From 1ca7e0a692fc2150da6ff84e467872bd10f5f1ae Mon Sep 17 00:00:00 2001 From: JvD_Ericsson Date: Mon, 2 Dec 2024 16:49:25 +0000 Subject: [PATCH] TEIV: Add groups and geo location * Updated yang models: - entities and relationships can now have groups - updated most relationship descriptions - added attributes to AntennaModule - added dUpLMNId to ODUFunction - updated Sector azimuth to decimal degrees - added an ANTENNAMODULE_SERVES_NRCELLDU relationship * Added auditing to teiv * Refactoring of teiv * Updated pgsql-schema-generator to generate groups - can run as both a jar and through the IDE * Updated exposure.Dockerfile to work with groups * Updated cloud event example Issue-ID: SMO-168 Issue-ID: SMO-169 Change-Id: I316c5766862cd0ff3e3275e81058090cbf092fe8 Signed-off-by: JvD_Ericsson --- .../init_sql/00_init-teiv-exposure-model.sql | 98 +- .../init_sql/01_init-teiv-exposure-data.sql | 172 +- .../init_sql/03_init-teiv-exposure-groups.sql | 70 + .../events/cloudEventExampleMerge.txt | 132 +- docker-compose/copySqlSchemaFromPgsqlGenerator.sh | 3 +- .../sql_scripts/00_init-teiv-exposure-model.sql | 98 +- .../sql_scripts/01_init-teiv-exposure-data.sql | 172 +- .../sql_scripts/03_init-teiv-exposure-groups.sql | 70 + docker-compose/sql_scripts/waitForFiles.sh | 3 +- docs/offeredapis/html/index.html | 7124 ++++++++++++-------- docs/offeredapis/index.html | 1126 ++-- .../topology-exposure-inventory-openapi.json | 1737 +++-- .../topology-exposure-inventory-openapi.yaml | 1067 ++- .../oran/smo/teiv/pgsqlgenerator/Constants.java | 9 + .../org/oran/smo/teiv/pgsqlgenerator/Entity.java | 13 +- .../pgsqlgenerator/PgSchemaGeneratorException.java | 4 + .../oran/smo/teiv/pgsqlgenerator/Processor.java | 5 +- .../pgsqlgenerator/StaticColumnsGenerator.java | 54 + .../schema/BackwardCompatibilityChecker.java | 2 +- .../consumerdata/ConsumerDataSchemaGenerator.java | 4 +- .../schema/data/DataSchemaGenerator.java | 39 +- .../pgsqlgenerator/schema/data/TableBuilder.java | 5 + .../schema/groups/GroupsSchemaGenerator.java | 73 + .../src/main/resources/application.yaml | 6 + .../scripts/00_init-oran-smo-teiv-data.sql | 31 +- .../scripts/01_init-oran-smo-teiv-model.sql | 9 +- .../scripts/03_init-oran-smo-teiv-groups.sql | 70 + .../oran/smo/teiv/pgsqlgenerator/EndToEndTest.java | 44 +- .../oran/smo/teiv/pgsqlgenerator/TestHelper.java | 3 +- .../schema/data/TableBuilderTest.java | 16 + .../entities/mock_00_init-oran-smo-teiv-data.sql | 2 +- .../manyToMany/mock_00_init-oran-smo-teiv-data.sql | 2 +- .../manyToOne/mock_00_init-oran-smo-teiv-data.sql | 2 +- .../oneToMany/mock_00_init-oran-smo-teiv-data.sql | 2 +- .../oneToOne/mock_00_init-oran-smo-teiv-data.sql | 2 +- .../mock_00_init-oran-smo-teiv-data.sql | 2 +- .../model/mock_01_init-oran-smo-teiv-model.sql | 3 +- .../src/test/resources/application.yaml | 7 + .../baseline-schema/00_init-oran-smo-teiv-data.sql | 5 +- .../01_init-oran-smo-teiv-model.sql | 21 +- .../03_init-oran-smo-teiv-groups.sql | 70 + .../baseline-schema/custom-sql-script.sql | 49 + .../result_00_init-oran-smo-teiv-data.sql | 88 +- .../result_01_init-oran-smo-teiv-model.sql | 53 +- .../result_03_init-oran-smo-teiv-groups.sql | 70 + .../o-ran-smo-teiv-common-yang-types.yang | 100 +- .../o-ran-smo-teiv-equipment.yang | 39 +- .../generate-defaults/o-ran-smo-teiv-ran.yang | 117 +- .../o-ran-smo-teiv-rel-equipment-ran.yang | 14 + pom.xml | 2 + teiv/exposure.Dockerfile | 2 + teiv/pom.xml | 21 +- .../antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 | 8 +- .../java/org/oran/smo/teiv/CoreApplication.java | 2 - .../DependentServiceAvailabilityKafka.java | 6 +- .../org/oran/smo/teiv/config/KafkaAdminConfig.java | 2 + .../java/org/oran/smo/teiv/config/KafkaConfig.java | 2 + .../oran/smo/teiv/config/KafkaSecurityConfig.java | 2 + .../health/TiesExposureHealthIndicator.java | 4 +- .../health/TiesGroupsHealthIndicator.java | 51 + .../controller/health/TiesHealthIndicator.java | 11 +- .../health/TiesIngestionHealthIndicator.java | 2 +- .../health/TiesKafkaHealthIndicator.java | 43 + .../teiv/exception/AdapterIdNotFoundException.java | 30 + .../oran/smo/teiv/exception/AuditException.java | 43 + .../teiv/exception/CloudEventParserException.java | 60 + .../teiv/exception/IllegalCharacterException.java | 35 + .../exception/InvalidRelationshipException.java | 36 +- .../org/oran/smo/teiv/exception/TiesException.java | 20 +- .../org/oran/smo/teiv/exception/YangException.java | 32 + .../smo/teiv/exception/YangModelException.java | 13 - .../smo/teiv/exception/YangParsingException.java | 32 + .../smo/teiv/exception/YangSchemaException.java | 36 + .../teiv/exception/YangValidationException.java | 54 + .../smo/teiv/exposure/audit/LoggerHandler.java | 4 + .../api/impl/ClassifiersServiceImpl.java | 2 + .../rest/controller/ClassifiersRestController.java | 2 + .../ConsumerDataOperationRegistry.java | 2 + .../consumerdata/ConsumerDataRepository.java | 10 - .../consumerdata/ConsumerDataRepositoryImpl.java | 38 - .../operation/DeleteClassifiersOperation.java | 7 +- .../operation/DeleteDecoratorsOperation.java | 5 +- .../operation/MergeClassifiersOperation.java | 9 +- .../operation/MergeDecoratorsOperation.java | 9 +- .../smo/teiv/exposure/data/api/DataService.java | 2 +- .../exposure/data/api/impl/DataServiceImpl.java | 2 + .../data/rest/controller/DataController.java | 2 + .../decorators/api/impl/DecoratorsServiceImpl.java | 2 + .../rest/controller/DecoratorsRestController.java | 2 + .../smo/teiv/exposure/model/api/ModelService.java | 4 +- .../exposure/model/api/impl/ModelServiceImpl.java | 38 +- .../model/rest/controller/ModelController.java | 31 +- .../smo/teiv/exposure/spi/ModelRepository.java | 21 +- .../exposure/spi/impl/ModelRepositoryImpl.java | 106 +- .../tiespath/innerlanguage/AndLogicalBlock.java | 17 +- .../tiespath/innerlanguage/AndOrLogicalBlock.java | 4 + .../tiespath/innerlanguage/ConditionFactory.java | 452 +- .../tiespath/innerlanguage/ContainerType.java | 3 +- .../innerlanguage/InnerFilterCriteria.java | 8 +- .../tiespath/innerlanguage/OrLogicalBlock.java | 16 +- .../tiespath/innerlanguage/QueryFunction.java | 4 +- .../tiespath/innerlanguage/ScopeLogicalBlock.java | 2 +- .../exposure/tiespath/refiner/AliasMapper.java | 1 + .../tiespath/refiner/BasePathRefinement.java | 33 +- .../tiespath/refiner/PathToJooqRefinement.java | 10 +- .../tiespath/resolver/ResolverDataType.java | 2 + .../exposure/tiespath/resolver/ResolverUtil.java | 7 +- .../tiespath/resolver/ScopeFilterListener.java | 29 + .../oran/smo/teiv/groups/GroupsCustomMetrics.java | 116 + .../oran/smo/teiv/groups/api/GroupsService.java | 110 + .../teiv/groups/api/impl/GroupsServiceImpl.java | 232 + .../api/impl/creator/DynamicGroupCreator.java | 73 + .../teiv/groups/api/impl/creator/GroupCreator.java | 43 + .../api/impl/creator/StaticGroupCreator.java | 67 + .../impl/resolver/AllProvidedMembersRetriever.java | 53 + .../groups/api/impl/resolver/CriteriaResolver.java | 38 + .../impl/resolver/CriteriaResolverRegistry.java | 63 + .../api/impl/resolver/DynamicGroupResolver.java | 61 + .../api/impl/resolver/EntityByDomainResolver.java | 54 + .../api/impl/resolver/EntityByTypeResolver.java | 55 + .../groups/api/impl/resolver/GroupResolver.java | 42 + .../resolver/InvalidProvidedMembersRetriever.java | 61 + .../NotPresentProvidedMembersRetriever.java | 67 + .../resolver/PresentProvidedMembersRetriever.java | 66 + .../impl/resolver/ProvidedMembersRetriever.java | 112 + .../resolver/ProvidedMembersRetrieverRegistry.java | 56 + .../resolver/RelationshipByEntityIdResolver.java | 58 + .../impl/resolver/RelationshipByTypeResolver.java | 55 + .../api/impl/resolver/StaticGroupResolver.java | 44 + .../org/oran/smo/teiv/groups/audit/AuditInfo.java | 88 + .../smo/teiv/groups/audit/ExecutionStatus.java | 29 + .../oran/smo/teiv/groups/audit/GroupOperation.java | 29 + .../groups/rest/controller/GroupsConstants.java | 30 + .../groups/rest/controller/GroupsController.java | 221 + .../groups/rest/controller/GroupsException.java | 90 + .../teiv/groups/rest/controller/GroupsUtil.java | 40 + .../smo/teiv/groups/spi/DynamicGroupRecord.java | 34 + .../teiv/groups/spi/GroupNotFoundException.java | 30 + .../org/oran/smo/teiv/groups/spi/GroupRecord.java | 36 + .../oran/smo/teiv/groups/spi/GroupsRepository.java | 258 + .../smo/teiv/groups/spi/ProvidedMembersStatus.java | 50 + .../groups/spi/StaticGroupMemberProcessor.java | 108 + .../smo/teiv/groups/spi/StaticGroupRecord.java | 35 + .../teiv/groups/spi/impl/GroupsRepositoryImpl.java | 412 ++ .../smo/teiv/listener/CreateTopologyProcessor.java | 16 +- .../smo/teiv/listener/DeleteTopologyProcessor.java | 9 + .../smo/teiv/listener/MergeTopologyProcessor.java | 21 +- .../SourceEntityDeleteTopologyProcessor.java | 13 + .../smo/teiv/listener/audit/ExecutionStatus.java | 29 + .../teiv/listener/audit/IngestionAuditInfo.java | 44 + .../teiv/listener/audit/IngestionAuditLogger.java | 44 + .../java/org/oran/smo/teiv/schema/DataType.java | 8 +- .../java/org/oran/smo/teiv/schema/EntityType.java | 50 +- .../java/org/oran/smo/teiv/schema/Persistable.java | 11 +- .../oran/smo/teiv/schema/PostgresSchemaLoader.java | 19 +- .../org/oran/smo/teiv/schema/RelationType.java | 62 +- .../java/org/oran/smo/teiv/schema/Reliability.java | 49 + .../oran/smo/teiv/schema/ResponsibleAdapter.java | 71 + .../org/oran/smo/teiv/schema/SchemaRegistry.java | 20 + .../smo/teiv/service/SchemaCleanUpService.java | 4 +- .../oran/smo/teiv/service/TiesDbOperations.java | 209 +- .../teiv/service/cloudevent/CloudEventParser.java | 222 +- .../smo/teiv/service/cloudevent/data/Entity.java | 130 + .../teiv/service/cloudevent/data/Relationship.java | 58 + .../oran/smo/teiv/service/kafka/KafkaFactory.java | 2 + .../smo/teiv/service/kafka/KafkaTopicService.java | 30 +- .../smo/teiv/service/models/OperationResult.java | 39 +- .../smo/teiv/startup/SchemaCleanUpHandler.java | 53 + .../org/oran/smo/teiv/startup/SchemaHandler.java | 28 +- .../org/oran/smo/teiv/utils/JooqTypeConverter.java | 16 +- .../java/org/oran/smo/teiv/utils/JooqUtils.java | 70 + .../org/oran/smo/teiv/utils/TiesConstants.java | 15 + .../org/oran/smo/teiv/utils/path/TiesPathUtil.java | 5 +- .../utils/query/exception/TiesPathException.java | 14 +- .../org/oran/smo/teiv/utils/schema/Geography.java | 64 +- .../teiv/utils/yangparser/ExposureYangParser.java | 139 + .../teiv/utils/yangparser/IngestionYangParser.java | 105 + .../teiv/utils/yangparser/YangFindingsManager.java | 144 + .../smo/teiv/utils/yangparser/YangModelLoader.java | 115 + teiv/src/main/resources/application.yaml | 13 +- teiv/src/main/resources/logback-json.xml | 33 +- .../resources/models/o-ran-smo-teiv-cloud.yang | 15 + .../models/o-ran-smo-teiv-common-yang-types.yang | 136 +- .../resources/models/o-ran-smo-teiv-equipment.yang | 95 +- .../main/resources/models/o-ran-smo-teiv-oam.yang | 14 +- .../main/resources/models/o-ran-smo-teiv-ran.yang | 91 +- .../models/o-ran-smo-teiv-rel-cloud-ran.yang | 9 + .../models/o-ran-smo-teiv-rel-equipment-ran.yang | 57 + .../models/o-ran-smo-teiv-rel-oam-cloud.yang | 7 + .../models/o-ran-smo-teiv-rel-oam-ran.yang | 56 +- ...topology-exposure-inventory-kafka-asyncapi.yaml | 265 + .../v1/topology-exposure-inventory-openapi.yaml | 1067 ++- .../org/oran/smo/teiv/CoreApplicationTest.java | 5 + .../java/org/oran/smo/teiv/TopologyApiBase.java | 69 + .../DependentServiceAvailabilityKafkaTest.java | 24 +- .../health/TiesExposureHealthIndicatorTest.java | 4 +- .../health/TiesGroupsHealthIndicatorTest.java | 91 + .../health/TiesIngestionHealthIndicatorTest.java | 7 +- .../oran/smo/teiv/db/TestPostgresqlContainer.java | 99 +- .../smo/teiv/db/TestPostgresqlContainerV1.java | 85 - .../api/contract/TopologyExposureApiBase.java | 62 +- .../api/ClassifiersServiceContainerizedTest.java | 76 +- .../api/DecoratorsServiceContainerizedTest.java | 64 +- ...RepositoryImplGETRequestsContainerizedTest.java | 72 +- .../tiespath/innerlanguage/DtoToJooqTest.java | 932 ++- .../innerlanguage/ScopeLogicalBlockTest.java | 10 + .../tiespath/innerlanguage/SelectBlockTest.java | 35 +- .../tiespath/refiner/BasePathRefinementTest.java | 31 + .../tiespath/resolver/ScopeResolverTest.java | 87 + .../smo/teiv/groups/TopologyGroupsApiBase.java | 65 + .../api/impl/creator/DynamicGroupCreatorTest.java | 64 + .../impl/resolver/DynamicGroupResolverTest.java | 68 + .../IngestionOperationValidatorTest.java | 184 +- .../teiv/listener/CreateTopologyProcessorTest.java | 138 +- .../teiv/listener/DeleteTopologyProcessorTest.java | 79 +- .../teiv/listener/MergeTopologyProcessorTest.java | 134 +- .../SourceEntityDeleteTopologyProcessorTest.java | 153 +- .../org/oran/smo/teiv/schema/MockSchemaLoader.java | 44 +- .../oran/smo/teiv/schema/SchemaRegistryTest.java | 41 +- .../org/oran/smo/teiv/service/EndToEndDbTest.java | 134 +- .../smo/teiv/service/KafkaTopicServiceTest.java | 33 +- .../teiv/service/TiesDbOperationResultsTest.java | 780 ++- .../service/TiesDbServiceContainerizedTest.java | 664 +- .../service/cloudevent/CloudEventParserTest.java | 307 +- .../smo/teiv/startup/SchemaCleanUpHandlerTest.java | 62 + .../oran/smo/teiv/utils/CloudEventTestUtil.java | 6 +- .../smo/teiv/utils/ExposureYangParserTest.java | 124 + .../smo/teiv/utils/IngestionYangParserTest.java | 220 + .../oran/smo/teiv/utils/JooqTypeConverterTest.java | 106 + .../smo/teiv/utils/KafkaTestExecutionListener.java | 36 + .../org/oran/smo/teiv/utils/TiesTestConstants.java | 3 + .../oran/smo/teiv/utils/schema/GeographyTest.java | 35 +- teiv/src/test/resources/application.yaml | 12 +- .../common/ce-64bit-numbers-as-json-numbers.json | 51 + .../common/ce-64bit-numbers-as-string.json | 51 + .../resources/cloudeventdata/common/ce-arrays.json | 28 +- .../common/ce-complex-attributes.json | 60 + .../cloudeventdata/common/ce-data-only.json | 104 + .../cloudeventdata/common/ce-delete-entity-id.json | 23 + .../cloudeventdata/common/ce-deprecated.json | 85 + .../cloudeventdata/common/ce-geo-location.json | 46 + .../common/ce-invalid-entity-attribute.json | 12 +- .../cloudeventdata/common/ce-null-attribute.json | 31 + .../cloudeventdata/common/ce-one-entity.json | 10 +- .../ce-relationship-invalid-module-type-pair.json | 18 +- .../common/ce-relationship-invalid-module.json | 18 +- .../common/ce-relationship-invalid-type.json | 18 +- .../common/ce-relationship-missing-a-side.json | 18 +- .../common/ce-relationship-missing-b-side.json | 18 +- .../common/ce-relationship-missing-both-sides.json | 18 +- .../common/ce-relationship-missing-id.json | 18 +- .../common/ce-relationship-missing-source-ids.json | 31 + .../common/ce-relationship-with-one-source-id.json | 25 + .../cloudeventdata/common/ce-with-data.json | 104 +- .../common/ce-with-invalid-entity-id.json | 100 + .../common/ce-with-invalid-relationship-ids.json | 30 +- .../common/ce-with-invalid-relationship-ids2.json | 30 +- .../common/ce-with-invalid-relationship-ids3.json | 30 +- .../common/ce-with-no-source-ids.json | 96 + .../end-to-end/ce-create-attribute-null.json | 26 + .../end-to-end/ce-create-geo-location-null.json | 28 + .../end-to-end/ce-create-geo-location.json | 29 +- .../end-to-end/ce-create-inferred.json | 183 + .../end-to-end/ce-create-many-to-many.json | 148 +- .../end-to-end/ce-create-many-to-one.json | 68 +- .../end-to-end/ce-create-one-to-many.json | 14 +- .../end-to-end/ce-create-one-to-many3.json | 87 + .../end-to-end/ce-create-one-to-one.json | 58 +- ...create-relationship-connecting-same-entity.json | 83 +- .../end-to-end/ce-create-second-case.json | 113 +- .../end-to-end/ce-delete-managed-element.json | 6 +- .../end-to-end/ce-delete-many-to-many.json | 14 +- .../end-to-end/ce-delete-many-to-one.json | 20 +- .../end-to-end/ce-delete-one-to-many.json | 12 +- .../end-to-end/ce-delete-one-to-one.json | 10 +- ...delete-relationship-connecting-same-entity.json | 10 +- .../end-to-end/ce-merge-long-names.json | 435 +- .../end-to-end/ce-merge-many-to-many.json | 91 + .../ce-merge-one-to-many-deprecated-structure.json | 95 - .../end-to-end/ce-merge-one-to-many.json | 96 +- .../end-to-end/ce-merge-one-to-many2.json | 20 +- .../end-to-end/ce-merge-reliability.json | 118 + .../ce-source-entity-delete-cm-handle.json | 4 +- .../ce-source-entity-delete-cm-handle2.json | 4 +- .../cloudeventdata/end-to-end/ce-unknown-type.json | 25 + .../expected-results/exp-create-geo-location.json | 22 + .../expected-results/exp-create-inferred.json | 146 + .../expected-results/exp-create-many-to-many.json | 98 +- .../expected-results/exp-create-one-to-one.json | 20 +- .../expected-results/exp-create-second-case.json | 203 +- .../expected-results/exp-delete-one-to-one.json | 17 +- .../expected-results/exp-merge-one-to-many.json | 143 +- .../expected-results/exp-merge-reliability.json | 76 + .../not-exp-delete-many-to-many.json | 17 +- .../not-exp-delete-one-to-one.json | 8 +- .../not-exp-source-entity-delete-cm-handle.json | 17 +- .../attributes/ce-wrong-attribute-type.json | 27 + .../attributes/ce-wrong-attribute-type2.json | 28 + .../attributes/ce-wrong-attribute-type3.json | 28 + .../validation/attributes/int-as-string.json | 30 + .../ce-create-many-to-one-geolocation.json | 32 +- .../ce-create-many-to-one-geolocation2.json | 20 +- .../many-to-one/ce-create-many-to-one.json | 33 +- .../many-to-one/ce-create-many-to-one2.json | 37 +- .../many-to-one/ce-create-many-to-one3.json | 25 +- .../many-to-one/ce-create-many-to-one4.json | 16 +- .../many-to-one/ce-create-many-to-one5.json | 20 +- .../many-to-one/ce-create-many-to-one6.json | 25 +- .../many-to-one/ce-create-many-to-one7.json | 12 +- .../many-to-one/ce-create-many-to-one8.json | 20 +- .../many-to-one/ce-create-many-to-one9.json | 59 + .../ce-merge-many-to-one-null-attribute.json | 56 + .../one-to-many/ce-create-one-to-many.json | 34 +- .../one-to-many/ce-create-one-to-many2.json | 34 +- .../one-to-many/ce-create-one-to-many3.json | 20 +- .../one-to-many/ce-create-one-to-many4.json | 12 +- .../one-to-many/ce-create-one-to-many5.json | 22 +- .../one-to-many/ce-create-one-to-many6.json | 20 +- .../one-to-many/ce-create-one-to-many7.json | 12 +- .../one-to-many/ce-create-one-to-many8.json | 22 +- .../one-to-one/ce-create-one-to-one.json | 39 +- .../one-to-one/ce-create-one-to-one2.json | 39 +- .../one-to-one/ce-create-one-to-one3.json | 24 +- .../one-to-one/ce-create-one-to-one4.json | 14 +- .../one-to-one/ce-create-one-to-one5.json | 29 +- .../one-to-one/ce-create-one-to-one6.json | 22 +- .../one-to-one/ce-create-one-to-one7.json | 14 +- .../one-to-one/ce-create-one-to-one8.json | 29 +- .../data/02_getTopologyByEntityTypeName.groovy | 64 +- .../contracts/data/05_getRelationshipTypes.groovy | 16 +- .../contracts/data/08_getEntitiesByDomain.groovy | 34 +- ...tClassifiers_getTopologyByEntityTypeName.groovy | 324 + ...01_getClassifiers_getRelationshipsByType.groovy | 250 + .../02_getClassifiers_getEntitiesByDomain.groovy | 163 + .../classifiers/03_postClassifiers_merge.groovy | 129 + .../classifiers/04_postClassifiers_delete.groovy | 237 + .../exposure/data/00_getAllDomains.groovy | 276 + .../exposure/data/01_getTopologyEntityTypes.groovy | 550 ++ .../data/02_getTopologyByEntityTypeName.groovy | 2008 ++++++ .../exposure/data/03_getTopologyById.groovy | 106 + .../data/04_getAllRelationshipsForEntityId.groovy | 746 ++ .../exposure/data/05_getRelationshipTypes.groovy | 545 ++ .../exposure/data/06_getRelationshipsByType.groovy | 807 +++ .../exposure/data/07_getRelationshipById.groovy | 90 + .../exposure/data/08_getEntitiesByDomain.groovy | 1034 +++ ...etDecorators_getTopologyByEntityTypeName.groovy | 236 + .../01_getDecorators_getRelationshipsByType.groovy | 236 + .../02_getDecorators_getEntitiesByDomain.groovy | 236 + .../decorators/03_postDecoratorsMerge.groovy | 310 + .../decorators/04_postDecoratorsDelete.groovy | 301 + .../exposure/schemas/00_getAllSchemas.groovy | 578 ++ .../exposure/schemas/01_getSchemaContent.groovy | 251 + .../exposure/schemas/02_postSchemas.groovy | 1370 ++++ .../exposure/schemas/03_deleteSchemas.groovy | 66 + .../contracts/groups/00_createGroup.groovy | 889 +++ .../resources/contracts/groups/01_getGroups.groovy | 277 + .../contracts/groups/02_getGroupById.groovy | 252 + .../contracts/groups/03_deleteGroup.groovy | 71 + .../resources/contracts/groups/04_putGroup.groovy | 113 + .../contracts/groups/05_getMembers.groovy | 592 ++ .../contracts/groups/06_getProvidedMembers.groovy | 435 ++ .../groups/07_updateProvidedMembers.groovy | 1128 ++++ .../contracts/schemas/00_getAllSchemas.groovy | 30 +- .../contracts/schemas/01_getSchemaContent.groovy | 56 +- .../pgsqlschema/00_init-oran-smo-teiv-data-v1.sql | 157 +- .../pgsqlschema/00_init-oran-smo-teiv-data.sql | 2103 +++--- .../pgsqlschema/01_init-oran-smo-teiv-model-v1.sql | 86 +- .../pgsqlschema/01_init-oran-smo-teiv-model.sql | 970 ++- .../02_init-oran-smo-teiv-consumer-data.sql | 53 + .../pgsqlschema/03_init-oran-smo-teiv-groups.sql | 70 + .../test/resources/pgsqlschema/consumer-data.sql | 43 + .../test/resources/pgsqlschema/data-deprecated.sql | 56 +- teiv/src/test/resources/pgsqlschema/data.sql | 396 +- teiv/src/test/resources/pgsqlschema/groups.sql | 83 + .../resources/pgsqlschema/ingestion-test-data.sql | 527 ++ .../resources/pgsqlschema/ingestion-test-model.sql | 149 + teiv/src/test/resources/pgsqlschema/model.sql | 11 +- .../test-data-for-ingestion-validation.sql | 157 + .../test-model-for-ingestion-validation.sql | 60 + .../test/resources/yang/parser/bad-yang-file.yang | 63 + .../resources/yang/parser/entity-in-wrong-ns.json | 15 + .../test/resources/yang/parser/geolocation.json | 33 + .../test/resources/yang/parser/missing-key.json | 14 + .../resources/yang/parser/multiple-entity.json | 47 + .../resources/yang/parser/not-existing-entity.json | 18 + .../yang/parser/source-ids-without-list.json | 16 + .../resources/yang/parser/wrong-attributes.json | 16 + .../resources/yang/parser/wrong-entity-name.json | 15 + .../resources/yang/parser/wrong-namespace.json | 15 + .../wrong-source-ids-list-with-one-long.json | 18 + .../yang/parser/wrong-source-ids-list.json | 20 + .../parser/wrong-source-ids-long-without-list.json | 16 + .../data/instance/AbstractStructureInstance.java | 24 + 393 files changed, 40313 insertions(+), 10624 deletions(-) create mode 100644 charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql create mode 100644 docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql create mode 100644 pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/StaticColumnsGenerator.java create mode 100644 pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java create mode 100644 pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql create mode 100644 pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql create mode 100644 pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql create mode 100644 pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql create mode 100644 teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicator.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesKafkaHealthIndicator.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/AdapterIdNotFoundException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/AuditException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/CloudEventParserException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/IllegalCharacterException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/YangException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/YangSchemaException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/exception/YangValidationException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/GroupsService.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/GroupsServiceImpl.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/GroupCreator.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/StaticGroupCreator.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/AllProvidedMembersRetriever.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolverRegistry.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByDomainResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByTypeResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/GroupResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/InvalidProvidedMembersRetriever.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/NotPresentProvidedMembersRetriever.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/PresentProvidedMembersRetriever.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetriever.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetrieverRegistry.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByTypeResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/StaticGroupResolver.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/audit/ExecutionStatus.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/audit/GroupOperation.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsUtil.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/DynamicGroupRecord.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupNotFoundException.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupRecord.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupsRepository.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/ProvidedMembersStatus.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupRecord.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/listener/audit/ExecutionStatus.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/startup/SchemaCleanUpHandler.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/JooqUtils.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java create mode 100644 teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java create mode 100644 teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml create mode 100644 teiv/src/test/java/org/oran/smo/teiv/TopologyApiBase.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicatorTest.java delete mode 100644 teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainerV1.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreatorTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolverTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/startup/SchemaCleanUpHandlerTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java create mode 100644 teiv/src/test/java/org/oran/smo/teiv/utils/KafkaTestExecutionListener.java create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-json-numbers.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-string.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-complex-attributes.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-data-only.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-delete-entity-id.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-deprecated.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-geo-location.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-source-ids.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-relationship-with-one-source-id.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-entity-id.json create mode 100644 teiv/src/test/resources/cloudeventdata/common/ce-with-no-source-ids.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json delete mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many-deprecated-structure.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-reliability.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/ce-unknown-type.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-geo-location.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json create mode 100644 teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type2.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type3.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/attributes/int-as-string.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json create mode 100644 teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json create mode 100644 teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy create mode 100644 teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy create mode 100644 teiv/src/test/resources/contracts/groups/00_createGroup.groovy create mode 100644 teiv/src/test/resources/contracts/groups/01_getGroups.groovy create mode 100644 teiv/src/test/resources/contracts/groups/02_getGroupById.groovy create mode 100644 teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy create mode 100644 teiv/src/test/resources/contracts/groups/04_putGroup.groovy create mode 100644 teiv/src/test/resources/contracts/groups/05_getMembers.groovy create mode 100644 teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy create mode 100644 teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy create mode 100644 teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql create mode 100644 teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql create mode 100644 teiv/src/test/resources/pgsqlschema/consumer-data.sql create mode 100644 teiv/src/test/resources/pgsqlschema/groups.sql create mode 100644 teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql create mode 100644 teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql create mode 100644 teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql create mode 100644 teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql create mode 100644 teiv/src/test/resources/yang/parser/bad-yang-file.yang create mode 100644 teiv/src/test/resources/yang/parser/entity-in-wrong-ns.json create mode 100644 teiv/src/test/resources/yang/parser/geolocation.json create mode 100644 teiv/src/test/resources/yang/parser/missing-key.json create mode 100644 teiv/src/test/resources/yang/parser/multiple-entity.json create mode 100644 teiv/src/test/resources/yang/parser/not-existing-entity.json create mode 100644 teiv/src/test/resources/yang/parser/source-ids-without-list.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-attributes.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-entity-name.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-namespace.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-source-ids-list-with-one-long.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-source-ids-list.json create mode 100644 teiv/src/test/resources/yang/parser/wrong-source-ids-long-without-list.json 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 7fbb357..dbb7b9d 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 @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE 'topology_exposure_user'; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -79,9 +75,6 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN @@ -117,6 +110,8 @@ FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_aSide_NFDeployme FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_bSide_ODUFunction FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08 CONSTRAINT FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960 CONSTRAINT FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_aSide_AntennaModule FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_bSide_NRCellDU FK_8605800A4923C52258A8CE3989E18A7C93D22E8C CONSTRAINT IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_classifiers IDX_BD96130868B69147B2F87B0D15F5829690DEF454 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_sourceIds IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_classifiers IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52 INDEX @@ -206,6 +201,8 @@ IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERV IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_sourceIds IDX_5996D077978D38D0C1A951A262F1F7E1E339F052 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_classifiers IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_sourceIds IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E INDEX IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_decorators IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C INDEX IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators INDEX @@ -243,6 +240,7 @@ IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ra IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_ADD3393C27589066C4993A3491436C6FB57A539F INDEX IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F INDEX IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators INDEX @@ -251,6 +249,7 @@ IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_decora IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_decorators IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F INDEX IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_decorators IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835 INDEX IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_decorators IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753 INDEX PK_o-ran-smo-teiv-cloud_CloudifiedNF_id PK_o-ran-smo-teiv-cloud_CloudifiedNF_id CONSTRAINT PK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_id PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6 CONSTRAINT PK_o-ran-smo-teiv-cloud_NFDeployment_id PK_o-ran-smo-teiv-cloud_NFDeployment_id CONSTRAINT @@ -276,6 +275,7 @@ PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_id PK_2D854968 PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_id PK_E551D02D14B3C04A565DC73A386BEB29627D3C08 CONSTRAINT PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_id PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3 CONSTRAINT PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_id PK_F41873285F3BD831F63C6041B4356A063403406D CONSTRAINT REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN @@ -355,6 +355,23 @@ REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN +REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_metadata_NRCELLDU_USES_NRSECTORCARRIER REL_metadata_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_metadata_SECTOR_GROUPS_ANTENNAMODULE REL_metadata_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_metadata_SECTOR_GROUPS_NRCELLDU REL_metadata_SECTOR_GROUPS_NRCELLDU COLUMN UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT @@ -382,6 +399,7 @@ arfcnUL arfcnUL COLUMN azimuth azimuth COLUMN bSChannelBwDL bSChannelBwDL COLUMN bSide_AntennaCapability bSide_AntennaCapability COLUMN +bSide_NRCellDU bSide_NRCellDU COLUMN bSide_NearRTRICFunction bSide_NearRTRICFunction COLUMN bSide_OCUCPFunction bSide_OCUCPFunction COLUMN bSide_OCUUPFunction bSide_OCUUPFunction COLUMN @@ -389,6 +407,7 @@ bSide_OCloudNamespace bSide_OCloudNamespace COLUMN bSide_OCloudSite bSide_OCloudSite COLUMN bSide_ODUFunction bSide_ODUFunction COLUMN cellLocalId cellLocalId COLUMN +dUpLMNId dUpLMNId COLUMN eUtranFqBands eUtranFqBands COLUMN electricalAntennaTilt electricalAntennaTilt COLUMN frequencyDL frequencyDL COLUMN @@ -399,9 +418,11 @@ gNBId gNBId COLUMN gNBIdLength gNBIdLength COLUMN geo-location geo-location COLUMN geranFqBands geranFqBands COLUMN +horizontalBeamWidth horizontalBeamWidth COLUMN id id COLUMN mechanicalAntennaBearing mechanicalAntennaBearing COLUMN mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +metadata metadata COLUMN nCI nCI COLUMN nRFqBands nRFqBands COLUMN nRPCI nRPCI COLUMN @@ -433,6 +454,7 @@ o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-re o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION TABLE o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION TABLE o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU TABLE oruId oruId COLUMN pLMNId pLMNId COLUMN pLMNIdList pLMNIdList COLUMN @@ -440,6 +462,7 @@ plmnId plmnId COLUMN positionWithinSector positionWithinSector COLUMN sectorId sectorId COLUMN totalTilt totalTilt COLUMN +verticalBeamWidth verticalBeamWidth COLUMN \. COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; @@ -448,42 +471,43 @@ _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW 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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= 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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgY29tbW9uIHR5cGVzIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGdyb3VwaW5nIFRvcF9HcnBfVHlwZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkdyb3VwaW5nIGNvbnRhaW5pbmcgdGhlIGtleSBhdHRyaWJ1dGUgY29tbW9uIHRvIGFsbCB0eXBlcy4KICAgICAgICAgICAgQWxsIHR5cGVzIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICAgICAgbGVhZiBpZCB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdG9wb2xvZ3kgZW50aXRpZXMuIFJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAgICBFbnRpdHkgSW5zdGFuY2UgSWRlbnRpZmllci4iOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgZGVjb3JhdG9ycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgZm9yIGFwcGxpY2F0aW9ucyB3aXNoaW5nCiAgICAgICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gZGVjb3JhdG9ycy4gVGhpcyBpcyBkb25lIHZpYSBhdWdtZW50YXRpb25zLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJDb25zdW1lciBkZWZpbmVkIHRhZ3MgdG8gdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIGlkZW50aXR5cmVmIHsgYmFzZSBjbGFzc2lmaWVyOyB9CiAgICB9CgogICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgIHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGFydGljaXBhdGluZyBlbnRpdGllcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllcnsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4KICAgICAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBiZWFyaW5nIG9uIGFudGVubmEgc3VidW5pdCB3aGVyZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgICAgICBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEgZWxlbWVudCByZXNwZWN0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIHBsYW5lLiBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHRvdGFsVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVG90YWwgYW50ZW5uYSBlbGV2YXRpb24gaW5jbHVkaW5nIHRoZSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgICAgIFRpbHQgKFJFVCkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIGRpcmVjdGlvbiBvcnRob2dvbmFsIHRvIGFudGVubmEgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBhbnRlbm5hQmVhbVdpZHRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgYW5ndWxhciBzcGFuIG9mIHRoZSBtYWluIGxvYmUgb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICByYWRpYXRpb24gcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4KICAgICAgICAgICAgICAgICAgICBkZWdyZWVzLiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgICAgIGluc3RhbGxlZC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwoKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX0lOU1RBTExFRF9BVF9TSVRFIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBNYW5hZ2VkIEVsZW1lbnQgKE1FKSBpcyBhIG5vZGUgaW50byBhIHRlbGVjb21tdW5pY2F0aW9uCiAgICAgICAgICAgIG5ldHdvcmsgcHJvdmlkaW5nIHN1cHBvcnQgYW5kL29yIHNlcnZpY2UgdG8gc3Vic2NyaWJlcnMuIEFuIE1FCiAgICAgICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICAgICAgb3ZlciBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzIGZvciB0aGUgcHVycG9zZSBvZiBiZWluZyBtb25pdG9yZWQKICAgICAgICAgICAgYW5kL29yIGNvbnRyb2xsZWQuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CiAgICB9Cn0= -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBSYWRpbyBVbml0IChPLVJVKS4KCiAgICAgICAgQSBsb2dpY2FsIG5vZGUgaG9zdGluZyBMb3ctUEhZIGxheWVyIGFuZCBSRiBwcm9jZXNzaW5nIGJhc2VkIG9uIGEKICAgICAgICBsb3dlciBsYXllciBmdW5jdGlvbmFsIHNwbGl0LiAgVGhpcyBpcyBzaW1pbGFyIHRvIDNHUFDigJlzIOKAnFRSUOKAnSBvcgogICAgICAgIOKAnFJSSOKAnSBidXQgbW9yZSBzcGVjaWZpYyBpbiBpbmNsdWRpbmcgdGhlIExvdy1QSFkgbGF5ZXIgKEZGVC9pRkZULAogICAgICAgIFBSQUNIIGV4dHJhY3Rpb24pLiBUaGUgTy1SVSB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBpbnRlcmZhY2UKICAgICAgICAoYWxzbyBrbm93biBhcyBMTFMgaW50ZXJmYWNlKSBhcyB3ZWxsIGFzIExvdy1QSFkgZnVuY3Rpb25zIG9mIHRoZQogICAgICAgIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4gVGhlIE8tUlUKICAgICAgICB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBNLVBsYW5lIGludGVyZmFjZSB0b3dhcmRzIHRoZSBPLURVCiAgICAgICAgYW5kIFNNTy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTy1SVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBvcnVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBPLVJVIHdpdGhpbiBhIE9SVUZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk5lYXItUmVhbC1UaW1lIFJBTiBJbnRlbGxpZ2VudCBDb250cm9sbGVyIChOZWFyLVJUIFJJQykuCgogICAgICAgIEFuIE8tUkFOIE5ldHdvcmsgRnVuY3Rpb24gKE5GKSB0aGF0IGVuYWJsZXMgbmVhci1yZWFsLXRpbWUgY29udHJvbAogICAgICAgIGFuZCBvcHRpbWl6YXRpb24gb2YgUkFOIGVsZW1lbnRzIGFuZCByZXNvdXJjZXMgdmlhIGZpbmUtZ3JhaW5lZAogICAgICAgIGRhdGEgY29sbGVjdGlvbiBhbmQgYWN0aW9ucyBvdmVyIEUyIGludGVyZmFjZS4gSXQgbWF5IGluY2x1ZGUKICAgICAgICBBSS9NTCAoQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UgLyBNYWNoaW5lIExlYXJuaW5nKSB3b3JrZmxvdwogICAgICAgIGluY2x1ZGluZyBtb2RlbCB0cmFpbmluZywgaW5mZXJlbmNlLCBhbmQgdXBkYXRlcy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTmVhci1SVCBSSUMgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmVhclJ0UmljSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTmVhci1SVCBSSUMgd2l0aGluIGEgTmVhclJUUklDRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gRGlzdHJpYnV0ZWQgVW5pdCAoTy1EVSkuCgogICAgICAgIFRoZSBPLURVIGlzIGFuIE8tUkFOIE5GIGluIHRoZSBPLVJBTiBBcmNoaXRlY3R1cmUuIEFuIE8tRFUsIGNvbWJpbmVkCiAgICAgICAgd2l0aCBvbmUgb3IgbW9yZSBPLVJVKHMpIGNvbm5lY3RlZCB0byBpdCwgc3VwcG9ydHMgYW5kIGlzIGZ1bGx5CiAgICAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBmdW5jdGlvbnMgb2YgYSBnTkItRFUgYXMgZGVmaW5lZCBieSAzR1BQIFRTIDM4LjQwMS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgIGNvbm5lY3RlZCB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIE8tRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIE8tRFUgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE5HLVJBTgogICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApCgogICAgICAgIFRoaXMgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgUmFkaW8gUmVzb3VyY2UgQ29udHJvbCAoUlJDKSBhbmQKICAgICAgICB0aGUgY29udHJvbCBwbGFuZSBwYXJ0IG9mIHRoZSBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbAogICAgICAgIChQRENQKS4gVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tQ1UtVVAgYW5kIHRoZSBGMS1DIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aCB0aGUgTy1SQU4KICAgICAgICBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtQ1A6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9ubHkgb25lIE8tQ1UtQ1AgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25lIE8tRFUuIE9ubHkgb25lIE8tQ1UtQ1AgaXMgY29ubmVjdGVkIHRvIG9uZQogICAgICAgIE8tQ1UtVVAuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIKICAgICAgICB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUgTy1DVS1VUCBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtQ1AgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLUNQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBnTm9kZUItQ1UiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTgogICAgICAgICAgICAgICAgbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ1VVUEZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gQ2VudHJhbGl6ZWQgVW5pdCBVc2VyIFBsYW5lIChPLUNVLVVQKQoKICAgICAgICBBbiBPLUNVLVVQIGlzIGEgbG9naWNhbCBub2RlIGhvc3RpbmcgdGhlIFVzZXIgUGxhbmUgcGFydCBvZiB0aGUKICAgICAgICBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbCAoUERDUCkgYW5kIHRoZSBTZXJ2aWNlIERhdGEKICAgICAgICBBZGFwdGF0aW9uIFByb3RvY29sIChTREFQKS4gVGhlIE8tQ1UtVVAgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlCiAgICAgICAgY29ubmVjdGVkIHdpdGggdGhlIE8tQ1UtQ1AgYW5kIHRoZSBGMS1VIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aAogICAgICAgIHRoZSBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtVVA6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1DUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9uZSBPLUNVLVVQIGlzCiAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIE8tQ1UtQ1AuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUKICAgICAgICBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQogICAgICAgIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYW4gTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtVVAgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLVVQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsaXN0IHBMTU5JZExpc3QgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLUNVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uCiAgICAgICAgU2lnbmFsIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQKICAgICAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1EVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIHNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbiBzaWduYWwKICAgICAgICAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kIHByb3ZpZGUKICAgICAgICB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBncm91cCBvZiBjby1sb2NhdGVkIENlbGxzIHRoYXQgaGF2ZSBhIHNoYXJlZAogICAgICAgIGNvdmVyYWdlIGFyZWEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUkNFTExEVSB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSB1c2VzIE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZWQgYnkgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTlJTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9DTE9VRF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09EVUZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VDUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0NVVVBGVU5DVElPTiB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWduYmN1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19BTlRFTk5BTU9EVUxFIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlY3RvciBncm91cHMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOlNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX0NMT1VEOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfREVQTE9ZRURfQVNfQ0xPVURJRklFRE5GIHsgIC8vIDAuLjEgdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBkZXBsb3llZC1hcy1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IGRlcGxveWVkIGFzIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGRlcGxveWVkLW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkaWZpZWQgTkYgZGVwbG95cyBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtY2xvdWQ6Q2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTUFOQUdFREVMRU1FTlQgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgc2VydmljZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 -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-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT0RVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +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== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud -o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment -o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment -o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam -o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran +COPY ties_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"] +o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud ["geo-location", "name"] +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment ["geo-location", "name"] +o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam [] +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRTAC", "plmnId"] +o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRPCI", "nRTAC"] +o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"] +o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran ["nearRtRicId", "pLMNId"] +o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"] +o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran ["gNBId", "gNBIdLength", "pLMNIdList"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +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; 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 CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT comprised-nFDeployment CloudifiedNF o-ran-smo-teiv-cloud 1 1 comprised-by-cloudifiedNF NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF deployed-as-cloudifiedNF ManagedElement o-ran-smo-teiv-oam 1 1 deployed-managedElement CloudifiedNF o-ran-smo-teiv-cloud 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-rel-oam-cloud MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION managed-nearRTRICFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-rel-oam-ran @@ -495,7 +519,7 @@ NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE deployed-on-ocloudNamespace NFDeploymen NFDEPLOYMENT_SERVES_MANAGEDELEMENT serviced-managedElement NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 serving-nFDeployment ManagedElement o-ran-smo-teiv-oam 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-rel-oam-cloud NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION serviced-nearRTRICFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION o-ran-smo-teiv-rel-cloud-ran NFDEPLOYMENT_SERVES_OCUCPFUNCTION serviced-ocucpFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran -NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-gnbcuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-ocuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran NFDEPLOYMENT_SERVES_ODUFUNCTION serviced-oduFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran NODECLUSTER_LOCATED_AT_OCLOUDSITE located-at-ocloudSite NodeCluster o-ran-smo-teiv-cloud 1 9223372036854775807 location-of-onodeCluster OCloudSite o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud NRCELLDU_USES_NRSECTORCARRIER used-nrSectorCarrier NRCellDU o-ran-smo-teiv-ran 0 1 used-by-nrCellDu NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-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 17921ee..138e865 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 @@ -43,22 +43,47 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT ties_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");' +); + +SELECT ties_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" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -73,7 +98,8 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "bSide_AntennaCapability" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -87,7 +113,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -102,7 +129,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "bSide_OCloudNamespace" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -117,16 +145,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_comprised-by-cloudifiedNF" TEXT, "REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" TEXT, "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_FK_serviced-managedElement" TEXT, "REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" TEXT, "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, - "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb + "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -153,7 +184,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "bSide_OCloudSite" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -167,7 +199,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -182,11 +215,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-on-nodeCluster" TEXT, "REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" TEXT, "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, - "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb + "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -207,7 +242,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -220,25 +256,31 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, + "azimuth" DECIMAL, "electricalAntennaTilt" INTEGER, "geo-location" geography, + "horizontalBeamWidth" DECIMAL, "mechanicalAntennaBearing" INTEGER, "mechanicalAntennaTilt" INTEGER, "positionWithinSector" TEXT, "totalTilt" INTEGER, + "verticalBeamWidth" DECIMAL, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_installed-at-site" TEXT, "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" TEXT, "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -265,7 +307,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -279,11 +322,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-as-cloudifiedNF" TEXT, "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb + "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -305,7 +350,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "nRFqBands" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -323,11 +369,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-ocucpFunction" TEXT, "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" TEXT, "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, - "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb + "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -351,16 +399,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_NRCELLDU" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb + "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb, + "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -391,21 +442,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_used-by-nrCellDu" TEXT, "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_FK_used-antennaCapability" TEXT, "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -439,11 +494,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -467,11 +524,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -494,11 +553,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -515,17 +576,20 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, + "dUpLMNId" jsonb, "gNBDUId" BIGINT, "gNBId" BIGINT, "gNBIdLength" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -546,11 +610,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -572,7 +638,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "sectorId" BIGINT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -587,7 +654,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUCPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -602,7 +670,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUUPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -617,7 +686,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_ODUFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -626,6 +696,22 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODU ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_NRCellDU" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "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 ties_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 '{}'; + SELECT ties_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', @@ -776,6 +862,12 @@ SELECT ties_data.create_constraint_if_not_exists( 'ALTER TABLE ties_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( + '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");' +); + SELECT ties_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA', @@ -1064,6 +1156,18 @@ SELECT ties_data.create_constraint_if_not_exists( '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;' ); +SELECT ties_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;' +); + +SELECT ties_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;' +); + 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_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); @@ -1284,6 +1388,8 @@ CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON tie 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_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_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_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); @@ -1332,6 +1438,12 @@ CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON tie 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_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_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_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_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 ties_data."o-ran-smo-teiv-ran_ODUFunction"; @@ -1352,6 +1464,8 @@ ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; +ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; + ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; 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 new file mode 100644 index 0000000..18ee6f3 --- /dev/null +++ b/charts/smo/topology-exposure-inventory/resources/init_sql/03_init-teiv-exposure-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +COMMIT; diff --git a/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt b/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt index f9abb0a..dc77c25 100644 --- a/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt +++ b/docker-compose/cloudEventProducer/events/cloudEventExampleMerge.txt @@ -236,134 +236,222 @@ ce_specversion:::1.0,ce_id:::a30e63c9-d29e-46ff-b99a-b63ed83fd237,ce_source:::dm { "id": "urn:oran:smo:teiv:MANAGEDELEMENT_MANAGES_ODUFUNCTION=1", "aSide": "urn:3gpp:dn:ManagedElement=NR01", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ { "id": "urn:oran:smo:teiv:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=1", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=2", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=2" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=3", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=3" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=3", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { "id": "urn:oran:smo:teiv:ODUFUNCTION_PROVIDES_NRCELLDU=1", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:ODUFUNCTION_PROVIDES_NRCELLDU=2", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ { "id": "urn:oran:smo:teiv:NRCELLDU_USES_NRSECTORCARRIER=1", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:NRCELLDU_USES_NRSECTORCARRIER=2", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=2" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:NRCELLDU_USES_NRSECTORCARRIER=3", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=3" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=3", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "urn:oran:smo:teiv:NRSECTORCARRIER_USES_ANTENNACAPABILITY=1", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=1", - "bSide": "urn:oran:smo:teiv:AntennaCapability=1" + "bSide": "urn:oran:smo:teiv:AntennaCapability=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:NRSECTORCARRIER_USES_ANTENNACAPABILITY=2", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=2", - "bSide": "urn:oran:smo:teiv:AntennaCapability=2" + "bSide": "urn:oran:smo:teiv:AntennaCapability=2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:NRSECTORCARRIER_USES_ANTENNACAPABILITY=3", "aSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRSectorCarrier=3", - "bSide": "urn:oran:smo:teiv:AntennaCapability=2" + "bSide": "urn:oran:smo:teiv:AntennaCapability=2", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ { "id": "urn:oran:smo:teiv:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=1", "aSide": "urn:oran:smo:teiv:AntennaModule=1", - "bSide": "urn:oran:smo:teiv:AntennaCapability=1" + "bSide": "urn:oran:smo:teiv:AntennaCapability=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=2", "aSide": "urn:oran:smo:teiv:AntennaModule=2", - "bSide": "urn:oran:smo:teiv:AntennaCapability=2" + "bSide": "urn:oran:smo:teiv:AntennaCapability=2", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-equipment:ANTENNAMODULE_INSTALLED_AT_SITE": [ { "id": "urn:oran:smo:teiv:ANTENNAMODULE_INSTALLED_AT_SITE=1", "aSide": "urn:oran:smo:teiv:AntennaModule=1", - "bSide": "urn:oran:smo:teiv:Site=1" + "bSide": "urn:oran:smo:teiv:Site=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:ANTENNAMODULE_INSTALLED_AT_SITE=2", "aSide": "urn:oran:smo:teiv:AntennaModule=2", - "bSide": "urn:oran:smo:teiv:Site=2" + "bSide": "urn:oran:smo:teiv:Site=2", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU": [ { "id": "urn:oran:smo:teiv:SECTOR_GROUPS_NRCELLDU=1", "aSide": "urn:oran:smo:teiv:Sector=1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "urn:oran:smo:teiv:SECTOR_GROUPS_NRCELLDU=2", "aSide": "urn:oran:smo:teiv:Sector=2", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1,NRCellDU=2", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-rel-oam-cloud:NFDEPLOYMENT_SERVES_MANAGEDELEMENT": [ { "id": "urn:oran:smo:teiv:NFDEPLOYMENT_SERVES_MANAGEDELEMENT=1", "aSide": "urn:oran:smo:teiv:NFDeployment:1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01" + "bSide": "urn:3gpp:dn:ManagedElement=NR01", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-rel-oam-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF": [ { "id": "urn:o-ran:smo-teiv-rel-oam-cloud:1", "aSide": "urn:3gpp:dn:ManagedElement=NR01", - "bSide": "urn:oran:smo:teiv:CloudifiedNF:1" + "bSide": "urn:oran:smo:teiv:CloudifiedNF:1", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-cloud:CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT": [ { "id": "urn:o-ran:smo-teiv-cloud:1", "aSide": "urn:oran:smo:teiv:CloudifiedNF:1", - "bSide": "urn:oran:smo:teiv:NFDeployment:1" + "bSide": "urn:oran:smo:teiv:NFDeployment:1", + "sourceIds": [ + "source1", + "source2" + ] } ], "o-ran-smo-teiv-rel-cloud-ran:NFDEPLOYMENT_SERVES_ODUFUNCTION": [ { "id": "urn:o-ran:smo-teiv-rel-cloud-ran:1", "aSide": "urn:oran:smo:teiv:NFDeployment:1", - "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1" + "bSide": "urn:3gpp:dn:ManagedElement=NR01,ODUFunction=1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/docker-compose/copySqlSchemaFromPgsqlGenerator.sh b/docker-compose/copySqlSchemaFromPgsqlGenerator.sh index 9444548..ebf3218 100644 --- a/docker-compose/copySqlSchemaFromPgsqlGenerator.sh +++ b/docker-compose/copySqlSchemaFromPgsqlGenerator.sh @@ -32,7 +32,8 @@ REPLACEMENT2="'topology_exposure_user'" declare -A FILES FILES=( ["00_init-oran-smo-teiv-data.sql"]="01_init-teiv-exposure-data.sql" ["01_init-oran-smo-teiv-model.sql"]="00_init-teiv-exposure-model.sql" - ["02_init-oran-smo-teiv-consumer-data.sql"]="02_init-teiv-exposure-consumer-data.sql") + ["02_init-oran-smo-teiv-consumer-data.sql"]="02_init-teiv-exposure-consumer-data.sql" + ["03_init-oran-smo-teiv-groups.sql"]="03_init-teiv-exposure-groups.sql") mkdir -p "$TARGET_DIR" 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 7fbb357..dbb7b9d 100644 --- a/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql +++ b/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE 'topology_exposure_user'; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -79,9 +75,6 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN @@ -117,6 +110,8 @@ FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_aSide_NFDeployme FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_bSide_ODUFunction FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08 CONSTRAINT FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960 CONSTRAINT FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_aSide_AntennaModule FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_bSide_NRCellDU FK_8605800A4923C52258A8CE3989E18A7C93D22E8C CONSTRAINT IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_classifiers IDX_BD96130868B69147B2F87B0D15F5829690DEF454 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_sourceIds IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_classifiers IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52 INDEX @@ -206,6 +201,8 @@ IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERV IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_sourceIds IDX_5996D077978D38D0C1A951A262F1F7E1E339F052 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_classifiers IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_sourceIds IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E INDEX IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_decorators IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C INDEX IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators INDEX @@ -243,6 +240,7 @@ IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ra IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_ADD3393C27589066C4993A3491436C6FB57A539F INDEX IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F INDEX IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators INDEX @@ -251,6 +249,7 @@ IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_decora IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_decorators IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F INDEX IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_decorators IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835 INDEX IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_decorators IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753 INDEX PK_o-ran-smo-teiv-cloud_CloudifiedNF_id PK_o-ran-smo-teiv-cloud_CloudifiedNF_id CONSTRAINT PK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_id PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6 CONSTRAINT PK_o-ran-smo-teiv-cloud_NFDeployment_id PK_o-ran-smo-teiv-cloud_NFDeployment_id CONSTRAINT @@ -276,6 +275,7 @@ PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_id PK_2D854968 PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_id PK_E551D02D14B3C04A565DC73A386BEB29627D3C08 CONSTRAINT PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_id PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3 CONSTRAINT PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_id PK_F41873285F3BD831F63C6041B4356A063403406D CONSTRAINT REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN @@ -355,6 +355,23 @@ REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN +REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_metadata_NRCELLDU_USES_NRSECTORCARRIER REL_metadata_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_metadata_SECTOR_GROUPS_ANTENNAMODULE REL_metadata_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_metadata_SECTOR_GROUPS_NRCELLDU REL_metadata_SECTOR_GROUPS_NRCELLDU COLUMN UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT @@ -382,6 +399,7 @@ arfcnUL arfcnUL COLUMN azimuth azimuth COLUMN bSChannelBwDL bSChannelBwDL COLUMN bSide_AntennaCapability bSide_AntennaCapability COLUMN +bSide_NRCellDU bSide_NRCellDU COLUMN bSide_NearRTRICFunction bSide_NearRTRICFunction COLUMN bSide_OCUCPFunction bSide_OCUCPFunction COLUMN bSide_OCUUPFunction bSide_OCUUPFunction COLUMN @@ -389,6 +407,7 @@ bSide_OCloudNamespace bSide_OCloudNamespace COLUMN bSide_OCloudSite bSide_OCloudSite COLUMN bSide_ODUFunction bSide_ODUFunction COLUMN cellLocalId cellLocalId COLUMN +dUpLMNId dUpLMNId COLUMN eUtranFqBands eUtranFqBands COLUMN electricalAntennaTilt electricalAntennaTilt COLUMN frequencyDL frequencyDL COLUMN @@ -399,9 +418,11 @@ gNBId gNBId COLUMN gNBIdLength gNBIdLength COLUMN geo-location geo-location COLUMN geranFqBands geranFqBands COLUMN +horizontalBeamWidth horizontalBeamWidth COLUMN id id COLUMN mechanicalAntennaBearing mechanicalAntennaBearing COLUMN mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +metadata metadata COLUMN nCI nCI COLUMN nRFqBands nRFqBands COLUMN nRPCI nRPCI COLUMN @@ -433,6 +454,7 @@ o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-re o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION TABLE o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION TABLE o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU TABLE oruId oruId COLUMN pLMNId pLMNId COLUMN pLMNIdList pLMNIdList COLUMN @@ -440,6 +462,7 @@ plmnId plmnId COLUMN positionWithinSector positionWithinSector COLUMN sectorId sectorId COLUMN totalTilt totalTilt COLUMN +verticalBeamWidth verticalBeamWidth COLUMN \. COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; @@ -448,42 +471,43 @@ _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW 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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= 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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgY29tbW9uIHR5cGVzIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGdyb3VwaW5nIFRvcF9HcnBfVHlwZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkdyb3VwaW5nIGNvbnRhaW5pbmcgdGhlIGtleSBhdHRyaWJ1dGUgY29tbW9uIHRvIGFsbCB0eXBlcy4KICAgICAgICAgICAgQWxsIHR5cGVzIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICAgICAgbGVhZiBpZCB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdG9wb2xvZ3kgZW50aXRpZXMuIFJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAgICBFbnRpdHkgSW5zdGFuY2UgSWRlbnRpZmllci4iOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgZGVjb3JhdG9ycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgZm9yIGFwcGxpY2F0aW9ucyB3aXNoaW5nCiAgICAgICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gZGVjb3JhdG9ycy4gVGhpcyBpcyBkb25lIHZpYSBhdWdtZW50YXRpb25zLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJDb25zdW1lciBkZWZpbmVkIHRhZ3MgdG8gdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIGlkZW50aXR5cmVmIHsgYmFzZSBjbGFzc2lmaWVyOyB9CiAgICB9CgogICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgIHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGFydGljaXBhdGluZyBlbnRpdGllcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllcnsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4KICAgICAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBiZWFyaW5nIG9uIGFudGVubmEgc3VidW5pdCB3aGVyZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgICAgICBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEgZWxlbWVudCByZXNwZWN0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIHBsYW5lLiBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHRvdGFsVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVG90YWwgYW50ZW5uYSBlbGV2YXRpb24gaW5jbHVkaW5nIHRoZSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgICAgIFRpbHQgKFJFVCkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIGRpcmVjdGlvbiBvcnRob2dvbmFsIHRvIGFudGVubmEgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBhbnRlbm5hQmVhbVdpZHRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgYW5ndWxhciBzcGFuIG9mIHRoZSBtYWluIGxvYmUgb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICByYWRpYXRpb24gcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4KICAgICAgICAgICAgICAgICAgICBkZWdyZWVzLiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgICAgIGluc3RhbGxlZC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwoKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX0lOU1RBTExFRF9BVF9TSVRFIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBNYW5hZ2VkIEVsZW1lbnQgKE1FKSBpcyBhIG5vZGUgaW50byBhIHRlbGVjb21tdW5pY2F0aW9uCiAgICAgICAgICAgIG5ldHdvcmsgcHJvdmlkaW5nIHN1cHBvcnQgYW5kL29yIHNlcnZpY2UgdG8gc3Vic2NyaWJlcnMuIEFuIE1FCiAgICAgICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICAgICAgb3ZlciBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzIGZvciB0aGUgcHVycG9zZSBvZiBiZWluZyBtb25pdG9yZWQKICAgICAgICAgICAgYW5kL29yIGNvbnRyb2xsZWQuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CiAgICB9Cn0= -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBSYWRpbyBVbml0IChPLVJVKS4KCiAgICAgICAgQSBsb2dpY2FsIG5vZGUgaG9zdGluZyBMb3ctUEhZIGxheWVyIGFuZCBSRiBwcm9jZXNzaW5nIGJhc2VkIG9uIGEKICAgICAgICBsb3dlciBsYXllciBmdW5jdGlvbmFsIHNwbGl0LiAgVGhpcyBpcyBzaW1pbGFyIHRvIDNHUFDigJlzIOKAnFRSUOKAnSBvcgogICAgICAgIOKAnFJSSOKAnSBidXQgbW9yZSBzcGVjaWZpYyBpbiBpbmNsdWRpbmcgdGhlIExvdy1QSFkgbGF5ZXIgKEZGVC9pRkZULAogICAgICAgIFBSQUNIIGV4dHJhY3Rpb24pLiBUaGUgTy1SVSB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBpbnRlcmZhY2UKICAgICAgICAoYWxzbyBrbm93biBhcyBMTFMgaW50ZXJmYWNlKSBhcyB3ZWxsIGFzIExvdy1QSFkgZnVuY3Rpb25zIG9mIHRoZQogICAgICAgIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4gVGhlIE8tUlUKICAgICAgICB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBNLVBsYW5lIGludGVyZmFjZSB0b3dhcmRzIHRoZSBPLURVCiAgICAgICAgYW5kIFNNTy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTy1SVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBvcnVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBPLVJVIHdpdGhpbiBhIE9SVUZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk5lYXItUmVhbC1UaW1lIFJBTiBJbnRlbGxpZ2VudCBDb250cm9sbGVyIChOZWFyLVJUIFJJQykuCgogICAgICAgIEFuIE8tUkFOIE5ldHdvcmsgRnVuY3Rpb24gKE5GKSB0aGF0IGVuYWJsZXMgbmVhci1yZWFsLXRpbWUgY29udHJvbAogICAgICAgIGFuZCBvcHRpbWl6YXRpb24gb2YgUkFOIGVsZW1lbnRzIGFuZCByZXNvdXJjZXMgdmlhIGZpbmUtZ3JhaW5lZAogICAgICAgIGRhdGEgY29sbGVjdGlvbiBhbmQgYWN0aW9ucyBvdmVyIEUyIGludGVyZmFjZS4gSXQgbWF5IGluY2x1ZGUKICAgICAgICBBSS9NTCAoQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UgLyBNYWNoaW5lIExlYXJuaW5nKSB3b3JrZmxvdwogICAgICAgIGluY2x1ZGluZyBtb2RlbCB0cmFpbmluZywgaW5mZXJlbmNlLCBhbmQgdXBkYXRlcy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTmVhci1SVCBSSUMgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmVhclJ0UmljSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTmVhci1SVCBSSUMgd2l0aGluIGEgTmVhclJUUklDRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gRGlzdHJpYnV0ZWQgVW5pdCAoTy1EVSkuCgogICAgICAgIFRoZSBPLURVIGlzIGFuIE8tUkFOIE5GIGluIHRoZSBPLVJBTiBBcmNoaXRlY3R1cmUuIEFuIE8tRFUsIGNvbWJpbmVkCiAgICAgICAgd2l0aCBvbmUgb3IgbW9yZSBPLVJVKHMpIGNvbm5lY3RlZCB0byBpdCwgc3VwcG9ydHMgYW5kIGlzIGZ1bGx5CiAgICAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBmdW5jdGlvbnMgb2YgYSBnTkItRFUgYXMgZGVmaW5lZCBieSAzR1BQIFRTIDM4LjQwMS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgIGNvbm5lY3RlZCB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIE8tRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIE8tRFUgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE5HLVJBTgogICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApCgogICAgICAgIFRoaXMgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgUmFkaW8gUmVzb3VyY2UgQ29udHJvbCAoUlJDKSBhbmQKICAgICAgICB0aGUgY29udHJvbCBwbGFuZSBwYXJ0IG9mIHRoZSBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbAogICAgICAgIChQRENQKS4gVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tQ1UtVVAgYW5kIHRoZSBGMS1DIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aCB0aGUgTy1SQU4KICAgICAgICBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtQ1A6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9ubHkgb25lIE8tQ1UtQ1AgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25lIE8tRFUuIE9ubHkgb25lIE8tQ1UtQ1AgaXMgY29ubmVjdGVkIHRvIG9uZQogICAgICAgIE8tQ1UtVVAuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIKICAgICAgICB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUgTy1DVS1VUCBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtQ1AgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLUNQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBnTm9kZUItQ1UiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTgogICAgICAgICAgICAgICAgbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ1VVUEZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gQ2VudHJhbGl6ZWQgVW5pdCBVc2VyIFBsYW5lIChPLUNVLVVQKQoKICAgICAgICBBbiBPLUNVLVVQIGlzIGEgbG9naWNhbCBub2RlIGhvc3RpbmcgdGhlIFVzZXIgUGxhbmUgcGFydCBvZiB0aGUKICAgICAgICBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbCAoUERDUCkgYW5kIHRoZSBTZXJ2aWNlIERhdGEKICAgICAgICBBZGFwdGF0aW9uIFByb3RvY29sIChTREFQKS4gVGhlIE8tQ1UtVVAgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlCiAgICAgICAgY29ubmVjdGVkIHdpdGggdGhlIE8tQ1UtQ1AgYW5kIHRoZSBGMS1VIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aAogICAgICAgIHRoZSBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtVVA6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1DUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9uZSBPLUNVLVVQIGlzCiAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIE8tQ1UtQ1AuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUKICAgICAgICBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQogICAgICAgIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYW4gTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtVVAgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLVVQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsaXN0IHBMTU5JZExpc3QgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLUNVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uCiAgICAgICAgU2lnbmFsIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQKICAgICAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1EVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIHNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbiBzaWduYWwKICAgICAgICAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kIHByb3ZpZGUKICAgICAgICB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBncm91cCBvZiBjby1sb2NhdGVkIENlbGxzIHRoYXQgaGF2ZSBhIHNoYXJlZAogICAgICAgIGNvdmVyYWdlIGFyZWEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUkNFTExEVSB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSB1c2VzIE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZWQgYnkgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTlJTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9DTE9VRF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09EVUZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VDUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0NVVVBGVU5DVElPTiB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWduYmN1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19BTlRFTk5BTU9EVUxFIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlY3RvciBncm91cHMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOlNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX0NMT1VEOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfREVQTE9ZRURfQVNfQ0xPVURJRklFRE5GIHsgIC8vIDAuLjEgdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBkZXBsb3llZC1hcy1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IGRlcGxveWVkIGFzIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGRlcGxveWVkLW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkaWZpZWQgTkYgZGVwbG95cyBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtY2xvdWQ6Q2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTUFOQUdFREVMRU1FTlQgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgc2VydmljZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 -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-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT0RVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +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== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud -o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment -o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment -o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam -o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran +COPY ties_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"] +o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud ["geo-location", "name"] +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment ["geo-location", "name"] +o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam [] +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRTAC", "plmnId"] +o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRPCI", "nRTAC"] +o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"] +o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran ["nearRtRicId", "pLMNId"] +o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"] +o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran ["gNBId", "gNBIdLength", "pLMNIdList"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +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; 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 CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT comprised-nFDeployment CloudifiedNF o-ran-smo-teiv-cloud 1 1 comprised-by-cloudifiedNF NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF deployed-as-cloudifiedNF ManagedElement o-ran-smo-teiv-oam 1 1 deployed-managedElement CloudifiedNF o-ran-smo-teiv-cloud 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-rel-oam-cloud MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION managed-nearRTRICFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-rel-oam-ran @@ -495,7 +519,7 @@ NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE deployed-on-ocloudNamespace NFDeploymen NFDEPLOYMENT_SERVES_MANAGEDELEMENT serviced-managedElement NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 serving-nFDeployment ManagedElement o-ran-smo-teiv-oam 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-rel-oam-cloud NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION serviced-nearRTRICFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION o-ran-smo-teiv-rel-cloud-ran NFDEPLOYMENT_SERVES_OCUCPFUNCTION serviced-ocucpFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran -NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-gnbcuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-ocuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran NFDEPLOYMENT_SERVES_ODUFUNCTION serviced-oduFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran NODECLUSTER_LOCATED_AT_OCLOUDSITE located-at-ocloudSite NodeCluster o-ran-smo-teiv-cloud 1 9223372036854775807 location-of-onodeCluster OCloudSite o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud NRCELLDU_USES_NRSECTORCARRIER used-nrSectorCarrier NRCellDU o-ran-smo-teiv-ran 0 1 used-by-nrCellDu NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-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 17921ee..138e865 100644 --- a/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql +++ b/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql @@ -43,22 +43,47 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); -CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT ties_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");' +); + +SELECT ties_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" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -73,7 +98,8 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "bSide_AntennaCapability" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -87,7 +113,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -102,7 +129,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "bSide_OCloudNamespace" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -117,16 +145,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_comprised-by-cloudifiedNF" TEXT, "REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" TEXT, "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_FK_serviced-managedElement" TEXT, "REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" TEXT, "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, - "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb + "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -153,7 +184,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "bSide_OCloudSite" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -167,7 +199,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -182,11 +215,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-on-nodeCluster" TEXT, "REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" TEXT, "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, - "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb + "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -207,7 +242,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -220,25 +256,31 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, + "azimuth" DECIMAL, "electricalAntennaTilt" INTEGER, "geo-location" geography, + "horizontalBeamWidth" DECIMAL, "mechanicalAntennaBearing" INTEGER, "mechanicalAntennaTilt" INTEGER, "positionWithinSector" TEXT, "totalTilt" INTEGER, + "verticalBeamWidth" DECIMAL, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_installed-at-site" TEXT, "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" TEXT, "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -265,7 +307,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -279,11 +322,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-as-cloudifiedNF" TEXT, "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb + "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -305,7 +350,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "nRFqBands" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -323,11 +369,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-ocucpFunction" TEXT, "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" TEXT, "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, - "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb + "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -351,16 +399,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_NRCELLDU" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb + "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb, + "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -391,21 +442,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_used-by-nrCellDu" TEXT, "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_FK_used-antennaCapability" TEXT, "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -439,11 +494,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -467,11 +524,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -494,11 +553,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -515,17 +576,20 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, + "dUpLMNId" jsonb, "gNBDUId" BIGINT, "gNBId" BIGINT, "gNBIdLength" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -546,11 +610,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -572,7 +638,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "sectorId" BIGINT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -587,7 +654,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUCPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -602,7 +670,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUUPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -617,7 +686,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_ODUFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -626,6 +696,22 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODU ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_NRCellDU" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "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 ties_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 '{}'; + SELECT ties_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', @@ -776,6 +862,12 @@ SELECT ties_data.create_constraint_if_not_exists( 'ALTER TABLE ties_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( + '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");' +); + SELECT ties_data.create_constraint_if_not_exists( '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', 'FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA', @@ -1064,6 +1156,18 @@ SELECT ties_data.create_constraint_if_not_exists( '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;' ); +SELECT ties_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;' +); + +SELECT ties_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;' +); + 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_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); @@ -1284,6 +1388,8 @@ CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON tie 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_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_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_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); @@ -1332,6 +1438,12 @@ CREATE INDEX IF NOT EXISTS "IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A" ON tie 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_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_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_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_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 ties_data."o-ran-smo-teiv-ran_ODUFunction"; @@ -1352,6 +1464,8 @@ ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; +ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; + ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; diff --git a/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql b/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql new file mode 100644 index 0000000..18ee6f3 --- /dev/null +++ b/docker-compose/sql_scripts/03_init-teiv-exposure-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +COMMIT; diff --git a/docker-compose/sql_scripts/waitForFiles.sh b/docker-compose/sql_scripts/waitForFiles.sh index 56e0cbb..ee95677 100755 --- a/docker-compose/sql_scripts/waitForFiles.sh +++ b/docker-compose/sql_scripts/waitForFiles.sh @@ -2,10 +2,11 @@ FILE_PATH="/docker-entrypoint-initdb.d/00_init-teiv-exposure-model.sql" FILE_PATH1="/docker-entrypoint-initdb.d/01_init-teiv-exposure-data.sql" FILE_PATH2="/docker-entrypoint-initdb.d/02_init-teiv-exposure-consumer-data.sql" +FILE_PATH3="/docker-entrypoint-initdb.d/03_init-teiv-exposure-groups.sql" echo "Waiting for sql files to be available..." -while [ ! -f "$FILE_PATH" ] || [ ! -f "$FILE_PATH1" ] || [ ! -f "$FILE_PATH2" ]; do +while [ ! -f "$FILE_PATH" ] || [ ! -f "$FILE_PATH1" ] || [ ! -f "$FILE_PATH2" ] || [ ! -f "$FILE_PATH3" ]; do echo "Waiting for sql files to be available..." sleep 1 done diff --git a/docs/offeredapis/html/index.html b/docs/offeredapis/html/index.html index c9662b8..be8e186 100644 --- a/docs/offeredapis/html/index.html +++ b/docs/offeredapis/html/index.html @@ -871,6 +871,34 @@ ul.nav-tabs { } } } +}; + defs["CreateGroupPayload"] = { + "title" : "CreateGroupPayload", + "type" : "object", + "discriminator" : { + "propertyName" : "type" + }, + "oneOf" : [ { + "$ref" : "#/components/schemas/static" + }, { + "$ref" : "#/components/schemas/dynamic" + } ] +}; + defs["Criteria"] = { + "title" : "Criteria", + "type" : "object", + "discriminator" : { + "propertyName" : "queryType" + }, + "oneOf" : [ { + "$ref" : "#/components/schemas/getEntitiesByDomain" + }, { + "$ref" : "#/components/schemas/getEntitiesByType" + }, { + "$ref" : "#/components/schemas/getRelationshipsForEntityId" + }, { + "$ref" : "#/components/schemas/getRelationshipsByType" + } ] }; defs["Decorator"] = { "title" : "Decorator", @@ -883,7 +911,7 @@ ul.nav-tabs { "decorators" : { "type" : "object", "additionalProperties" : true, - "description" : "Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by it's schema." + "description" : "Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by its schema." }, "entityIds" : { "type" : "array", @@ -942,30 +970,72 @@ ul.nav-tabs { } } }; - defs["DynamicSelection"] = { + defs["dynamic"] = { + "title" : "CreateDynamicGroupPayload", + "required" : [ "criteria", "name", "type" ], "type" : "object", "properties" : { - "resourceQuery" : { - "$ref" : "#/components/schemas/DynamicSelection_resourceQuery" + "name" : { + "maxLength" : 150, + "minLength" : 1, + "type" : "string", + "description" : "A name of the topology group." + }, + "type" : { + "type" : "string", + "description" : "Allowed: dynamic" + }, + "criteria" : { + "$ref" : "#/components/schemas/Criteria" } - }, - "additionalProperties" : false + } }; - defs["DynamicSelection_resourceQuery"] = { - "required" : [ "url" ], + defs["DynamicEnum"] = { + "type" : "string", + "enum" : [ "dynamic" ] +}; + defs["DynamicGroupByIdResponse"] = { + "title" : "DynamicGroup", + "required" : [ "criteria", "id", "members", "name", "type" ], "type" : "object", "properties" : { - "url" : { - "type" : "string" + "id" : { + "type" : "string", + "description" : "The unique identifier of the topology group." }, - "method" : { - "type" : "string" + "name" : { + "type" : "string", + "description" : "The unique name of the topology group." + }, + "type" : { + "$ref" : "#/components/schemas/DynamicEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" }, - "queryParams" : { - "type" : "object" + "criteria" : { + "$ref" : "#/components/schemas/Criteria" + } + } +}; + defs["DynamicGroupResponse"] = { + "title" : "DynamicGroup", + "required" : [ "id", "members", "name", "type" ], + "type" : "object", + "properties" : { + "id" : { + "type" : "string", + "description" : "The unique identifier of the topology group." }, - "requestBody" : { - "type" : "object" + "name" : { + "type" : "string", + "description" : "The unique name of the topology group." + }, + "type" : { + "$ref" : "#/components/schemas/DynamicEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" } } }; @@ -1056,39 +1126,117 @@ ul.nav-tabs { } } }; - defs["Group"] = { + defs["getEntitiesByDomain"] = { + "title" : "getEntitiesByDomain", + "required" : [ "domain", "queryType" ], "type" : "object", "properties" : { - "groupName" : { + "queryType" : { + "type" : "string", + "description" : "Allowed: getEntitiesByDomain" + }, + "domain" : { "type" : "string" }, - "criteria" : { - "$ref" : "#/components/schemas/TopologySelection" + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" } } }; - defs["GroupResponse"] = { + defs["getEntitiesByType"] = { + "title" : "getEntitiesByType", + "required" : [ "domain", "entityTypeName", "queryType" ], "type" : "object", "properties" : { - "id" : { + "queryType" : { + "type" : "string", + "description" : "Allowed: getEntitiesByType" + }, + "domain" : { "type" : "string" }, - "groupName" : { + "entityTypeName" : { "type" : "string" }, - "criteria" : { - "$ref" : "#/components/schemas/GroupResponse_criteria" + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + } +}; + defs["getRelationshipsByType"] = { + "title" : "getRelationshipsByType", + "required" : [ "domain", "queryType", "relationshipTypeName" ], + "type" : "object", + "properties" : { + "queryType" : { + "type" : "string", + "description" : "Allowed: getRelationshipsByType" + }, + "domain" : { + "type" : "string" + }, + "relationshipTypeName" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + } +}; + defs["getRelationshipsForEntityId"] = { + "title" : "getRelationshipsForEntityId", + "required" : [ "domain", "entityId", "entityTypeName", "queryType" ], + "type" : "object", + "properties" : { + "queryType" : { + "type" : "string", + "description" : "Allowed: getRelationshipsForEntityId" + }, + "domain" : { + "type" : "string" + }, + "entityTypeName" : { + "type" : "string" + }, + "entityId" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" } } }; - defs["GroupResponse_criteria"] = { + defs["GroupByIdResponse"] = { + "title" : "Group", + "type" : "object", + "oneOf" : [ { + "$ref" : "#/components/schemas/StaticGroupByIdResponse" + }, { + "$ref" : "#/components/schemas/DynamicGroupByIdResponse" + } ] +}; + defs["GroupResponse"] = { + "title" : "Group", + "type" : "object", "oneOf" : [ { - "$ref" : "#/components/schemas/StaticSelection" + "$ref" : "#/components/schemas/StaticGroupResponse" }, { - "$ref" : "#/components/schemas/DynamicSelection" + "$ref" : "#/components/schemas/DynamicGroupResponse" } ] }; - defs["Groups"] = { + defs["GroupsResponse"] = { "title" : "Groups", "type" : "object", "properties" : { @@ -1127,6 +1275,37 @@ ul.nav-tabs { "format" : "uri-template" } } +}; + defs["MembersResponse"] = { + "title" : "GroupMembers", + "type" : "object", + "properties" : { + "items" : { + "type" : "array", + "items" : { + "type" : "object", + "description" : "Refer to yang model for schema definition of topology objects." + } + }, + "self" : { + "$ref" : "#/components/schemas/Href" + }, + "first" : { + "$ref" : "#/components/schemas/Href" + }, + "prev" : { + "$ref" : "#/components/schemas/Href" + }, + "next" : { + "$ref" : "#/components/schemas/Href" + }, + "last" : { + "$ref" : "#/components/schemas/Href" + }, + "totalCount" : { + "type" : "integer" + } + } }; defs["RelationshipTypes"] = { "title" : "RelationshipTypes", @@ -1248,24 +1427,115 @@ ul.nav-tabs { } } }; - defs["StaticSelection"] = { + defs["static"] = { + "title" : "CreateStaticGroupPayload", + "required" : [ "name", "providedMembers", "type" ], "type" : "object", "properties" : { - "resourceInstances" : { + "name" : { + "maxLength" : 150, + "minLength" : 1, + "type" : "string", + "description" : "A name of the topology group." + }, + "type" : { + "type" : "string", + "description" : "Allowed: static" + }, + "providedMembers" : { "minItems" : 1, "type" : "array", "items" : { - "type" : "string" + "type" : "object", + "description" : "Refer to yang model for schema definition of topology objects." } } } }; - defs["TopologySelection"] = { - "oneOf" : [ { - "$ref" : "#/components/schemas/StaticSelection" - }, { - "$ref" : "#/components/schemas/DynamicSelection" - } ] + defs["StaticEnum"] = { + "type" : "string", + "enum" : [ "static" ] +}; + defs["StaticGroupByIdResponse"] = { + "title" : "StaticGroup", + "required" : [ "id", "members", "name", "providedMembers", "type" ], + "type" : "object", + "properties" : { + "id" : { + "type" : "string", + "description" : "The unique identifier of the topology group." + }, + "name" : { + "type" : "string", + "description" : "The unique name of the topology group." + }, + "type" : { + "$ref" : "#/components/schemas/StaticEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + }, + "providedMembers" : { + "$ref" : "#/components/schemas/Href" + } + } +}; + defs["StaticGroupResponse"] = { + "title" : "StaticGroup", + "required" : [ "id", "members", "name", "providedMembers", "type" ], + "type" : "object", + "properties" : { + "id" : { + "type" : "string", + "description" : "The unique identifier of the topology group." + }, + "name" : { + "type" : "string", + "description" : "The unique name of the topology group." + }, + "type" : { + "$ref" : "#/components/schemas/StaticEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + }, + "providedMembers" : { + "$ref" : "#/components/schemas/Href" + } + } +}; + defs["UpdateGroupNamePayload"] = { + "title" : "UpdateGroupNamePayload", + "required" : [ "name" ], + "type" : "object", + "properties" : { + "name" : { + "maxLength" : 150, + "minLength" : 1, + "type" : "string" + } + } +}; + defs["UpdateProvidedMembersPayload"] = { + "title" : "UpdateProvidedMembersPayload", + "required" : [ "operation", "providedMembers" ], + "type" : "object", + "properties" : { + "operation" : { + "type" : "string", + "description" : "The operation to be performed on the members of topology group.", + "enum" : [ "merge", "remove" ] + }, + "providedMembers" : { + "minItems" : 1, + "type" : "array", + "description" : "Members to be added or removed from the group.", + "items" : { + "type" : "object", + "description" : "Refer to yang model for schema definition of topology objects." + } + } + } }; @@ -1322,6 +1592,31 @@ ul.nav-tabs {
  • getTopologyRelationshipTypes
  • + +
  • + createGroup +
  • +
  • + deleteGroup +
  • +
  • + getAllGroups +
  • +
  • + getGroupById +
  • +
  • + getMembers +
  • +
  • + getProvidedMembers +
  • +
  • + updateGroupName +
  • +
  • + updateProvidedMembers +
  • createSchema @@ -1335,22 +1630,6 @@ ul.nav-tabs {
  • getSchemas
  • - -
  • - createGroup -
  • -
  • - deleteGroup -
  • -
  • - getAllGroups -
  • -
  • - getGroup -
  • -
  • - updateGroup -
  • @@ -1385,6 +1664,9 @@ 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.

    +

    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.

    Topology Exposure and Inventory API provides the capabilities to fetch topology data. Using the filtering options, it is possible to define more specific query requests.

    @@ -1396,22 +1678,31 @@ 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 matches the given property in the scopeFilter parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | 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=3 and @gNBId=111] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 and the gNBId equals 111 | -| 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=3] | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 or the sourceIds contains an item with "SubNetwork=Ireland" |

    +

    | 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" |

    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 |

    +

    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 | |:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 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 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 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. | +| 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. | +| 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. | +| 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. |

    Querying entities for relationships

    The entityTypeName is used as the root of the queries.

    | Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | @@ -1432,7 +1723,7 @@ retrieved and filtered using the /attributes.

    | 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 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. |

    The entityName is used as the root of the queries.

    | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -1799,8 +2090,11 @@ $(document).ready(function() { "$ref" : "#/components/schemas/Classifier" }, "examples" : { - "classifier" : { - "$ref" : "#/components/examples/ClassifierExample" + "updateClassifier" : { + "$ref" : "#/components/examples/ClassifierMergeExample" + }, + "removeClassifier" : { + "$ref" : "#/components/examples/ClassifierDeleteExample" } } } @@ -2657,8 +2951,11 @@ $(document).ready(function() { "$ref" : "#/components/schemas/Decorator" }, "examples" : { - "decorator" : { - "$ref" : "#/components/examples/DecoratorExample" + "mergeDecorator" : { + "$ref" : "#/components/examples/DecoratorMergeExample" + }, + "removeDecorator" : { + "$ref" : "#/components/examples/DecoratorDeleteExample" } } } @@ -3974,7 +4271,7 @@ Result limiter.

    curl -X GET \
      -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entity-types/{entityTypeName}/entities/{entityId}/relationships?targetFilter=/attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]&offset=56&limit=56"
    + "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entity-types/{entityTypeName}/entities/{entityId}/relationships?targetFilter=/sourceIds;/classifiers&scopeFilter=/sourceIds[contains(@item,'ManagedElement=1')]&offset=56&limit=56"
     
    @@ -3992,11 +4289,11 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | String entityId = entityId_example; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -4021,8 +4318,8 @@ final String accept = new String(); // String | final String domainName = new String(); // String | domain name final String entityTypeName = new String(); // String | final String entityId = new String(); // String | -final String targetFilter = new String(); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -final String scopeFilter = new String(); // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +final String targetFilter = new String(); // String | Use *targetFilter* to specify what needs to be returned in the REST response. +final String scopeFilter = new String(); // String | ScopeFilter is used to specify the conditions to be applied. final Integer offset = new Integer(); // Integer | Pagination offset. final Integer limit = new Integer(); // Integer | Result limiter. @@ -4043,11 +4340,11 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | String entityId = entityId_example; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -4071,11 +4368,11 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) String *entityTypeName = entityTypeName_example; // (default to null) String *entityId = entityId_example; // (default to null) -String *targetFilter = /attributes(nCI,nRPCI); // Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -String *scopeFilter = /attributes[@nRTAC=310]; // Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +String *targetFilter = /sourceIds;/classifiers; // Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +String *scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -4105,12 +4402,12 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var entityTypeName = entityTypeName_example; // {String} var entityId = entityId_example; // {String} var opts = { - 'targetFilter': /attributes(nCI,nRPCI), // {String} Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - 'scopeFilter': /attributes[@nRTAC=310], // {String} Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + 'targetFilter': /sourceIds;/classifiers, // {String} Use *targetFilter* to specify what needs to be returned in the REST response. + 'scopeFilter': /sourceIds[contains(@item,'ManagedElement=1')], // {String} ScopeFilter is used to specify the conditions to be applied. 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. }; @@ -4146,11 +4443,11 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var entityTypeName = entityTypeName_example; // String | (default to null) var entityId = entityId_example; // String | (default to null) - var targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) - var scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) + var targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) + var scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -4174,11 +4471,11 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $entityTypeName = entityTypeName_example; // String | $entityId = entityId_example; // String | -$targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -$scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +$targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. +$scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -4199,11 +4496,11 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $entityTypeName = entityTypeName_example; # String | my $entityId = entityId_example; # String | -my $targetFilter = /attributes(nCI,nRPCI); # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -my $scopeFilter = /attributes[@nRTAC=310]; # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +my $targetFilter = /sourceIds;/classifiers; # String | Use *targetFilter* to specify what needs to be returned in the REST response. +my $scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; # String | ScopeFilter is used to specify the conditions to be applied. my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -4226,11 +4523,11 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) entityTypeName = entityTypeName_example # String | (default to null) entityId = entityId_example # String | (default to null) -targetFilter = /attributes(nCI,nRPCI) # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -scopeFilter = /attributes[@nRTAC=310] # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +targetFilter = /sourceIds;/classifiers # String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')] # String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -4247,11 +4544,11 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let entityTypeName = entityTypeName_example; // String let entityId = entityId_example; // String - let targetFilter = /attributes(nCI,nRPCI); // String - let scopeFilter = /attributes[@nRTAC=310]; // String + let targetFilter = /sourceIds;/classifiers; // String + let scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String let offset = 56; // Integer let limit = 56; // Integer @@ -4390,7 +4687,7 @@ domain name
    -Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. +Use *targetFilter* to specify what needs to be returned in the REST response.
    @@ -4410,7 +4707,7 @@ Use *targetFilter* to specify the entity type and attributes to be returned in t
    -Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +ScopeFilter is used to specify the conditions to be applied.
    @@ -4959,7 +5256,7 @@ Result limiter.

    -

    Get topology entities by domain, using specified targetFilter as mandatory query parameter.

    +

    Get topology entities by domain, using a specified *targetFilter* as a query parameter.


    /domains/{domainName}/entities
    @@ -4986,7 +5283,7 @@ Result limiter.
    curl -X GET \
      -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entities?targetFilter=/attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]&offset=56&limit=56"
    + "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entities?targetFilter=/sourceIds;/classifiers&scopeFilter=/sourceIds[contains(@item,'ManagedElement=1')]&offset=56&limit=56"
     
    @@ -5004,9 +5301,9 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String domainName = RAN; // String | domain name + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -5029,8 +5326,8 @@ final api_instance = DefaultApi(); final String accept = new String(); // String | final String domainName = new String(); // String | domain name -final String targetFilter = new String(); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -final String scopeFilter = new String(); // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +final String targetFilter = new String(); // String | Use *targetFilter* to specify what needs to be returned in the REST response. +final String scopeFilter = new String(); // String | ScopeFilter is used to specify the conditions to be applied. final Integer offset = new Integer(); // Integer | Pagination offset. final Integer limit = new Integer(); // Integer | Result limiter. @@ -5051,9 +5348,9 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String domainName = RAN; // String | domain name + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -5077,9 +5374,9 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) -String *targetFilter = /attributes(nCI,nRPCI); // Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -String *scopeFilter = /attributes[@nRTAC=310]; // Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +String *domainName = RAN; // domain name (default to null) +String *targetFilter = /sourceIds;/classifiers; // Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +String *scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -5107,10 +5404,10 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var opts = { - 'targetFilter': /attributes(nCI,nRPCI), // {String} Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - 'scopeFilter': /attributes[@nRTAC=310], // {String} Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + 'targetFilter': /sourceIds;/classifiers, // {String} Use *targetFilter* to specify what needs to be returned in the REST response. + 'scopeFilter': /sourceIds[contains(@item,'ManagedElement=1')], // {String} ScopeFilter is used to specify the conditions to be applied. 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. }; @@ -5146,9 +5443,9 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) - var targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) - var scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) + var domainName = RAN; // String | domain name (default to null) + var targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) + var scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -5172,9 +5469,9 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name -$targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -$scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +$domainName = RAN; // String | domain name +$targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. +$scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -5195,9 +5492,9 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name -my $targetFilter = /attributes(nCI,nRPCI); # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -my $scopeFilter = /attributes[@nRTAC=310]; # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +my $domainName = RAN; # String | domain name +my $targetFilter = /sourceIds;/classifiers; # String | Use *targetFilter* to specify what needs to be returned in the REST response. +my $scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; # String | ScopeFilter is used to specify the conditions to be applied. my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -5220,9 +5517,9 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) -targetFilter = /attributes(nCI,nRPCI) # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -scopeFilter = /attributes[@nRTAC=310] # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +domainName = RAN # String | domain name (default to null) +targetFilter = /sourceIds;/classifiers # String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')] # String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -5239,9 +5536,9 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String - let targetFilter = /attributes(nCI,nRPCI); // String - let scopeFilter = /attributes[@nRTAC=310]; // String + let domainName = RAN; // String + let targetFilter = /sourceIds;/classifiers; // String + let scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String let offset = 56; // Integer let limit = 56; // Integer @@ -5340,7 +5637,7 @@ domain name
    -Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. +Use *targetFilter* to specify what needs to be returned in the REST response.
    @@ -5360,7 +5657,7 @@ Use *targetFilter* to specify the entity type and attributes to be returned in t
    -Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +ScopeFilter is used to specify the conditions to be applied.
    @@ -5873,7 +6170,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/yang.data+json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | String relationshipId = relationshipId_example; // String | @@ -5916,7 +6213,7 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/yang.data+json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | String relationshipId = relationshipId_example; // String | @@ -5940,7 +6237,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/yang.data+json; // (default to application/yang.data+json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) String *relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // (default to null) String *relationshipId = relationshipId_example; // (default to null) @@ -5966,7 +6263,7 @@ String *relationshipId = relationshipId_example; // (default to null) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/yang.data+json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // {String} var relationshipId = relationshipId_example; // {String} @@ -6001,7 +6298,7 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/yang.data+json; // String | (default to application/yang.data+json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | (default to null) var relationshipId = relationshipId_example; // String | (default to null) @@ -6025,7 +6322,7 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/yang.data+json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | $relationshipId = relationshipId_example; // String | @@ -6046,7 +6343,7 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/yang.data+json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; # String | my $relationshipId = relationshipId_example; # String | @@ -6069,7 +6366,7 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/yang.data+json # String | (default to application/yang.data+json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER # String | (default to null) relationshipId = relationshipId_example # String | (default to null) @@ -6086,7 +6383,7 @@ except ApiException as e: pub fn main() { let accept = application/yang.data+json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String let relationshipId = relationshipId_example; // String @@ -6735,7 +7032,7 @@ domain name
    curl -X GET \
      -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/relationship-types/{relationshipTypeName}/relationships?targetFilter=/attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]&offset=56&limit=56"
    + "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/relationship-types/{relationshipTypeName}/relationships?targetFilter=/sourceIds;/classifiers&scopeFilter=/sourceIds[contains(@item,'ManagedElement=1')]&offset=56&limit=56"
     
    @@ -6753,10 +7050,10 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -6780,8 +7077,8 @@ final api_instance = DefaultApi(); final String accept = new String(); // String | final String domainName = new String(); // String | domain name final String relationshipTypeName = new String(); // String | -final String targetFilter = new String(); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -final String scopeFilter = new String(); // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +final String targetFilter = new String(); // String | Use *targetFilter* to specify what needs to be returned in the REST response. +final String scopeFilter = new String(); // String | ScopeFilter is used to specify the conditions to be applied. final Integer offset = new Integer(); // Integer | Pagination offset. final Integer limit = new Integer(); // Integer | Result limiter. @@ -6802,10 +7099,10 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -6829,10 +7126,10 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) String *relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // (default to null) -String *targetFilter = /attributes(nCI,nRPCI); // Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -String *scopeFilter = /attributes[@nRTAC=310]; // Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +String *targetFilter = /sourceIds;/classifiers; // Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +String *scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -6861,11 +7158,11 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // {String} var opts = { - 'targetFilter': /attributes(nCI,nRPCI), // {String} Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - 'scopeFilter': /attributes[@nRTAC=310], // {String} Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + 'targetFilter': /sourceIds;/classifiers, // {String} Use *targetFilter* to specify what needs to be returned in the REST response. + 'scopeFilter': /sourceIds[contains(@item,'ManagedElement=1')], // {String} ScopeFilter is used to specify the conditions to be applied. 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. }; @@ -6901,10 +7198,10 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | (default to null) - var targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) - var scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) + var targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) + var scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -6928,10 +7225,10 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String | -$targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -$scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +$targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. +$scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -6952,10 +7249,10 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; # String | -my $targetFilter = /attributes(nCI,nRPCI); # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -my $scopeFilter = /attributes[@nRTAC=310]; # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +my $targetFilter = /sourceIds;/classifiers; # String | Use *targetFilter* to specify what needs to be returned in the REST response. +my $scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; # String | ScopeFilter is used to specify the conditions to be applied. my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -6978,10 +7275,10 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER # String | (default to null) -targetFilter = /attributes(nCI,nRPCI) # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -scopeFilter = /attributes[@nRTAC=310] # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +targetFilter = /sourceIds;/classifiers # String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')] # String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -6998,10 +7295,10 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let relationshipTypeName = NRCELLDU_USES_NRSECTORCARRIER; // String - let targetFilter = /attributes(nCI,nRPCI); // String - let scopeFilter = /attributes[@nRTAC=310]; // String + let targetFilter = /sourceIds;/classifiers; // String + let scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String let offset = 56; // Integer let limit = 56; // Integer @@ -7120,7 +7417,7 @@ domain name
    -Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. +Use *targetFilter* to specify what needs to be returned in the REST response.
    @@ -7140,7 +7437,7 @@ Use *targetFilter* to specify the entity type and attributes to be returned in t
    -Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +ScopeFilter is used to specify the conditions to be applied.
    @@ -7635,7 +7932,7 @@ Result limiter.
    curl -X GET \
      -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entity-types/{entityTypeName}/entities?targetFilter=/attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]&offset=56&limit=56"
    + "https://localhost/topology-inventory/v1alpha11/domains/{domainName}/entity-types/{entityTypeName}/entities?targetFilter=/sourceIds;/classifiers&scopeFilter=/sourceIds[contains(@item,'ManagedElement=1')]&offset=56&limit=56"
     
    @@ -7653,10 +7950,10 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -7680,8 +7977,8 @@ final api_instance = DefaultApi(); final String accept = new String(); // String | final String domainName = new String(); // String | domain name final String entityTypeName = new String(); // String | -final String targetFilter = new String(); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -final String scopeFilter = new String(); // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +final String targetFilter = new String(); // String | Use *targetFilter* to specify what needs to be returned in the REST response. +final String scopeFilter = new String(); // String | ScopeFilter is used to specify the conditions to be applied. final Integer offset = new Integer(); // Integer | Pagination offset. final Integer limit = new Integer(); // Integer | Result limiter. @@ -7702,10 +7999,10 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | - String targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - String scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + String targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. + String scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -7729,10 +8026,10 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) String *entityTypeName = entityTypeName_example; // (default to null) -String *targetFilter = /attributes(nCI,nRPCI); // Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -String *scopeFilter = /attributes[@nRTAC=310]; // Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +String *targetFilter = /sourceIds;/classifiers; // Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +String *scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -7761,11 +8058,11 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var entityTypeName = entityTypeName_example; // {String} var opts = { - 'targetFilter': /attributes(nCI,nRPCI), // {String} Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. - 'scopeFilter': /attributes[@nRTAC=310], // {String} Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. + 'targetFilter': /sourceIds;/classifiers, // {String} Use *targetFilter* to specify what needs to be returned in the REST response. + 'scopeFilter': /sourceIds[contains(@item,'ManagedElement=1')], // {String} ScopeFilter is used to specify the conditions to be applied. 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. }; @@ -7801,10 +8098,10 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var entityTypeName = entityTypeName_example; // String | (default to null) - var targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) - var scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) + var targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) + var scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -7828,10 +8125,10 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $entityTypeName = entityTypeName_example; // String | -$targetFilter = /attributes(nCI,nRPCI); // String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -$scopeFilter = /attributes[@nRTAC=310]; // String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +$targetFilter = /sourceIds;/classifiers; // String | Use *targetFilter* to specify what needs to be returned in the REST response. +$scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String | ScopeFilter is used to specify the conditions to be applied. $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -7852,10 +8149,10 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $entityTypeName = entityTypeName_example; # String | -my $targetFilter = /attributes(nCI,nRPCI); # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. -my $scopeFilter = /attributes[@nRTAC=310]; # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +my $targetFilter = /sourceIds;/classifiers; # String | Use *targetFilter* to specify what needs to be returned in the REST response. +my $scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; # String | ScopeFilter is used to specify the conditions to be applied. my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -7878,10 +8175,10 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) entityTypeName = entityTypeName_example # String | (default to null) -targetFilter = /attributes(nCI,nRPCI) # String | Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. (optional) (default to null) -scopeFilter = /attributes[@nRTAC=310] # String | Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. (optional) (default to null) +targetFilter = /sourceIds;/classifiers # String | Use *targetFilter* to specify what needs to be returned in the REST response. (optional) (default to null) +scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')] # String | ScopeFilter is used to specify the conditions to be applied. (optional) (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -7898,10 +8195,10 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let entityTypeName = entityTypeName_example; // String - let targetFilter = /attributes(nCI,nRPCI); // String - let scopeFilter = /attributes[@nRTAC=310]; // String + let targetFilter = /sourceIds;/classifiers; // String + let scopeFilter = /sourceIds[contains(@item,'ManagedElement=1')]; // String let offset = 56; // Integer let limit = 56; // Integer @@ -8020,7 +8317,7 @@ domain name
    -Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes. +Use *targetFilter* to specify what needs to be returned in the REST response.
    @@ -8040,7 +8337,7 @@ Use *targetFilter* to specify the entity type and attributes to be returned in t
    -Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean. +ScopeFilter is used to specify the conditions to be applied.
    @@ -8553,7 +8850,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/yang.data+json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | String entityId = entityId_example; // String | @@ -8596,7 +8893,7 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/yang.data+json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name String entityTypeName = entityTypeName_example; // String | String entityId = entityId_example; // String | @@ -8620,7 +8917,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/yang.data+json; // (default to application/yang.data+json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) String *entityTypeName = entityTypeName_example; // (default to null) String *entityId = entityId_example; // (default to null) @@ -8646,7 +8943,7 @@ String *entityId = entityId_example; // (default to null) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/yang.data+json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var entityTypeName = entityTypeName_example; // {String} var entityId = entityId_example; // {String} @@ -8681,7 +8978,7 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/yang.data+json; // String | (default to application/yang.data+json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var entityTypeName = entityTypeName_example; // String | (default to null) var entityId = entityId_example; // String | (default to null) @@ -8705,7 +9002,7 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/yang.data+json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $entityTypeName = entityTypeName_example; // String | $entityId = entityId_example; // String | @@ -8726,7 +9023,7 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/yang.data+json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $entityTypeName = entityTypeName_example; # String | my $entityId = entityId_example; # String | @@ -8749,7 +9046,7 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/yang.data+json # String | (default to application/yang.data+json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) entityTypeName = entityTypeName_example # String | (default to null) entityId = entityId_example # String | (default to null) @@ -8766,7 +9063,7 @@ except ApiException as e: pub fn main() { let accept = application/yang.data+json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let entityTypeName = entityTypeName_example; // String let entityId = entityId_example; // String @@ -9433,7 +9730,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -9476,7 +9773,7 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -9500,7 +9797,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -9526,7 +9823,7 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var opts = { 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. @@ -9563,7 +9860,7 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -9587,7 +9884,7 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -9608,7 +9905,7 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -9631,7 +9928,7 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -9648,7 +9945,7 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let offset = 56; // Integer let limit = 56; // Integer @@ -10195,7 +10492,7 @@ Result limiter.

    -

    Get all the available topology relationship types.

    +

    Get all the available topology relationship types in a specified domain.


    /domains/{domainName}/relationship-types
    @@ -10240,7 +10537,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -10283,7 +10580,7 @@ public class EntitiesAndRelationshipsApiExample { public static void main(String[] args) { EntitiesAndRelationshipsApi apiInstance = new EntitiesAndRelationshipsApi(); String accept = application/json; // String | - String domainName = domainName_example; // String | domain name + String domainName = RAN; // String | domain name Integer offset = 56; // Integer | Pagination offset. Integer limit = 56; // Integer | Result limiter. @@ -10307,7 +10604,7 @@ public class EntitiesAndRelationshipsApiExample { // Create an instance of the API class EntitiesAndRelationshipsApi *apiInstance = [[EntitiesAndRelationshipsApi alloc] init]; String *accept = application/json; // (default to application/json) -String *domainName = domainName_example; // domain name (default to null) +String *domainName = RAN; // domain name (default to null) Integer *offset = 56; // Pagination offset. (optional) (default to 0) Integer *limit = 56; // Result limiter. (optional) (default to 500) @@ -10333,7 +10630,7 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500) // Create an instance of the API class var api = new TopologyExposureAndInventoryApi.EntitiesAndRelationshipsApi() var accept = application/json; // {String} -var domainName = domainName_example; // {String} domain name +var domainName = RAN; // {String} domain name var opts = { 'offset': 56, // {Integer} Pagination offset. 'limit': 56 // {Integer} Result limiter. @@ -10370,7 +10667,7 @@ namespace Example // Create an instance of the API class var apiInstance = new EntitiesAndRelationshipsApi(); var accept = application/json; // String | (default to application/json) - var domainName = domainName_example; // String | domain name (default to null) + var domainName = RAN; // String | domain name (default to null) var offset = 56; // Integer | Pagination offset. (optional) (default to 0) var limit = 56; // Integer | Result limiter. (optional) (default to 500) @@ -10394,7 +10691,7 @@ require_once(__DIR__ . '/vendor/autoload.php'); // Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\EntitiesAndRelationshipsApi(); $accept = application/json; // String | -$domainName = domainName_example; // String | domain name +$domainName = RAN; // String | domain name $offset = 56; // Integer | Pagination offset. $limit = 56; // Integer | Result limiter. @@ -10415,7 +10712,7 @@ use WWW::OPenAPIClient::EntitiesAndRelationshipsApi; # Create an instance of the API class my $api_instance = WWW::OPenAPIClient::EntitiesAndRelationshipsApi->new(); my $accept = application/json; # String | -my $domainName = domainName_example; # String | domain name +my $domainName = RAN; # String | domain name my $offset = 56; # Integer | Pagination offset. my $limit = 56; # Integer | Result limiter. @@ -10438,7 +10735,7 @@ from pprint import pprint # Create an instance of the API class api_instance = openapi_client.EntitiesAndRelationshipsApi() accept = application/json # String | (default to application/json) -domainName = domainName_example # String | domain name (default to null) +domainName = RAN # String | domain name (default to null) offset = 56 # Integer | Pagination offset. (optional) (default to 0) limit = 56 # Integer | Result limiter. (optional) (default to 500) @@ -10455,7 +10752,7 @@ except ApiException as e: pub fn main() { let accept = application/json; // String - let domainName = domainName_example; // String + let domainName = RAN; // String let offset = 56; // Integer let limit = 56; // Integer @@ -10994,70 +11291,76 @@ Result limiter.
    -
    -

    Schemas

    -
    -
    +
    +

    Groups

    +
    +
    -

    createSchema

    -

    Create a new schema.

    +

    createGroup

    +

    Create a new group.

    -

    Create a new schema. The request body shall contain the schema in YANG format.

    +

    Create a group of entities and/or relationships in a static or dynamic way.


    -
    /schemas
    +
    /groups

    Usage and SDK Samples

    -
    +
    curl -X POST \
    - -H "Accept: application/problem+json" \
    - -H "Content-Type: multipart/form-data" \
    - "https://localhost/topology-inventory/v1alpha11/schemas"
    + -H "Accept: application/json,application/problem+json" \
    + -H "Content-Type: application/json" \
    + "https://localhost/topology-inventory/v1alpha11/groups" \
    + -d '{
    +  "name" : "name",
    +  "providedMembers" : [ "{}", "{}" ],
    +  "type" : "type"
    +}'
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.SchemasApi;
    +import org.openapitools.client.api.GroupsApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class SchemasApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        SchemasApi apiInstance = new SchemasApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
    -        String contentType = multipart/form-data; // String | 
    -        File file = BINARY_DATA_HERE; // File | multipartFile
    +        String contentType = application/json; // String | 
    +        CreateGroupPayload createGroupPayload = ; // CreateGroupPayload | 
     
             try {
    -            apiInstance.createSchema(accept, contentType, file);
    +            GroupByIdResponse result = apiInstance.createGroup(accept, contentType, createGroupPayload);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling SchemasApi#createSchema");
    +            System.err.println("Exception when calling GroupsApi#createGroup");
                 e.printStackTrace();
             }
         }
    @@ -11065,62 +11368,66 @@ public class SchemasApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
     final String contentType = new String(); // String | 
    -final File file = new File(); // File | multipartFile
    +final CreateGroupPayload createGroupPayload = new CreateGroupPayload(); // CreateGroupPayload | 
     
     try {
    -    final result = await api_instance.createSchema(accept, contentType, file);
    +    final result = await api_instance.createGroup(accept, contentType, createGroupPayload);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->createSchema: $e\n');
    +    print('Exception when calling DefaultApi->createGroup: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.SchemasApi;
    +                          
    +
    import org.openapitools.client.api.GroupsApi;
     
    -public class SchemasApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
    -        SchemasApi apiInstance = new SchemasApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
    -        String contentType = multipart/form-data; // String | 
    -        File file = BINARY_DATA_HERE; // File | multipartFile
    +        String contentType = application/json; // String | 
    +        CreateGroupPayload createGroupPayload = ; // CreateGroupPayload | 
     
             try {
    -            apiInstance.createSchema(accept, contentType, file);
    +            GroupByIdResponse result = apiInstance.createGroup(accept, contentType, createGroupPayload);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling SchemasApi#createSchema");
    +            System.err.println("Exception when calling GroupsApi#createGroup");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -SchemasApi *apiInstance = [[SchemasApi alloc] init];
    +GroupsApi *apiInstance = [[GroupsApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -String *contentType = multipart/form-data; //  (default to multipart/form-data)
    -File *file = BINARY_DATA_HERE; // multipartFile (default to null)
    +String *contentType = application/json; //  (default to application/json)
    +CreateGroupPayload *createGroupPayload = ; // 
     
    -// Create a new schema.
    -[apiInstance createSchemaWith:accept
    +// Create a new group.
    +[apiInstance createGroupWith:accept
         contentType:contentType
    -    file:file
    -              completionHandler: ^(NSError* error) {
    +    createGroupPayload:createGroupPayload
    +              completionHandler: ^(GroupByIdResponse output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
         if (error) {
             NSLog(@"Error: %@", error);
         }
    @@ -11128,30 +11435,30 @@ File *file = BINARY_DATA_HERE; // multipartFile (default to null)
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.SchemasApi()
    +var api = new TopologyExposureAndInventoryApi.GroupsApi()
     var accept = application/json; // {String} 
    -var contentType = multipart/form-data; // {String} 
    -var file = BINARY_DATA_HERE; // {File} multipartFile
    +var contentType = application/json; // {String} 
    +var createGroupPayload = ; // {CreateGroupPayload} 
     
     var callback = function(error, data, response) {
       if (error) {
         console.error(error);
       } else {
    -    console.log('API called successfully.');
    +    console.log('API called successfully. Returned data: ' + data);
       }
     };
    -api.createSchema(accept, contentType, file, callback);
    +api.createGroup(accept, contentType, createGroupPayload, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -11160,22 +11467,23 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class createSchemaExample
    +    public class createGroupExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new SchemasApi();
    +            var apiInstance = new GroupsApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var contentType = multipart/form-data;  // String |  (default to multipart/form-data)
    -            var file = BINARY_DATA_HERE;  // File | multipartFile (default to null)
    +            var contentType = application/json;  // String |  (default to application/json)
    +            var createGroupPayload = new CreateGroupPayload(); // CreateGroupPayload | 
     
                 try {
    -                // Create a new schema.
    -                apiInstance.createSchema(accept, contentType, file);
    +                // Create a new group.
    +                GroupByIdResponse result = apiInstance.createGroup(accept, contentType, createGroupPayload);
    +                Debug.WriteLine(result);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling SchemasApi.createSchema: " + e.Message );
    +                Debug.Print("Exception when calling GroupsApi.createGroup: " + e.Message );
                 }
             }
         }
    @@ -11183,44 +11491,46 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\SchemasApi();
    +$api_instance = new OpenAPITools\Client\Api\GroupsApi();
     $accept = application/json; // String | 
    -$contentType = multipart/form-data; // String | 
    -$file = BINARY_DATA_HERE; // File | multipartFile
    +$contentType = application/json; // String | 
    +$createGroupPayload = ; // CreateGroupPayload | 
     
     try {
    -    $api_instance->createSchema($accept, $contentType, $file);
    +    $result = $api_instance->createGroup($accept, $contentType, $createGroupPayload);
    +    print_r($result);
     } catch (Exception $e) {
    -    echo 'Exception when calling SchemasApi->createSchema: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling GroupsApi->createGroup: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::SchemasApi;
    +use WWW::OPenAPIClient::GroupsApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
    +my $api_instance = WWW::OPenAPIClient::GroupsApi->new();
     my $accept = application/json; # String | 
    -my $contentType = multipart/form-data; # String | 
    -my $file = BINARY_DATA_HERE; # File | multipartFile
    +my $contentType = application/json; # String | 
    +my $createGroupPayload = WWW::OPenAPIClient::Object::CreateGroupPayload->new(); # CreateGroupPayload | 
     
     eval {
    -    $api_instance->createSchema(accept => $accept, contentType => $contentType, file => $file);
    +    my $result = $api_instance->createGroup(accept => $accept, contentType => $contentType, createGroupPayload => $createGroupPayload);
    +    print Dumper($result);
     };
     if ($@) {
    -    warn "Exception when calling SchemasApi->createSchema: $@\n";
    +    warn "Exception when calling GroupsApi->createGroup: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -11228,28 +11538,29 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.SchemasApi()
    +api_instance = openapi_client.GroupsApi()
     accept = application/json # String |  (default to application/json)
    -contentType = multipart/form-data # String |  (default to multipart/form-data)
    -file = BINARY_DATA_HERE # File | multipartFile (default to null)
    +contentType = application/json # String |  (default to application/json)
    +createGroupPayload =  # CreateGroupPayload | 
     
     try:
    -    # Create a new schema.
    -    api_instance.create_schema(accept, contentType, file)
    +    # Create a new group.
    +    api_response = api_instance.create_group(accept, contentType, createGroupPayload)
    +    pprint(api_response)
     except ApiException as e:
    -    print("Exception when calling SchemasApi->createSchema: %s\n" % e)
    + print("Exception when calling GroupsApi->createGroup: %s\n" % e)
    -
    -
    extern crate SchemasApi;
    +                            
    +
    extern crate GroupsApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let contentType = multipart/form-data; // String
    -    let file = BINARY_DATA_HERE; // File
    +    let contentType = application/json; // String
    +    let createGroupPayload = ; // CreateGroupPayload
     
    -    let mut context = SchemasApi::Context::default();
    -    let result = client.createSchema(accept, contentType, file, &context).wait();
    +    let mut context = GroupsApi::Context::default();
    +    let result = client.createGroup(accept, contentType, createGroupPayload, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -11275,7 +11586,7 @@ pub fn main() {
     
     
     
    -    
    +
    @@ -11295,7 +11606,7 @@ pub fn main() { -
    +
    @@ -11313,70 +11624,113 @@ pub fn main() { - -
    Form parameters
    +
    Body parameters
    - +
    Name Description
    file*
    createGroupPayload * +

    + +
    +

    Responses

    -

    -

    +

    +

    -
    +
    +
    +
    +
    +
    +

    deleteGroup

    +

    Delete a group with specified id.

    +
    +
    +
    +

    +

    Delete a group with specified id.

    +

    +
    +
    /groups/{groupId}
    +

    +

    Usage and SDK Samples

    +

    + -
    +
    +
    +
    +
    +
    +

    getAllGroups

    +

    Get all groups.

    +
    +
    +
    +

    +

    Get all groups.

    +

    +
    +
    /groups
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET \
    + -H "Accept: application/json,application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/groups?offset=56&limit=56&name=name_example"
    +
    +
    +
    +
    import org.openapitools.client.*;
    +import org.openapitools.client.auth.*;
    +import org.openapitools.client.model.*;
    +import org.openapitools.client.api.GroupsApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class GroupsApiExample {
    +    public static void main(String[] args) {
    +
    +        // Create an instance of the API class
    +        GroupsApi apiInstance = new GroupsApi();
    +        String accept = application/json; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
    +        String name = name_example; // String | Group name. If not specified, returns all the groups.
    +
    +        try {
    +            GroupsResponse result = apiInstance.getAllGroups(accept, offset, limit, name);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling GroupsApi#getAllGroups");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    +
    + +
    +
    import 'package:openapi/api.dart';
    +
    +final api_instance = DefaultApi();
    +
    +final String accept = new String(); // String | 
    +final Integer offset = new Integer(); // Integer | Pagination offset.
    +final Integer limit = new Integer(); // Integer | Result limiter.
    +final String name = new String(); // String | Group name. If not specified, returns all the groups.
    +
    +try {
    +    final result = await api_instance.getAllGroups(accept, offset, limit, name);
    +    print(result);
    +} catch (e) {
    +    print('Exception when calling DefaultApi->getAllGroups: $e\n');
    +}
    +
    +
    +
    + +
    +
    import org.openapitools.client.api.GroupsApi;
    +
    +public class GroupsApiExample {
    +    public static void main(String[] args) {
    +        GroupsApi apiInstance = new GroupsApi();
    +        String accept = application/json; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
    +        String name = name_example; // String | Group name. If not specified, returns all the groups.
    +
    +        try {
    +            GroupsResponse result = apiInstance.getAllGroups(accept, offset, limit, name);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling GroupsApi#getAllGroups");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    
    +
    +// Create an instance of the API class
    +GroupsApi *apiInstance = [[GroupsApi alloc] init];
    +String *accept = application/json; //  (default to application/json)
    +Integer *offset = 56; // Pagination offset. (optional) (default to 0)
    +Integer *limit = 56; // Result limiter. (optional) (default to 500)
    +String *name = name_example; // Group name. If not specified, returns all the groups. (optional) (default to null)
    +
    +// Get all groups.
    +[apiInstance getAllGroupsWith:accept
    +    offset:offset
    +    limit:limit
    +    name:name
    +              completionHandler: ^(GroupsResponse output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
    +    if (error) {
    +        NSLog(@"Error: %@", error);
    +    }
    +}];
    +
    +
    + +
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
    +
    +// Create an instance of the API class
    +var api = new TopologyExposureAndInventoryApi.GroupsApi()
    +var accept = application/json; // {String} 
    +var opts = {
    +  'offset': 56, // {Integer} Pagination offset.
    +  'limit': 56, // {Integer} Result limiter.
    +  'name': name_example // {String} Group name. If not specified, returns all the groups.
    +};
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getAllGroups(accept, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using Org.OpenAPITools.Api;
    +using Org.OpenAPITools.Client;
    +using Org.OpenAPITools.Model;
    +
    +namespace Example
    +{
    +    public class getAllGroupsExample
    +    {
    +        public void main()
    +        {
    +
    +            // Create an instance of the API class
    +            var apiInstance = new GroupsApi();
    +            var accept = application/json;  // String |  (default to application/json)
    +            var offset = 56;  // Integer | Pagination offset. (optional)  (default to 0)
    +            var limit = 56;  // Integer | Result limiter. (optional)  (default to 500)
    +            var name = name_example;  // String | Group name. If not specified, returns all the groups. (optional)  (default to null)
    +
    +            try {
    +                // Get all groups.
    +                GroupsResponse result = apiInstance.getAllGroups(accept, offset, limit, name);
    +                Debug.WriteLine(result);
    +            } catch (Exception e) {
    +                Debug.Print("Exception when calling GroupsApi.getAllGroups: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +// Create an instance of the API class
    +$api_instance = new OpenAPITools\Client\Api\GroupsApi();
    +$accept = application/json; // String | 
    +$offset = 56; // Integer | Pagination offset.
    +$limit = 56; // Integer | Result limiter.
    +$name = name_example; // String | Group name. If not specified, returns all the groups.
    +
    +try {
    +    $result = $api_instance->getAllGroups($accept, $offset, $limit, $name);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling GroupsApi->getAllGroups: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::OPenAPIClient::Configuration;
    +use WWW::OPenAPIClient::GroupsApi;
    +
    +# Create an instance of the API class
    +my $api_instance = WWW::OPenAPIClient::GroupsApi->new();
    +my $accept = application/json; # String | 
    +my $offset = 56; # Integer | Pagination offset.
    +my $limit = 56; # Integer | Result limiter.
    +my $name = name_example; # String | Group name. If not specified, returns all the groups.
    +
    +eval {
    +    my $result = $api_instance->getAllGroups(accept => $accept, offset => $offset, limit => $limit, name => $name);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling GroupsApi->getAllGroups: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import openapi_client
    +from openapi_client.rest import ApiException
    +from pprint import pprint
    +
    +# Create an instance of the API class
    +api_instance = openapi_client.GroupsApi()
    +accept = application/json # String |  (default to application/json)
    +offset = 56 # Integer | Pagination offset. (optional) (default to 0)
    +limit = 56 # Integer | Result limiter. (optional) (default to 500)
    +name = name_example # String | Group name. If not specified, returns all the groups. (optional) (default to null)
    +
    +try:
    +    # Get all groups.
    +    api_response = api_instance.get_all_groups(accept, offset=offset, limit=limit, name=name)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling GroupsApi->getAllGroups: %s\n" % e)
    +
    + +
    +
    extern crate GroupsApi;
    +
    +pub fn main() {
    +    let accept = application/json; // String
    +    let offset = 56; // Integer
    +    let limit = 56; // Integer
    +    let name = name_example; // String
    +
    +    let mut context = GroupsApi::Context::default();
    +    let result = client.getAllGroups(accept, offset, limit, name, &context).wait();
    +
    +    println!("{:?}", result);
    +}
    +
    +
    +
    + +

    Scopes

    + + +
    + +

    Parameters

    + + +
    Header parameters
    + + + + + + + + + +
    NameDescription
    Accept* + + +
    +
    +
    + + String + + +
    +
    + Required +
    +
    +
    +
    + + + +
    Query parameters
    + + + + + + + + + + + + + + + + + +
    NameDescription
    offset + + +
    +
    +
    + + Integer + + +
    +Pagination offset. +
    +
    +
    +
    +
    limit + + +
    +
    +
    + + Integer + + +
    +Result limiter. +
    +
    +
    +
    +
    name + + +
    +
    +
    + + String + + +
    +Group name. If not specified, returns all the groups. +
    +
    +
    +
    +
    + +

    Responses

    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    getGroupById

    +

    Get a group with specified id.

    +
    +
    +
    +

    +

    Get a group with specified id.

    +

    +
    +
    /groups/{groupId}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET \
    + -H "Accept: application/json,application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/groups/{groupId}"
    +
    +
    +
    +
    import org.openapitools.client.*;
    +import org.openapitools.client.auth.*;
    +import org.openapitools.client.model.*;
    +import org.openapitools.client.api.GroupsApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class GroupsApiExample {
    +    public static void main(String[] args) {
    +
    +        // Create an instance of the API class
    +        GroupsApi apiInstance = new GroupsApi();
    +        String accept = application/json; // String | 
    +        String groupId = groupId_example; // String | 
    +
    +        try {
    +            GroupByIdResponse result = apiInstance.getGroupById(accept, groupId);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling GroupsApi#getGroupById");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    +
    + +
    +
    import 'package:openapi/api.dart';
    +
    +final api_instance = DefaultApi();
    +
    +final String accept = new String(); // String | 
    +final String groupId = new String(); // String | 
    +
    +try {
    +    final result = await api_instance.getGroupById(accept, groupId);
    +    print(result);
    +} catch (e) {
    +    print('Exception when calling DefaultApi->getGroupById: $e\n');
    +}
    +
    +
    +
    + +
    +
    import org.openapitools.client.api.GroupsApi;
    +
    +public class GroupsApiExample {
    +    public static void main(String[] args) {
    +        GroupsApi apiInstance = new GroupsApi();
    +        String accept = application/json; // String | 
    +        String groupId = groupId_example; // String | 
    +
    +        try {
    +            GroupByIdResponse result = apiInstance.getGroupById(accept, groupId);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling GroupsApi#getGroupById");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    
    +
    +// Create an instance of the API class
    +GroupsApi *apiInstance = [[GroupsApi alloc] init];
    +String *accept = application/json; //  (default to application/json)
    +String *groupId = groupId_example; //  (default to null)
    +
    +// Get a group with specified id.
    +[apiInstance getGroupByIdWith:accept
    +    groupId:groupId
    +              completionHandler: ^(GroupByIdResponse output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
    +    if (error) {
    +        NSLog(@"Error: %@", error);
    +    }
    +}];
    +
    +
    + +
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
    +
    +// Create an instance of the API class
    +var api = new TopologyExposureAndInventoryApi.GroupsApi()
    +var accept = application/json; // {String} 
    +var groupId = groupId_example; // {String} 
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getGroupById(accept, groupId, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using Org.OpenAPITools.Api;
    +using Org.OpenAPITools.Client;
    +using Org.OpenAPITools.Model;
    +
    +namespace Example
    +{
    +    public class getGroupByIdExample
    +    {
    +        public void main()
    +        {
    +
    +            // Create an instance of the API class
    +            var apiInstance = new GroupsApi();
    +            var accept = application/json;  // String |  (default to application/json)
    +            var groupId = groupId_example;  // String |  (default to null)
    +
    +            try {
    +                // Get a group with specified id.
    +                GroupByIdResponse result = apiInstance.getGroupById(accept, groupId);
    +                Debug.WriteLine(result);
    +            } catch (Exception e) {
    +                Debug.Print("Exception when calling GroupsApi.getGroupById: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +// Create an instance of the API class
    +$api_instance = new OpenAPITools\Client\Api\GroupsApi();
    +$accept = application/json; // String | 
    +$groupId = groupId_example; // String | 
    +
    +try {
    +    $result = $api_instance->getGroupById($accept, $groupId);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling GroupsApi->getGroupById: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::OPenAPIClient::Configuration;
    +use WWW::OPenAPIClient::GroupsApi;
    +
    +# Create an instance of the API class
    +my $api_instance = WWW::OPenAPIClient::GroupsApi->new();
    +my $accept = application/json; # String | 
    +my $groupId = groupId_example; # String | 
    +
    +eval {
    +    my $result = $api_instance->getGroupById(accept => $accept, groupId => $groupId);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling GroupsApi->getGroupById: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import openapi_client
    +from openapi_client.rest import ApiException
    +from pprint import pprint
    +
    +# Create an instance of the API class
    +api_instance = openapi_client.GroupsApi()
    +accept = application/json # String |  (default to application/json)
    +groupId = groupId_example # String |  (default to null)
    +
    +try:
    +    # Get a group with specified id.
    +    api_response = api_instance.get_group_by_id(accept, groupId)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling GroupsApi->getGroupById: %s\n" % e)
    +
    + +
    +
    extern crate GroupsApi;
    +
    +pub fn main() {
    +    let accept = application/json; // String
    +    let groupId = groupId_example; // String
    +
    +    let mut context = GroupsApi::Context::default();
    +    let result = client.getGroupById(accept, groupId, &context).wait();
    +
    +    println!("{:?}", result);
    +}
    +
    +
    +
    + +

    Scopes

    + + +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + +
    NameDescription
    groupId* + + +
    +
    +
    + + String + + +
    +
    + Required +
    +
    +
    +
    + +
    Header parameters
    + + + + + + + + + +
    NameDescription
    Accept* + + +
    +
    +
    + + String + + +
    +
    + Required +
    +
    +
    +
    + + + + +

    Responses

    +

    +

    + + + + + + +
    +
    +
    + +
    + +
    +
    +

    +

    + + + + -
    -
    -
    +
    +
    +
    - +
    -

    -

    +

    +

    -

    -
    -
    +
    +
    -

    deleteSchema

    -

    Delete a schema.

    +

    getMembers

    +

    Get the members of a group with specified id.

    -

    Delete a schema.

    +

    Get the members of a group with specified id.


    -
    /schemas/{schemaName}
    +
    /groups/{groupId}/members

    Usage and SDK Samples

    -
    -
    curl -X DELETE \
    - -H "Accept: application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/schemas/{schemaName}"
    +                          
    +
    curl -X GET \
    + -H "Accept: application/json,application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/groups/{groupId}/members?offset=56&limit=56"
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.SchemasApi;
    +import org.openapitools.client.api.GroupsApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class SchemasApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        SchemasApi apiInstance = new SchemasApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
    -        String schemaName = schemaName_example; // String | 
    +        String groupId = groupId_example; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
     
             try {
    -            apiInstance.deleteSchema(accept, schemaName);
    +            MembersResponse result = apiInstance.getMembers(accept, groupId, offset, limit);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling SchemasApi#deleteSchema");
    +            System.err.println("Exception when calling GroupsApi#getMembers");
                 e.printStackTrace();
             }
         }
    @@ -11889,58 +13882,70 @@ public class SchemasApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
    -final String schemaName = new String(); // String | 
    +final String groupId = new String(); // String | 
    +final Integer offset = new Integer(); // Integer | Pagination offset.
    +final Integer limit = new Integer(); // Integer | Result limiter.
     
     try {
    -    final result = await api_instance.deleteSchema(accept, schemaName);
    +    final result = await api_instance.getMembers(accept, groupId, offset, limit);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->deleteSchema: $e\n');
    +    print('Exception when calling DefaultApi->getMembers: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.SchemasApi;
    +                          
    +
    import org.openapitools.client.api.GroupsApi;
     
    -public class SchemasApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
    -        SchemasApi apiInstance = new SchemasApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
    -        String schemaName = schemaName_example; // String | 
    +        String groupId = groupId_example; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
     
             try {
    -            apiInstance.deleteSchema(accept, schemaName);
    +            MembersResponse result = apiInstance.getMembers(accept, groupId, offset, limit);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling SchemasApi#deleteSchema");
    +            System.err.println("Exception when calling GroupsApi#getMembers");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -SchemasApi *apiInstance = [[SchemasApi alloc] init];
    +GroupsApi *apiInstance = [[GroupsApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -String *schemaName = schemaName_example; //  (default to o-ran-smo-teiv-ran)
    +String *groupId = groupId_example; //  (default to null)
    +Integer *offset = 56; // Pagination offset. (optional) (default to 0)
    +Integer *limit = 56; // Result limiter. (optional) (default to 500)
     
    -// Delete a schema.
    -[apiInstance deleteSchemaWith:accept
    -    schemaName:schemaName
    -              completionHandler: ^(NSError* error) {
    +// Get the members of a group with specified id.
    +[apiInstance getMembersWith:accept
    +    groupId:groupId
    +    offset:offset
    +    limit:limit
    +              completionHandler: ^(MembersResponse output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
         if (error) {
             NSLog(@"Error: %@", error);
         }
    @@ -11948,29 +13953,33 @@ String *schemaName = schemaName_example; //  (default to o-ran-smo-teiv-ran)
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.SchemasApi()
    +var api = new TopologyExposureAndInventoryApi.GroupsApi()
     var accept = application/json; // {String} 
    -var schemaName = schemaName_example; // {String} 
    +var groupId = groupId_example; // {String} 
    +var opts = {
    +  'offset': 56, // {Integer} Pagination offset.
    +  'limit': 56 // {Integer} Result limiter.
    +};
     
     var callback = function(error, data, response) {
       if (error) {
         console.error(error);
       } else {
    -    console.log('API called successfully.');
    +    console.log('API called successfully. Returned data: ' + data);
       }
     };
    -api.deleteSchema(accept, schemaName, callback);
    +api.getMembers(accept, groupId, opts, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -11979,21 +13988,24 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class deleteSchemaExample
    +    public class getMembersExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new SchemasApi();
    +            var apiInstance = new GroupsApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var schemaName = schemaName_example;  // String |  (default to o-ran-smo-teiv-ran)
    +            var groupId = groupId_example;  // String |  (default to null)
    +            var offset = 56;  // Integer | Pagination offset. (optional)  (default to 0)
    +            var limit = 56;  // Integer | Result limiter. (optional)  (default to 500)
     
                 try {
    -                // Delete a schema.
    -                apiInstance.deleteSchema(accept, schemaName);
    +                // Get the members of a group with specified id.
    +                MembersResponse result = apiInstance.getMembers(accept, groupId, offset, limit);
    +                Debug.WriteLine(result);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling SchemasApi.deleteSchema: " + e.Message );
    +                Debug.Print("Exception when calling GroupsApi.getMembers: " + e.Message );
                 }
             }
         }
    @@ -12001,42 +14013,48 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\SchemasApi();
    +$api_instance = new OpenAPITools\Client\Api\GroupsApi();
     $accept = application/json; // String | 
    -$schemaName = schemaName_example; // String | 
    +$groupId = groupId_example; // String | 
    +$offset = 56; // Integer | Pagination offset.
    +$limit = 56; // Integer | Result limiter.
     
     try {
    -    $api_instance->deleteSchema($accept, $schemaName);
    +    $result = $api_instance->getMembers($accept, $groupId, $offset, $limit);
    +    print_r($result);
     } catch (Exception $e) {
    -    echo 'Exception when calling SchemasApi->deleteSchema: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling GroupsApi->getMembers: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::SchemasApi;
    +use WWW::OPenAPIClient::GroupsApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
    +my $api_instance = WWW::OPenAPIClient::GroupsApi->new();
     my $accept = application/json; # String | 
    -my $schemaName = schemaName_example; # String | 
    +my $groupId = groupId_example; # String | 
    +my $offset = 56; # Integer | Pagination offset.
    +my $limit = 56; # Integer | Result limiter.
     
     eval {
    -    $api_instance->deleteSchema(accept => $accept, schemaName => $schemaName);
    +    my $result = $api_instance->getMembers(accept => $accept, groupId => $groupId, offset => $offset, limit => $limit);
    +    print Dumper($result);
     };
     if ($@) {
    -    warn "Exception when calling SchemasApi->deleteSchema: $@\n";
    +    warn "Exception when calling GroupsApi->getMembers: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -12044,26 +14062,31 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.SchemasApi()
    +api_instance = openapi_client.GroupsApi()
     accept = application/json # String |  (default to application/json)
    -schemaName = schemaName_example # String |  (default to o-ran-smo-teiv-ran)
    +groupId = groupId_example # String |  (default to null)
    +offset = 56 # Integer | Pagination offset. (optional) (default to 0)
    +limit = 56 # Integer | Result limiter. (optional) (default to 500)
     
     try:
    -    # Delete a schema.
    -    api_instance.delete_schema(accept, schemaName)
    +    # Get the members of a group with specified id.
    +    api_response = api_instance.get_members(accept, groupId, offset=offset, limit=limit)
    +    pprint(api_response)
     except ApiException as e:
    -    print("Exception when calling SchemasApi->deleteSchema: %s\n" % e)
    + print("Exception when calling GroupsApi->getMembers: %s\n" % e)
    -
    -
    extern crate SchemasApi;
    +                            
    +
    extern crate GroupsApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let schemaName = schemaName_example; // String
    +    let groupId = groupId_example; // String
    +    let offset = 56; // Integer
    +    let limit = 56; // Integer
     
    -    let mut context = SchemasApi::Context::default();
    -    let result = client.deleteSchema(accept, schemaName, &context).wait();
    +    let mut context = GroupsApi::Context::default();
    +    let result = client.getMembers(accept, groupId, offset, limit, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -12084,11 +14107,11 @@ pub fn main() {
                                       Name
                                       Description
                                     
    -                                  schemaName*
    +                                  groupId*
     
     
     
    -    
    +
    @@ -12116,7 +14139,7 @@ pub fn main() { -
    +
    @@ -12136,90 +14159,72 @@ pub fn main() { +
    Query parameters
    + + + + + + + + + + + -
    -
    -
    - -
    - -
    -
    -

    -

    +

    Responses

    +

    +

    - - + + + +
    NameDescription
    offset -

    Responses

    -

    -

    - +
    +
    +
    + + Integer + -
    +
    +
    +
    limit - +
    +
    +
    + + Integer + + +
    +Result limiter. +
    +
    +
    +
    +
    Name Description
    schemaName*
    groupId* -
    +
    @@ -12833,7 +14873,7 @@ pub fn main() {
    -
    +
    @@ -12853,187 +14893,92 @@ pub fn main() { +
    Query parameters
    + + + + + + + + + + + + -
    -
    -
    - -
    - -
    -
    -

    -

    +

    Responses

    +

    +

    -
    NameDescription
    status -

    Responses

    -

    -

    - - - - +
    +
    +
    + + String + -
    -
    -
    - -
    - -
    -
    -

    -

    - +
    offset -
    limit - +
    +
    +
    + + Integer + +
    +Result limiter. +
    +
    +
    +
    +
    - - - - - - - - -
    NameDescription
    Accept* - - -
    -
    -
    - - String - - -
    -
    - Required -
    -
    -
    -
    - - - -
    Query parameters
    +
    Path parameters
    - - - - - + + + + + - - - - - +
    NameDescription
    domain
    NameDescription
    groupId* -
    +
    String - - -
    -
    -
    -
    offset - - -
    -
    -
    - - Integer - - -
    -Pagination offset. -
    + +
    +
    + Required +
    limit
    + +
    Header parameters
    + + + + + + @@ -13729,132 +15616,91 @@ Result limiter.
    NameDescription
    Content-Type* -
    +
    - Integer + String -
    -Result limiter. -
    +
    + Required +
    -

    Responses

    -

    -

    - - - - - - -
    -
    -
    - -
    - -
    -
    -

    -

    + var schema = findNode('schema',schemaWrapper).schema; + if (!schema) { + schema = schemaWrapper.schema; + } + if (schema.$ref != null) { + schema = defsParser.$refs.get(schema.$ref); + } else if (schema.items != null && schema.items.$ref != null) { + schema.items = defsParser.$refs.get(schema.items.$ref); + } else { + schemaWrapper.definitions = Object.assign({}, defs); + $RefParser.dereference(schemaWrapper).catch(function(err) { + console.log(err); + }); + } + + var view = new JSONSchemaView(schema,2,{isBodyParam: true}); + var result = $('#d2e199_updateGroupName_updateGroupNamePayload'); + result.empty(); + result.append(view.render()); +}); + +
    +
    + + + +

    Responses

    +

    +

    -

    -
    -
    -

    TopologyGroups

    -
    -
    +
    +
    -

    createGroup

    -

    Create group.

    +

    updateProvidedMembers

    +

    Merge or remove members of a static group.

    -

    Create group.

    +

    Merge or remove members in an existing topology group. This operation is applicable for static group only.


    -
    /groups
    +
    /groups/{groupId}/provided-members-operations

    Usage and SDK Samples

    -
    +
    curl -X POST \
    - -H "Accept: application/json,application/problem+json" \
    + -H "Accept: application/problem+json" \
      -H "Content-Type: application/json" \
    - "https://localhost/topology-inventory/v1alpha11/groups" \
    + "https://localhost/topology-inventory/v1alpha11/groups/{groupId}/provided-members-operations" \
      -d '{
    -  "groupName" : "groupName",
    -  "criteria" : {
    -    "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    -  }
    +  "providedMembers" : [ "{}", "{}" ],
    +  "operation" : "merge"
     }'
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.TopologyGroupsApi;
    +import org.openapitools.client.api.GroupsApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class TopologyGroupsApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
             String contentType = application/json; // String | 
    -        Group group = ; // Group | 
    +        String groupId = groupId_example; // String | 
    +        UpdateProvidedMembersPayload updateProvidedMembersPayload = ; // UpdateProvidedMembersPayload | 
     
             try {
    -            GroupResponse result = apiInstance.createGroup(accept, contentType, group);
    -            System.out.println(result);
    +            apiInstance.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#createGroup");
    +            System.err.println("Exception when calling GroupsApi#updateProvidedMembers");
                 e.printStackTrace();
             }
         }
    @@ -14217,66 +16058,66 @@ public class TopologyGroupsApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
     final String contentType = new String(); // String | 
    -final Group group = new Group(); // Group | 
    +final String groupId = new String(); // String | 
    +final UpdateProvidedMembersPayload updateProvidedMembersPayload = new UpdateProvidedMembersPayload(); // UpdateProvidedMembersPayload | 
     
     try {
    -    final result = await api_instance.createGroup(accept, contentType, group);
    +    final result = await api_instance.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->createGroup: $e\n');
    +    print('Exception when calling DefaultApi->updateProvidedMembers: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.TopologyGroupsApi;
    +                          
    +
    import org.openapitools.client.api.GroupsApi;
     
    -public class TopologyGroupsApiExample {
    +public class GroupsApiExample {
         public static void main(String[] args) {
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        GroupsApi apiInstance = new GroupsApi();
             String accept = application/json; // String | 
             String contentType = application/json; // String | 
    -        Group group = ; // Group | 
    +        String groupId = groupId_example; // String | 
    +        UpdateProvidedMembersPayload updateProvidedMembersPayload = ; // UpdateProvidedMembersPayload | 
     
             try {
    -            GroupResponse result = apiInstance.createGroup(accept, contentType, group);
    -            System.out.println(result);
    +            apiInstance.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#createGroup");
    +            System.err.println("Exception when calling GroupsApi#updateProvidedMembers");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -TopologyGroupsApi *apiInstance = [[TopologyGroupsApi alloc] init];
    +GroupsApi *apiInstance = [[GroupsApi alloc] init];
     String *accept = application/json; //  (default to application/json)
     String *contentType = application/json; //  (default to application/json)
    -Group *group = ; // 
    +String *groupId = groupId_example; //  (default to null)
    +UpdateProvidedMembersPayload *updateProvidedMembersPayload = ; // 
     
    -// Create group.
    -[apiInstance createGroupWith:accept
    +// Merge or remove members of a static group.
    +[apiInstance updateProvidedMembersWith:accept
         contentType:contentType
    -    group:group
    -              completionHandler: ^(GroupResponse output, NSError* error) {
    -    if (output) {
    -        NSLog(@"%@", output);
    -    }
    +    groupId:groupId
    +    updateProvidedMembersPayload:updateProvidedMembersPayload
    +              completionHandler: ^(NSError* error) {
         if (error) {
             NSLog(@"Error: %@", error);
         }
    @@ -14284,30 +16125,31 @@ Group *group = ; //
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.TopologyGroupsApi()
    +var api = new TopologyExposureAndInventoryApi.GroupsApi()
     var accept = application/json; // {String} 
     var contentType = application/json; // {String} 
    -var group = ; // {Group} 
    +var groupId = groupId_example; // {String} 
    +var updateProvidedMembersPayload = ; // {UpdateProvidedMembersPayload} 
     
     var callback = function(error, data, response) {
       if (error) {
         console.error(error);
       } else {
    -    console.log('API called successfully. Returned data: ' + data);
    +    console.log('API called successfully.');
       }
     };
    -api.createGroup(accept, contentType, group, callback);
    +api.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -14316,23 +16158,23 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class createGroupExample
    +    public class updateProvidedMembersExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new TopologyGroupsApi();
    +            var apiInstance = new GroupsApi();
                 var accept = application/json;  // String |  (default to application/json)
                 var contentType = application/json;  // String |  (default to application/json)
    -            var group = new Group(); // Group | 
    +            var groupId = groupId_example;  // String |  (default to null)
    +            var updateProvidedMembersPayload = new UpdateProvidedMembersPayload(); // UpdateProvidedMembersPayload | 
     
                 try {
    -                // Create group.
    -                GroupResponse result = apiInstance.createGroup(accept, contentType, group);
    -                Debug.WriteLine(result);
    +                // Merge or remove members of a static group.
    +                apiInstance.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling TopologyGroupsApi.createGroup: " + e.Message );
    +                Debug.Print("Exception when calling GroupsApi.updateProvidedMembers: " + e.Message );
                 }
             }
         }
    @@ -14340,46 +16182,46 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\TopologyGroupsApi();
    +$api_instance = new OpenAPITools\Client\Api\GroupsApi();
     $accept = application/json; // String | 
     $contentType = application/json; // String | 
    -$group = ; // Group | 
    +$groupId = groupId_example; // String | 
    +$updateProvidedMembersPayload = ; // UpdateProvidedMembersPayload | 
     
     try {
    -    $result = $api_instance->createGroup($accept, $contentType, $group);
    -    print_r($result);
    +    $api_instance->updateProvidedMembers($accept, $contentType, $groupId, $updateProvidedMembersPayload);
     } catch (Exception $e) {
    -    echo 'Exception when calling TopologyGroupsApi->createGroup: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling GroupsApi->updateProvidedMembers: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::TopologyGroupsApi;
    +use WWW::OPenAPIClient::GroupsApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::TopologyGroupsApi->new();
    +my $api_instance = WWW::OPenAPIClient::GroupsApi->new();
     my $accept = application/json; # String | 
     my $contentType = application/json; # String | 
    -my $group = WWW::OPenAPIClient::Object::Group->new(); # Group | 
    +my $groupId = groupId_example; # String | 
    +my $updateProvidedMembersPayload = WWW::OPenAPIClient::Object::UpdateProvidedMembersPayload->new(); # UpdateProvidedMembersPayload | 
     
     eval {
    -    my $result = $api_instance->createGroup(accept => $accept, contentType => $contentType, group => $group);
    -    print Dumper($result);
    +    $api_instance->updateProvidedMembers(accept => $accept, contentType => $contentType, groupId => $groupId, updateProvidedMembersPayload => $updateProvidedMembersPayload);
     };
     if ($@) {
    -    warn "Exception when calling TopologyGroupsApi->createGroup: $@\n";
    +    warn "Exception when calling GroupsApi->updateProvidedMembers: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -14387,29 +16229,30 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.TopologyGroupsApi()
    +api_instance = openapi_client.GroupsApi()
     accept = application/json # String |  (default to application/json)
     contentType = application/json # String |  (default to application/json)
    -group =  # Group | 
    +groupId = groupId_example # String |  (default to null)
    +updateProvidedMembersPayload =  # UpdateProvidedMembersPayload | 
     
     try:
    -    # Create group.
    -    api_response = api_instance.create_group(accept, contentType, group)
    -    pprint(api_response)
    +    # Merge or remove members of a static group.
    +    api_instance.update_provided_members(accept, contentType, groupId, updateProvidedMembersPayload)
     except ApiException as e:
    -    print("Exception when calling TopologyGroupsApi->createGroup: %s\n" % e)
    + print("Exception when calling GroupsApi->updateProvidedMembers: %s\n" % e)
    -
    -
    extern crate TopologyGroupsApi;
    +                            
    +
    extern crate GroupsApi;
     
     pub fn main() {
         let accept = application/json; // String
         let contentType = application/json; // String
    -    let group = ; // Group
    +    let groupId = groupId_example; // String
    +    let updateProvidedMembersPayload = ; // UpdateProvidedMembersPayload
     
    -    let mut context = TopologyGroupsApi::Context::default();
    -    let result = client.createGroup(accept, contentType, group, &context).wait();
    +    let mut context = GroupsApi::Context::default();
    +    let result = client.updateProvidedMembers(accept, contentType, groupId, updateProvidedMembersPayload, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -14424,6 +16267,33 @@ pub fn main() {
     
                               

    Parameters

    +
    Path parameters
    + + + + + + + + + +
    NameDescription
    groupId* + + +
    +
    +
    + + String + + +
    +
    + Required +
    +
    +
    +
    Header parameters
    @@ -14435,7 +16305,7 @@ pub fn main() { - + - - -
    -
    +
    @@ -14455,7 +16325,7 @@ pub fn main() {
    -
    +
    @@ -14479,7 +16349,7 @@ pub fn main() {
    Name Description
    group *
    updateProvidedMembersPayload *

    -
    -
    - - - -

    Responses

    -

    -

    - - - - - - -
    -
    -
    - -
    - -
    -
    -

    -

    - - - - - - -
    -
    -
    - -
    - -
    -
    -

    -

    - - - - - - -
    -
    -
    - -
    - -
    -
    -

    -

    + var schema = findNode('schema',schemaWrapper).schema; + if (!schema) { + schema = schemaWrapper.schema; + } + if (schema.$ref != null) { + schema = defsParser.$refs.get(schema.$ref); + } else if (schema.items != null && schema.items.$ref != null) { + schema.items = defsParser.$refs.get(schema.items.$ref); + } else { + schemaWrapper.definitions = Object.assign({}, defs); + $RefParser.dereference(schemaWrapper).catch(function(err) { + console.log(err); + }); + } + + var view = new JSONSchemaView(schema,2,{isBodyParam: true}); + var result = $('#d2e199_updateProvidedMembers_updateProvidedMembersPayload'); + result.empty(); + result.append(view.render()); +}); + +
    + + + + + + + +

    Responses

    +

    +

    -

    -
    -
    +
    +
    +

    Schemas

    +
    +
    -

    deleteGroup

    -

    Delete a group with specified id.

    +

    createSchema

    +

    Create a new schema.

    -

    Delete a group with specified id.

    +

    Create a new schema. The request body contains the schema in YANG format.


    -
    /groups/{groupId}
    +
    /schemas

    Usage and SDK Samples

    -
    -
    curl -X DELETE \
    +                          
    +
    curl -X POST \
      -H "Accept: application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/groups/{groupId}"
    + -H "Content-Type: multipart/form-data" \
    + "https://localhost/topology-inventory/v1alpha11/schemas"
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.TopologyGroupsApi;
    +import org.openapitools.client.api.SchemasApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    +        String contentType = multipart/form-data; // String | 
    +        File file = BINARY_DATA_HERE; // File | multipartFile
     
             try {
    -            apiInstance.deleteGroup(accept, groupId);
    +            apiInstance.createSchema(accept, contentType, file);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#deleteGroup");
    +            System.err.println("Exception when calling SchemasApi#createSchema");
                 e.printStackTrace();
             }
         }
    @@ -15089,57 +16705,61 @@ public class TopologyGroupsApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
    -final String groupId = new String(); // String | 
    +final String contentType = new String(); // String | 
    +final File file = new File(); // File | multipartFile
     
     try {
    -    final result = await api_instance.deleteGroup(accept, groupId);
    +    final result = await api_instance.createSchema(accept, contentType, file);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->deleteGroup: $e\n');
    +    print('Exception when calling DefaultApi->createSchema: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.TopologyGroupsApi;
    +                          
    +
    import org.openapitools.client.api.SchemasApi;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    +        String contentType = multipart/form-data; // String | 
    +        File file = BINARY_DATA_HERE; // File | multipartFile
     
             try {
    -            apiInstance.deleteGroup(accept, groupId);
    +            apiInstance.createSchema(accept, contentType, file);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#deleteGroup");
    +            System.err.println("Exception when calling SchemasApi#createSchema");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -TopologyGroupsApi *apiInstance = [[TopologyGroupsApi alloc] init];
    +SchemasApi *apiInstance = [[SchemasApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -String *groupId = groupId_example; //  (default to null)
    +String *contentType = multipart/form-data; //  (default to multipart/form-data)
    +File *file = BINARY_DATA_HERE; // multipartFile (default to null)
     
    -// Delete a group with specified id.
    -[apiInstance deleteGroupWith:accept
    -    groupId:groupId
    +// Create a new schema.
    +[apiInstance createSchemaWith:accept
    +    contentType:contentType
    +    file:file
                   completionHandler: ^(NSError* error) {
         if (error) {
             NSLog(@"Error: %@", error);
    @@ -15148,13 +16768,14 @@ String *groupId = groupId_example; //  (default to null)
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.TopologyGroupsApi()
    +var api = new TopologyExposureAndInventoryApi.SchemasApi()
     var accept = application/json; // {String} 
    -var groupId = groupId_example; // {String} 
    +var contentType = multipart/form-data; // {String} 
    +var file = BINARY_DATA_HERE; // {File} multipartFile
     
     var callback = function(error, data, response) {
       if (error) {
    @@ -15163,14 +16784,14 @@ var callback = function(error, data, response) {
         console.log('API called successfully.');
       }
     };
    -api.deleteGroup(accept, groupId, callback);
    +api.createSchema(accept, contentType, file, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -15179,21 +16800,22 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class deleteGroupExample
    +    public class createSchemaExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new TopologyGroupsApi();
    +            var apiInstance = new SchemasApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var groupId = groupId_example;  // String |  (default to null)
    +            var contentType = multipart/form-data;  // String |  (default to multipart/form-data)
    +            var file = BINARY_DATA_HERE;  // File | multipartFile (default to null)
     
                 try {
    -                // Delete a group with specified id.
    -                apiInstance.deleteGroup(accept, groupId);
    +                // Create a new schema.
    +                apiInstance.createSchema(accept, contentType, file);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling TopologyGroupsApi.deleteGroup: " + e.Message );
    +                Debug.Print("Exception when calling SchemasApi.createSchema: " + e.Message );
                 }
             }
         }
    @@ -15201,42 +16823,44 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\TopologyGroupsApi();
    +$api_instance = new OpenAPITools\Client\Api\SchemasApi();
     $accept = application/json; // String | 
    -$groupId = groupId_example; // String | 
    +$contentType = multipart/form-data; // String | 
    +$file = BINARY_DATA_HERE; // File | multipartFile
     
     try {
    -    $api_instance->deleteGroup($accept, $groupId);
    +    $api_instance->createSchema($accept, $contentType, $file);
     } catch (Exception $e) {
    -    echo 'Exception when calling TopologyGroupsApi->deleteGroup: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling SchemasApi->createSchema: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::TopologyGroupsApi;
    +use WWW::OPenAPIClient::SchemasApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::TopologyGroupsApi->new();
    +my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
     my $accept = application/json; # String | 
    -my $groupId = groupId_example; # String | 
    +my $contentType = multipart/form-data; # String | 
    +my $file = BINARY_DATA_HERE; # File | multipartFile
     
     eval {
    -    $api_instance->deleteGroup(accept => $accept, groupId => $groupId);
    +    $api_instance->createSchema(accept => $accept, contentType => $contentType, file => $file);
     };
     if ($@) {
    -    warn "Exception when calling TopologyGroupsApi->deleteGroup: $@\n";
    +    warn "Exception when calling SchemasApi->createSchema: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -15244,26 +16868,28 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.TopologyGroupsApi()
    +api_instance = openapi_client.SchemasApi()
     accept = application/json # String |  (default to application/json)
    -groupId = groupId_example # String |  (default to null)
    +contentType = multipart/form-data # String |  (default to multipart/form-data)
    +file = BINARY_DATA_HERE # File | multipartFile (default to null)
     
     try:
    -    # Delete a group with specified id.
    -    api_instance.delete_group(accept, groupId)
    +    # Create a new schema.
    +    api_instance.create_schema(accept, contentType, file)
     except ApiException as e:
    -    print("Exception when calling TopologyGroupsApi->deleteGroup: %s\n" % e)
    + print("Exception when calling SchemasApi->createSchema: %s\n" % e)
    -
    -
    extern crate TopologyGroupsApi;
    +                            
    +
    extern crate SchemasApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let groupId = groupId_example; // String
    +    let contentType = multipart/form-data; // String
    +    let file = BINARY_DATA_HERE; // File
     
    -    let mut context = TopologyGroupsApi::Context::default();
    -    let result = client.deleteGroup(accept, groupId, &context).wait();
    +    let mut context = SchemasApi::Context::default();
    +    let result = client.createSchema(accept, contentType, file, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -15278,17 +16904,38 @@ pub fn main() {
     
                               

    Parameters

    -
    Path parameters
    + +
    Header parameters
    - - - - - + + + + + + + + +
    NameDescription
    groupId*
    NameDescription
    Accept* -
    +
    +
    +
    + + String + + +
    +
    + Required +
    +
    +
    +
    Content-Type* + + +
    @@ -15306,23 +16953,30 @@ pub fn main() {
    -
    Header parameters
    + +
    Form parameters
    - +
    Name Description
    Accept*
    file* -
    +
    - String + File + + (binary) + +
    +multipartFile +
    Required @@ -15335,37 +16989,34 @@ pub fn main() {
    - -

    Responses

    -

    -

    +

    +

    -

    -
    -
    +
    +
    -

    getAllGroups

    -

    Get all groups.

    +

    deleteSchema

    +

    Delete a schema.

    -

    Get all groups.

    +

    Delete a schema.


    -
    /groups
    +
    /schemas/{schemaName}

    Usage and SDK Samples

    -
    -
    curl -X GET \
    - -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/groups?offset=56&limit=56"
    +                          
    +
    curl -X DELETE \
    + -H "Accept: application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/schemas/{schemaName}"
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.TopologyGroupsApi;
    +import org.openapitools.client.api.SchemasApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        Integer offset = 56; // Integer | Pagination offset.
    -        Integer limit = 56; // Integer | Result limiter.
    +        String schemaName = schemaName_example; // String | 
     
             try {
    -            Groups result = apiInstance.getAllGroups(accept, offset, limit);
    -            System.out.println(result);
    +            apiInstance.deleteSchema(accept, schemaName);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#getAllGroups");
    +            System.err.println("Exception when calling SchemasApi#deleteSchema");
                 e.printStackTrace();
             }
         }
    @@ -15880,66 +17529,58 @@ public class TopologyGroupsApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
    -final Integer offset = new Integer(); // Integer | Pagination offset.
    -final Integer limit = new Integer(); // Integer | Result limiter.
    +final String schemaName = new String(); // String | 
     
     try {
    -    final result = await api_instance.getAllGroups(accept, offset, limit);
    +    final result = await api_instance.deleteSchema(accept, schemaName);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->getAllGroups: $e\n');
    +    print('Exception when calling DefaultApi->deleteSchema: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.TopologyGroupsApi;
    +                          
    +
    import org.openapitools.client.api.SchemasApi;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        Integer offset = 56; // Integer | Pagination offset.
    -        Integer limit = 56; // Integer | Result limiter.
    +        String schemaName = schemaName_example; // String | 
     
             try {
    -            Groups result = apiInstance.getAllGroups(accept, offset, limit);
    -            System.out.println(result);
    +            apiInstance.deleteSchema(accept, schemaName);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#getAllGroups");
    +            System.err.println("Exception when calling SchemasApi#deleteSchema");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -TopologyGroupsApi *apiInstance = [[TopologyGroupsApi alloc] init];
    +SchemasApi *apiInstance = [[SchemasApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -Integer *offset = 56; // Pagination offset. (optional) (default to 0)
    -Integer *limit = 56; // Result limiter. (optional) (default to 500)
    +String *schemaName = schemaName_example; //  (default to o-ran-smo-teiv-ran)
     
    -// Get all groups.
    -[apiInstance getAllGroupsWith:accept
    -    offset:offset
    -    limit:limit
    -              completionHandler: ^(Groups output, NSError* error) {
    -    if (output) {
    -        NSLog(@"%@", output);
    -    }
    +// Delete a schema.
    +[apiInstance deleteSchemaWith:accept
    +    schemaName:schemaName
    +              completionHandler: ^(NSError* error) {
         if (error) {
             NSLog(@"Error: %@", error);
         }
    @@ -15947,32 +17588,29 @@ Integer *limit = 56; // Result limiter. (optional) (default to 500)
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.TopologyGroupsApi()
    +var api = new TopologyExposureAndInventoryApi.SchemasApi()
     var accept = application/json; // {String} 
    -var opts = {
    -  'offset': 56, // {Integer} Pagination offset.
    -  'limit': 56 // {Integer} Result limiter.
    -};
    +var schemaName = schemaName_example; // {String} 
     
     var callback = function(error, data, response) {
       if (error) {
         console.error(error);
       } else {
    -    console.log('API called successfully. Returned data: ' + data);
    +    console.log('API called successfully.');
       }
     };
    -api.getAllGroups(accept, opts, callback);
    +api.deleteSchema(accept, schemaName, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -15981,23 +17619,21 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class getAllGroupsExample
    +    public class deleteSchemaExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new TopologyGroupsApi();
    +            var apiInstance = new SchemasApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var offset = 56;  // Integer | Pagination offset. (optional)  (default to 0)
    -            var limit = 56;  // Integer | Result limiter. (optional)  (default to 500)
    +            var schemaName = schemaName_example;  // String |  (default to o-ran-smo-teiv-ran)
     
                 try {
    -                // Get all groups.
    -                Groups result = apiInstance.getAllGroups(accept, offset, limit);
    -                Debug.WriteLine(result);
    +                // Delete a schema.
    +                apiInstance.deleteSchema(accept, schemaName);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling TopologyGroupsApi.getAllGroups: " + e.Message );
    +                Debug.Print("Exception when calling SchemasApi.deleteSchema: " + e.Message );
                 }
             }
         }
    @@ -16005,46 +17641,42 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\TopologyGroupsApi();
    +$api_instance = new OpenAPITools\Client\Api\SchemasApi();
     $accept = application/json; // String | 
    -$offset = 56; // Integer | Pagination offset.
    -$limit = 56; // Integer | Result limiter.
    +$schemaName = schemaName_example; // String | 
     
     try {
    -    $result = $api_instance->getAllGroups($accept, $offset, $limit);
    -    print_r($result);
    +    $api_instance->deleteSchema($accept, $schemaName);
     } catch (Exception $e) {
    -    echo 'Exception when calling TopologyGroupsApi->getAllGroups: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling SchemasApi->deleteSchema: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::TopologyGroupsApi;
    +use WWW::OPenAPIClient::SchemasApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::TopologyGroupsApi->new();
    +my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
     my $accept = application/json; # String | 
    -my $offset = 56; # Integer | Pagination offset.
    -my $limit = 56; # Integer | Result limiter.
    +my $schemaName = schemaName_example; # String | 
     
     eval {
    -    my $result = $api_instance->getAllGroups(accept => $accept, offset => $offset, limit => $limit);
    -    print Dumper($result);
    +    $api_instance->deleteSchema(accept => $accept, schemaName => $schemaName);
     };
     if ($@) {
    -    warn "Exception when calling TopologyGroupsApi->getAllGroups: $@\n";
    +    warn "Exception when calling SchemasApi->deleteSchema: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -16052,29 +17684,26 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.TopologyGroupsApi()
    +api_instance = openapi_client.SchemasApi()
     accept = application/json # String |  (default to application/json)
    -offset = 56 # Integer | Pagination offset. (optional) (default to 0)
    -limit = 56 # Integer | Result limiter. (optional) (default to 500)
    +schemaName = schemaName_example # String |  (default to o-ran-smo-teiv-ran)
     
     try:
    -    # Get all groups.
    -    api_response = api_instance.get_all_groups(accept, offset=offset, limit=limit)
    -    pprint(api_response)
    +    # Delete a schema.
    +    api_instance.delete_schema(accept, schemaName)
     except ApiException as e:
    -    print("Exception when calling TopologyGroupsApi->getAllGroups: %s\n" % e)
    + print("Exception when calling SchemasApi->deleteSchema: %s\n" % e)
    -
    -
    extern crate TopologyGroupsApi;
    +                            
    +
    extern crate SchemasApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let offset = 56; // Integer
    -    let limit = 56; // Integer
    +    let schemaName = schemaName_example; // String
     
    -    let mut context = TopologyGroupsApi::Context::default();
    -    let result = client.getAllGroups(accept, offset, limit, &context).wait();
    +    let mut context = SchemasApi::Context::default();
    +    let result = client.deleteSchema(accept, schemaName, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -16089,18 +17718,17 @@ pub fn main() {
     
                               

    Parameters

    - -
    Header parameters
    +
    Path parameters
    - - - - - + + + + + -
    NameDescription
    Accept*
    NameDescription
    schemaName* -
    +
    @@ -16116,51 +17744,29 @@ pub fn main() {
    - - - -
    Query parameters
    - - - - - - - - +
    NameDescription
    offset - - -
    -
    -
    - - Integer - - -
    -Pagination offset. -
    -
    -
    -
    -
    - limit +
    Header parameters
    + + + + + + @@ -16168,111 +17774,33 @@ Result limiter.
    NameDescription
    Accept* -
    +
    - Integer + String -
    -Result limiter. -
    +
    + Required +
    -

    Responses

    -

    -

    - - - - -
    -
    -
    - -
    - -
    -
    -

    -

    +

    Responses

    +

    +

    -

    -
    -
    +
    +
    -

    getGroup

    -

    Get a group with specified id.

    +

    getSchemaByName

    +

    Get the model schema.

    -

    Get a Group with specified id.

    +

    Get the model schema by name.


    -
    /groups/{groupId}
    +
    /schemas/{schemaName}/content

    Usage and SDK Samples

    -
    +
    curl -X GET \
    - -H "Accept: application/json,application/problem+json" \
    - "https://localhost/topology-inventory/v1alpha11/groups/{groupId}"
    + -H "Accept: text/plain,application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/schemas/{schemaName}/content"
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.TopologyGroupsApi;
    +import org.openapitools.client.api.SchemasApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    +        String schemaName = schemaName_example; // String | 
     
             try {
    -            GroupResponse result = apiInstance.getGroup(accept, groupId);
    +            'String' result = apiInstance.getSchemaByName(accept, schemaName);
                 System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#getGroup");
    +            System.err.println("Exception when calling SchemasApi#getSchemaByName");
                 e.printStackTrace();
             }
         }
    @@ -16710,59 +18238,59 @@ public class TopologyGroupsApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
    -final String groupId = new String(); // String | 
    +final String schemaName = new String(); // String | 
     
     try {
    -    final result = await api_instance.getGroup(accept, groupId);
    +    final result = await api_instance.getSchemaByName(accept, schemaName);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->getGroup: $e\n');
    +    print('Exception when calling DefaultApi->getSchemaByName: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.TopologyGroupsApi;
    +                          
    +
    import org.openapitools.client.api.SchemasApi;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    +        String schemaName = schemaName_example; // String | 
     
             try {
    -            GroupResponse result = apiInstance.getGroup(accept, groupId);
    +            'String' result = apiInstance.getSchemaByName(accept, schemaName);
                 System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#getGroup");
    +            System.err.println("Exception when calling SchemasApi#getSchemaByName");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -TopologyGroupsApi *apiInstance = [[TopologyGroupsApi alloc] init];
    +SchemasApi *apiInstance = [[SchemasApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -String *groupId = groupId_example; //  (default to null)
    +String *schemaName = schemaName_example; //  (default to o-ran-smo-teiv-ran)
     
    -// Get a group with specified id.
    -[apiInstance getGroupWith:accept
    -    groupId:groupId
    -              completionHandler: ^(GroupResponse output, NSError* error) {
    +// Get the model schema.
    +[apiInstance getSchemaByNameWith:accept
    +    schemaName:schemaName
    +              completionHandler: ^('String' output, NSError* error) {
         if (output) {
             NSLog(@"%@", output);
         }
    @@ -16773,13 +18301,13 @@ String *groupId = groupId_example; //  (default to null)
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.TopologyGroupsApi()
    +var api = new TopologyExposureAndInventoryApi.SchemasApi()
     var accept = application/json; // {String} 
    -var groupId = groupId_example; // {String} 
    +var schemaName = schemaName_example; // {String} 
     
     var callback = function(error, data, response) {
       if (error) {
    @@ -16788,14 +18316,14 @@ var callback = function(error, data, response) {
         console.log('API called successfully. Returned data: ' + data);
       }
     };
    -api.getGroup(accept, groupId, callback);
    +api.getSchemaByName(accept, schemaName, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -16804,22 +18332,22 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class getGroupExample
    +    public class getSchemaByNameExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new TopologyGroupsApi();
    +            var apiInstance = new SchemasApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var groupId = groupId_example;  // String |  (default to null)
    +            var schemaName = schemaName_example;  // String |  (default to o-ran-smo-teiv-ran)
     
                 try {
    -                // Get a group with specified id.
    -                GroupResponse result = apiInstance.getGroup(accept, groupId);
    +                // Get the model schema.
    +                'String' result = apiInstance.getSchemaByName(accept, schemaName);
                     Debug.WriteLine(result);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling TopologyGroupsApi.getGroup: " + e.Message );
    +                Debug.Print("Exception when calling SchemasApi.getSchemaByName: " + e.Message );
                 }
             }
         }
    @@ -16827,44 +18355,44 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\TopologyGroupsApi();
    +$api_instance = new OpenAPITools\Client\Api\SchemasApi();
     $accept = application/json; // String | 
    -$groupId = groupId_example; // String | 
    +$schemaName = schemaName_example; // String | 
     
     try {
    -    $result = $api_instance->getGroup($accept, $groupId);
    +    $result = $api_instance->getSchemaByName($accept, $schemaName);
         print_r($result);
     } catch (Exception $e) {
    -    echo 'Exception when calling TopologyGroupsApi->getGroup: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling SchemasApi->getSchemaByName: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::TopologyGroupsApi;
    +use WWW::OPenAPIClient::SchemasApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::TopologyGroupsApi->new();
    +my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
     my $accept = application/json; # String | 
    -my $groupId = groupId_example; # String | 
    +my $schemaName = schemaName_example; # String | 
     
     eval {
    -    my $result = $api_instance->getGroup(accept => $accept, groupId => $groupId);
    +    my $result = $api_instance->getSchemaByName(accept => $accept, schemaName => $schemaName);
         print Dumper($result);
     };
     if ($@) {
    -    warn "Exception when calling TopologyGroupsApi->getGroup: $@\n";
    +    warn "Exception when calling SchemasApi->getSchemaByName: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -16872,27 +18400,27 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.TopologyGroupsApi()
    +api_instance = openapi_client.SchemasApi()
     accept = application/json # String |  (default to application/json)
    -groupId = groupId_example # String |  (default to null)
    +schemaName = schemaName_example # String |  (default to o-ran-smo-teiv-ran)
     
     try:
    -    # Get a group with specified id.
    -    api_response = api_instance.get_group(accept, groupId)
    +    # Get the model schema.
    +    api_response = api_instance.get_schema_by_name(accept, schemaName)
         pprint(api_response)
     except ApiException as e:
    -    print("Exception when calling TopologyGroupsApi->getGroup: %s\n" % e)
    + print("Exception when calling SchemasApi->getSchemaByName: %s\n" % e)
    -
    -
    extern crate TopologyGroupsApi;
    +                            
    +
    extern crate SchemasApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let groupId = groupId_example; // String
    +    let schemaName = schemaName_example; // String
     
    -    let mut context = TopologyGroupsApi::Context::default();
    -    let result = client.getGroup(accept, groupId, &context).wait();
    +    let mut context = SchemasApi::Context::default();
    +    let result = client.getSchemaByName(accept, schemaName, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -16913,11 +18441,11 @@ pub fn main() {
                                       Name
                                       Description
                                     
    -                                  groupId*
    +                                  schemaName*
     
     
     
    -    
    +
    @@ -16945,7 +18473,7 @@ pub fn main() { -
    +
    @@ -16967,23 +18495,23 @@ pub fn main() {

    Responses

    -

    -

    +

    +

    -

    -
    -
    +
    +
    -

    updateGroup

    -

    Update a Group.

    +

    getSchemas

    +

    Get a list of all schemas.

    -

    Update a Group.

    +

    Get a list of all schemas.


    -
    /groups/{groupId}
    +
    /schemas

    Usage and SDK Samples

    -
    -
    curl -X PUT \
    - -H "Accept: application/problem+json" \
    - -H "Content-Type: application/json" \
    - "https://localhost/topology-inventory/v1alpha11/groups/{groupId}" \
    - -d '{
    -  "groupName" : "groupName",
    -  "criteria" : {
    -    "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    -  }
    -}'
    +                          
    +
    curl -X GET \
    + -H "Accept: application/json,application/problem+json" \
    + "https://localhost/topology-inventory/v1alpha11/schemas?domain=RAN&offset=56&limit=56"
     
    -
    +
    import org.openapitools.client.*;
     import org.openapitools.client.auth.*;
     import org.openapitools.client.model.*;
    -import org.openapitools.client.api.TopologyGroupsApi;
    +import org.openapitools.client.api.SchemasApi;
     
     import java.io.File;
     import java.util.*;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
     
             // Create an instance of the API class
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String contentType = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    -        Group group = ; // Group | 
    +        String domain = RAN; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
     
             try {
    -            apiInstance.updateGroup(accept, contentType, groupId, group);
    +            SchemaList result = apiInstance.getSchemas(accept, domain, offset, limit);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#updateGroup");
    +            System.err.println("Exception when calling SchemasApi#getSchemas");
                 e.printStackTrace();
             }
         }
    @@ -17532,66 +19054,70 @@ public class TopologyGroupsApiExample {
     
    -
    +
    import 'package:openapi/api.dart';
     
     final api_instance = DefaultApi();
     
     final String accept = new String(); // String | 
    -final String contentType = new String(); // String | 
    -final String groupId = new String(); // String | 
    -final Group group = new Group(); // Group | 
    +final String domain = new String(); // String | 
    +final Integer offset = new Integer(); // Integer | Pagination offset.
    +final Integer limit = new Integer(); // Integer | Result limiter.
     
     try {
    -    final result = await api_instance.updateGroup(accept, contentType, groupId, group);
    +    final result = await api_instance.getSchemas(accept, domain, offset, limit);
         print(result);
     } catch (e) {
    -    print('Exception when calling DefaultApi->updateGroup: $e\n');
    +    print('Exception when calling DefaultApi->getSchemas: $e\n');
     }
     
     
    -
    -
    import org.openapitools.client.api.TopologyGroupsApi;
    +                          
    +
    import org.openapitools.client.api.SchemasApi;
     
    -public class TopologyGroupsApiExample {
    +public class SchemasApiExample {
         public static void main(String[] args) {
    -        TopologyGroupsApi apiInstance = new TopologyGroupsApi();
    +        SchemasApi apiInstance = new SchemasApi();
             String accept = application/json; // String | 
    -        String contentType = application/json; // String | 
    -        String groupId = groupId_example; // String | 
    -        Group group = ; // Group | 
    +        String domain = RAN; // String | 
    +        Integer offset = 56; // Integer | Pagination offset.
    +        Integer limit = 56; // Integer | Result limiter.
     
             try {
    -            apiInstance.updateGroup(accept, contentType, groupId, group);
    +            SchemaList result = apiInstance.getSchemas(accept, domain, offset, limit);
    +            System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling TopologyGroupsApi#updateGroup");
    +            System.err.println("Exception when calling SchemasApi#getSchemas");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    
     
     // Create an instance of the API class
    -TopologyGroupsApi *apiInstance = [[TopologyGroupsApi alloc] init];
    +SchemasApi *apiInstance = [[SchemasApi alloc] init];
     String *accept = application/json; //  (default to application/json)
    -String *contentType = application/json; //  (default to application/json)
    -String *groupId = groupId_example; //  (default to null)
    -Group *group = ; // 
    +String *domain = RAN; //  (optional) (default to null)
    +Integer *offset = 56; // Pagination offset. (optional) (default to 0)
    +Integer *limit = 56; // Result limiter. (optional) (default to 500)
     
    -// Update a Group.
    -[apiInstance updateGroupWith:accept
    -    contentType:contentType
    -    groupId:groupId
    -    group:group
    -              completionHandler: ^(NSError* error) {
    +// Get a list of all schemas.
    +[apiInstance getSchemasWith:accept
    +    domain:domain
    +    offset:offset
    +    limit:limit
    +              completionHandler: ^(SchemaList output, NSError* error) {
    +    if (output) {
    +        NSLog(@"%@", output);
    +    }
         if (error) {
             NSLog(@"Error: %@", error);
         }
    @@ -17599,31 +19125,33 @@ Group *group = ; //
     
    -
    +
    var TopologyExposureAndInventoryApi = require('topology_exposure_and_inventory_api');
     
     // Create an instance of the API class
    -var api = new TopologyExposureAndInventoryApi.TopologyGroupsApi()
    +var api = new TopologyExposureAndInventoryApi.SchemasApi()
     var accept = application/json; // {String} 
    -var contentType = application/json; // {String} 
    -var groupId = groupId_example; // {String} 
    -var group = ; // {Group} 
    +var opts = {
    +  'domain': RAN, // {String} 
    +  'offset': 56, // {Integer} Pagination offset.
    +  'limit': 56 // {Integer} Result limiter.
    +};
     
     var callback = function(error, data, response) {
       if (error) {
         console.error(error);
       } else {
    -    console.log('API called successfully.');
    +    console.log('API called successfully. Returned data: ' + data);
       }
     };
    -api.updateGroup(accept, contentType, groupId, group, callback);
    +api.getSchemas(accept, opts, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using Org.OpenAPITools.Api;
    @@ -17632,23 +19160,24 @@ using Org.OpenAPITools.Model;
     
     namespace Example
     {
    -    public class updateGroupExample
    +    public class getSchemasExample
         {
             public void main()
             {
     
                 // Create an instance of the API class
    -            var apiInstance = new TopologyGroupsApi();
    +            var apiInstance = new SchemasApi();
                 var accept = application/json;  // String |  (default to application/json)
    -            var contentType = application/json;  // String |  (default to application/json)
    -            var groupId = groupId_example;  // String |  (default to null)
    -            var group = new Group(); // Group | 
    +            var domain = RAN;  // String |  (optional)  (default to null)
    +            var offset = 56;  // Integer | Pagination offset. (optional)  (default to 0)
    +            var limit = 56;  // Integer | Result limiter. (optional)  (default to 500)
     
                 try {
    -                // Update a Group.
    -                apiInstance.updateGroup(accept, contentType, groupId, group);
    +                // Get a list of all schemas.
    +                SchemaList result = apiInstance.getSchemas(accept, domain, offset, limit);
    +                Debug.WriteLine(result);
                 } catch (Exception e) {
    -                Debug.Print("Exception when calling TopologyGroupsApi.updateGroup: " + e.Message );
    +                Debug.Print("Exception when calling SchemasApi.getSchemas: " + e.Message );
                 }
             }
         }
    @@ -17656,46 +19185,48 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
     // Create an instance of the API class
    -$api_instance = new OpenAPITools\Client\Api\TopologyGroupsApi();
    +$api_instance = new OpenAPITools\Client\Api\SchemasApi();
     $accept = application/json; // String | 
    -$contentType = application/json; // String | 
    -$groupId = groupId_example; // String | 
    -$group = ; // Group | 
    +$domain = RAN; // String | 
    +$offset = 56; // Integer | Pagination offset.
    +$limit = 56; // Integer | Result limiter.
     
     try {
    -    $api_instance->updateGroup($accept, $contentType, $groupId, $group);
    +    $result = $api_instance->getSchemas($accept, $domain, $offset, $limit);
    +    print_r($result);
     } catch (Exception $e) {
    -    echo 'Exception when calling TopologyGroupsApi->updateGroup: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling SchemasApi->getSchemas: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::OPenAPIClient::Configuration;
    -use WWW::OPenAPIClient::TopologyGroupsApi;
    +use WWW::OPenAPIClient::SchemasApi;
     
     # Create an instance of the API class
    -my $api_instance = WWW::OPenAPIClient::TopologyGroupsApi->new();
    +my $api_instance = WWW::OPenAPIClient::SchemasApi->new();
     my $accept = application/json; # String | 
    -my $contentType = application/json; # String | 
    -my $groupId = groupId_example; # String | 
    -my $group = WWW::OPenAPIClient::Object::Group->new(); # Group | 
    +my $domain = RAN; # String | 
    +my $offset = 56; # Integer | Pagination offset.
    +my $limit = 56; # Integer | Result limiter.
     
     eval {
    -    $api_instance->updateGroup(accept => $accept, contentType => $contentType, groupId => $groupId, group => $group);
    +    my $result = $api_instance->getSchemas(accept => $accept, domain => $domain, offset => $offset, limit => $limit);
    +    print Dumper($result);
     };
     if ($@) {
    -    warn "Exception when calling TopologyGroupsApi->updateGroup: $@\n";
    +    warn "Exception when calling SchemasApi->getSchemas: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import openapi_client
    @@ -17703,30 +19234,31 @@ from openapi_client.rest import ApiException
     from pprint import pprint
     
     # Create an instance of the API class
    -api_instance = openapi_client.TopologyGroupsApi()
    +api_instance = openapi_client.SchemasApi()
     accept = application/json # String |  (default to application/json)
    -contentType = application/json # String |  (default to application/json)
    -groupId = groupId_example # String |  (default to null)
    -group =  # Group | 
    +domain = RAN # String |  (optional) (default to null)
    +offset = 56 # Integer | Pagination offset. (optional) (default to 0)
    +limit = 56 # Integer | Result limiter. (optional) (default to 500)
     
     try:
    -    # Update a Group.
    -    api_instance.update_group(accept, contentType, groupId, group)
    +    # Get a list of all schemas.
    +    api_response = api_instance.get_schemas(accept, domain=domain, offset=offset, limit=limit)
    +    pprint(api_response)
     except ApiException as e:
    -    print("Exception when calling TopologyGroupsApi->updateGroup: %s\n" % e)
    + print("Exception when calling SchemasApi->getSchemas: %s\n" % e)
    -
    -
    extern crate TopologyGroupsApi;
    +                            
    +
    extern crate SchemasApi;
     
     pub fn main() {
         let accept = application/json; // String
    -    let contentType = application/json; // String
    -    let groupId = groupId_example; // String
    -    let group = ; // Group
    +    let domain = RAN; // String
    +    let offset = 56; // Integer
    +    let limit = 56; // Integer
     
    -    let mut context = TopologyGroupsApi::Context::default();
    -    let result = client.updateGroup(accept, contentType, groupId, group, &context).wait();
    +    let mut context = SchemasApi::Context::default();
    +    let result = client.getSchemas(accept, domain, offset, limit, &context).wait();
     
         println!("{:?}", result);
     }
    @@ -17740,18 +19272,19 @@ pub fn main() {
                               
     
                               

    Parameters

    - -
    Path parameters
    - - - - - - + + +
    Header parameters
    +
    NameDescription
    groupId*
    + + + + +
    NameDescription
    Accept* -
    +
    @@ -17769,17 +19302,19 @@ pub fn main() {
    -
    Header parameters
    + + +
    Query parameters
    - + - + -
    Name Description
    Accept*
    domain -
    +
    @@ -17787,124 +19322,98 @@ pub fn main() {
    -
    - Required -
    Content-Type*
    offset -
    +
    - String + Integer +
    +Pagination offset. +
    -
    - Required -
    - -
    Body parameters
    - - - - - - +
    NameDescription
    group *
    limit -

    - -
    +
    +
    +
    + + Integer + + +
    +Result limiter. +
    +
    +
    +
    - -

    Responses

    -

    -

    +

    +

    -
    diff --git a/docs/offeredapis/index.html b/docs/offeredapis/index.html index 7d91429..87b55a7 100644 --- a/docs/offeredapis/index.html +++ b/docs/offeredapis/index.html @@ -198,6 +198,9 @@ 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.

    +

    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.

    Topology Exposure and Inventory API provides the capabilities to fetch topology data. Using the filtering options, it is possible to define more specific query requests.

    @@ -209,22 +212,31 @@ 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 matches the given property in the scopeFilter parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | 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=3 and @gNBId=111] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 and the gNBId equals 111 | -| 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=3] | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 or the sourceIds contains an item with "SubNetwork=Ireland" |

    +

    | 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" |

    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 |

    +

    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 | |:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 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 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 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. | +| 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. | +| 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. | +| 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. |

    Querying entities for relationships

    The entityTypeName is used as the root of the queries.

    | Use case | domainName | entityTypeName | entityId | targetFilter | scopeFilter | Query result | @@ -245,7 +257,7 @@ retrieved and filtered using the /attributes.

    | 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 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. |

    The entityName is used as the root of the queries.

    | Use case | entityName | relationshipTypeName | targetFilter | scopeFilter | Query result | |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|:---------------------|:--------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -298,6 +310,17 @@ retrieved and filtered using the /attributes.

  • get /domains/{domainName}/entity-types
  • get /domains/{domainName}/relationship-types
  • +

    Groups

    +

    Schemas

    -

    TopologyGroups

    -

    Classifiers

    @@ -625,9 +640,9 @@ retrieved and filtered using the /attributes.

    Get entities by domain (getEntitiesByDomain)
    -
    Get topology entities by domain, using specified targetFilter as mandatory query parameter.
    +
    Get topology entities by domain, using a specified targetFilter as a query parameter.

    Path parameters

    @@ -737,9 +752,9 @@ retrieved and filtered using the /attributes.

    targetFilter (optional)
    -
    Query Parameter — Use targetFilter to specify the entity type and attributes to be returned in the REST response. The value for targetFilter can also be a list of entity types and attributes. default: null
    scopeFilter (optional)
    +
    Query Parameter — Use targetFilter to specify what needs to be returned in the REST response. default: null
    scopeFilter (optional)
    -
    Query Parameter — Use scopeFilter to specify the attributes to match on. The value for scopeFilter can also be a list of entity types and attributes. scopeFilter returns a boolean. default: null
    offset (optional)
    +
    Query Parameter — ScopeFilter is used to specify the conditions to be applied. default: null
    offset (optional)
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    @@ -928,9 +943,9 @@ retrieved and filtered using the /attributes.

    targetFilter (optional)
    -
    Query Parameter — Use targetFilter to specify the entity type and attributes to be returned in the REST response. The value for targetFilter can also be a list of entity types and attributes. default: null
    scopeFilter (optional)
    +
    Query Parameter — Use targetFilter to specify what needs to be returned in the REST response. default: null
    scopeFilter (optional)
    -
    Query Parameter — Use scopeFilter to specify the attributes to match on. The value for scopeFilter can also be a list of entity types and attributes. scopeFilter returns a boolean. default: null
    offset (optional)
    +
    Query Parameter — ScopeFilter is used to specify the conditions to be applied. default: null
    offset (optional)
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    @@ -1036,9 +1051,9 @@ retrieved and filtered using the /attributes.

    targetFilter (optional)
    -
    Query Parameter — Use targetFilter to specify the entity type and attributes to be returned in the REST response. The value for targetFilter can also be a list of entity types and attributes. default: null
    scopeFilter (optional)
    +
    Query Parameter — Use targetFilter to specify what needs to be returned in the REST response. default: null
    scopeFilter (optional)
    -
    Query Parameter — Use scopeFilter to specify the attributes to match on. The value for scopeFilter can also be a list of entity types and attributes. scopeFilter returns a boolean. default: null
    offset (optional)
    +
    Query Parameter — ScopeFilter is used to specify the conditions to be applied. default: null
    offset (optional)
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    @@ -1314,7 +1329,7 @@ retrieved and filtered using the /attributes.

    Up
    get /domains/{domainName}/relationship-types
    Get all the available topology relationship types. (getTopologyRelationshipTypes)
    -
    Get all the available topology relationship types.
    +
    Get all the available topology relationship types in a specified domain.

    Path parameters

    @@ -1421,21 +1436,28 @@ retrieved and filtered using the /attributes.

    ErrorMessage

    -

    Schemas

    -
    +

    Groups

    +
    Up -
    post /schemas
    -
    Create a new schema. (createSchema)
    -
    Create a new schema. The request body shall contain the schema in YANG format.
    +
    post /groups
    +
    Create a new group. (createGroup)
    +
    Create a group of entities and/or relationships in a static or dynamic way.

    Consumes

    This API call consumes the following media types via the Content-Type request header:
      -
    • multipart/form-data
    • +
    • application/json
    +

    Request body

    +
    +
    CreateGroupPayload CreateGroupPayload (required)
    + +
    Body Parameter
    + +

    Request headers

    @@ -1444,30 +1466,33 @@ retrieved and filtered using the /attributes.

    Header Parameter — default: application/json
    Content-Type (required)
    -
    Header Parameter — default: multipart/form-data
    +
    Header Parameter — default: application/json
    -

    Form parameters

    -
    -
    file (required)
    - -
    Form Parameter — multipartFile default: null format: binary
    -
    +

    Return type

    +

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    +
    Content-Type: application/json
    +
    {
    +  "members" : {
    +    "href" : "href"
    +  },
    +  "name" : "name",
    +  "providedMembers" : {
    +    "href" : "href"
    +  },
    +  "id" : "id",
    +  "type" : "static"
    +}

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    @@ -1479,62 +1504,44 @@ retrieved and filtered using the /attributes.

    This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.
      +
    • application/json
    • application/problem+json

    Responses

    201

    - Created without response body - + Created + GroupByIdResponse

    400

    Bad Request ErrorMessage -

    401

    - Unauthorized - ErrorMessage -

    403

    - Forbidden - ErrorMessage -

    409

    - Conflict - ErrorMessage

    500

    Internal Server Error ErrorMessage

    -
    +
    Up -
    delete /schemas/{schemaName}
    -
    Delete a schema. (deleteSchema)
    -
    Delete a schema.
    +
    delete /groups/{groupId}
    +
    Delete a group with specified id. (deleteGroup)
    +
    Delete a group with specified id.

    Path parameters

    -
    schemaName (required)
    +
    groupId (required)
    -
    Path Parameter — default: o-ran-smo-teiv-ran
    +
    Path Parameter — default: null
    -

    Request headers

    -
    -
    Accept (required)
    - -
    Header Parameter — default: application/json
    - -
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    @@ -1559,88 +1566,6 @@ retrieved and filtered using the /attributes.

    400

    Bad Request ErrorMessage -

    401

    - Unauthorized - ErrorMessage -

    403

    - Forbidden - ErrorMessage -

    500

    - Internal Server Error - ErrorMessage -
    -
    -
    -
    - Up -
    get /schemas/{schemaName}/content
    -
    Get the model schema. (getSchemaByName)
    -
    Get the model schema by name.
    - -

    Path parameters

    -
    -
    schemaName (required)
    - -
    Path Parameter — default: o-ran-smo-teiv-ran
    -
    - - - -

    Request headers

    -
    -
    Accept (required)
    - -
    Header Parameter — default: application/json
    - -
    - - - -

    Return type

    -
    - - String -
    - - - -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • text/plain
    • -
    • application/problem+json
    • -
    - -

    Responses

    -

    200

    - OK - String -

    400

    - Bad Request - ErrorMessage -

    401

    - Unauthorized - ErrorMessage -

    403

    - Forbidden - ErrorMessage

    404

    Not Found ErrorMessage @@ -1649,12 +1574,12 @@ retrieved and filtered using the /attributes.

    ErrorMessage

    -
    +
    Up -
    get /schemas
    -
    Get a list of all schemas. (getSchemas)
    -
    Get a list of all schemas.
    +
    get /groups
    +
    Get all groups. (getAllGroups)
    +
    Get all groups.
    @@ -1669,19 +1594,19 @@ retrieved and filtered using the /attributes.

    Query parameters

    -
    domain (optional)
    - -
    Query Parameter — default: null
    offset (optional)
    +
    offset (optional)
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    -
    Query Parameter — Result limiter. default: 500
    +
    Query Parameter — Result limiter. default: 500
    name (optional)
    + +
    Query Parameter — Group name. If not specified, returns all the groups. default: null

    Return type

    @@ -1704,19 +1629,25 @@ retrieved and filtered using the /attributes.

    }, "totalCount" : 0, "items" : [ { - "domain" : "domain", + "members" : { + "href" : "href" + }, "name" : "name", - "content" : { + "providedMembers" : { "href" : "href" }, - "revision" : "revision" + "id" : "id", + "type" : "static" }, { - "domain" : "domain", + "members" : { + "href" : "href" + }, "name" : "name", - "content" : { + "providedMembers" : { "href" : "href" }, - "revision" : "revision" + "id" : "id", + "type" : "static" } ], "first" : { "href" : "href" @@ -1728,12 +1659,6 @@ retrieved and filtered using the /attributes.

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json

    Produces

    This API call produces the following media types according to the Accept request header; @@ -1746,51 +1671,35 @@ retrieved and filtered using the /attributes.

    Responses

    200

    OK - SchemaList + GroupsResponse

    400

    Bad Request ErrorMessage -

    401

    - Unauthorized - ErrorMessage -

    403

    - Forbidden - ErrorMessage

    500

    Internal Server Error ErrorMessage

    -

    TopologyGroups

    -
    +
    Up -
    post /groups
    -
    Create group. (createGroup)
    -
    Create group.
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    +
    get /groups/{groupId}
    +
    Get a group with specified id. (getGroupById)
    +
    Get a group with specified id.
    -

    Request body

    +

    Path parameters

    -
    Group Group (required)
    - -
    Body Parameter
    +
    groupId (required)
    +
    Path Parameter — default: null
    + +

    Request headers

    Accept (required)
    -
    Header Parameter — default: application/json
    -
    Content-Type (required)
    -
    Header Parameter — default: application/json
    @@ -1799,7 +1708,7 @@ retrieved and filtered using the /attributes.

    Return type

    @@ -1808,11 +1717,15 @@ retrieved and filtered using the /attributes.

    Example data

    Content-Type: application/json
    {
    -  "groupName" : "groupName",
    -  "criteria" : {
    -    "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    +  "members" : {
    +    "href" : "href"
       },
    -  "id" : "id"
    +  "name" : "name",
    +  "providedMembers" : {
    +    "href" : "href"
    +  },
    +  "id" : "id",
    +  "type" : "static"
     }

    Example data

    Content-Type: application/problem+json
    @@ -1823,12 +1736,6 @@ retrieved and filtered using the /attributes.

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    -

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json

    Produces

    This API call produces the following media types according to the Accept request header; @@ -1839,32 +1746,26 @@ retrieved and filtered using the /attributes.

    Responses

    -

    201

    - Created - GroupResponse +

    200

    + OK + GroupByIdResponse

    400

    Bad Request ErrorMessage -

    401

    - Unauthorized - ErrorMessage -

    403

    - Forbidden - ErrorMessage -

    409

    - Conflict +

    404

    + Not Found ErrorMessage

    500

    Internal Server Error ErrorMessage

    -
    +
    Up -
    delete /groups/{groupId}
    -
    Delete a group with specified id. (deleteGroup)
    -
    Delete a group with specified id.
    +
    get /groups/{groupId}/members
    +
    Get the members of a group with specified id. (getMembers)
    +
    Get the members of a group with specified id.

    Path parameters

    @@ -1883,9 +1784,355 @@ retrieved and filtered using the /attributes.

    +

    Query parameters

    +
    +
    offset (optional)
    + +
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    + +
    Query Parameter — Result limiter. default: 500
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "next" : {
    +    "href" : "href"
    +  },
    +  "last" : {
    +    "href" : "href"
    +  },
    +  "prev" : {
    +    "href" : "href"
    +  },
    +  "self" : {
    +    "href" : "href"
    +  },
    +  "totalCount" : 0,
    +  "items" : [ "{}", "{}" ],
    +  "first" : {
    +    "href" : "href"
    +  }
    +}
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    • application/problem+json
    • +
    + +

    Responses

    +

    200

    + OK + MembersResponse +

    400

    + Bad Request + ErrorMessage +

    404

    + Not Found + ErrorMessage +

    500

    + Internal Server Error + ErrorMessage +
    +
    +
    +
    + Up +
    get /groups/{groupId}/provided-members
    +
    Get the provided members of a static group with specified id. (getProvidedMembers)
    +
    Get the provided members of a static group with specified id.
    + +

    Path parameters

    +
    +
    groupId (required)
    + +
    Path Parameter — default: null
    +
    + + + +

    Request headers

    +
    +
    Accept (required)
    + +
    Header Parameter — default: application/json
    + +
    + +

    Query parameters

    +
    +
    status (optional)
    + +
    Query Parameter — Status can be present (or) not-present (or) invalid. If not specified, returns all members of the group. default: null
    offset (optional)
    + +
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    + +
    Query Parameter — Result limiter. default: 500
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "next" : {
    +    "href" : "href"
    +  },
    +  "last" : {
    +    "href" : "href"
    +  },
    +  "prev" : {
    +    "href" : "href"
    +  },
    +  "self" : {
    +    "href" : "href"
    +  },
    +  "totalCount" : 0,
    +  "items" : [ "{}", "{}" ],
    +  "first" : {
    +    "href" : "href"
    +  }
    +}
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    • application/problem+json
    • +
    + +

    Responses

    +

    200

    + OK + MembersResponse +

    400

    + Bad Request + ErrorMessage +

    404

    + Not Found + ErrorMessage +

    500

    + Internal Server Error + ErrorMessage +
    +
    +
    +
    + Up +
    put /groups/{groupId}/name
    +
    Update the name of a group. (updateGroupName)
    +
    Update the name of a group.
    + +

    Path parameters

    +
    +
    groupId (required)
    + +
    Path Parameter — default: null
    +
    + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    UpdateGroupNamePayload UpdateGroupNamePayload (required)
    + +
    Body Parameter
    + +
    + +

    Request headers

    +
    +
    Content-Type (required)
    + +
    Header Parameter — default: application/json
    + +
    + + + + + + +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/problem+json
    • +
    + +

    Responses

    +

    204

    + No Content + +

    400

    + Bad Request + ErrorMessage +

    404

    + Not Found + ErrorMessage +

    500

    + Internal Server Error + ErrorMessage +
    +
    +
    +
    + Up +
    post /groups/{groupId}/provided-members-operations
    +
    Merge or remove members of a static group. (updateProvidedMembers)
    +
    Merge or remove members in an existing topology group. This operation is applicable for static group only.
    + +

    Path parameters

    +
    +
    groupId (required)
    + +
    Path Parameter — default: null
    +
    + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    UpdateProvidedMembersPayload UpdateProvidedMembersPayload (required)
    + +
    Body Parameter
    + +
    + +

    Request headers

    +
    +
    Accept (required)
    + +
    Header Parameter — default: application/json
    +
    Content-Type (required)
    + +
    Header Parameter — default: application/json
    + +
    + + + + + + +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    +

    Example data

    +
    Content-Type: application/problem+json
    +
    Custom MIME type example not yet supported: application/problem+json
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/problem+json
    • +
    + +

    Responses

    +

    204

    + No Content + +

    400

    + Bad Request + ErrorMessage +

    500

    + Internal Server Error + ErrorMessage +
    +
    +

    Schemas

    +
    +
    + Up +
    post /schemas
    +
    Create a new schema. (createSchema)
    +
    Create a new schema. The request body contains the schema in YANG format.
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • multipart/form-data
    • +
    + + +

    Request headers

    +
    +
    Accept (required)
    + +
    Header Parameter — default: application/json
    +
    Content-Type (required)
    + +
    Header Parameter — default: multipart/form-data
    + +
    + + +

    Form parameters

    +
    +
    file (required)
    + +
    Form Parameter — multipartFile default: null format: binary
    +
    + - -

    Example data

    @@ -1912,8 +2159,8 @@ retrieved and filtered using the /attributes.

    Responses

    -

    204

    - No Content +

    201

    + Created without response body

    400

    Bad Request @@ -1924,21 +2171,27 @@ retrieved and filtered using the /attributes.

    403

    Forbidden ErrorMessage -

    404

    - Not Found +

    409

    + Conflict ErrorMessage

    500

    Internal Server Error ErrorMessage

    -
    +
    Up -
    get /groups
    -
    Get all groups. (getAllGroups)
    -
    Get all groups.
    +
    delete /schemas/{schemaName}
    +
    Delete a schema. (deleteSchema)
    +
    Delete a schema.
    + +

    Path parameters

    +
    +
    schemaName (required)
    +
    Path Parameter — default: o-ran-smo-teiv-ran
    +
    @@ -1950,57 +2203,11 @@ retrieved and filtered using the /attributes.

    -

    Query parameters

    -
    -
    offset (optional)
    - -
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    - -
    Query Parameter — Result limiter. default: 500
    -
    -

    Return type

    -
    - Groups - -
    -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "next" : {
    -    "href" : "href"
    -  },
    -  "last" : {
    -    "href" : "href"
    -  },
    -  "prev" : {
    -    "href" : "href"
    -  },
    -  "self" : {
    -    "href" : "href"
    -  },
    -  "totalCount" : 0,
    -  "items" : [ {
    -    "groupName" : "groupName",
    -    "criteria" : {
    -      "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    -    },
    -    "id" : "id"
    -  }, {
    -    "groupName" : "groupName",
    -    "criteria" : {
    -      "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    -    },
    -    "id" : "id"
    -  } ],
    -  "first" : {
    -    "href" : "href"
    -  }
    -}

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    @@ -2018,14 +2225,10 @@ retrieved and filtered using the /attributes.

    This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.
      -
    • application/json
    • application/problem+json

    Responses

    -

    200

    - OK - Groups

    204

    No Content @@ -2043,18 +2246,18 @@ retrieved and filtered using the /attributes.

    ErrorMessage

    -
    +
    Up -
    get /groups/{groupId}
    -
    Get a group with specified id. (getGroup)
    -
    Get a Group with specified id.
    +
    get /schemas/{schemaName}/content
    +
    Get the model schema. (getSchemaByName)
    +
    Get the model schema by name.

    Path parameters

    -
    groupId (required)
    +
    schemaName (required)
    -
    Path Parameter — default: null
    +
    Path Parameter — default: o-ran-smo-teiv-ran
    @@ -2071,21 +2274,12 @@ retrieved and filtered using the /attributes.

    Return type

    - GroupResponse + String
    -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "groupName" : "groupName",
    -  "criteria" : {
    -    "resourceInstances" : [ "resourceInstances", "resourceInstances" ]
    -  },
    -  "id" : "id"
    -}

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    @@ -2106,14 +2300,14 @@ retrieved and filtered using the /attributes.

    This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.
      -
    • application/json
    • +
    • text/plain
    • application/problem+json

    Responses

    200

    OK - GroupResponse + String

    400

    Bad Request ErrorMessage @@ -2131,53 +2325,79 @@ retrieved and filtered using the /attributes.

    ErrorMessage

    -
    +
    Up -
    put /groups/{groupId}
    -
    Update a Group. (updateGroup)
    -
    Update a Group.
    +
    get /schemas
    +
    Get a list of all schemas. (getSchemas)
    +
    Get a list of all schemas.
    -

    Path parameters

    -
    -
    groupId (required)
    -
    Path Parameter — default: null
    -
    -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    -

    Request body

    +

    Request headers

    -
    Group Group (required)
    +
    Accept (required)
    -
    Body Parameter
    +
    Header Parameter — default: application/json
    -

    Request headers

    +

    Query parameters

    -
    Accept (required)
    +
    domain (optional)
    -
    Header Parameter — default: application/json
    -
    Content-Type (required)
    +
    Query Parameter — default: null
    offset (optional)
    -
    Header Parameter — default: application/json
    +
    Query Parameter — Pagination offset. default: 0
    limit (optional)
    +
    Query Parameter — Result limiter. default: 500
    - +

    Return type

    +
    + SchemaList + +

    Example data

    -
    Content-Type: application/problem+json
    -
    Custom MIME type example not yet supported: application/problem+json
    +
    Content-Type: application/json
    +
    {
    +  "next" : {
    +    "href" : "href"
    +  },
    +  "last" : {
    +    "href" : "href"
    +  },
    +  "prev" : {
    +    "href" : "href"
    +  },
    +  "self" : {
    +    "href" : "href"
    +  },
    +  "totalCount" : 0,
    +  "items" : [ {
    +    "domain" : "domain",
    +    "name" : "name",
    +    "content" : {
    +      "href" : "href"
    +    },
    +    "revision" : "revision"
    +  }, {
    +    "domain" : "domain",
    +    "name" : "name",
    +    "content" : {
    +      "href" : "href"
    +    },
    +    "revision" : "revision"
    +  } ],
    +  "first" : {
    +    "href" : "href"
    +  }
    +}

    Example data

    Content-Type: application/problem+json
    Custom MIME type example not yet supported: application/problem+json
    @@ -2195,13 +2415,14 @@ retrieved and filtered using the /attributes.

    This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.
      +
    • application/json
    • application/problem+json

    Responses

    -

    204

    - No Content - +

    200

    + OK + SchemaList

    400

    Bad Request ErrorMessage @@ -2211,9 +2432,6 @@ retrieved and filtered using the /attributes.

    403

    Forbidden ErrorMessage -

    409

    - Conflict - ErrorMessage

    500

    Internal Server Error ErrorMessage @@ -2226,27 +2444,39 @@ retrieved and filtered using the /attributes.

    Table of Contents

    1. Classifier - Classifier
    2. +
    3. CreateGroupPayload - CreateGroupPayload
    4. +
    5. Criteria - Criteria
    6. Decorator - Decorator
    7. Domains - Domains
    8. Domains_items_inner -
    9. -
    10. DynamicSelection -
    11. -
    12. DynamicSelection_resourceQuery -
    13. +
    14. DynamicEnum -
    15. +
    16. DynamicGroupByIdResponse - DynamicGroup
    17. +
    18. DynamicGroupResponse - DynamicGroup
    19. EntitiesResponseMessage - Entities
    20. EntityTypes - EntityTypes
    21. EntityTypes_items_inner -
    22. ErrorMessage - Error
    23. -
    24. Group -
    25. -
    26. GroupResponse -
    27. -
    28. GroupResponse_criteria -
    29. -
    30. Groups - Groups
    31. +
    32. GroupByIdResponse - Group
    33. +
    34. GroupResponse - Group
    35. +
    36. GroupsResponse - Groups
    37. Href - Href
    38. +
    39. MembersResponse - GroupMembers
    40. RelationshipTypes - RelationshipTypes
    41. RelationshipTypes_items_inner -
    42. RelationshipsResponseMessage - Relationships
    43. Schema - Schema
    44. SchemaList - Schemas
    45. -
    46. StaticSelection -
    47. -
    48. TopologySelection -
    49. +
    50. StaticEnum -
    51. +
    52. StaticGroupByIdResponse - StaticGroup
    53. +
    54. StaticGroupResponse - StaticGroup
    55. +
    56. UpdateGroupNamePayload - UpdateGroupNamePayload
    57. +
    58. UpdateProvidedMembersPayload - UpdateProvidedMembersPayload
    59. +
    60. dynamic - CreateDynamicGroupPayload
    61. +
    62. getEntitiesByDomain - getEntitiesByDomain
    63. +
    64. getEntitiesByType - getEntitiesByType
    65. +
    66. getRelationshipsByType - getRelationshipsByType
    67. +
    68. getRelationshipsForEntityId - getRelationshipsForEntityId
    69. +
    70. static - CreateStaticGroupPayload
    @@ -2261,6 +2491,29 @@ retrieved and filtered using the /attributes.

    relationshipIds (optional)
    +
    +

    CreateGroupPayload - CreateGroupPayload Up

    +
    +
    +
    name
    String A name of the topology group.
    +
    type
    String Allowed: dynamic
    +
    providedMembers
    +
    criteria
    +
    +
    +
    +

    Criteria - Criteria Up

    +
    +
    +
    queryType
    String Allowed: getRelationshipsByType
    +
    domain
    +
    targetFilter (optional)
    +
    scopeFilter (optional)
    +
    entityTypeName
    +
    entityId
    +
    relationshipTypeName
    +
    +

    Decorator - Decorator Up

    @@ -2268,7 +2521,7 @@ retrieved and filtered using the /attributes.

    operation (optional)
    Enum:
    merge
    delete
    -
    decorators (optional)
    map[String, oas_any_type_not_mapped] Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by it's schema.
    +
    decorators (optional)
    map[String, oas_any_type_not_mapped] Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by its schema.
    entityIds (optional)
    relationshipIds (optional)
    @@ -2296,20 +2549,30 @@ retrieved and filtered using the /attributes.

    +
    +

    DynamicGroupByIdResponse - DynamicGroup Up

    -
    resourceQuery (optional)
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    +
    criteria
    -

    DynamicSelection_resourceQuery - Up

    +

    DynamicGroupResponse - DynamicGroup Up

    -
    url
    -
    method (optional)
    -
    queryParams (optional)
    -
    requestBody (optional)
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    @@ -2356,32 +2619,30 @@ retrieved and filtered using the /attributes.

    -

    Group - Up

    -
    -
    -
    groupName (optional)
    -
    criteria (optional)
    -
    -
    -
    -

    GroupResponse - Up

    +

    GroupByIdResponse - Group Up

    -
    id (optional)
    -
    groupName (optional)
    -
    criteria (optional)
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    +
    providedMembers
    +
    criteria
    -

    GroupResponse_criteria - Up

    +

    GroupResponse - Group Up

    -
    resourceInstances (optional)
    -
    resourceQuery (optional)
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    +
    providedMembers
    -

    Groups - Groups Up

    +

    GroupsResponse - Groups Up

    items (optional)
    @@ -2400,6 +2661,19 @@ retrieved and filtered using the /attributes.

    href (optional)
    String format: uri-template
    +
    +

    MembersResponse - GroupMembers Up

    +
    +
    +
    items (optional)
    +
    self (optional)
    +
    first (optional)
    +
    prev (optional)
    +
    next (optional)
    +
    last (optional)
    +
    totalCount (optional)
    +
    +

    RelationshipTypes - RelationshipTypes Up

    @@ -2458,18 +2732,110 @@ retrieved and filtered using the /attributes.

    +
    +

    StaticGroupByIdResponse - StaticGroup Up

    +
    +
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    +
    providedMembers
    +
    +
    +
    +

    StaticGroupResponse - StaticGroup Up

    +
    +
    +
    id
    String The unique identifier of the topology group.
    +
    name
    String The unique name of the topology group.
    +
    type
    +
    members
    +
    providedMembers
    +
    +
    + +
    +

    UpdateProvidedMembersPayload - UpdateProvidedMembersPayload Up

    +
    +
    +
    operation
    String The operation to be performed on the members of topology group.
    +
    Enum:
    +
    merge
    remove
    +
    providedMembers
    array[Object] Members to be added or removed from the group.
    +
    +
    +
    +

    dynamic - CreateDynamicGroupPayload Up

    +
    +
    +
    name
    String A name of the topology group.
    +
    type
    String Allowed: dynamic
    +
    criteria
    +
    +
    +
    +

    getEntitiesByDomain - getEntitiesByDomain Up

    +
    +
    +
    queryType
    String Allowed: getEntitiesByDomain
    +
    domain
    +
    targetFilter (optional)
    +
    scopeFilter (optional)
    +
    +
    +
    +

    getEntitiesByType - getEntitiesByType Up

    +
    +
    +
    queryType
    String Allowed: getEntitiesByType
    +
    domain
    +
    entityTypeName
    +
    targetFilter (optional)
    +
    scopeFilter (optional)
    +
    +
    +
    +

    getRelationshipsByType - getRelationshipsByType Up

    +
    +
    +
    queryType
    String Allowed: getRelationshipsByType
    +
    domain
    +
    relationshipTypeName
    +
    targetFilter (optional)
    +
    scopeFilter (optional)
    +
    +
    +
    +

    getRelationshipsForEntityId - getRelationshipsForEntityId Up

    -
    resourceInstances (optional)
    +
    queryType
    String Allowed: getRelationshipsForEntityId
    +
    domain
    +
    entityTypeName
    +
    entityId
    +
    targetFilter (optional)
    +
    scopeFilter (optional)
    -

    TopologySelection - Up

    +

    static - CreateStaticGroupPayload Up

    -
    resourceInstances (optional)
    -
    resourceQuery (optional)
    +
    name
    String A name of the topology group.
    +
    type
    String Allowed: static
    +
    providedMembers
    diff --git a/docs/offeredapis/topology-exposure-inventory-openapi.json b/docs/offeredapis/topology-exposure-inventory-openapi.json index 0d2ead0..f5af5f2 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 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 matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | 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=3 and @gNBId=111] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 and the gNBId equals 111 |\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=3] | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 or the sourceIds contains an item with \"SubNetwork=Ireland\" |\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 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\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\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", "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" @@ -34,8 +34,8 @@ "description" : "Provides the capability to update or remove user-defined values on entities and relationships.", "name" : "Decorators" }, { - "description" : "Provides the capability to group topology entities of any type, with an appropriate description and other criteria.", - "name" : "Topology Groups" + "description" : "Provides the capability to group topology entities and/or relationships of any type. Groups can be created in static or dynamic way. *Static groups*: Group members are defined statically upon group creation. It can include a maximum of 25,000 members. *Dynamic groups*: Group members are dynamically selected based on the defined resource query.", + "name" : "Groups" } ], "paths" : { "/domains" : { @@ -182,6 +182,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -314,6 +315,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -327,10 +329,10 @@ }, "style" : "simple" }, { - "description" : "Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes.", + "description" : "Use *targetFilter* to specify what needs to be returned in the REST response.", "examples" : { "targetFilter" : { - "value" : "/attributes(nCI,nRPCI)" + "value" : "/sourceIds;/classifiers" } }, "explode" : true, @@ -342,10 +344,10 @@ }, "style" : "form" }, { - "description" : "Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean.", + "description" : "ScopeFilter is used to specify the conditions to be applied.", "examples" : { "scopeFilter" : { - "value" : "/attributes[@nRTAC=310]" + "value" : "/sourceIds[contains(@item,'ManagedElement=1')]" } }, "explode" : true, @@ -485,6 +487,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -626,6 +629,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -648,10 +652,10 @@ }, "style" : "simple" }, { - "description" : "Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes.", + "description" : "Use *targetFilter* to specify what needs to be returned in the REST response.", "examples" : { "targetFilter" : { - "value" : "/attributes(nCI,nRPCI)" + "value" : "/sourceIds;/classifiers" } }, "explode" : true, @@ -663,10 +667,10 @@ }, "style" : "form" }, { - "description" : "Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean.", + "description" : "ScopeFilter is used to specify the conditions to be applied.", "examples" : { "scopeFilter" : { - "value" : "/attributes[@nRTAC=310]" + "value" : "/sourceIds[contains(@item,'ManagedElement=1')]" } }, "explode" : true, @@ -801,7 +805,7 @@ }, "/domains/{domainName}/relationship-types" : { "get" : { - "description" : "Get all the available topology relationship types.", + "description" : "Get all the available topology relationship types in a specified domain.", "operationId" : "getTopologyRelationshipTypes", "parameters" : [ { "explode" : false, @@ -821,6 +825,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -953,6 +958,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -967,10 +973,10 @@ }, "style" : "simple" }, { - "description" : "Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes.", + "description" : "Use *targetFilter* to specify what needs to be returned in the REST response.", "examples" : { "targetFilter" : { - "value" : "/attributes(nCI,nRPCI)" + "value" : "/sourceIds;/classifiers" } }, "explode" : true, @@ -982,10 +988,10 @@ }, "style" : "form" }, { - "description" : "Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean.", + "description" : "ScopeFilter is used to specify the conditions to be applied.", "examples" : { "scopeFilter" : { - "value" : "/attributes[@nRTAC=310]" + "value" : "/sourceIds[contains(@item,'ManagedElement=1')]" } }, "explode" : true, @@ -1125,6 +1131,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -1247,7 +1254,7 @@ }, "/domains/{domainName}/entities" : { "get" : { - "description" : "Get topology entities by domain, using specified targetFilter as mandatory query parameter.", + "description" : "Get topology entities by domain, using a specified *targetFilter* as a query parameter.", "operationId" : "getEntitiesByDomain", "parameters" : [ { "explode" : false, @@ -1267,14 +1274,15 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" }, { - "description" : "Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes.", + "description" : "Use *targetFilter* to specify what needs to be returned in the REST response.", "examples" : { "targetFilter" : { - "value" : "/attributes(nCI,nRPCI)" + "value" : "/sourceIds;/classifiers" } }, "explode" : true, @@ -1286,10 +1294,10 @@ }, "style" : "form" }, { - "description" : "Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean.", + "description" : "ScopeFilter is used to specify the conditions to be applied.", "examples" : { "scopeFilter" : { - "value" : "/attributes[@nRTAC=310]" + "value" : "/sourceIds[contains(@item,'ManagedElement=1')]" } }, "explode" : true, @@ -1425,7 +1433,7 @@ }, { "examples" : { "domain" : { - "value" : "ran" + "value" : "RAN" } }, "explode" : true, @@ -1543,7 +1551,7 @@ "tags" : [ "Schemas" ] }, "post" : { - "description" : "Create a new schema. The request body shall contain the schema in YANG format.", + "description" : "Create a new schema. The request body contains the schema in YANG format.", "operationId" : "createSchema", "parameters" : [ { "explode" : false, @@ -1911,8 +1919,11 @@ "content" : { "application/json" : { "examples" : { - "classifier" : { - "$ref" : "#/components/examples/ClassifierExample" + "updateClassifier" : { + "$ref" : "#/components/examples/ClassifierMergeExample" + }, + "removeClassifier" : { + "$ref" : "#/components/examples/ClassifierDeleteExample" } }, "schema" : { @@ -2038,8 +2049,11 @@ "content" : { "application/json" : { "examples" : { - "decorator" : { - "$ref" : "#/components/examples/DecoratorExample" + "mergeDecorator" : { + "$ref" : "#/components/examples/DecoratorMergeExample" + }, + "removeDecorator" : { + "$ref" : "#/components/examples/DecoratorDeleteExample" } }, "schema" : { @@ -2174,6 +2188,16 @@ "type" : "integer" }, "style" : "form" + }, { + "description" : "Group name. If not specified, returns all the groups.", + "explode" : true, + "in" : "query", + "name" : "name", + "required" : false, + "schema" : { + "type" : "string" + }, + "style" : "form" } ], "responses" : { "200" : { @@ -2185,16 +2209,12 @@ } }, "schema" : { - "$ref" : "#/components/schemas/Groups" + "$ref" : "#/components/schemas/GroupsResponse" } } }, "description" : "OK" }, - "204" : { - "content" : { }, - "description" : "No Content" - }, "400" : { "content" : { "application/problem+json" : { @@ -2210,36 +2230,6 @@ }, "description" : "Bad Request" }, - "401" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "401", - "title" : "Unauthorized request", - "details" : "This request is unauthorized" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Unauthorized" - }, - "403" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "403", - "title" : "Request Forbidden", - "details" : "This request is forbidden" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Forbidden" - }, "500" : { "content" : { "application/problem+json" : { @@ -2257,10 +2247,10 @@ } }, "summary" : "Get all groups.", - "tags" : [ "Topology Groups" ] + "tags" : [ "Groups" ] }, "post" : { - "description" : "Create group.", + "description" : "Create a group of entities and/or relationships in a static or dynamic way.", "operationId" : "createGroup", "parameters" : [ { "explode" : false, @@ -2289,15 +2279,15 @@ "content" : { "application/json" : { "examples" : { - "dynamicGroup" : { - "$ref" : "#/components/examples/DynamicGroupExample" - }, "staticGroup" : { - "$ref" : "#/components/examples/StaticGroupExample" + "$ref" : "#/components/examples/CreateStaticGroupPayloadExample" + }, + "dynamicGroup" : { + "$ref" : "#/components/examples/CreateDynamicGroupGetEntitiesByDomainPayloadExample" } }, "schema" : { - "$ref" : "#/components/schemas/Group" + "$ref" : "#/components/schemas/CreateGroupPayload" } } }, @@ -2308,12 +2298,15 @@ "content" : { "application/json" : { "examples" : { - "group" : { - "$ref" : "#/components/examples/GroupResponseExample" + "static" : { + "$ref" : "#/components/examples/StaticGroupResponseExample" + }, + "dynamic" : { + "$ref" : "#/components/examples/DynamicGroupResponseExample" } }, "schema" : { - "$ref" : "#/components/schemas/GroupResponse" + "$ref" : "#/components/schemas/GroupByIdResponse" } } }, @@ -2334,51 +2327,6 @@ }, "description" : "Bad Request" }, - "401" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "401", - "title" : "Unauthorized request", - "details" : "This request is unauthorized" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Unauthorized" - }, - "403" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "403", - "title" : "Request Forbidden", - "details" : "This request is forbidden" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Forbidden" - }, - "409" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "409", - "title" : "Conflicting request", - "details" : "The request cannot be processed as the resource is in use." - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Conflict" - }, "500" : { "content" : { "application/problem+json" : { @@ -2395,8 +2343,8 @@ "description" : "Internal Server Error" } }, - "summary" : "Create group.", - "tags" : [ "Topology Groups" ] + "summary" : "Create a new group.", + "tags" : [ "Groups" ] } }, "/groups/{groupId}" : { @@ -2404,17 +2352,6 @@ "description" : "Delete a group with specified id.", "operationId" : "deleteGroup", "parameters" : [ { - "explode" : false, - "in" : "header", - "name" : "Accept", - "required" : true, - "schema" : { - "default" : "application/json", - "example" : "application/json", - "type" : "string" - }, - "style" : "simple" - }, { "explode" : false, "in" : "path", "name" : "groupId", @@ -2444,36 +2381,6 @@ }, "description" : "Bad Request" }, - "401" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "401", - "title" : "Unauthorized request", - "details" : "This request is unauthorized" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Unauthorized" - }, - "403" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "403", - "title" : "Request Forbidden", - "details" : "This request is forbidden" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Forbidden" - }, "404" : { "content" : { "application/problem+json" : { @@ -2506,11 +2413,11 @@ } }, "summary" : "Delete a group with specified id.", - "tags" : [ "Topology Groups" ] + "tags" : [ "Groups" ] }, "get" : { - "description" : "Get a Group with specified id.", - "operationId" : "getGroup", + "description" : "Get a group with specified id.", + "operationId" : "getGroupById", "parameters" : [ { "explode" : false, "in" : "header", @@ -2537,12 +2444,15 @@ "content" : { "application/json" : { "examples" : { - "group" : { - "$ref" : "#/components/examples/GroupResponseExample" + "static" : { + "$ref" : "#/components/examples/StaticGroupResponseExample" + }, + "dynamic" : { + "$ref" : "#/components/examples/DynamicGroupResponseExample" } }, "schema" : { - "$ref" : "#/components/schemas/GroupResponse" + "$ref" : "#/components/schemas/GroupByIdResponse" } } }, @@ -2563,36 +2473,6 @@ }, "description" : "Bad Request" }, - "401" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "401", - "title" : "Unauthorized request", - "details" : "This request is unauthorized" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Unauthorized" - }, - "403" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "403", - "title" : "Request Forbidden", - "details" : "This request is forbidden" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Forbidden" - }, "404" : { "content" : { "application/problem+json" : { @@ -2625,23 +2505,14 @@ } }, "summary" : "Get a group with specified id.", - "tags" : [ "Topology Groups" ] - }, + "tags" : [ "Groups" ] + } + }, + "/groups/{groupId}/name" : { "put" : { - "description" : "Update a Group.", - "operationId" : "updateGroup", + "description" : "Update the name of a group.", + "operationId" : "updateGroupName", "parameters" : [ { - "explode" : false, - "in" : "header", - "name" : "Accept", - "required" : true, - "schema" : { - "default" : "application/json", - "example" : "application/json", - "type" : "string" - }, - "style" : "simple" - }, { "explode" : false, "in" : "header", "name" : "Content-Type", @@ -2666,15 +2537,12 @@ "content" : { "application/json" : { "examples" : { - "dynamicGroup" : { - "$ref" : "#/components/examples/DynamicGroupExample" - }, - "staticGroup" : { - "$ref" : "#/components/examples/StaticGroupExample" + "GroupNameUpdatePayload" : { + "$ref" : "#/components/examples/UpdateGroupNamePayloadExample" } }, "schema" : { - "$ref" : "#/components/schemas/Group" + "$ref" : "#/components/schemas/UpdateGroupNamePayload" } } }, @@ -2700,50 +2568,20 @@ }, "description" : "Bad Request" }, - "401" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "401", - "title" : "Unauthorized request", - "details" : "This request is unauthorized" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Unauthorized" - }, - "403" : { - "content" : { - "application/problem+json" : { - "example" : { - "status" : "403", - "title" : "Request Forbidden", - "details" : "This request is forbidden" - }, - "schema" : { - "$ref" : "#/components/schemas/ErrorMessage" - } - } - }, - "description" : "Forbidden" - }, - "409" : { + "404" : { "content" : { "application/problem+json" : { "example" : { - "status" : "409", - "title" : "Conflicting request", - "details" : "The request cannot be processed as the resource is in use." + "status" : "404", + "title" : "Resource Not Found", + "details" : "The requested resource is not found" }, "schema" : { "$ref" : "#/components/schemas/ErrorMessage" } } }, - "description" : "Conflict" + "description" : "Not Found" }, "500" : { "content" : { @@ -2761,110 +2599,451 @@ "description" : "Internal Server Error" } }, - "summary" : "Update a Group.", - "tags" : [ "Topology Groups" ] + "summary" : "Update the name of a group.", + "tags" : [ "Groups" ] } - } - }, - "components" : { - "examples" : { - "ClassifierExample" : { - "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" ], - "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] - } - }, - "DecoratorExample" : { - "value" : { - "operation" : "merge", - "decorators" : { - "module-x:location" : "Stockholm", - "module-y:vendor" : "Ericsson" + }, + "/groups/{groupId}/members" : { + "get" : { + "description" : "Get the members of a group with specified id.", + "operationId" : "getMembers", + "parameters" : [ { + "explode" : false, + "in" : "header", + "name" : "Accept", + "required" : true, + "schema" : { + "default" : "application/json", + "example" : "application/json", + "type" : "string" }, - "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" ], - "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] - } - }, - "EntityResponseExample" : { - "value" : { - "o-ran-smo-teiv-ran:GNBDUFunction" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1", - "attributes" : { - "gNBDUId" : 11, - "dUpLMNId" : { - "mcc" : 110, - "mnc" : 210 - }, - "gNBId" : 21, - "gNBIdLength" : 2 + "style" : "simple" + }, { + "explode" : false, + "in" : "path", + "name" : "groupId", + "required" : true, + "schema" : { + "type" : "string" + }, + "style" : "simple" + }, { + "description" : "Pagination offset.", + "explode" : true, + "in" : "query", + "name" : "offset", + "required" : false, + "schema" : { + "default" : 0, + "minimum" : 0, + "type" : "integer" + }, + "style" : "form" + }, { + "description" : "Result limiter.", + "explode" : true, + "in" : "query", + "name" : "limit", + "required" : false, + "schema" : { + "default" : 500, + "maximum" : 500, + "minimum" : 1, + "type" : "integer" + }, + "style" : "form" + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : { + "members" : { + "$ref" : "#/components/examples/MembersResponseExample" + } + }, + "schema" : { + "$ref" : "#/components/schemas/MembersResponse" + } + } + }, + "description" : "OK" + }, + "400" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "400", + "title" : "Bad Request", + "details" : "The provided request is not valid" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Bad Request" + }, + "404" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "404", + "title" : "Resource Not Found", + "details" : "The requested resource is not found" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Not Found" + }, + "500" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "500", + "title" : "Internal Server Error", + "details" : "Internal Server Error occurred" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Internal Server Error" + } + }, + "summary" : "Get the members of a group with specified id.", + "tags" : [ "Groups" ] + } + }, + "/groups/{groupId}/provided-members" : { + "get" : { + "description" : "Get the provided members of a static group with specified id.", + "operationId" : "getProvidedMembers", + "parameters" : [ { + "explode" : false, + "in" : "header", + "name" : "Accept", + "required" : true, + "schema" : { + "default" : "application/json", + "example" : "application/json", + "type" : "string" + }, + "style" : "simple" + }, { + "explode" : false, + "in" : "path", + "name" : "groupId", + "required" : true, + "schema" : { + "type" : "string" + }, + "style" : "simple" + }, { + "description" : "Status can be present (or) not-present (or) invalid. If not specified, returns all members of the group.", + "explode" : true, + "in" : "query", + "name" : "status", + "required" : false, + "schema" : { + "enum" : [ "present", "not-present", "invalid" ], + "type" : "string" + }, + "style" : "form" + }, { + "description" : "Pagination offset.", + "explode" : true, + "in" : "query", + "name" : "offset", + "required" : false, + "schema" : { + "default" : 0, + "minimum" : 0, + "type" : "integer" + }, + "style" : "form" + }, { + "description" : "Result limiter.", + "explode" : true, + "in" : "query", + "name" : "limit", + "required" : false, + "schema" : { + "default" : 500, + "maximum" : 500, + "minimum" : 1, + "type" : "integer" + }, + "style" : "form" + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "examples" : { + "members" : { + "$ref" : "#/components/examples/ProvidedMembersResponseExample" + } + }, + "schema" : { + "$ref" : "#/components/schemas/MembersResponse" + } + } + }, + "description" : "OK" + }, + "400" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "400", + "title" : "Bad Request", + "details" : "The provided request is not valid" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Bad Request" + }, + "404" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "404", + "title" : "Resource Not Found", + "details" : "The requested resource is not found" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Not Found" + }, + "500" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "500", + "title" : "Internal Server Error", + "details" : "Internal Server Error occurred" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Internal Server Error" + } + }, + "summary" : "Get the provided members of a static group with specified id.", + "tags" : [ "Groups" ] + } + }, + "/groups/{groupId}/provided-members-operations" : { + "post" : { + "description" : "Merge or remove members in an existing topology group. This operation is applicable for static group only.", + "operationId" : "updateProvidedMembers", + "parameters" : [ { + "explode" : false, + "in" : "header", + "name" : "Accept", + "required" : true, + "schema" : { + "default" : "application/json", + "example" : "application/json", + "type" : "string" + }, + "style" : "simple" + }, { + "explode" : false, + "in" : "header", + "name" : "Content-Type", + "required" : true, + "schema" : { + "default" : "application/json", + "example" : "application/json", + "type" : "string" + }, + "style" : "simple" + }, { + "explode" : false, + "in" : "path", + "name" : "groupId", + "required" : true, + "schema" : { + "type" : "string" + }, + "style" : "simple" + } ], + "requestBody" : { + "content" : { + "application/json" : { + "examples" : { + "mergeMembersPayload" : { + "$ref" : "#/components/examples/MergeProvidedMembersPayloadExample" + }, + "deleteMembersPayload" : { + "$ref" : "#/components/examples/RemoveProvidedMembersPayloadExample" + } + }, + "schema" : { + "$ref" : "#/components/schemas/UpdateProvidedMembersPayload" + } + } + }, + "required" : true + }, + "responses" : { + "204" : { + "content" : { }, + "description" : "No Content" + }, + "400" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "400", + "title" : "Bad Request", + "details" : "The provided request is not valid" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Bad Request" + }, + "500" : { + "content" : { + "application/problem+json" : { + "example" : { + "status" : "500", + "title" : "Internal Server Error", + "details" : "Internal Server Error occurred" + }, + "schema" : { + "$ref" : "#/components/schemas/ErrorMessage" + } + } + }, + "description" : "Internal Server Error" + } + }, + "summary" : "Merge or remove members of a static group.", + "tags" : [ "Groups" ] + } + } + }, + "components" : { + "examples" : { + "ClassifierMergeExample" : { + "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" ], + "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] + } + }, + "ClassifierDeleteExample" : { + "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" ], + "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] + } + }, + "DecoratorMergeExample" : { + "value" : { + "operation" : "merge", + "decorators" : { + "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" ], + "relationshipIds" : [ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" ] + } + }, + "DecoratorDeleteExample" : { + "value" : { + "operation" : "delete", + "decorators" : { + "module-x:location" : "Stockholm" + }, + "entityIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=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", + "attributes" : { + "cellLocalId" : 91, + "nCI" : 91, + "nRPCI" : 789, + "nRTAC" : 456 }, "decorators" : { "location" : "Stockholm" }, "classifiers" : [ "Rural" ], - "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ] } ] } }, "EntitiesResponseExample" : { "value" : { "items" : [ { - "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", + "o-ran-smo-teiv-ran:GNBCUUPFunction" : [ { + "id" : "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10", "attributes" : { - "cellLocalId" : 4589, - "nCI" : 1, - "nRPCI" : 12, - "nRTAC" : 310 - }, - "decorators" : { - "location" : "Stockholm" + "gNBId" : 10, + "gNBIdLength" : 2 }, - "classifiers" : [ "Rural" ], - "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10", "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" ] } ] }, { - "o-ran-smo-teiv-ran:NRCellDU" : [ { - "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", + "o-ran-smo-teiv-ran:GNBCUUPFunction" : [ { + "id" : "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13", "attributes" : { - "cellLocalId" : 4559, - "nRPCI" : 32, - "nRTAC" : 510 + "gNBId" : 13, + "gNBIdLength" : 2 }, - "decorators" : { - "location" : "Stockholm" + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13", "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" ] + } ] + }, { + "o-ran-smo-teiv-ran:GNBCUUPFunction" : [ { + "id" : "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14", + "attributes" : { + "gNBId" : 14, + "gNBIdLength" : 2 }, - "classifiers" : [ "Rural" ], - "sourceIds" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", "urn:cmHandle:395221E080CCF0FD1924103B15873814" ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14", "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" ] } ] } ], "self" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + "href" : "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" }, "first" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + "href" : "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" }, "prev" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + "href" : "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" }, "next" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities?offset=500&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + "href" : "/domains/RAN/entities?offset=3&limit=3&targetFilter=/sourceIds;/attributes" }, "last" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities?offset=678&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + "href" : "/domains/RAN/entities?offset=33&limit=3&targetFilter=/sourceIds;/attributes" }, - "totalCount" : 12 + "totalCount" : 3 } }, "RelationshipResponseExample" : { @@ -2873,14 +3052,7 @@ "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", - "decorators" : { - "location" : "Stockholm" - }, - "classifiers" : [ "Rural" ], - "sourceIds" : [ ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ ] } ] } }, @@ -2891,28 +3063,14 @@ "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", - "decorators" : { - "location" : "Stockholm" - }, - "classifiers" : [ "Rural" ], - "sourceIds" : [ ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ ] } ] }, { "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", - "decorators" : { - "location" : "Stockholm" - }, - "classifiers" : [ "Rural" ], - "sourceIds" : [ ], - "metadata" : { - "trustLevel" : "RELIABLE" - } + "sourceIds" : [ ] } ] } ], "self" : { @@ -2925,48 +3083,48 @@ "href" : "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" }, "next" : { - "href" : "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=500&limit=500" + "href" : "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" }, "last" : { - "href" : "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=678&limit=500" + "href" : "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" }, - "totalCount" : 23 + "totalCount" : 2 } }, "EntityTypesResponseExample" : { "value" : { "items" : [ { - "name" : "GNBCUUPFunction", + "name" : "AntennaCapability", "entities" : { - "href" : "/domains/RAN/entity-types/GNBCUUPFunction/entities" + "href" : "/domains/RAN/entity-types/AntennaCapability/entities" } }, { - "name" : "NRCellDU", + "name" : "ENodeBFunction", "entities" : { - "href" : "/domains/RAN/entity-types/NRCellDU/entities" + "href" : "/domains/RAN/entity-types/ENodeBFunction/entities" } }, { - "name" : "GNBDUFunction", + "name" : "EUtranCell", "entities" : { - "href" : "/domains/RAN/entity-types/GNBDUFunction/entities" + "href" : "/domains/RAN/entity-types/EUtranCell/entities" } } ], "self" : { - "href" : "/domains/RAN/entity-types?offset=0&limit=500" + "href" : "/domains/RAN/entity-types?offset=0&limit=3" }, "first" : { - "href" : "/domains/RAN/entity-types?offset=0&limit=500" + "href" : "/domains/RAN/entity-types?offset=0&limit=3" }, "prev" : { - "href" : "/domains/RAN/entity-types?offset=0&limit=500" + "href" : "/domains/RAN/entity-types?offset=0&limit=3" }, "next" : { - "href" : "/domains/RAN/entity-types?offset=500&limit=500" + "href" : "/domains/RAN/entity-types?offset=3&limit=3" }, "last" : { - "href" : "/domains/RAN/entity-types?offset=678&limit=500" + "href" : "/domains/RAN/entity-types?offset=9&limit=3" }, - "totalCount" : 43 + "totalCount" : 11 } }, "RelationshipTypesResponseExample" : { @@ -2988,21 +3146,21 @@ } } ], "self" : { - "href" : "/domains/RAN/relationship-types?offset=0&limit=500" + "href" : "/domains/RAN/relationship-types?offset=0&limit=3" }, "first" : { - "href" : "/domains/RAN/relationship-types?offset=0&limit=500" + "href" : "/domains/RAN/relationship-types?offset=0&limit=3" }, "prev" : { - "href" : "/domains/RAN/relationship-types?offset=0&limit=500" + "href" : "/domains/RAN/relationship-types?offset=0&limit=3" }, "next" : { - "href" : "/domains/RAN/relationship-types?offset=500&limit=500" + "href" : "/domains/RAN/relationship-types?offset=0&limit=3" }, "last" : { - "href" : "/domains/RAN/relationship-types?offset=678&limit=500" + "href" : "/domains/RAN/relationship-types?offset=0&limit=3" }, - "totalCount" : 21 + "totalCount" : 3 } }, "DomainsResponseExample" : { @@ -3016,20 +3174,44 @@ "href" : "/domains/EQUIPMENT/relationship-types" } }, { - "name" : "OAM", + "name" : "OAM", + "entityTypes" : { + "href" : "/domains/OAM/entity-types" + }, + "relationshipTypes" : { + "href" : "/domains/OAM/relationship-types" + } + }, { + "name" : "RAN", + "entityTypes" : { + "href" : "/domains/RAN/entity-types" + }, + "relationshipTypes" : { + "href" : "/domains/RAN/relationship-types" + } + }, { + "name" : "REL_EQUIPMENT_RAN", + "entityTypes" : { + "href" : "/domains/REL_EQUIPMENT_RAN/entity-types" + }, + "relationshipTypes" : { + "href" : "/domains/REL_EQUIPMENT_RAN/relationship-types" + } + }, { + "name" : "REL_OAM_RAN", "entityTypes" : { - "href" : "/domains/OAM/entity-types" + "href" : "/domains/REL_OAM_RAN/entity-types" }, "relationshipTypes" : { - "href" : "/domains/OAM/relationship-types" + "href" : "/domains/REL_OAM_RAN/relationship-types" } }, { - "name" : "RAN", + "name" : "TEIV", "entityTypes" : { - "href" : "/domains/RAN/entity-types" + "href" : "/domains/TEIV/entity-types" }, "relationshipTypes" : { - "href" : "/domains/RAN/relationship-types" + "href" : "/domains/TEIV/relationship-types" } } ], "self" : { @@ -3042,92 +3224,12 @@ "href" : "/domains?offset=0&limit=500" }, "next" : { - "href" : "/domains?offset=500&limit=500" - }, - "last" : { - "href" : "/domains?offset=678&limit=500" - }, - "totalCount" : 343 - } - }, - "StaticGroupExample" : { - "value" : { - "groupName" : "son-cell-filter-group-1", - "criteria" : { - "resourceInstances" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" ] - } - } - }, - "DynamicGroupExample" : { - "value" : { - "groupName" : "son-cell-filter-group-1", - "criteria" : { - "resourceQuery" : { - "url" : "/domains/RAN/entity-types/NRCellDU/entities", - "method" : "GET", - "queryParams" : { - "target:Filter" : "/sourceIds", - "scopeFilter" : "/attributes[@nRTAC=310]" - }, - "requestBody" : "" - } - } - } - }, - "GroupResponseExample" : { - "value" : { - "id" : "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=", - "groupName" : "son-cell-filter-group-1", - "criteria" : { - "resourceInstances" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" ] - } - } - }, - "GroupsResponseExample" : { - "value" : { - "items" : [ { - "id" : "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=", - "groupName" : "son-cell-group-1", - "criteria" : { - "resourceInstances" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" ] - } - }, { - "id" : "urn:o-ran:smo:teiv:group:/DFJER77R6F7S9VD=", - "groupName" : "son-cell-group-2", - "criteria" : { - "resourceInstances" : [ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=4", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=5", "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=6" ] - } - }, { - "id" : "urn:o-ran:smo:teiv:group:/LMND77R6F7S9VD=", - "groupName" : "son-cell-group-3", - "criteria" : { - "resourceQuery" : { - "url" : "/domains/RAN/entity-types/NRCellDU/entities", - "method" : "GET", - "queryParams" : { - "target:Filter" : "/sourceIds", - "scopeFilter" : "/attributes[@nRTAC=310]" - }, - "requestBody" : "" - } - } - } ], - "self" : { - "href" : "/groups?offset=0&limit=500" - }, - "first" : { - "href" : "/groups?offset=0&limit=500" - }, - "prev" : { - "href" : "/groups?offset=0&limit=500" - }, - "next" : { - "href" : "/groups?offset=0&limit=500" + "href" : "/domains?offset=0&limit=500" }, "last" : { - "href" : "/groups?offset=0&limit=500" + "href" : "/domains?offset=0&limit=500" }, - "totalCount" : 3 + "totalCount" : 6 } }, "SchemasResponseExample" : { @@ -3237,6 +3339,219 @@ }, "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" + }, + "CreateStaticGroupPayloadExample" : { + "value" : { + "name" : "cell-filter-group-1", + "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" + } ] + }, { + "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" + } ] + } ] + } + }, + "CreateDynamicGroupGetEntitiesByDomainPayloadExample" : { + "value" : { + "name" : "cell-filter-group-2", + "type" : "dynamic", + "criteria" : { + "queryType" : "getEntitiesByDomain", + "domain" : "RAN", + "targetFilter" : "/NRCellDU/attributes(nCI)", + "scopeFilter" : "/NRCellDU/attributes[@cellLocalId=1]" + } + } + }, + "GroupsResponseExample" : { + "value" : { + "items" : [ { + "id" : "urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000", + "name" : "cell-filter-group-1", + "type" : "static", + "providedMembers" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members" + }, + "members" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members" + } + }, { + "id" : "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000", + "name" : "cell-filter-group-2", + "type" : "dynamic", + "members" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members" + } + } ], + "self" : { + "href" : "/groups?offset=0&limit=500" + }, + "first" : { + "href" : "/groups?offset=0&limit=500" + }, + "prev" : { + "href" : "/groups?offset=0&limit=500" + }, + "next" : { + "href" : "/groups?offset=0&limit=500" + }, + "last" : { + "href" : "/groups?offset=0&limit=500" + }, + "totalCount" : 2 + } + }, + "MembersResponseExample" : { + "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" + } ] + }, { + "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" + } ] + } ], + "self" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + }, + "first" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + }, + "prev" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + }, + "next" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + }, + "last" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + }, + "totalCount" : 5 + } + }, + "ProvidedMembersResponseExample" : { + "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" + } ] + }, { + "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" + } ] + } ], + "self" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + }, + "first" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + }, + "prev" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + }, + "next" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + }, + "last" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + }, + "totalCount" : 5 + } + }, + "MergeProvidedMembersPayloadExample" : { + "value" : { + "operation" : "merge", + "providedMembers" : [ { + "o-ran-smo-teiv-ran:NRCellDU" : [ { + "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + } ] + } ] + } + }, + "RemoveProvidedMembersPayloadExample" : { + "value" : { + "operation" : "remove", + "providedMembers" : [ { + "o-ran-smo-teiv-ran:NRCellDU" : [ { + "id" : "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + } ] + } ] + } + }, + "StaticGroupResponseExample" : { + "value" : { + "id" : "urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000", + "name" : "cell-filter-group-1", + "type" : "static", + "providedMembers" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members" + }, + "members" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members" + } + } + }, + "DynamicGroupResponseExample" : { + "value" : { + "id" : "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000", + "name" : "cell-filter-group-2", + "type" : "dynamic", + "criteria" : { + "queryType" : "getEntitiesByDomain", + "domain" : "RAN", + "targetFilter" : "/NRCellDU/attributes(nCI)", + "scopeFilter" : "/NRCellDU/attributes[@cellLocalId=1]" + }, + "members" : { + "href" : "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members" + } + } + }, + "UpdateGroupNamePayloadExample" : { + "value" : { + "name" : "cell-filter-group-5" + } } }, "parameters" : { @@ -3322,6 +3637,7 @@ "name" : "domainName", "required" : true, "schema" : { + "example" : "RAN", "type" : "string" }, "style" : "simple" @@ -3391,7 +3707,7 @@ "domainOptionalInQuery" : { "examples" : { "domain" : { - "value" : "ran" + "value" : "RAN" } }, "explode" : true, @@ -3404,10 +3720,10 @@ "style" : "form" }, "targetFilterOptionalInQuery" : { - "description" : "Use *targetFilter* to specify the entity type and attributes to be returned in the REST response. The value for *targetFilter* can also be a list of entity types and attributes.", + "description" : "Use *targetFilter* to specify what needs to be returned in the REST response.", "examples" : { "targetFilter" : { - "value" : "/attributes(nCI,nRPCI)" + "value" : "/sourceIds;/classifiers" } }, "explode" : true, @@ -3420,10 +3736,10 @@ "style" : "form" }, "scopeFilterOptionalInQuery" : { - "description" : "Use *scopeFilter* to specify the attributes to match on. The value for *scopeFilter* can also be a list of entity types and attributes. scopeFilter returns a boolean.", + "description" : "ScopeFilter is used to specify the conditions to be applied.", "examples" : { "scopeFilter" : { - "value" : "/attributes[@nRTAC=310]" + "value" : "/sourceIds[contains(@item,'ManagedElement=1')]" } }, "explode" : true, @@ -3434,6 +3750,29 @@ "type" : "string" }, "style" : "form" + }, + "groupMembersStatusOptionalInQuery" : { + "description" : "Status can be present (or) not-present (or) invalid. If not specified, returns all members of the group.", + "explode" : true, + "in" : "query", + "name" : "status", + "required" : false, + "schema" : { + "enum" : [ "present", "not-present", "invalid" ], + "type" : "string" + }, + "style" : "form" + }, + "groupNameOptionalInQuery" : { + "description" : "Group name. If not specified, returns all the groups.", + "explode" : true, + "in" : "query", + "name" : "name", + "required" : false, + "schema" : { + "type" : "string" + }, + "style" : "form" } }, "responses" : { @@ -3551,100 +3890,17 @@ "entityIds" : { "items" : { "type" : "string" - }, - "type" : "array" - }, - "relationshipIds" : { - "items" : { - "type" : "string" - }, - "type" : "array" - } - }, - "title" : "Classifier", - "type" : "object" - }, - "GroupResponse" : { - "properties" : { - "id" : { - "type" : "string" - }, - "groupName" : { - "type" : "string" - }, - "criteria" : { - "$ref" : "#/components/schemas/GroupResponse_criteria" - } - }, - "type" : "object" - }, - "Group" : { - "properties" : { - "groupName" : { - "type" : "string" - }, - "criteria" : { - "$ref" : "#/components/schemas/TopologySelection" - } - }, - "type" : "object" - }, - "Groups" : { - "properties" : { - "items" : { - "items" : { - "$ref" : "#/components/schemas/GroupResponse" - }, - "type" : "array" - }, - "self" : { - "$ref" : "#/components/schemas/Href" - }, - "first" : { - "$ref" : "#/components/schemas/Href" - }, - "prev" : { - "$ref" : "#/components/schemas/Href" - }, - "next" : { - "$ref" : "#/components/schemas/Href" - }, - "last" : { - "$ref" : "#/components/schemas/Href" - }, - "totalCount" : { - "type" : "integer" - } - }, - "title" : "Groups", - "type" : "object" - }, - "TopologySelection" : { - "oneOf" : [ { - "$ref" : "#/components/schemas/StaticSelection" - }, { - "$ref" : "#/components/schemas/DynamicSelection" - } ] - }, - "StaticSelection" : { - "properties" : { - "resourceInstances" : { + }, + "type" : "array" + }, + "relationshipIds" : { "items" : { "type" : "string" }, - "minItems" : 1, "type" : "array" } }, - "type" : "object" - }, - "DynamicSelection" : { - "additionalProperties" : false, - "properties" : { - "resourceQuery" : { - "$ref" : "#/components/schemas/DynamicSelection_resourceQuery" - } - }, + "title" : "Classifier", "type" : "object" }, "Decorator" : { @@ -3655,7 +3911,7 @@ }, "decorators" : { "additionalProperties" : true, - "description" : "Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by it's schema.", + "description" : "Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by its schema.", "type" : "object" }, "entityIds" : { @@ -3910,29 +4166,382 @@ "title" : "Schemas", "type" : "object" }, - "GroupResponse_criteria" : { + "StaticEnum" : { + "enum" : [ "static" ], + "type" : "string" + }, + "DynamicEnum" : { + "enum" : [ "dynamic" ], + "type" : "string" + }, + "CreateGroupPayload" : { + "discriminator" : { + "propertyName" : "type" + }, "oneOf" : [ { - "$ref" : "#/components/schemas/StaticSelection" + "$ref" : "#/components/schemas/static" }, { - "$ref" : "#/components/schemas/DynamicSelection" - } ] + "$ref" : "#/components/schemas/dynamic" + } ], + "title" : "CreateGroupPayload", + "type" : "object" }, - "DynamicSelection_resourceQuery" : { + "static" : { "properties" : { - "url" : { + "name" : { + "description" : "A name of the topology group.", + "maxLength" : 150, + "minLength" : 1, "type" : "string" }, - "method" : { + "type" : { + "description" : "Allowed: static", "type" : "string" }, - "queryParams" : { - "type" : "object" + "providedMembers" : { + "items" : { + "description" : "Refer to yang model for schema definition of topology objects.", + "type" : "object" + }, + "minItems" : 1, + "type" : "array" + } + }, + "required" : [ "name", "providedMembers", "type" ], + "title" : "CreateStaticGroupPayload", + "type" : "object" + }, + "dynamic" : { + "properties" : { + "name" : { + "description" : "A name of the topology group.", + "maxLength" : 150, + "minLength" : 1, + "type" : "string" }, - "requestBody" : { - "type" : "object" + "type" : { + "description" : "Allowed: dynamic", + "type" : "string" + }, + "criteria" : { + "$ref" : "#/components/schemas/Criteria" + } + }, + "required" : [ "criteria", "name", "type" ], + "title" : "CreateDynamicGroupPayload", + "type" : "object" + }, + "Criteria" : { + "discriminator" : { + "propertyName" : "queryType" + }, + "oneOf" : [ { + "$ref" : "#/components/schemas/getEntitiesByDomain" + }, { + "$ref" : "#/components/schemas/getEntitiesByType" + }, { + "$ref" : "#/components/schemas/getRelationshipsForEntityId" + }, { + "$ref" : "#/components/schemas/getRelationshipsByType" + } ], + "title" : "Criteria", + "type" : "object" + }, + "getEntitiesByDomain" : { + "properties" : { + "queryType" : { + "description" : "Allowed: getEntitiesByDomain", + "type" : "string" + }, + "domain" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + }, + "required" : [ "domain", "queryType" ], + "title" : "getEntitiesByDomain", + "type" : "object" + }, + "getEntitiesByType" : { + "properties" : { + "queryType" : { + "description" : "Allowed: getEntitiesByType", + "type" : "string" + }, + "domain" : { + "type" : "string" + }, + "entityTypeName" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + }, + "required" : [ "domain", "entityTypeName", "queryType" ], + "title" : "getEntitiesByType", + "type" : "object" + }, + "getRelationshipsForEntityId" : { + "properties" : { + "queryType" : { + "description" : "Allowed: getRelationshipsForEntityId", + "type" : "string" + }, + "domain" : { + "type" : "string" + }, + "entityTypeName" : { + "type" : "string" + }, + "entityId" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + }, + "required" : [ "domain", "entityId", "entityTypeName", "queryType" ], + "title" : "getRelationshipsForEntityId", + "type" : "object" + }, + "getRelationshipsByType" : { + "properties" : { + "queryType" : { + "description" : "Allowed: getRelationshipsByType", + "type" : "string" + }, + "domain" : { + "type" : "string" + }, + "relationshipTypeName" : { + "type" : "string" + }, + "targetFilter" : { + "type" : "string" + }, + "scopeFilter" : { + "type" : "string" + } + }, + "required" : [ "domain", "queryType", "relationshipTypeName" ], + "title" : "getRelationshipsByType", + "type" : "object" + }, + "GroupsResponse" : { + "properties" : { + "items" : { + "items" : { + "$ref" : "#/components/schemas/GroupResponse" + }, + "type" : "array" + }, + "self" : { + "$ref" : "#/components/schemas/Href" + }, + "first" : { + "$ref" : "#/components/schemas/Href" + }, + "prev" : { + "$ref" : "#/components/schemas/Href" + }, + "next" : { + "$ref" : "#/components/schemas/Href" + }, + "last" : { + "$ref" : "#/components/schemas/Href" + }, + "totalCount" : { + "type" : "integer" + } + }, + "title" : "Groups", + "type" : "object" + }, + "GroupResponse" : { + "oneOf" : [ { + "$ref" : "#/components/schemas/StaticGroupResponse" + }, { + "$ref" : "#/components/schemas/DynamicGroupResponse" + } ], + "title" : "Group", + "type" : "object" + }, + "StaticGroupResponse" : { + "properties" : { + "id" : { + "description" : "The unique identifier of the topology group.", + "type" : "string" + }, + "name" : { + "description" : "The unique name of the topology group.", + "type" : "string" + }, + "type" : { + "$ref" : "#/components/schemas/StaticEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + }, + "providedMembers" : { + "$ref" : "#/components/schemas/Href" + } + }, + "required" : [ "id", "members", "name", "providedMembers", "type" ], + "title" : "StaticGroup", + "type" : "object" + }, + "DynamicGroupResponse" : { + "properties" : { + "id" : { + "description" : "The unique identifier of the topology group.", + "type" : "string" + }, + "name" : { + "description" : "The unique name of the topology group.", + "type" : "string" + }, + "type" : { + "$ref" : "#/components/schemas/DynamicEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + } + }, + "required" : [ "id", "members", "name", "type" ], + "title" : "DynamicGroup", + "type" : "object" + }, + "GroupByIdResponse" : { + "oneOf" : [ { + "$ref" : "#/components/schemas/StaticGroupByIdResponse" + }, { + "$ref" : "#/components/schemas/DynamicGroupByIdResponse" + } ], + "title" : "Group", + "type" : "object" + }, + "StaticGroupByIdResponse" : { + "properties" : { + "id" : { + "description" : "The unique identifier of the topology group.", + "type" : "string" + }, + "name" : { + "description" : "The unique name of the topology group.", + "type" : "string" + }, + "type" : { + "$ref" : "#/components/schemas/StaticEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + }, + "providedMembers" : { + "$ref" : "#/components/schemas/Href" + } + }, + "required" : [ "id", "members", "name", "providedMembers", "type" ], + "title" : "StaticGroup", + "type" : "object" + }, + "DynamicGroupByIdResponse" : { + "properties" : { + "id" : { + "description" : "The unique identifier of the topology group.", + "type" : "string" + }, + "name" : { + "description" : "The unique name of the topology group.", + "type" : "string" + }, + "type" : { + "$ref" : "#/components/schemas/DynamicEnum" + }, + "members" : { + "$ref" : "#/components/schemas/Href" + }, + "criteria" : { + "$ref" : "#/components/schemas/Criteria" + } + }, + "required" : [ "criteria", "id", "members", "name", "type" ], + "title" : "DynamicGroup", + "type" : "object" + }, + "MembersResponse" : { + "properties" : { + "items" : { + "items" : { + "description" : "Refer to yang model for schema definition of topology objects.", + "type" : "object" + }, + "type" : "array" + }, + "self" : { + "$ref" : "#/components/schemas/Href" + }, + "first" : { + "$ref" : "#/components/schemas/Href" + }, + "prev" : { + "$ref" : "#/components/schemas/Href" + }, + "next" : { + "$ref" : "#/components/schemas/Href" + }, + "last" : { + "$ref" : "#/components/schemas/Href" + }, + "totalCount" : { + "type" : "integer" + } + }, + "title" : "GroupMembers", + "type" : "object" + }, + "UpdateProvidedMembersPayload" : { + "properties" : { + "operation" : { + "description" : "The operation to be performed on the members of topology group.", + "enum" : [ "merge", "remove" ], + "type" : "string" + }, + "providedMembers" : { + "description" : "Members to be added or removed from the group.", + "items" : { + "description" : "Refer to yang model for schema definition of topology objects.", + "type" : "object" + }, + "minItems" : 1, + "type" : "array" + } + }, + "required" : [ "operation", "providedMembers" ], + "title" : "UpdateProvidedMembersPayload", + "type" : "object" + }, + "UpdateGroupNamePayload" : { + "properties" : { + "name" : { + "maxLength" : 150, + "minLength" : 1, + "type" : "string" } }, - "required" : [ "url" ], + "required" : [ "name" ], + "title" : "UpdateGroupNamePayload", "type" : "object" }, "Domains_items_inner" : { diff --git a/docs/offeredapis/topology-exposure-inventory-openapi.yaml b/docs/offeredapis/topology-exposure-inventory-openapi.yaml index 782fcf8..1d6a962 100644 --- a/docs/offeredapis/topology-exposure-inventory-openapi.yaml +++ b/docs/offeredapis/topology-exposure-inventory-openapi.yaml @@ -48,6 +48,10 @@ info: Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships. + 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. + Topology Exposure and Inventory API provides the capabilities to fetch topology data. Using the filtering options, it is possible to define more specific query requests. @@ -61,24 +65,35 @@ 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 matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | 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=3 and @gNBId=111] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 and the gNBId equals 111 | - | 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=3] | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 or the sourceIds contains an item with "SubNetwork=Ireland" | + | 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" | ## 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 | + + ## 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 | |:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | 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 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 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. | + | 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. | + | 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. | + | 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. | ## Querying entities for relationships The *entityTypeName* is used as the root of the queries. @@ -105,7 +120,7 @@ info: | 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 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. | The *entityName* is used as the root of the queries. @@ -145,8 +160,8 @@ tags: description: "Provides the capability to update or remove user-defined keywords or tags on entities and relationships." - name: Decorators description: "Provides the capability to update or remove user-defined values on entities and relationships." - - name: Topology Groups - description: "Provides the capability to group topology entities of any type, with an appropriate description and other criteria." + - name: Groups + description: "Provides the capability to group topology entities and/or relationships of any type. Groups can be created in static or dynamic way. *Static groups*: Group members are defined statically upon group creation. It can include a maximum of 25,000 members. *Dynamic groups*: Group members are dynamically selected based on the defined resource query." servers: - url: https://{host}/topology-inventory/v1alpha11 @@ -328,7 +343,7 @@ paths: /domains/{domainName}/relationship-types: get: - description: Get all the available topology relationship types. + description: Get all the available topology relationship types in a specified domain. tags: - Entities and relationships summary: Get all the available topology relationship types. @@ -430,8 +445,8 @@ paths: /domains/{domainName}/entities: get: - description: Get topology entities by domain, using specified - targetFilter as mandatory query parameter. + description: Get topology entities by domain, using a specified + *targetFilter* as a query parameter. tags: - Entities and relationships summary: "Get entities by domain" @@ -464,7 +479,7 @@ paths: /schemas: post: - description: Create a new schema. The request body shall contain the schema in YANG format. + description: Create a new schema. The request body contains the schema in YANG format. tags: - Schemas summary: Create a new schema. @@ -521,6 +536,7 @@ paths: $ref: '#/components/responses/Forbidden' '500': $ref: '#/components/responses/InternalServerError' + /schemas/{schemaName}/content: get: description: Get the model schema by name. @@ -591,8 +607,10 @@ paths: schema: $ref: '#/components/schemas/Classifier' examples: - classifier: - $ref: '#/components/examples/ClassifierExample' + updateClassifier: + $ref: '#/components/examples/ClassifierMergeExample' + removeClassifier: + $ref: '#/components/examples/ClassifierDeleteExample' responses: '204': $ref: '#/components/responses/NoContent' @@ -624,8 +642,10 @@ paths: schema: $ref: '#/components/schemas/Decorator' examples: - decorator: - $ref: '#/components/examples/DecoratorExample' + mergeDecorator: + $ref: '#/components/examples/DecoratorMergeExample' + removeDecorator: + $ref: '#/components/examples/DecoratorDeleteExample' responses: '204': $ref: '#/components/responses/NoContent' @@ -642,11 +662,11 @@ paths: /groups: post: - description: Create group. + description: Create a group of entities and/or relationships in a static or dynamic way. tags: - - Topology Groups - summary: Create group. - operationId: createGroup + - Groups + summary: Create a new group. + operationId: "createGroup" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/contentTypeJsonInHeader' @@ -655,71 +675,61 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Group' + $ref: '#/components/schemas/CreateGroupPayload' examples: - dynamicGroup: - $ref: '#/components/examples/DynamicGroupExample' staticGroup: - $ref: '#/components/examples/StaticGroupExample' + $ref: '#/components/examples/CreateStaticGroupPayloadExample' + dynamicGroup: + $ref: '#/components/examples/CreateDynamicGroupGetEntitiesByDomainPayloadExample' responses: '201': description: Created content: application/json: schema: - $ref: '#/components/schemas/GroupResponse' + $ref: '#/components/schemas/GroupByIdResponse' examples: - group: - $ref: '#/components/examples/GroupResponseExample' + static: + $ref: '#/components/examples/StaticGroupResponseExample' + dynamic: + $ref: '#/components/examples/DynamicGroupResponseExample' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' - '409': - $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' - get: description: Get all groups. tags: - - Topology Groups + - Groups summary: Get all groups. operationId: "getAllGroups" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/offsetParam' - $ref: '#/components/parameters/limitParam' + - $ref: '#/components/parameters/groupNameOptionalInQuery' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/Groups' + $ref: '#/components/schemas/GroupsResponse' examples: groups: $ref: '#/components/examples/GroupsResponseExample' - '204': - $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '500': $ref: '#/components/responses/InternalServerError' /groups/{groupId}: get: - description: Get a Group with specified id. + description: Get a group with specified id. tags: - - Topology Groups + - Groups summary: Get a group with specified id. - operationId: "getGroup" + operationId: "getGroupById" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' @@ -729,29 +739,44 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/GroupResponse' + $ref: '#/components/schemas/GroupByIdResponse' examples: - group: - $ref: '#/components/examples/GroupResponseExample' + static: + $ref: '#/components/examples/StaticGroupResponseExample' + dynamic: + $ref: '#/components/examples/DynamicGroupResponseExample' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + delete: + description: Delete a group with specified id. + tags: + - Groups + summary: Delete a group with specified id. + operationId: "deleteGroup" + parameters: + - $ref: '#/components/parameters/groupIdInPath' + responses: + '204': + $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' + /groups/{groupId}/name: put: - description: Update a Group. + description: Update the name of a group. tags: - - Topology Groups - summary: Update a Group. - operationId: updateGroup + - Groups + summary: Update the name of a group. + operationId: "updateGroupName" parameters: - - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/contentTypeJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' requestBody: @@ -759,49 +784,108 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Group' + $ref: '#/components/schemas/UpdateGroupNamePayload' examples: - dynamicGroup: - $ref: '#/components/examples/DynamicGroupExample' - staticGroup: - $ref: '#/components/examples/StaticGroupExample' + GroupNameUpdatePayload: + $ref: '#/components/examples/UpdateGroupNamePayloadExample' responses: '204': $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' - '409': - $ref: '#/components/responses/Conflict' + '404': + $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' - delete: - description: Delete a group with specified id. + /groups/{groupId}/members: + get: + description: Get the members of a group with specified id. tags: - - Topology Groups - summary: Delete a group with specified id. - operationId: "deleteGroup" + - Groups + summary: Get the members of a group with specified id. + operationId: "getMembers" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' + - $ref: '#/components/parameters/offsetParam' + - $ref: '#/components/parameters/limitParam' responses: - '204': - $ref: '#/components/responses/NoContent' + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + examples: + members: + $ref: '#/components/examples/MembersResponseExample' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + + /groups/{groupId}/provided-members: + get: + description: Get the provided members of a static group with specified id. + tags: + - Groups + summary: Get the provided members of a static group with specified id. + operationId: "getProvidedMembers" + parameters: + - $ref: '#/components/parameters/acceptJsonInHeader' + - $ref: '#/components/parameters/groupIdInPath' + - $ref: '#/components/parameters/groupMembersStatusOptionalInQuery' + - $ref: '#/components/parameters/offsetParam' + - $ref: '#/components/parameters/limitParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + examples: + members: + $ref: '#/components/examples/ProvidedMembersResponseExample' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' + /groups/{groupId}/provided-members-operations: + post: + description: Merge or remove members in an existing topology group. This operation is applicable for static group only. + tags: + - Groups + summary: Merge or remove members of a static group. + operationId: "updateProvidedMembers" + parameters: + - $ref: '#/components/parameters/acceptJsonInHeader' + - $ref: '#/components/parameters/contentTypeJsonInHeader' + - $ref: '#/components/parameters/groupIdInPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProvidedMembersPayload' + examples: + mergeMembersPayload: + $ref: '#/components/examples/MergeProvidedMembersPayloadExample' + deleteMembersPayload: + $ref: '#/components/examples/RemoveProvidedMembersPayloadExample' + responses: + '204': + $ref: '#/components/responses/NoContent' + '400': + $ref: '#/components/responses/BadRequest' + '500': + $ref: '#/components/responses/InternalServerError' components: schemas: @@ -826,74 +910,6 @@ components: type: array items: type: string - GroupResponse: - type: object - properties: - id: - type: string - groupName: - type: string - criteria: - oneOf: - - $ref: '#/components/schemas/StaticSelection' - - $ref: '#/components/schemas/DynamicSelection' - Group: - type: object - properties: - groupName: - type: string - criteria: - $ref: '#/components/schemas/TopologySelection' - Groups: - type: object - title: Groups - properties: - items: - type: array - items: - $ref: '#/components/schemas/GroupResponse' - self: - $ref: '#/components/schemas/Href' - first: - $ref: '#/components/schemas/Href' - prev: - $ref: '#/components/schemas/Href' - next: - $ref: '#/components/schemas/Href' - last: - $ref: '#/components/schemas/Href' - totalCount: - type: integer - TopologySelection: - oneOf: - - $ref: '#/components/schemas/StaticSelection' - - $ref: '#/components/schemas/DynamicSelection' - StaticSelection: - type: object - properties: - resourceInstances: - type: array - minItems: 1 - items: - type: string - DynamicSelection: - type: object - additionalProperties: false - properties: - resourceQuery: - type: object - properties: - url: - type: string - method: - type: string - queryParams: - type: object - requestBody: - type: object - required: - - url - Decorator: type: object title: Decorator @@ -906,7 +922,7 @@ components: decorators: type: object additionalProperties: true - description: Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by it's schema. + description: Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by its schema. entityIds: type: array items: @@ -1091,6 +1107,314 @@ components: $ref: '#/components/schemas/Href' totalCount: type: integer + StaticEnum: + type: string + enum: + - static + DynamicEnum: + type: string + enum: + - dynamic + CreateGroupPayload: + title: CreateGroupPayload + type: object + oneOf: + - $ref: '#/components/schemas/static' + - $ref: '#/components/schemas/dynamic' + discriminator: + propertyName: type + static: + title: CreateStaticGroupPayload + type: object + required: + - name + - type + - providedMembers + properties: + name: + type: string + description: A name of the topology group. + minLength: 1 + maxLength: 150 + type: + type: string + description: 'Allowed: static' + providedMembers: + type: array + minItems: 1 + items: + type: object + description: Refer to yang model for schema definition of topology objects. + dynamic: + title: CreateDynamicGroupPayload + type: object + required: + - name + - type + - criteria + properties: + name: + type: string + description: A name of the topology group. + minLength: 1 + maxLength: 150 + type: + type: string + description: 'Allowed: dynamic' + criteria: + $ref: '#/components/schemas/Criteria' + Criteria: + title: Criteria + type: object + oneOf: + - $ref: '#/components/schemas/getEntitiesByDomain' + - $ref: '#/components/schemas/getEntitiesByType' + - $ref: '#/components/schemas/getRelationshipsForEntityId' + - $ref: '#/components/schemas/getRelationshipsByType' + discriminator: + propertyName: queryType + getEntitiesByDomain: + title: getEntitiesByDomain + type: object + required: + - queryType + - domain + properties: + queryType: + type: string + description: 'Allowed: getEntitiesByDomain' + domain: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getEntitiesByType: + title: getEntitiesByType + type: object + required: + - queryType + - domain + - entityTypeName + properties: + queryType: + type: string + description: 'Allowed: getEntitiesByType' + domain: + type: string + entityTypeName: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getRelationshipsForEntityId: + title: getRelationshipsForEntityId + type: object + required: + - queryType + - domain + - entityTypeName + - entityId + properties: + queryType: + type: string + description: 'Allowed: getRelationshipsForEntityId' + domain: + type: string + entityTypeName: + type: string + entityId: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getRelationshipsByType: + title: getRelationshipsByType + type: object + required: + - queryType + - domain + - relationshipTypeName + properties: + queryType: + type: string + description: 'Allowed: getRelationshipsByType' + domain: + type: string + relationshipTypeName: + type: string + targetFilter: + type: string + scopeFilter: + type: string + GroupsResponse: + title: Groups + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/GroupResponse' + self: + $ref: '#/components/schemas/Href' + first: + $ref: '#/components/schemas/Href' + prev: + $ref: '#/components/schemas/Href' + next: + $ref: '#/components/schemas/Href' + last: + $ref: '#/components/schemas/Href' + totalCount: + type: integer + GroupResponse: + title: Group + type: object + oneOf: + - $ref: '#/components/schemas/StaticGroupResponse' + - $ref: '#/components/schemas/DynamicGroupResponse' + StaticGroupResponse: + title: StaticGroup + type: object + required: + - id + - name + - type + - members + - providedMembers + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/StaticEnum' + members: + $ref: '#/components/schemas/Href' + providedMembers: + $ref: '#/components/schemas/Href' + DynamicGroupResponse: + title: DynamicGroup + type: object + required: + - id + - name + - type + - members + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/DynamicEnum' + members: + $ref: '#/components/schemas/Href' + GroupByIdResponse: + title: Group + type: object + oneOf: + - $ref: '#/components/schemas/StaticGroupByIdResponse' + - $ref: '#/components/schemas/DynamicGroupByIdResponse' + StaticGroupByIdResponse: + title: StaticGroup + type: object + required: + - id + - name + - type + - members + - providedMembers + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/StaticEnum' + members: + $ref: '#/components/schemas/Href' + providedMembers: + $ref: '#/components/schemas/Href' + DynamicGroupByIdResponse: + title: DynamicGroup + type: object + required: + - id + - name + - type + - members + - criteria + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/DynamicEnum' + members: + $ref: '#/components/schemas/Href' + criteria: + $ref: '#/components/schemas/Criteria' + MembersResponse: + title: GroupMembers + type: object + properties: + items: + type: array + items: + type: object + description: Refer to yang model for schema definition of topology objects. + self: + $ref: '#/components/schemas/Href' + first: + $ref: '#/components/schemas/Href' + prev: + $ref: '#/components/schemas/Href' + next: + $ref: '#/components/schemas/Href' + last: + $ref: '#/components/schemas/Href' + totalCount: + type: integer + UpdateProvidedMembersPayload: + title: UpdateProvidedMembersPayload + type: object + required: + - operation + - providedMembers + properties: + operation: + type: string + description: The operation to be performed on the members of topology group. + enum: [merge, remove] + providedMembers: + description: Members to be added or removed from the group. + type: array + minItems: 1 + items: + type: object + description: Refer to yang model for schema definition of topology objects. + UpdateGroupNamePayload: + title: UpdateGroupNamePayload + type: object + required: + - name + properties: + name: + type: string + minLength: 1 + maxLength: 150 responses: NotFound: @@ -1218,6 +1542,7 @@ components: required: true schema: type: string + example: RAN schemaNameInPath: name: schemaName in: path @@ -1264,34 +1589,45 @@ components: type: string examples: domain: - value: ran + value: RAN targetFilterOptionalInQuery: name: targetFilter - description: Use *targetFilter* to specify the entity type and - attributes to be returned in the REST response. The value for - *targetFilter* can also be a list of entity types and attributes. + description: Use *targetFilter* to specify what needs to be returned in the REST response. in: query required: false schema: type: string examples: targetFilter: - value: /attributes(nCI,nRPCI) + value: /sourceIds;/classifiers scopeFilterOptionalInQuery: name: scopeFilter - description: Use *scopeFilter* to specify the attributes to match on. - The value for *scopeFilter* can also be a list of entity types and - attributes. scopeFilter returns a boolean. + description: ScopeFilter is used to specify the conditions to be applied. in: query required: false schema: type: string examples: scopeFilter: - value: /attributes[@nRTAC=310] + value: /sourceIds[contains(@item,'ManagedElement=1')] + groupMembersStatusOptionalInQuery: + name: status + description: Status can be present (or) not-present (or) invalid. If not specified, returns all members of the group. + in: query + required: false + schema: + type: string + enum: [present, not-present, invalid] + groupNameOptionalInQuery: + name: name + description: Group name. If not specified, returns all the groups. + in: query + required: false + schema: + type: string examples: - ClassifierExample: + ClassifierMergeExample: value: operation: merge classifiers: @@ -1303,7 +1639,19 @@ components: - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - DecoratorExample: + ClassifierDeleteExample: + 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" + relationshipIds: + - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + + DecoratorMergeExample: value: operation: merge decorators: @@ -1314,71 +1662,72 @@ components: - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + DecoratorDeleteExample: + value: + operation: delete + decorators: + module-x:location: Stockholm + entityIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + relationshipIds: + - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + EntityResponseExample: value: - o-ran-smo-teiv-ran:GNBDUFunction: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" attributes: - gNBDUId: 11 - dUpLMNId: - mcc: 110 - mnc: 210 - gNBId: 21 - gNBIdLength: 2 + cellLocalId: 91 + nCI: 91 + nRPCI: 789 + nRTAC: 456 decorators: location: Stockholm classifiers: - Rural sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE + EntitiesResponseExample: value: items: - - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" attributes: - cellLocalId: 4589 - nCI: 1 - nRPCI: 12 - nRTAC: 310 - decorators: - location: Stockholm - classifiers: - - Rural + gNBId: 10 + gNBIdLength: 2 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE - - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" + - "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" + attributes: + gNBId: 13 + gNBIdLength: 2 + sourceIds: + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" + - "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" attributes: - cellLocalId: 4559 - nRPCI: 32 - nRTAC: 510 - decorators: - location: Stockholm - classifiers: - - Rural + gNBId: 14 + gNBIdLength: 2 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" + - "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" self: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" first: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" prev: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" next: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=500&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=3&limit=3&targetFilter=/sourceIds;/attributes" last: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=678&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" - totalCount: 12 + href: "/domains/RAN/entities?offset=33&limit=3&targetFilter=/sourceIds;/attributes" + totalCount: 3 RelationshipResponseExample: value: @@ -1386,13 +1735,7 @@ components: - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE RelationshipsResponseExample: value: @@ -1401,24 +1744,12 @@ components: - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE self: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" first: @@ -1426,34 +1757,34 @@ components: prev: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" next: - href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=500&limit=500" + href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" last: - href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=678&limit=500" - totalCount: 23 + href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" + totalCount: 2 EntityTypesResponseExample: value: items: - - name: "GNBCUUPFunction" + - name: "AntennaCapability" entities: - href: "/domains/RAN/entity-types/GNBCUUPFunction/entities" - - name: "NRCellDU" + href: "/domains/RAN/entity-types/AntennaCapability/entities" + - name: "ENodeBFunction" entities: - href: "/domains/RAN/entity-types/NRCellDU/entities" - - name: "GNBDUFunction" + href: "/domains/RAN/entity-types/ENodeBFunction/entities" + - name: "EUtranCell" entities: - href: "/domains/RAN/entity-types/GNBDUFunction/entities" + href: "/domains/RAN/entity-types/EUtranCell/entities" self: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" first: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" prev: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" next: - href: "/domains/RAN/entity-types?offset=500&limit=500" + href: "/domains/RAN/entity-types?offset=3&limit=3" last: - href: "/domains/RAN/entity-types?offset=678&limit=500" - totalCount: 43 + href: "/domains/RAN/entity-types?offset=9&limit=3" + totalCount: 11 RelationshipTypesResponseExample: value: @@ -1468,16 +1799,16 @@ components: relationships: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" self: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" first: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" prev: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" next: - href: "/domains/RAN/relationship-types?offset=500&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" last: - href: "/domains/RAN/relationship-types?offset=678&limit=500" - totalCount: 21 + href: "/domains/RAN/relationship-types?offset=0&limit=3" + totalCount: 3 DomainsResponseExample: value: @@ -1497,6 +1828,21 @@ components: href: "/domains/RAN/entity-types" relationshipTypes: href: "/domains/RAN/relationship-types" + - name: "REL_EQUIPMENT_RAN" + entityTypes: + href: "/domains/REL_EQUIPMENT_RAN/entity-types" + relationshipTypes: + href: "/domains/REL_EQUIPMENT_RAN/relationship-types" + - name: "REL_OAM_RAN" + entityTypes: + href: "/domains/REL_OAM_RAN/entity-types" + relationshipTypes: + href: "/domains/REL_OAM_RAN/relationship-types" + - name: "TEIV" + entityTypes: + href: "/domains/TEIV/entity-types" + relationshipTypes: + href: "/domains/TEIV/relationship-types" self: href: "/domains?offset=0&limit=500" first: @@ -1504,81 +1850,10 @@ components: prev: href: "/domains?offset=0&limit=500" next: - href: "/domains?offset=500&limit=500" - last: - href: "/domains?offset=678&limit=500" - totalCount: 343 - - StaticGroupExample: - value: - groupName: "son-cell-filter-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - DynamicGroupExample: - value: - groupName: "son-cell-filter-group-1" - criteria: - resourceQuery: - url: /domains/RAN/entity-types/NRCellDU/entities - method: GET - queryParams: - target:Filter: /sourceIds - scopeFilter: /attributes[@nRTAC=310] - requestBody: "" - - GroupResponseExample: - value: - id: "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=" - groupName: "son-cell-filter-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - GroupsResponseExample: - value: - items: - - id: "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=" - groupName: "son-cell-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - id: "urn:o-ran:smo:teiv:group:/DFJER77R6F7S9VD=" - groupName: "son-cell-group-2" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=4" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=5" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=6" - - id: "urn:o-ran:smo:teiv:group:/LMND77R6F7S9VD=" - groupName: "son-cell-group-3" - criteria: - resourceQuery: - url: /domains/RAN/entity-types/NRCellDU/entities - method: GET - queryParams: - target:Filter: /sourceIds - scopeFilter: /attributes[@nRTAC=310] - requestBody: "" - - self: - href: "/groups?offset=0&limit=500" - first: - href: "/groups?offset=0&limit=500" - prev: - href: "/groups?offset=0&limit=500" - next: - href: "/groups?offset=0&limit=500" + href: "/domains?offset=0&limit=500" last: - href: "/groups?offset=0&limit=500" - totalCount: 3 + href: "/domains?offset=0&limit=500" + totalCount: 6 SchemasResponseExample: value: @@ -1730,3 +2005,149 @@ components: } } } + + CreateStaticGroupPayloadExample: + value: + name: cell-filter-group-1 + 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 + - 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 + + CreateDynamicGroupGetEntitiesByDomainPayloadExample: + value: + name: cell-filter-group-2 + type: dynamic + criteria: + queryType: getEntitiesByDomain + domain: RAN + targetFilter: /NRCellDU/attributes(nCI) + scopeFilter: /NRCellDU/attributes[@cellLocalId=1] + + + GroupsResponseExample: + value: + items: + - id: urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000 + name: cell-filter-group-1 + type: static + providedMembers: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members + members: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members + - id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 + name: cell-filter-group-2 + type: dynamic + members: + href: /groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members + self: + href: "/groups?offset=0&limit=500" + first: + href: "/groups?offset=0&limit=500" + prev: + href: "/groups?offset=0&limit=500" + next: + href: "/groups?offset=0&limit=500" + last: + href: "/groups?offset=0&limit=500" + totalCount: 2 + + MembersResponseExample: + 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 + - 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 + self: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + first: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + prev: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + next: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + last: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + totalCount: 5 + + ProvidedMembersResponseExample: + 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 + - 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 + self: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + first: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + prev: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + next: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + last: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + totalCount: 5 + + MergeProvidedMembersPayloadExample: + value: + operation: "merge" + providedMembers: + - o-ran-smo-teiv-ran:NRCellDU: + - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + + RemoveProvidedMembersPayloadExample: + value: + operation: "remove" + providedMembers: + - o-ran-smo-teiv-ran:NRCellDU: + - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + + StaticGroupResponseExample: + value: + id: urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000 + name: cell-filter-group-1 + type: static + providedMembers: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members + members: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members + + + DynamicGroupResponseExample: + value: + id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 + name: cell-filter-group-2 + type: dynamic + criteria: + queryType: getEntitiesByDomain + domain: RAN + targetFilter: /NRCellDU/attributes(nCI) + scopeFilter: /NRCellDU/attributes[@cellLocalId=1] + members: + href: /groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members + + UpdateGroupNamePayloadExample: + value: + name: "cell-filter-group-5" \ No newline at end of file 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 b0678fd..154f433 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 @@ -58,4 +58,13 @@ public class Constants { public static final String RELATION = "RELATION"; public static final String GEO_LOCATION = "geo-location"; public static final String GEOGRAPHY = "geography"; + public static final String METADATA = "metadata"; + public static final String UPDATETIME = "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 REL_UPDATETIME_PREFIX = "REL_" + UPDATETIME + "_"; + 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/Entity.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java index 3208c2d..d0d8e77 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java @@ -21,6 +21,7 @@ package org.oran.smo.teiv.pgsqlgenerator; import java.util.List; +import java.util.stream.Collectors; import lombok.Value; import org.oran.smo.teiv.pgsqlgenerator.schema.Table; @@ -28,6 +29,7 @@ import lombok.Builder; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID; import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; import static org.oran.smo.teiv.pgsqlgenerator.Constants.SOURCE_IDS; @@ -52,11 +54,18 @@ public class Entity implements Table { @Override public String getColumnsForCopyStatement() { - return "(\"storedAt\", \"name\", \"moduleReferenceName\")"; + return "(\"storedAt\", \"name\", \"moduleReferenceName\", \"attributeNames\")"; } @Override public String getRecordForCopyStatement() { - return this.getStoredAt() + "\t" + this.getEntityName() + "\t" + this.getModuleReferenceName() + "\n"; + return this.getStoredAt() + "\t" + this.getEntityName() + "\t" + this.getModuleReferenceName() + "\t" + this + .getAttributesNames().stream().map(attr -> "\"" + attr + "\"").toList() + "\n"; } + + public List getAttributesNames() { + return this.getAttributes().stream().map(Attribute::getName).filter(name -> !name.equals(ID)).collect(Collectors + .toList()); + } + } 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 989dfc0..b06111a 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 @@ -68,4 +68,8 @@ public class PgSchemaGeneratorException extends RuntimeException { errorMsg), ex); } + public static PgSchemaGeneratorException readCustomSqlFileException(final String schemaName, Exception ex) { + return new PgSchemaGeneratorException(String.format("%s : Failed to read custom sql file!", schemaName), ex); + } + } diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java index e931315..9607b32 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java @@ -32,6 +32,7 @@ import org.oran.smo.teiv.pgsqlgenerator.graphgenerator.EntityGraphGeneratorUml; import org.oran.smo.teiv.pgsqlgenerator.graphgenerator.RelationshipGraphGeneratorUml; import org.oran.smo.teiv.pgsqlgenerator.schema.consumerdata.ConsumerDataSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.schema.data.DataSchemaGenerator; +import org.oran.smo.teiv.pgsqlgenerator.schema.groups.GroupsSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.schema.model.ModelSchemaGenerator; import org.oran.smo.teiv.pgsqlgenerator.graphgenerator.RelationshipGraphGenerator; import org.springframework.beans.factory.annotation.Value; @@ -49,6 +50,7 @@ public class Processor { private final DataSchemaGenerator dataSchemaGenerator; private final ModelSchemaGenerator modelSchemaGenerator; private final ConsumerDataSchemaGenerator consumerDataSchemaGenerator; + private final GroupsSchemaGenerator groupSchemaGenerator; private final RelationshipGraphGenerator relationshipGraphGenerator; private final RelationshipGraphGeneratorUml relationshipGraphGeneratorUml; private final EntityGraphGenerator entityGraphGenerator; @@ -75,9 +77,7 @@ public class Processor { // retrieve info from the model List entitiesFromModelService = yangModelProcessor.getEntitiesAndAttributesFromYang(pathToImplementing); - List moduleReferences = storeRelatedModuleRefsFromIncludedModules(entitiesFromModelService, modules); - List relationshipsFromModelService = yangModelProcessor.getRelationshipsFromYang(pathToImplementing); relationshipGraphGenerator.generate(relationshipsFromModelService, entitiesFromModelService); @@ -87,6 +87,7 @@ public class Processor { dataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); modelSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); consumerDataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); + groupSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService); } /** diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/StaticColumnsGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/StaticColumnsGenerator.java new file mode 100644 index 0000000..6eae482 --- /dev/null +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/StaticColumnsGenerator.java @@ -0,0 +1,54 @@ +/* + * ============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.pgsqlgenerator; + +import static org.oran.smo.teiv.pgsqlgenerator.Constants.COLUMN; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.METADATA; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.NO_PREFIX; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_METADATA_PREFIX; + +import java.util.List; + +import org.oran.smo.teiv.pgsqlgenerator.schema.model.HashInfoDataGenerator; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class StaticColumnsGenerator { + + public List getStaticColumnsForEntityTables(HashInfoDataGenerator hashInfoDataGenerator) { + return List.of(Column.builder().name(hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, METADATA, + COLUMN)).dataType(JSONB).build()); + } + + public List getStaticColumnsForRelationshipTables(HashInfoDataGenerator hashInfoDataGenerator) { + return List.of(Column.builder().name(hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, METADATA, + COLUMN)).dataType(JSONB).build()); + } + + public List getStaticColumnsForRelationshipsInEntity(String relationshipName, + HashInfoDataGenerator hashInfoDataGenerator) { + return List.of(Column.builder().name(hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_METADATA_PREFIX, + relationshipName, COLUMN)).dataType(JSONB).build()); + } + +} diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java index be6a66d..ddb3eba 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java @@ -86,7 +86,7 @@ public class BackwardCompatibilityChecker { } } - public void checkForNBCChangesInConsumerDataSchema(String baselineConsumerDataSchema, + public void checkForNBCChangesInConsumerAndGroupsSchema(String baselineConsumerDataSchema, String skeletonConsumerDataSchema) { if (!isGreenFieldInstallation) { final List baselineTables = SchemaParser.extractDataFromBaseline(baselineConsumerDataSchema); 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 86ea689..8295233 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 @@ -57,8 +57,8 @@ public class ConsumerDataSchemaGenerator extends SchemaGenerator { try { Resource skeletonResource = new ClassPathResource(skeletonConsumerDataSchema); final Path destinationPath = Paths.get(outputConsumerDataSchema); - backwardCompatibilityChecker.checkForNBCChangesInConsumerDataSchema(baselineConsumerDataSchema, destinationPath - .toFile().getAbsolutePath()); + backwardCompatibilityChecker.checkForNBCChangesInConsumerAndGroupsSchema(baselineConsumerDataSchema, + destinationPath.toFile().getAbsolutePath()); FileHelper.copyResourceToFile(skeletonResource, destinationPath.toFile()); this.schema = destinationPath.toFile(); } catch (IOException 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 9ed67ec..4efd28b 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 @@ -29,6 +29,7 @@ import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker; import org.oran.smo.teiv.pgsqlgenerator.FileHelper; @@ -59,6 +60,10 @@ public class DataSchemaGenerator extends SchemaGenerator { private String skeletonDataSchema; @Value("${green-field-installation}") private boolean isGreenFieldInstallation; + @Value("${custom-query-execution}") + private boolean isCustomQueryExecutionEnabled; + @Value("${schema.data.custom-sql-script}") + private String customSqlScripts; private final ModelComparator modelComparator; private final DataSchemaHelper dataSchemaHelper; @@ -99,22 +104,54 @@ public class DataSchemaGenerator extends SchemaGenerator { protected void setSqlStatements(List modules, List entities, List relationships) { // Create table from entities and relationships List
    tablesFromModelSvc = tableBuilder.getTables(entities, relationships); + List
    tablesForNbcCheck = new ArrayList<>(); + try { + Resource skeletonResource = new ClassPathResource(skeletonDataSchema); + File tmpSkeletonFile = new File("target/tmpSkeletonData.sql"); + FileHelper.copyResourceToFile(skeletonResource, tmpSkeletonFile); + List
    tablesFromSkeleton = SchemaParser.extractDataFromBaseline(tmpSkeletonFile.getAbsolutePath()); + tablesForNbcCheck.addAll(tablesFromSkeleton); + } catch (IOException exception) { + throw PgSchemaGeneratorException.prepareBaselineException("ties.data", exception); + } // Get tables from baseline sql List
    tablesFromBaselineSql = isGreenFieldInstallation ? List.of() : SchemaParser.extractDataFromBaseline(baselineDataSchema); // Check for NBCs - backwardCompatibilityChecker.checkForNBCChangesInData(tablesFromBaselineSql, tablesFromModelSvc); + tablesForNbcCheck.addAll(tablesFromModelSvc); + backwardCompatibilityChecker.checkForNBCChangesInData(tablesFromBaselineSql, tablesForNbcCheck); // Compare and store differences in tables from baseline sql with tables from model service Map> differences = modelComparator.identifyDifferencesInBaselineAndGenerated(tablesFromModelSvc, tablesFromBaselineSql); // Generate schema from differences StringBuilder generatedSchema = dataSchemaHelper.generateSchemaFromDifferences(differences); + //add custome sql query if cutom flag is enabled and greenfield is disabled + if (isCustomQueryExecutionEnabled && !isGreenFieldInstallation) { + generatedSchema.append(appendCustomQueries()); + generatedSchema.append("\n"); + } generatedSchema.append(generateAnalyzeTableStatement(tablesFromModelSvc)); generatedSchema.append("COMMIT;\n"); this.sqlStatements = generatedSchema.toString(); } + private StringBuilder appendCustomQueries() { + StringBuilder customSqlQueries = new StringBuilder(); + File customSqlFile = new File(customSqlScripts); + try { + Path customQueryFilePath = customSqlFile.toPath(); + try (Stream lines = Files.lines(customQueryFilePath)) { + lines.forEach(line -> { + customSqlQueries.append(line).append("\n"); + }); + } + } catch (IOException exception) { + throw PgSchemaGeneratorException.readCustomSqlFileException("ties.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 diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java index d085339..a4d67ae 100644 --- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java @@ -51,6 +51,7 @@ import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint; import org.oran.smo.teiv.pgsqlgenerator.IndexType; import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex; import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint; +import org.oran.smo.teiv.pgsqlgenerator.StaticColumnsGenerator; import org.springframework.stereotype.Component; import lombok.RequiredArgsConstructor; @@ -121,6 +122,7 @@ public class TableBuilder { .postgresIndexList(getIndexesForColumn(entity.getStoredAt(), hashedTableName, attributeName, hashedAttributeName, cd.getIndexTypes())).build(); }).toList()); + entityCols.addAll(StaticColumnsGenerator.getStaticColumnsForEntityTables(hashInfoDataGenerator)); return entityCols; } @@ -168,6 +170,8 @@ public class TableBuilder { .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName, hashedColumnName, cd.getIndexTypes())).build()); }); + relColumns.addAll(StaticColumnsGenerator.getStaticColumnsForRelationshipsInEntity(rel.getName(), + hashInfoDataGenerator)); return relColumns; } @@ -199,6 +203,7 @@ public class TableBuilder { .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName, hashedColumnName, cd.getIndexTypes())).build()); }); + relColumns.addAll(StaticColumnsGenerator.getStaticColumnsForRelationshipTables(hashInfoDataGenerator)); return relColumns; } 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 new file mode 100644 index 0000000..d1ddac2 --- /dev/null +++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/groups/GroupsSchemaGenerator.java @@ -0,0 +1,73 @@ +/* + * ============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.pgsqlgenerator.schema.groups; + +import org.oran.smo.teiv.pgsqlgenerator.Entity; +import org.oran.smo.teiv.pgsqlgenerator.FileHelper; +import org.oran.smo.teiv.pgsqlgenerator.Module; +import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException; +import org.oran.smo.teiv.pgsqlgenerator.Relationship; +import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker; +import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaGenerator; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +@Component +@Slf4j +@RequiredArgsConstructor +public class GroupsSchemaGenerator extends SchemaGenerator { + private final BackwardCompatibilityChecker backwardCompatibilityChecker; + + @Value("${schema.groups.baseline}") + private String baselineGroupSchema; + @Value("${schema.groups.output}") + private String outputGroupSchema; + @Value("${schema.groups.skeleton}") + private String skeletonGroupSchema; + + @Override + protected void prepareSchema() { + try { + Resource skeletonResource = new ClassPathResource(skeletonGroupSchema); + final Path destinationPath = Paths.get(outputGroupSchema); + backwardCompatibilityChecker.checkForNBCChangesInConsumerAndGroupsSchema(baselineGroupSchema, destinationPath + .toFile().getAbsolutePath()); + FileHelper.copyResourceToFile(skeletonResource, destinationPath.toFile()); + this.schema = destinationPath.toFile(); + } catch (IOException exception) { + throw PgSchemaGeneratorException.prepareBaselineException("ties.group", exception); + } + } + + @Override + protected void setSqlStatements(List modules, List entities, List relationships) { + //DO-NOTHING + } +} diff --git a/pgsql-schema-generator/src/main/resources/application.yaml b/pgsql-schema-generator/src/main/resources/application.yaml index 1464aab..be3e582 100644 --- a/pgsql-schema-generator/src/main/resources/application.yaml +++ b/pgsql-schema-generator/src/main/resources/application.yaml @@ -20,6 +20,7 @@ # green-field-installation: true +custom-query-execution: false yang-model: source: generate-defaults external: @@ -29,6 +30,7 @@ schema: skeleton: scripts/00_init-oran-smo-teiv-data.sql baseline: output: target/00_init-oran-smo-teiv-data.sql + custom-sql-script: scripts/custom-sql-script.sql model: skeleton: scripts/01_init-oran-smo-teiv-model.sql baseline: @@ -38,6 +40,10 @@ schema: skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql baseline: output: target/02_init-oran-smo-teiv-consumer-data.sql + groups: + skeleton: scripts/03_init-oran-smo-teiv-groups.sql + baseline: + output: target/03_init-oran-smo-teiv-groups.sql exclusions: model-names: metadata, decorators graphs: 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 2a9c705..398a6e4 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 @@ -43,12 +43,37 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT ties_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");' +); +SELECT ties_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");' +); \ 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 d4ee9a2..82f5bc0 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 @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -79,6 +75,3 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - 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 new file mode 100644 index 0000000..739a717 --- /dev/null +++ b/pgsql-schema-generator/src/main/resources/scripts/03_init-oran-smo-teiv-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java index f0fe69e..889e93e 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java @@ -49,6 +49,8 @@ class EndToEndTest { @Autowired private Processor processor; + @Value("${green-field-installation}") + private boolean isGreenFieldInstallation; @Value("${test-result.data}") private String expectedDataSql; @Value("${schema.data.output}") @@ -61,6 +63,14 @@ class EndToEndTest { private String expectedConsumerDataSql; @Value("${schema.consumer-data.output}") private String actualConsumerDataSql; + @Value("${test-result.groups}") + private String expectedGroupSql; + @Value("${schema.groups.output}") + private String actualGroupSql; + @Value("${custom-query-execution}") + private boolean isCustomQueryExecutionEnabled; + @Value("${schema.data.custom-sql-script}") + private String customSqlScripts; @Value("${graphs.output}") private String graphOutput; @@ -73,12 +83,16 @@ class EndToEndTest { File generatedDataSql = new File(actualDataSql); File generatedModelSql = new File(actualModelSql); File generatedConsumerDataSql = new File(actualConsumerDataSql); + File generatedGroupSql = new File(actualGroupSql); + File customSqlScript = new File(customSqlScripts); File generatedGraphs = new File(graphOutput); //then Assertions.assertTrue(generatedDataSql.exists()); Assertions.assertTrue(generatedModelSql.exists()); Assertions.assertTrue(generatedConsumerDataSql.exists()); + Assertions.assertTrue(generatedGroupSql.exists()); + Assertions.assertTrue(customSqlScript.exists()); Assertions.assertTrue(generatedGraphs.exists() && generatedGraphs.isDirectory() && generatedGraphs .listFiles().length > 0); } @@ -190,8 +204,30 @@ class EndToEndTest { Assertions.assertEquals(expectedSqlStatements, actualSqlStatements); } + @Test + @Order(4) + void verifyGeneratedConsumerDataSqlFileTest() { + //when + Set expectedSqlStatements = TestHelper.readFile(expectedConsumerDataSql); + Set actualSqlStatements = TestHelper.readFile(actualConsumerDataSql); + //then + Assertions.assertEquals(expectedSqlStatements.size(), actualSqlStatements.size()); + Assertions.assertEquals(expectedSqlStatements, actualSqlStatements); + } + @Test @Order(5) + void verifyGeneratedTopologyGroupSqlFileTest() { + //when + Set expectedSqlStatements = TestHelper.readFile(expectedGroupSql); + Set actualSqlStatements = TestHelper.readFile(actualGroupSql); + //then + Assertions.assertEquals(expectedSqlStatements.size(), actualSqlStatements.size()); + Assertions.assertEquals(expectedSqlStatements, actualSqlStatements); + } + + @Test + @Order(6) void verifyGeneratedAlterStatementsSchemaTest() { //when Set expectedSqlStatements = TestHelper.readFile(expectedDataSql); @@ -212,11 +248,13 @@ class EndToEndTest { "ALTER TABLE") && s.contains("ADD CONSTRAINT")).count()); //then - Assertions.assertEquals(0, actualAlterStatements.get("ALTER ADD COLUMN")); Assertions.assertEquals(expectedAlterStatements.get("ALTER ADD DEFAULT"), actualAlterStatements.get( "ALTER ADD DEFAULT")); Assertions.assertEquals(expectedAlterStatements.get("ALTER ADD CONSTRAINT"), actualAlterStatements.get( "ALTER ADD CONSTRAINT")); + if (!isGreenFieldInstallation) { + Assertions.assertEquals(17, actualAlterStatements.get("ALTER ADD COLUMN")); + } } @@ -232,7 +270,7 @@ class EndToEndTest { "o-ran-smo-teiv-common-yang-extensions", "ietf-geo-location"))).build()); mockModuleRefFromYangParser.add( Module.builder().name("o-ran-smo-teiv-ran-equipment-to-logical") - .namespace("urn:rdns:o-ran:smo:teiv:ericsson-topologyandinventory-ran-logical-to-equipment") + .namespace("urn:rdns:o-ran:smo:teiv:oran-topologyandinventory-ran-logical-to-equipment") .domain("EQUIPMENT_TO_RAN_LOGICAL") .includedModules(new ArrayList<>(List.of( "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-common-yang-extensions", "o-ran-smo-teiv-ran-logical", @@ -266,7 +304,7 @@ class EndToEndTest { .namespace("urn:rdns:o-ran:smo:teiv:o-ran-smo-teiv-ran-equipment") .domain("RAN_EQUIPMENT").build(), Module.builder().name("o-ran-smo-teiv-ran-equipment-to-logical") - .namespace("urn:rdns:o-ran:smo:teiv:ericsson-topologyandinventory-ran-logical-to-equipment") + .namespace("urn:rdns:o-ran:smo:teiv:oran-topologyandinventory-ran-logical-to-equipment") .domain("EQUIPMENT_TO_RAN_LOGICAL") .includedModules(new ArrayList<>(List.of("o-ran-smo-teiv-ran-logical", "o-ran-smo-teiv-ran-equipment"))).build(), 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 113ea24..659e25a 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 @@ -100,7 +100,8 @@ public class TestHelper { while ((line = br.readLine()) != null) { line = line.trim(); if (!line.isEmpty() && Character.isLetterOrDigit(line.charAt(0)) && !line.startsWith("SELECT") && !line - .startsWith("FOREIGN KEY")) { + .startsWith("FOREIGN KEY") && !line.startsWith("BEGIN") && !line.startsWith("END IF;") && !line + .startsWith("END;")) { Assertions.assertTrue(lines.add(line), String.format("Duplicate identified in file - %s on line --> %s", filePath, line)); } diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java index fc33adc..03015a3 100644 --- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java +++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java @@ -44,6 +44,8 @@ import lombok.extern.slf4j.Slf4j; import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS; import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.METADATA; +import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_METADATA_PREFIX; @Slf4j @SpringBootTest(classes = { TableBuilder.class, HashInfoDataGenerator.class }) @@ -242,6 +244,7 @@ class TableBuilderTest { .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name("REL_FK_used-EntityB").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA") @@ -250,6 +253,7 @@ class TableBuilderTest { .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_ONETOONE").tableName("module-a_EntityA") .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(), Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(REL_METADATA_PREFIX+"oneToOne").dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(), Column.builder().name(String.format("REL_CD_%s_oneToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), @@ -260,6 +264,7 @@ class TableBuilderTest { Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id") .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); @@ -287,6 +292,7 @@ class TableBuilderTest { Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), @@ -296,6 +302,7 @@ class TableBuilderTest { .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name("REL_FK_used-by-EntityA").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-b_EntityB_REL_FK_used-by-EntityA") .tableName("module-b_EntityB").referencedTable("module-a_EntityA").columnToAddConstraintTo("REL_FK_used-by-EntityA").build())).build(), @@ -305,6 +312,7 @@ class TableBuilderTest { .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_module-b_EntityB_REL_ID_oneToMany").tableName("module-b_EntityB") .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(), Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(REL_METADATA_PREFIX+"oneToMany").dataType(JSONB).build(), Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -332,6 +340,7 @@ class TableBuilderTest { Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name("REL_FK_used-EntityB").dataType("TEXT") .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA") .referencedTable("module-b_EntityB").columnToAddConstraintTo("REL_FK_used-EntityB").build())).build(), @@ -339,6 +348,7 @@ class TableBuilderTest { .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_MANYTOONE").tableName("module-a_EntityA") .columnToAddConstraintTo("REL_ID_ManyToOne").build())).build(), Column.builder().name("REL_CD_sourceIds_ManyToOne").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(REL_METADATA_PREFIX+"ManyToOne").dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(), Column.builder().name(String.format("REL_CD_%s_ManyToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(), @@ -350,6 +360,7 @@ class TableBuilderTest { .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -374,6 +385,7 @@ class TableBuilderTest { Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), @@ -383,6 +395,7 @@ class TableBuilderTest { .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(), Column.builder().name("name").dataType("TEXT").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), @@ -397,6 +410,7 @@ class TableBuilderTest { .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a-b_manyToMany_bSide_EntityB") .tableName("module-a-b_ManyToMany").referencedTable("module-b_EntityB").columnToAddConstraintTo("bSide_EntityB").build())).build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on @@ -432,6 +446,7 @@ class TableBuilderTest { Column.builder().name("sectorId").dataType("jsonb").build(), Column.builder().name("geo-location").dataType("geography").build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(), @@ -447,6 +462,7 @@ class TableBuilderTest { .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a_relationshipConnectingSameEntity_bSide_EntityA") .tableName("module-a_relationshipConnectingSameEntity").referencedTable("module-a_EntityA").columnToAddConstraintTo("bSide_EntityA").build())).build(), Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(), + Column.builder().name(METADATA).dataType(JSONB).build(), Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(), Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build()); //spotless:on 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 b952ba2..de012f8 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 4150f94..ea84368 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 4be3ac9..245f160 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 cf40e8c..e46c7d3 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 6f1aea5..ce6ffd3 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 90c8237..b6baa4a 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 @@ -43,7 +43,7 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; 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 1f554a0..c4b89a9 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 @@ -53,6 +53,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -86,7 +87,7 @@ COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; +COPY ties_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; diff --git a/pgsql-schema-generator/src/test/resources/application.yaml b/pgsql-schema-generator/src/test/resources/application.yaml index cabe4ce..e9cabcd 100644 --- a/pgsql-schema-generator/src/test/resources/application.yaml +++ b/pgsql-schema-generator/src/test/resources/application.yaml @@ -20,6 +20,7 @@ # green-field-installation: true +custom-query-execution: true yang-model: source: generate-defaults external: @@ -30,6 +31,7 @@ schema: skeleton: scripts/00_init-oran-smo-teiv-data.sql baseline: baseline-schema/00_init-oran-smo-teiv-data.sql output: target/test-classes/TEST_00_init-oran-smo-teiv-data.sql + custom-sql-script: src/test/resources/baseline-schema/custom-sql-script.sql model: skeleton: scripts/01_init-oran-smo-teiv-model.sql baseline: baseline-schema/01_init-oran-smo-teiv-model.sql @@ -39,10 +41,15 @@ schema: skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql baseline: baseline-schema/02_init-oran-smo-teiv-consumer-data.sql output: target/test-classes/TEST_02_init-oran-smo-teiv-consumer-data.sql + groups: + skeleton: scripts/03_init-oran-smo-teiv-groups.sql + baseline: src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql + output: target/test-classes/TEST_03_init-oran-smo-teiv-groups.sql test-result: data: src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql model: src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql consumer-data: src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql + groups: src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql exclusions: model-names: metadata, decorators graphs: 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 109f6e7..0def1e6 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 @@ -43,15 +43,12 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); - --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" ( 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 fc61d6f..4559b22 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 @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE :'pguser'; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -79,9 +75,6 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - COPY ties_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 @@ -131,12 +124,12 @@ 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") FROM stdin; -o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment -o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran +COPY ties_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"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +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; 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 new file mode 100644 index 0000000..01cc9b3 --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/03_init-oran-smo-teiv-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +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 new file mode 100644 index 0000000..1c84dba --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/baseline-schema/custom-sql-script.sql @@ -0,0 +1,49 @@ +-- +-- ============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========================================================= +-- + +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT ties_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");' +); + +SELECT ties_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");' +); 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 06702e0..939bed1 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 @@ -43,15 +43,12 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); - CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( "id" TEXT, "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT, @@ -182,7 +179,7 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_ ALTER TABLE ONLY ties_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_GNBDUFunction" ( +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, "gNBDUId" BIGINT, @@ -193,11 +190,11 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ( "CD_decorators" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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" ( "id" TEXT, @@ -313,9 +310,9 @@ SELECT ties_data.create_constraint_if_not_exists( ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_GNBDUFunction', - 'PK_o-ran-smo-teiv-ran_GNBDUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_GNBDUFunction_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( @@ -488,13 +485,13 @@ CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON tie 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_GNBDUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("dUpLMNId"); +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_2BEF269CED354C2454AC2B2EABB134AC267A0C62" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); +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_601A4514FFACA8985471531013AFC8F760361F09" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_classifiers"::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_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("CD_decorators"); +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_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); @@ -532,7 +529,66 @@ CREATE INDEX IF NOT EXISTS "IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224" ON tie CREATE INDEX IF NOT EXISTS "IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA"); -ANALYZE ties_data."o-ran-smo-teiv-ran_GNBDUFunction"; +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); + +SELECT ties_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");' +); + +SELECT ties_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 ties_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 ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE ties_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 ties_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 ties_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 ties_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 ties_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 ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ANALYZE ties_data."o-ran-smo-teiv-ran_ODUFunction"; ANALYZE ties_data."FB1E124031A12CD85D3335194B39B193723A0490"; 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 f07698f..2c99051 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 @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" VARCHAR(511) PRIMARY KEY, "hashedValue" VARCHAR(511) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -77,9 +73,6 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN @@ -105,8 +98,8 @@ IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_geranFqBa IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_nRFqBands IDX_441B5C05448D63552C6414BD59C13641D8A4408D INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_classifiers IDX_B598B74193845587BA03553CEDBA058D33956847 INDEX 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_GNBDUFunction_CD_classifiers IDX_601A4514FFACA8985471531013AFC8F760361F09 INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_GNBDUFunction_CD_sourceIds IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_classifiers IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_sourceIds IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_sourceIds IDX_6EC539C61EA7078DBA264C9877B87FC263605D42 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C INDEX @@ -134,8 +127,8 @@ IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators IDX_GIN_o-ran-smo-t IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId INDEX -IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators INDEX -IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators INDEX IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_44075E1D464599B61924196C20F2B88332520CD8 INDEX IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494 INDEX @@ -151,7 +144,7 @@ IDX_GIN_test-built-in-module_EntityTypeA_REL_CD_decorators_ENTITYTYPEA_USES_ENTI PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT PK_o-ran-smo-teiv-ran_ENodeBFunction_id PK_o-ran-smo-teiv-ran_ENodeBFunction_id CONSTRAINT -PK_o-ran-smo-teiv-ran_GNBDUFunction_id PK_o-ran-smo-teiv-ran_GNBDUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ODUFunction_id PK_o-ran-smo-teiv-ran_ODUFunction_id CONSTRAINT PK_o-ran-smo-teiv-ran_LTESectorCarrier_id PK_o-ran-smo-teiv-ran_LTESectorCarrier_id CONSTRAINT PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT PK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_id PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD CONSTRAINT @@ -219,7 +212,7 @@ nRFqBands nRFqBands COLUMN o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE o-ran-smo-teiv-ran_ENodeBFunction o-ran-smo-teiv-ran_ENodeBFunction TABLE -o-ran-smo-teiv-ran_GNBDUFunction o-ran-smo-teiv-ran_GNBDUFunction TABLE +o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran_ODUFunction TABLE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran_LTESectorCarrier TABLE o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE positionWithinSector positionWithinSector COLUMN @@ -229,27 +222,33 @@ test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGT test-built-in-module_EntityTypeA test-built-in-module_EntityTypeA TABLE test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters 10B9F515756871D3EF6558FAF1F112BAE207945D TABLE totalTilt totalTilt COLUMN +REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN +REL_metadata_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_8D7D68E4BA4C9749577CF7F26DB5E9B22BCA796E COLUMN +REL_metadata_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_C3C2193291E4C8D591E05390DFBCC3843B6B0DA2 COLUMN +REL_metadata_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_5A306C45543040943259237E7C3C9710139245CB COLUMN +REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +metadata metadata COLUMN \. COPY ties_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= +_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== -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLgogICAgICAgICAgICBBbGwgdHlwZXMgTVVTVCB1c2UgdGhpcyBncm91cGluZy4iOwoKICAgICAgICBsZWFmIGlkIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUKICAgICAgICAgICAgICAgIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcKICAgICAgICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLiBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGxlYWYtbGlzdCBjbGFzc2lmaWVycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkNvbnN1bWVyIGRlZmluZWQgdGFncyB0byB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBsZWFmLWxpc3Qgc291cmNlSWRzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQW4gb3JkZXJlZCBsaXN0IG9mIGlkZW50aXRpZXMgdGhhdCByZXByZXNlbnQgdGhlIHNldCBvZiBuYXRpdmUKICAgICAgICAgICAgc291cmNlIGlkZW50aWZpZXJzIGZvciBwYXJ0aWNpcGF0aW5nIGVudGl0aWVzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIG1ldGFkYXRhLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgY2xhc3NpZmllciBpcyB1c2VkIGFzIGEgYmFzZSB0byBwcm92aWRlIGFsbCBjbGFzc2lmaWVycwogICAgICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQp9 -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIEVxdWlwbWVudAogICAgZG9tYWluLCB3aGljaCBpcyBtb2RlbGxlZCB0byB1bmRlcnN0YW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiBlcXVpcG1lbnQKICAgIHN1Y2ggYXMgYW50ZW5uYXMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbC9jYXJyaWVyIGFuZCB0aGVpciByZWxldmFudAogICAgcHJvcGVydGllcyBlLmcuIHRpbHQsIG1heCBwb3dlciBldGMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gRVFVSVBNRU5UOwoKICAgIGxpc3QgQW50ZW5uYU1vZHVsZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEFudGVubmEgTW9kdWxlIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGFzcGVjdCBvZiBhbgogICAgICAgICAgICBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbCBpZGVudGlmaWVyLiBUaGlzCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFCZWFyaW5nIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIGJlYXJpbmcgb24gYW50ZW5uYSBzdWJ1bml0IHdoZXJlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICB1bml0IGlzIGluc3RhbGxlZC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBmaXhlZCBhbnRlbm5hIHRpbHQgb2YgdGhlIGluc3RhbGxhdGlvbiwgZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgcGxhbmUuIEl0IGlzIGEgc2lnbmVkIHZhbHVlLiBQb3NpdGl2ZSBpbmRpY2F0ZXMKICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3IgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgdW5pdCBwb3NpdGlvbiB3aXRoaW4gc2VjdG9yLiBUaGlzIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgICAgIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgdG90YWxUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb3RhbCBhbnRlbm5hIGVsZXZhdGlvbiBpbmNsdWRpbmcgdGhlIGluc3RhbGxlZAogICAgICAgICAgICAgICAgICAgIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkgdGhlIFJlbW90ZSBFbGVjdHJpY2FsCiAgICAgICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOyB0aWx0IGRvd24gaXMKICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHJhZGlhdGlvbiBwYXR0ZXJuIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLiBNZWFzdXJlZCBpbgogICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQp9 -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIFJBTiBkb21haW4sCiAgICB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZQogICAgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IEdOQkRVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUIgRGlzdHJpYnV0ZWQgVW5pdCAoZ05CLURVKS4KCiAgICAgICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQgKGdOQi1DVSkgYW5kIGEgZ05CLURVLgogICAgICAgICAgICBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsIHRpbWUgcHJvdG9jb2xzIGFuZCBzZXJ2aWNlcywgYW5kIHRoZSBEVQogICAgICAgICAgICBwcm9jZXNzZXMgUEhZIGxldmVsIHByb3RvY29sIGFuZCByZWFsIHRpbWUgc2VydmljZXMuIFRoZSBnTkItQ1UgYW5kCiAgICAgICAgICAgIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEgRjEgbG9naWNhbCBpbnRlcmZhY2UuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgZ05CLURVOgogICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1DUCB0aHJvdWdoIHRoZSBGMS1DIGludGVyZmFjZS4gSXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIGdOQi1DVS1DUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgZ05CLUNVLUNQLgoKICAgICAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1EVXMuIGdOQi1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgICAgICB0aGUgZ05CLURVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBjb250YWluZXIgZFVwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB1c2VkIGFzIHBhcnQgb2YgUE0gRXZlbnRzIGRhdGEiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQkRVSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBFTm9kZUJGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEV2b2x2ZWQgTm9kZSBCIChlTm9kZUIpIGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBub2RlIGluCiAgICAgICAgICAgIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0gRXZvbHV0aW9uIChMVEUpLiBUaGUKICAgICAgICAgICAgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zCiAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlcgogICAgICAgICAgICBkZWNpc2lvbnMuIFVubGlrZSAyLzNHIHdpcmVsZXNzIFJBTiwgdGhlcmUgaXMgbm8gY2VudHJhbGl6ZWQgcmFkaW8KICAgICAgICAgICAgbmV0d29yayBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcyBkaXJlY3RseSB3aXRoIG1vYmlsZQogICAgICAgICAgICBoYW5kc2V0cyAoVXNlciBFcXVpcG1lbnQpLCBsaWtlIGEgYmFzZSB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluCiAgICAgICAgICAgIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlcgogICAgICAgICAgICByZXNwb25zZSB0aW1lcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGVOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgRU5vZGVCIElEIHRoYXQgZm9ybXMgcGFydCBvZiB0aGUgQ2VsbCBHbG9iYWwKICAgICAgICAgICAgICAgICAgICBJZGVudGl0eSwgYW5kIGlzIGFsc28gdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyIHRoZSBTMQogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBQdWJsaWMgTGFuZCBNb2JpbGUgTmV0d29yayAoUExNTikgSUQKICAgICAgICAgICAgICAgICAgICB0aGF0IGZvcm1zIHBhcnQgb2YgdGhlIEVOb2RlQiBHbG9iYWwgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUKICAgICAgICAgICAgICAgICAgICBub2RlIG92ZXIgdGhlIFMxIGludGVyZmFjZS4gTm90ZTogVGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgKE1DQz0wMDEsIE1OQz0wMSkgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgY2FuIG5vdCBiZSB1c2VkIGFzIGEgdmFsaWQgUExNTiBJZGVudGl0eS4iOwoKICAgICAgICAgICAgICAgIGxlYWYgbWNjIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1DQyBwYXJ0IG9mIGEgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDAuLjk5OTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZWFmIG1uYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkKICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAyLi4zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IExURVNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTFRFIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgICAgIGNlbGxzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgc2VjdG9yQ2FycmllclR5cGUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdG9yIGNhcnJpZXIKICAgICAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsKICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgICAgIGVudW0gbm9ybWFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb3QgYSBkaWdpdGFsIHNlY3RvciI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIG1pZGRsZV9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcyBhc3NvY2lhdGVkIGhhcmR3YXJlCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIExURVNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBMVEUgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgYW5kIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICBmb3Igc291cmNlSWRzYW5kIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHRvIG1ldGFkYXRhLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLgogICAgICAgICAgICBBbGwgdHlwZXMgTVVTVCB1c2UgdGhpcyBncm91cGluZy4iOwoKICAgICAgICBsZWFmIGlkIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUKICAgICAgICAgICAgICAgIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcKICAgICAgICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLiBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGxlYWYtbGlzdCBjbGFzc2lmaWVycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkNvbnN1bWVyIGRlZmluZWQgdGFncyB0byB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgZW50aXR5LiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewoKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZQogICAgICAgICAgICAgICAgc291cmNlIGlkZW50aWZpZXJzIGZvciBwYXJ0aWNpcGF0aW5nIGVudGl0aWVzLgoKICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgVG9wb2xvZ3kgRW50aXR5IGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5J3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQKICAgICAgICAgICAgICAgIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgcmVsYXRpb25zaGlwLiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewoKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZQogICAgICAgICAgICAgICAgc291cmNlIGlkZW50aWZpZXJzIGZvciBwYXJ0aWNpcGF0aW5nIGVudGl0aWVzIGluIHRoZSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUKICAgICAgICAgICAgICAgIGRlY2xhcmVkIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUKICAgICAgICAgICAgICAgIGNvbnN1bWVycyBhbmQgY2FuIG9ubHkgYmUgc2V0IGJ5IHRoZSByZXNwb25zaWJsZSBhZGFwdGVyLiBUaGlzCiAgICAgICAgICAgICAgICBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluCiAgICAgICAgICAgICAgICBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICAgICAgdHlwZSBzb3VyY2VJZDsKICAgICAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIG1ldGFkYXRhIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGFuIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgbWV0YWRhdGEuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXJzLgoKICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsCiAgICAgICAgICAgIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncwogICAgICAgICAgICBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlIGNvbnN1bWVycyBhbmQgY2FuIG9ubHkgYmUgc2V0IGJ5CiAgICAgICAgICAgIHRoZSByZXNwb25zaWJsZSBhZGFwdGVyLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZQogICAgICAgICAgICBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgbGVhZiByZWxpYWJpbGl0eUluZGljYXRvciB7CiAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgZW51bSBPSyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIGlzIGluIGFsaWdubWVudCB3aXRoIHRoZSBzb3VyY2Ugb2YgdHJ1dGgsCiAgICAgICAgICAgICAgICAgICAgYXMgZmFyIGFzIFRvcG9sb2d5IEV4cG9zdXJlIEhhbmRsaW5nIGlzIGF3YXJlLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gUkVTVE9SRUQgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZGF0YSB3YXMgcmVzdG9yZWQgZnJvbSBiYWNrdXAgYW5kIHRoZSByZXNwb25zaWJsZQogICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJzIGFyZSBjaGVja2luZyB0byBlbnN1cmUgdGhlIGRhdGEgaXMgY3VycmVudC4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbnVtIEFEVklTRUQgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbnRpdHkgaW1wbGljaXRseSBjcmVhdGVkIGJ5IFRvcG9sb2d5IEV4cG9zdXJlIEhhbmRsaW5nIGFuZAogICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbGx5IG5vdCBhbGlnbmVkIHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aC4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KCiAgICB0eXBlZGVmIHNvdXJjZUlkIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gaWRlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgbmF0aXZlIGlkZW50aWZpZXIgb2YgYSB0b3BvbG9neSBlbnRpdHkuIjsKICAgICAgICB0eXBlIHN0cmluZzsKICAgIH0KfQ== +o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIEVxdWlwbWVudAogICAgZG9tYWluLCB3aGljaCBpcyBtb2RlbGxlZCB0byB1bmRlcnN0YW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiBlcXVpcG1lbnQKICAgIHN1Y2ggYXMgYW50ZW5uYXMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbC9jYXJyaWVyIGFuZCB0aGVpciByZWxldmFudAogICAgcHJvcGVydGllcyBlLmcuIHRpbHQsIG1heCBwb3dlciBldGMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBncm91cGluZ3MsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgb3IgT3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycAogICAgICAgIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRvcG9sb2d5IG9iamVjdHMuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4KICAgICAgICBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbCBpZGVudGlmaWVyLiBUaGlzCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vCiAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBiZWFyaW5nIG9uIGFudGVubmEgc3VidW5pdCB3aGVyZSBhbnRlbm5hCiAgICAgICAgICAgICAgICB1bml0IGlzIGluc3RhbGxlZC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBmaXhlZCBhbnRlbm5hIHRpbHQgb2YgdGhlIGluc3RhbGxhdGlvbiwgZGVmaW5lZAogICAgICAgICAgICAgICAgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUKICAgICAgICAgICAgICAgIHZlcnRpY2FsIHBsYW5lLiBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3IgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgdW5pdCBwb3NpdGlvbiB3aXRoaW4gc2VjdG9yLiBUaGlzIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vIG9wZXJhdGlvbmFsCiAgICAgICAgICAgICAgICBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHRvdGFsVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVG90YWwgYW50ZW5uYSBlbGV2YXRpb24gaW5jbHVkaW5nIHRoZSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkgdGhlIFJlbW90ZSBFbGVjdHJpY2FsCiAgICAgICAgICAgICAgICBUaWx0IChSRVQpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRWxlY3RyaWNhbGx5LWNvbnRyb2xsZWQgdGlsdCBvZiBtYWluIGJlYW0gbWF4aW11bQogICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIGRpcmVjdGlvbiBvcnRob2dvbmFsIHRvIGFudGVubmEgZWxlbWVudAogICAgICAgICAgICAgICAgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOyB0aWx0IGRvd24gaXMKICAgICAgICAgICAgICAgIHBvc2l0aXZlLCB0aWx0IHVwIGlzIG5lZ2F0aXZlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hCiAgICAgICAgICAgICAgICByYWRpYXRpb24gcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4KICAgICAgICAgICAgICAgIGRlZ3JlZXMuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIFJBTiBkb21haW4sCiAgICB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZQogICAgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gRGlzdHJpYnV0ZWQgVW5pdCAoTy1EVSkuCgogICAgICAgIFRoZSBPLURVIGlzIGFuIE8tUkFOIE5GIGluIHRoZSBPLVJBTiBBcmNoaXRlY3R1cmUuIEFuIE8tRFUsIGNvbWJpbmVkCiAgICAgICAgd2l0aCBvbmUgb3IgbW9yZSBPLVJVKHMpIGNvbm5lY3RlZCB0byBpdCwgc3VwcG9ydHMgYW5kIGlzIGZ1bGx5CiAgICAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBmdW5jdGlvbnMgb2YgYSBnTkItRFUgYXMgZGVmaW5lZCBieSAzR1BQIFRTIDM4LjQwMS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgIGNvbm5lY3RlZCB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIE8tRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIE8tRFUgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE5HLVJBTgogICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGNvbnRhaW5lciBkVXBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gRXZvbHZlZCBOb2RlIEIgKGVOb2RlQikgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IG5vZGUgaW4KICAgICAgICB0aGUgcmFkaW8gYWNjZXNzIG5ldHdvcmsgKFJBTikgb2YgTG9uZy1UZXJtIEV2b2x1dGlvbiAoTFRFKS4gVGhlCiAgICAgICAgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zCiAgICAgICAgaW4gdGhlIGNlbGwgYW5kIGNhcnJpZXMgb3V0IHJhZGlvIHJlc291cmNlIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyCiAgICAgICAgZGVjaXNpb25zLiBVbmxpa2UgMi8zRyB3aXJlbGVzcyBSQU4sIHRoZXJlIGlzIG5vIGNlbnRyYWxpemVkIHJhZGlvCiAgICAgICAgbmV0d29yayBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkIHRvCiAgICAgICAgdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzIGRpcmVjdGx5IHdpdGggbW9iaWxlCiAgICAgICAgaGFuZHNldHMgKFVzZXIgRXF1aXBtZW50KSwgbGlrZSBhIGJhc2UgdHJhbnNjZWl2ZXIgc3RhdGlvbiAoQlRTKSBpbgogICAgICAgIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlcgogICAgICAgIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBDZWxsIEdsb2JhbAogICAgICAgICAgICAgICAgSWRlbnRpdHksIGFuZCBpcyBhbHNvIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG5vZGUgb3ZlciB0aGUgUzEKICAgICAgICAgICAgICAgIGludGVyZmFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBQdWJsaWMgTGFuZCBNb2JpbGUgTmV0d29yayAoUExNTikgSUQKICAgICAgICAgICAgICAgIHRoYXQgZm9ybXMgcGFydCBvZiB0aGUgRU5vZGVCIEdsb2JhbCBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoZQogICAgICAgICAgICAgICAgbm9kZSBvdmVyIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZQogICAgICAgICAgICAgICAgKE1DQz0wMDEsIE1OQz0wMSkgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBjYW4gbm90IGJlIHVzZWQgYXMgYSB2YWxpZCBQTE1OIElkZW50aXR5LiI7CgogICAgICAgICAgICAgICAgbGVhZiBtY2MgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTUNDIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5IHVzZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5IHVzZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkKICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTFRFU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBMVEUgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0b3IgY2FycmllcgogICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1pZGRsZSBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBBbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZi1saXN0IGVVdHJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcyB0aGF0IGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgZ2VyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcyB0aGF0IGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcyBhc3NvY2lhdGVkIGhhcmR3YXJlCiAgICAgICAgICAgICAgICBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOT0RFQkZVTkNUSU9OX1BST1ZJREVTX0xURVNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgRU5vZGVCRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBMdGVTZWN0b3IgdHlwZS4KICAgICAgICAgICAgVGhlIEVOb2RlQkZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGJhc2Ugc3RhdGlvbiB0aGF0IHByb3ZpZGVzIHRoZSBFVXRyYW5DZWxsLgogICAgICAgICAgICBBbiBFTm9kZUJGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IExURVNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBMVEVTZWN0b3JDYXJyaWVyIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gRU5vZGVCRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIExURVNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBMVEVTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIExURVNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBMVEVTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiB1c2Ugb25seSBvbmUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSB1c2VkIGJ5IG1hbnkgTFRFU2VjdG9yQ2FycmllcnMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= +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-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5nLCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9FUVVJUE1FTlRfUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBBbnRlbm5hTW9kdWxlIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGFudGVubmEgdGhhdCBzZXJ2ZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBzZXJ2ZSBtYW55IEFudGVubmFDYXBhYmlsaXRpZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgc2VydmljZWQgYnkgdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment -o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran -test-built-in-module_EntityTypeA EntityTypeA test-built-in-module -test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module +COPY ties_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"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran ["sectorCarrierType"] +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; 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 new file mode 100644 index 0000000..739a717 --- /dev/null +++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_03_init-oran-smo-teiv-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +COMMIT; diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang index 4585747..6c989a8 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang @@ -18,6 +18,12 @@ module o-ran-smo-teiv-common-yang-types { This model contains re-usable data types that topology and inventory models will frequently use as part of types and relationships."; + revision "2024-10-04" { + description "Added Origin_Entity_Mapping_Grp and Origin_Relationship_Mapping_Grp + for sourceIdsand reliabilityIndicator to metadata."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -60,35 +66,87 @@ module o-ran-smo-teiv-common-yang-types { type identityref { base classifier; } } - leaf-list sourceIds { - description - "An ordered list of identities that represent the set of native - source identifiers for participating entities. + grouping Origin_Entity_Mapping_Grp { + description "Grouping to identify sourceIds on a topology entity."; - This is a consumer data and can be attached to Topology Entity or - Topology Relation instance, outside of the declared Topology Entity - or Topology Relationship's attributes. This cannot be instantiated, - and it MUST NOT be augmented or deviated in any way, unless stated - otherwise."; + leaf-list sourceIds { - type string; - ordered-by user; + description + "An ordered list of identities that represent the set of native + source identifiers for participating entities. + + This must be attached to the Topology Entity instance, outside of the + declared Topology Entity'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."; + + type sourceId; + ordered-by user; + min-elements 1; + } + } + + grouping Origin_Relationship_Mapping_Grp { + description "Grouping to identify sourceIds on a topology relationship."; + + leaf-list sourceIds { + + description + "An ordered list of identities that represent the set of native + source identifiers for participating entities in the relationship. + + This must be attached to the Topology Relation instance, outside of the + declared 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."; + + type sourceId; + ordered-by user; + min-elements 2; + } } container metadata { description - "This container serves as extension point to define metadata. They - can only be defined in name value pair. - - This is a consumer data and can be attached to Topology Entity or - Topology Relation instance, outside of the declared Topology Entity - or Topology Relationship's attributes. This cannot be instantiated, - and it MUST NOT be augmented or deviated in any way, unless stated - otherwise."; + "This container serves as an extension point to define metadata. They + can only be defined in name value pairs. + + 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."; + + 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."; + value 0; + } + enum RESTORED { + description "The data was restored from backup and the responsible + adapters are checking to ensure the data is current."; + value 1; + } + enum ADVISED { + description "Entity implicitly created by Topology Exposure Handling and + potentially not aligned with the source of truth."; + value 2; + } + } + } } - identity classifier{ + identity classifier { description "The classifier is used as a base to provide all classifiers - with identity. "; + with identity. "; + } + + typedef sourceId { + description "An identity that represents a native identifier of a topology entity."; + type string; } } \ No newline at end of file diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang index d25ea98..e7bc42f 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang @@ -25,6 +25,12 @@ module o-ran-smo-teiv-equipment { such as antennas associated with a cell/carrier and their relevant properties e.g. tilt, max power etc."; + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology objects."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -34,59 +40,60 @@ module o-ran-smo-teiv-equipment { list AntennaModule { description "An Antenna Module represents the physical aspect of an - antenna."; + antenna."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { leaf antennaModelNumber { description "Vendor-specific antenna model identifier. This - attribute is part of AISG v3 ADB Standard and has no - operational impact."; + attribute is part of AISG v3 ADB Standard and has no + operational impact."; type string; } leaf mechanicalAntennaBearing { description "Antenna bearing on antenna subunit where antenna - unit is installed."; + unit is installed."; type int32; } leaf mechanicalAntennaTilt { description "The fixed antenna tilt of the installation, defined - as the inclination of the antenna element respect to the - vertical plane. It is a signed value. Positive indicates - downtilt, and negative indicates uptilt."; + as the inclination of the antenna element respect to the + vertical plane. It is a signed value. Positive indicates + downtilt, and negative indicates uptilt."; type int32; } leaf positionWithinSector { description "Antenna unit position within sector. This attribute - is part of AISG v3 ADB Standard and has no operational - impact."; + is part of AISG v3 ADB Standard and has no operational + impact."; type string; } leaf totalTilt { description "Total antenna elevation including the installed - tilt and the tilt applied by the Remote Electrical - Tilt (RET)."; + tilt and the tilt applied by the Remote Electrical + Tilt (RET)."; type int32; } leaf electricalAntennaTilt { description "Electrically-controlled tilt of main beam maximum - with respect to direction orthogonal to antenna element - axis (see 3GPP TS 25.466). Value is signed; tilt down is - positive, tilt up is negative."; + with respect to direction orthogonal to antenna element + axis (see 3GPP TS 25.466). Value is signed; tilt down is + positive, tilt up is negative."; type int32; } leaf-list antennaBeamWidth { description "The angular span of the main lobe of the antenna - radiation pattern in the horizontal plane. Measured in - degrees."; + radiation pattern in the horizontal plane. Measured in + degrees."; type uint32; } diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang index 474b2af..fa3d2b2 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang @@ -26,6 +26,12 @@ module o-ran-smo-teiv-ran { which represents the functional capability of the deployed RAN that are relevant to rApps use cases."; + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -33,26 +39,26 @@ module o-ran-smo-teiv-ran { or-teiv-yext:domain RAN; - list GNBDUFunction { - description "gNodeB Distributed Unit (gNB-DU). + list ODUFunction { + description "O-RAN Distributed Unit (O-DU). - A gNB may consist of a gNB-Centralized Unit (gNB-CU) and a gNB-DU. - The CU processes non-real time protocols and services, and the DU - processes PHY level protocol and real time services. The gNB-CU and - the gNB-DU units are connected via F1 logical interface. + The O-DU is an O-RAN NF in the O-RAN Architecture. An O-DU, combined + with one or more O-RU(s) connected to it, supports and is fully + compatible with the functions of a gNB-DU as defined by 3GPP TS 38.401. - The following is true for a gNB-DU: - Is connected to the gNB-CU-CP through the F1-C interface. Is - connected to the gNB-CU-UP through the F1-U interface. One gNB-DU is - connected to only one gNB-CU-CP. One gNB-DU can be connected to - multiple gNB-CU-UPs under the control of the same gNB-CU-CP. + The following is true for a O-DU: + Is connected to the O-CU-CP through the F1-C interface. Is + connected to the O-CU-UP through the F1-U interface. One O-DU is + connected to only one O-CU-CP. One O-DU can be connected to + multiple O-CU-UPs under the control of the same O-CU-CP. - Note: A gNB may consist of a gNB-CU-CP, multiple gNB-CU-UPs and - multiple gNB-DUs. gNB-DU is a concrete class that extends the NG-RAN - node object. In Topology, you can create, read, update, and delete - the gNB-DU object."; + Note: A gNB may consist of a O-CU-CP, multiple O-CU-UPs and + multiple O-DUs. O-DU is a concrete class that extends the NG-RAN + node object. In Topology, you can create, read, update, and delete + the gNB-DU object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -80,52 +86,53 @@ module o-ran-smo-teiv-ran { list ENodeBFunction { description "An Evolved Node B (eNodeB) is the only mandatory node in - the radio access network (RAN) of Long-Term Evolution (LTE). The - eNodeB is a complex base station that handles radio communications - in the cell and carries out radio resource management and handover - decisions. Unlike 2/3G wireless RAN, there is no centralized radio - network controller in LTE. It is the hardware that is connected to - the mobile phone network that communicates directly with mobile - handsets (User Equipment), like a base transceiver station (BTS) in - GSM networks. This simplifies the architecture and allows lower - response times."; + the radio access network (RAN) of Long-Term Evolution (LTE). The + eNodeB is a complex base station that handles radio communications + in the cell and carries out radio resource management and handover + decisions. Unlike 2/3G wireless RAN, there is no centralized radio + network controller in LTE. It is the hardware that is connected to + the mobile phone network that communicates directly with mobile + handsets (User Equipment), like a base transceiver station (BTS) in + GSM networks. This simplifies the architecture and allows lower + response times."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { leaf eNBId { description "The ENodeB ID that forms part of the Cell Global - Identity, and is also used to identify the node over the S1 - interface"; + Identity, and is also used to identify the node over the S1 + interface"; type int32; default 11; } container eNodeBPlmnId { description "The ENodeB Public Land Mobile Network (PLMN) ID - that forms part of the ENodeB Global ID used to identify the - node over the S1 interface. Note: The value - (MCC=001, MNC=01) indicates that the PLMN is not initiated. - The value can not be used as a valid PLMN Identity."; + that forms part of the ENodeB Global ID used to identify the + node over the S1 interface. Note: The value + (MCC=001, MNC=01) indicates that the PLMN is not initiated. + The value can not be used as a valid PLMN Identity."; leaf mcc { description "The MCC part of a PLMN identity used in the - radio network."; + radio network."; type int32 { range 0..999; } } leaf mnc { description "The MNC part of a PLMN identity used in the - radio network."; + radio network."; type int32 { range 0..999; } } leaf mncLength { description "The length of the MNC part of a PLMN identity - used in the radio network."; + used in the radio network."; type int32 { range 2..3; } @@ -136,20 +143,21 @@ module o-ran-smo-teiv-ran { list LTESectorCarrier { description "The LTE Sector Carrier object provides the attributes for - defining the logical characteristics of a carrier (cell) in a - sector. A sector is a coverage area associated with a base station - having its own antennas, radio ports, and control channels. The - concept of sectors was developed to improve co-channel interference - in cellular systems, and most wireless systems use three sector - cells."; + defining the logical characteristics of a carrier (cell) in a + sector. A sector is a coverage area associated with a base station + having its own antennas, radio ports, and control channels. The + concept of sectors was developed to improve co-channel interference + in cellular systems, and most wireless systems use three sector + cells."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { leaf sectorCarrierType { description "Indicates whether or not the sector carrier - modelled by MO SectorCarrier is a digital sector."; + modelled by MO SectorCarrier is a digital sector."; type enumeration { enum normal_sector { value 0; @@ -182,28 +190,29 @@ module o-ran-smo-teiv-ran { list AntennaCapability { description "This MO serves as a mapping between the cell and the RBS - equipment used to provide coverage in a certain geographical area. - The MO also controls the maximum output power of the sector."; + equipment used to provide coverage in a certain geographical area. + The MO also controls the maximum output power of the sector."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { leaf-list eUtranFqBands { description "List of LTE frequency bands that associated - hardware supports"; + hardware supports"; type string; } leaf-list geranFqBands { description "List of GERAN frequency bands that associated - hardware supports"; + hardware supports"; type string; } leaf-list nRFqBands { description "List of NR frequency bands associated hardware - supports"; + supports"; type string; } } @@ -211,7 +220,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ENodeBFunction type. + The bSide of this relationship is an instance of the LteSector type. + The ENodeBFunction represents the base station that provides the EUtranCell. + An ENodeBFunction instance can provide many LTESectorCarriers. + An LTESectorCarrier instance must be provided by an ENodeBFunction. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list provided-lteSectorCarrier { @@ -230,7 +248,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1 + description + "The aSide of this relationship is an instance of the LTESectorCarrier type. + The bSide of this relationship is an instance of the AntennaCapability type. + The LTESectorCarrier represents the carrier that uses the AntennaCapability. + An LTESectorCarrier instance can use only one AntennaCapability. + An AntennaCapability instance can be used by many LTESectorCarriers. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf used-antennaCapability { diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang index a860ef1..f9900d9 100644 --- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang +++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang @@ -21,6 +21,11 @@ module o-ran-smo-teiv-rel-equipment-ran { This model contains the topology relations between Equipment and RAN."; + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -30,7 +35,16 @@ module o-ran-smo-teiv-rel-equipment-ran { or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_SERVES_ANTENNACAPABILITY { // 0..n to 0..m + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the AntennaCapability type. + The AntennaModule represents the physical antenna that serves the AntennaCapability. + An AntennaModule instance can serve many AntennaCapabilities. + An AntennaCapability instance can be served by many AntennaModules. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list serviced-antennaCapability { diff --git a/pom.xml b/pom.xml index 5c91fe8..0ad4c3e 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,8 @@ 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 diff --git a/teiv/exposure.Dockerfile b/teiv/exposure.Dockerfile index 3382c86..d1cdd73 100644 --- a/teiv/exposure.Dockerfile +++ b/teiv/exposure.Dockerfile @@ -35,6 +35,8 @@ RUN echo "$USER_ID:x:$USER_ID:0:An Identity for $USER_NAME:/nonexistent:/bin/fal ARG JAR WORKDIR /opt/app/teiv +ENV SPRING_PROFILES_ACTIVE=exposure,groups + ADD src/main/resources/application.yaml /opt/app/teiv/config/application.yaml ADD target/${JAR} /opt/app/teiv/topology-exposure-inventory-app.jar diff --git a/teiv/pom.xml b/teiv/pom.xml index ff95d84..e2fbbfd 100644 --- a/teiv/pom.xml +++ b/teiv/pom.xml @@ -336,9 +336,7 @@ ${project.groupId} ${project.artifactId} ${project.version} - - true - + true @@ -454,6 +452,16 @@ true org.oran.smo.teiv.exposure.api.contract.TopologyExposureApiBase + + + .*exposure.* + org.oran.smo.teiv.exposure.api.contract.TopologyExposureApiBase + + + .*groups.* + org.oran.smo.teiv.groups.TopologyGroupsApiBase + + @@ -658,9 +666,10 @@ -jar ${project.parent.basedir}/pgsql-schema-generator/target/pgsql-schema-generator-1.1.0.jar --yang-model.external.source=${project.basedir}/src/main/resources/models - --schema.data.output=src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql - --schema.model.output=src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql - --schema.consumer-data.output=src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data-v1.sql + --schema.data.output=src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data.sql + --schema.model.output=src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model.sql + --schema.consumer-data.output=src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql + --schema.groups.output=src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql diff --git a/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 b/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 index 456a1fa..83bb4de 100644 --- a/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 +++ b/teiv/src/main/antlr4/org/oran/smo/teiv/antlr4/tiesPath.g4 @@ -49,7 +49,7 @@ grammar tiesPath ; -tiesPath : ( prefix | incorrectPrefix ) multipleLeafConditions? containsTextFunctionCondition? textFunctionCondition? containsFunctionCondition? ancestorAxis? invalidPostFix? containerName? fieldLeaf?; +tiesPath : ( prefix | incorrectPrefix ) multipleLeafConditions? containsTextFunctionCondition? textFunctionCondition? containsFunctionCondition? withinMetersFunctionCondition? coveredByFunctionCondition? ancestorAxis? invalidPostFix? containerName? fieldLeaf?; ancestorAxis : SLASH KW_ANCESTOR COLONCOLON ancestorPath ; @@ -81,6 +81,10 @@ leafName : QName ; booleanOperators : ( KW_AND | KW_OR ) ; +withinMetersFunctionCondition : OB KW_WITHIN_METERS OP AT leafName COMMA StringLiteral COMMA ( IntegerLiteral | DoubleLiteral | DecimalLiteral) CP CB ; + +coveredByFunctionCondition : OB KW_COVERED_BY OP AT leafName COMMA StringLiteral CP CB ; + // Onnly EQ supported for now comparativeOperators : ( EQ /*| GT | LT | GE | LE */ ) ; @@ -115,6 +119,8 @@ KW_AND : 'and' ; KW_TEXT_FUNCTION: 'text()' ; KW_OR : 'or' ; KW_CONTAINS_FUNCTION: 'contains' ; +KW_WITHIN_METERS: 'withinMeters' ; +KW_COVERED_BY: 'coveredBy' ; IntegerLiteral : FragDigits ; // Add below type definitions for leafvalue comparision in https://jira.onap.org/browse/CPS-440 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 ff91345..12b64b9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java +++ b/teiv/src/main/java/org/oran/smo/teiv/CoreApplication.java @@ -26,7 +26,6 @@ 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.context.properties.ConfigurationPropertiesScan; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.EnableAspectJAutoProxy; @@ -48,7 +47,6 @@ import org.springframework.cache.annotation.EnableCaching; @EnableCaching @EnableScheduling @EnableAspectJAutoProxy -@ConfigurationPropertiesScan public class CoreApplication { /** diff --git a/teiv/src/main/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafka.java b/teiv/src/main/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafka.java index 0e0748e..ac292a4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafka.java +++ b/teiv/src/main/java/org/oran/smo/teiv/availability/DependentServiceAvailabilityKafka.java @@ -21,10 +21,11 @@ package org.oran.smo.teiv.availability; import lombok.RequiredArgsConstructor; -import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.ListTopicsOptions; import org.apache.kafka.clients.admin.ListTopicsResult; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.kafka.core.KafkaAdmin; import org.springframework.stereotype.Component; @@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; @Component @Slf4j @RequiredArgsConstructor +@Profile({ "exposure", "ingestion" }) public class DependentServiceAvailabilityKafka extends DependentServiceAvailability { @Getter @@ -68,7 +70,7 @@ public class DependentServiceAvailabilityKafka extends DependentServiceAvailabil boolean isServiceAvailable() throws UnsatisfiedExternalDependencyException { log.debug("Checking if Kafka is reachable, bootstrap server: '{}'", kafkaAdminConfig.getBootstrapServer()); - try (AdminClient client = AdminClient.create(kafkaAdmin.getConfigurationProperties())) { + try (Admin client = Admin.create(kafkaAdmin.getConfigurationProperties())) { ListTopicsResult topics = client.listTopics(new ListTopicsOptions().timeoutMs(listTopicTimeout)); topics.names().get(); return true; diff --git a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaAdminConfig.java b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaAdminConfig.java index 747c52e..0111c4b 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaAdminConfig.java +++ b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaAdminConfig.java @@ -27,10 +27,12 @@ import org.springframework.context.annotation.Configuration; import lombok.Data; import org.oran.smo.teiv.service.kafka.KafkaAddressSupplier; +import org.springframework.context.annotation.Profile; @Configuration @Data @Slf4j +@Profile({ "exposure", "ingestion" }) public class KafkaAdminConfig { private String bootstrapServer; diff --git a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaConfig.java b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaConfig.java index a263de6..d681099 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaConfig.java +++ b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaConfig.java @@ -23,9 +23,11 @@ package org.oran.smo.teiv.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; @Configuration @Data +@Profile({ "exposure", "ingestion" }) public class KafkaConfig { private final TopologyIngestion topologyIngestion; diff --git a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaSecurityConfig.java b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaSecurityConfig.java index 286378f..8e3703a 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/config/KafkaSecurityConfig.java +++ b/teiv/src/main/java/org/oran/smo/teiv/config/KafkaSecurityConfig.java @@ -24,7 +24,9 @@ import java.util.Map; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +@Configuration @Data @Slf4j @ConfigurationProperties("kafka.security") 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/TiesExposureHealthIndicator.java index cdcf000..70e6c4b 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/TiesExposureHealthIndicator.java @@ -30,8 +30,8 @@ import org.springframework.stereotype.Component; */ @Component -@Profile("!ingestion") -public class TiesExposureHealthIndicator extends TiesHealthIndicator { +@Profile("exposure") +public class TiesExposureHealthIndicator extends TiesKafkaHealthIndicator { public TiesExposureHealthIndicator(HealthStatus healthStatus, DependentServiceAvailabilityKafka 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/TiesGroupsHealthIndicator.java new file mode 100644 index 0000000..6091f5b --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicator.java @@ -0,0 +1,51 @@ +/* + * ============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.controller.health; + +import org.springframework.boot.actuate.health.Health; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +/** + * Health Check component for TIES exposure. + */ + +@Component +@Profile("groups") +public class TiesGroupsHealthIndicator extends TiesHealthIndicator { + + public TiesGroupsHealthIndicator(HealthStatus healthStatus) { + super(healthStatus); + } + + @Override + protected String getServiceName() { + return "top-exp-inv-groups"; + } + + @Override + public Health health() { + if (!healthStatus.isSchemaInitialized()) { + return healthDown("Schema is yet to be initialized."); + } + return healthUp(); + } +} 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/TiesHealthIndicator.java index 0beb247..8c86879 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/TiesHealthIndicator.java @@ -20,8 +20,6 @@ */ package org.oran.smo.teiv.controller.health; -import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; - import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; @@ -31,14 +29,11 @@ import lombok.extern.slf4j.Slf4j; public abstract class TiesHealthIndicator implements HealthIndicator { protected final HealthStatus healthStatus; - protected final DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka; protected abstract String getServiceName(); - protected TiesHealthIndicator(HealthStatus healthStatus, - DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka) { + protected TiesHealthIndicator(HealthStatus healthStatus) { this.healthStatus = healthStatus; - this.dependentServiceAvailabilityKafka = dependentServiceAvailabilityKafka; } protected Health healthUp() { @@ -52,8 +47,4 @@ public abstract class TiesHealthIndicator implements HealthIndicator { log.error(errorMessage); return Health.down().withDetail("Error", errorMessage).build(); } - - protected boolean isKafkaReachable() { - return dependentServiceAvailabilityKafka.checkService(); - } } 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/TiesIngestionHealthIndicator.java index 4b891d2..054a74b 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/TiesIngestionHealthIndicator.java @@ -32,7 +32,7 @@ import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; @Component @Profile("ingestion") -public class TiesIngestionHealthIndicator extends TiesHealthIndicator { +public class TiesIngestionHealthIndicator extends TiesKafkaHealthIndicator { @Override protected String getServiceName() { 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/TiesKafkaHealthIndicator.java new file mode 100644 index 0000000..27ef1b5 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/controller/health/TiesKafkaHealthIndicator.java @@ -0,0 +1,43 @@ +/* + * ============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.controller.health; + +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; + +@Slf4j +public abstract class TiesKafkaHealthIndicator extends TiesHealthIndicator { + + protected final DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka; + + protected abstract String getServiceName(); + + protected TiesKafkaHealthIndicator(HealthStatus healthStatus, + DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka) { + super(healthStatus); + this.dependentServiceAvailabilityKafka = dependentServiceAvailabilityKafka; + } + + protected boolean isKafkaReachable() { + return dependentServiceAvailabilityKafka.checkService(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/AdapterIdNotFoundException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/AdapterIdNotFoundException.java new file mode 100644 index 0000000..d567ba5 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/AdapterIdNotFoundException.java @@ -0,0 +1,30 @@ +/* + * ============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.exception; + +/** + * This exception is thrown when a adapter id does not exist in the responsible adapter table + */ +public class AdapterIdNotFoundException extends Exception { + public AdapterIdNotFoundException(final String msg) { + super(msg); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/AuditException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/AuditException.java new file mode 100644 index 0000000..add4c1b --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/AuditException.java @@ -0,0 +1,43 @@ +/* + * ============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.exception; + +import org.springframework.http.HttpStatus; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class AuditException extends RuntimeException { + private final HttpStatus status; + private final String message; + private final String details; + private final Exception exception; + + public static AuditException resourceNotFoundException() { + return AuditException.builder().status(HttpStatus.NOT_FOUND).message("Resource Not Found").details( + "The requested adapter id is not found").build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/CloudEventParserException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/CloudEventParserException.java new file mode 100644 index 0000000..0d6008d --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/CloudEventParserException.java @@ -0,0 +1,60 @@ +/* + * ============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.exception; + +public class CloudEventParserException extends Exception { + protected CloudEventParserException(final String message) { + super(message); + } + + private CloudEventParserException(final String issue, final String type, final String node, final String cause) { + super(String.format("Error %s %s: %s Cause: %s", issue, type, node, cause)); + } + + public static CloudEventParserException noEventData() { + return new CloudEventParserException("CloudEvent doesn't contain data."); + } + + public static CloudEventParserException invalidStructure(final String node) { + return new CloudEventParserException(String.format( + "Invalid structure. Event elements must be an array of JSON objects. Node: %s", node)); + } + + public static CloudEventParserException eventDataReading(final String node, final Exception e) { + return new CloudEventParserException("reading", "cloudevent", node, e.getMessage()); + } + + public static CloudEventParserException entityParsing(final String node, final Exception e) { + return new CloudEventParserException("parsing", "entity", node, e.getMessage()); + } + + public static CloudEventParserException entityValidating(final String node, final Exception e) { + return new CloudEventParserException("validating", "entity", node, e.getMessage()); + } + + public static CloudEventParserException relationshipParsing(final String node, final Exception e) { + return new CloudEventParserException("parsing", "relationship", node, e.getMessage()); + } + + public static CloudEventParserException relationshipValidating(final String node, final Exception e) { + return new CloudEventParserException("validating", "relationship", node, e.getMessage()); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/IllegalCharacterException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/IllegalCharacterException.java new file mode 100644 index 0000000..a22fa2f --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/IllegalCharacterException.java @@ -0,0 +1,35 @@ +/* + * ============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.exception; + +public class IllegalCharacterException extends CloudEventParserException { + private IllegalCharacterException(final String type, final String location, final String value) { + super(String.format("Illegal character found in %s %s: %s", type, location, value)); + } + + public static IllegalCharacterException inEntity(final String location, final String value) { + return new IllegalCharacterException("entity", location, value); + } + + public static IllegalCharacterException inRelationship(final String location, final String value) { + return new IllegalCharacterException("relationship", location, value); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/InvalidRelationshipException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/InvalidRelationshipException.java index 2943f44..443f59f 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exception/InvalidRelationshipException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/InvalidRelationshipException.java @@ -20,8 +20,40 @@ */ package org.oran.smo.teiv.exception; -public class InvalidRelationshipException extends Exception { - public InvalidRelationshipException(final String message) { +import org.oran.smo.teiv.service.cloudevent.data.Relationship; + +public class InvalidRelationshipException extends CloudEventParserException { + private InvalidRelationshipException(final String message) { super(message); } + + public static InvalidRelationshipException missingId(final Relationship relationship) { + return new InvalidRelationshipException(String.format("Missing id in relationship! ASide: %s, BSide: %s", + relationship.getASide(), relationship.getBSide())); + } + + public static InvalidRelationshipException missingSide(final Relationship relationship) { + return new InvalidRelationshipException(String.format("Missing a side in relationship! Relationship id: %s", + relationship.getId())); + } + + public static InvalidRelationshipException invalidType(final Relationship relationship) { + return new InvalidRelationshipException(String.format("Invalid relationship type! Relationship id: %s", relationship + .getId())); + } + + public static InvalidRelationshipException missingSourceIds(final String relationshipId) { + return new InvalidRelationshipException(String.format("Relationship is missing sourceIds! Relationship id: %s", + relationshipId)); + } + + public static InvalidRelationshipException invalidModule(final Relationship relationship) { + return new InvalidRelationshipException(String.format("Invalid module in relationship! Relationship id: %s", + relationship.getId())); + } + + public static InvalidRelationshipException invalidModuleTypePair(final Relationship relationship) { + return new InvalidRelationshipException(String.format("Invalid relationship module-type pair! Relationship id: %s", + relationship.getId())); + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java index 36d4bdb..d8daf99 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/TiesException.java @@ -86,6 +86,16 @@ public class TiesException extends RuntimeException { return clientException("Invalid file input", String.format("Invalid file input: %s", error)); } + public static TiesException 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) { + 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, null); @@ -144,14 +154,16 @@ public class TiesException extends RuntimeException { return new TiesException(message, details, HttpStatus.INTERNAL_SERVER_ERROR, exception); } - public static TiesException notImplementedException(String details, Exception exception) { - return new TiesException("Not Implemented", details, HttpStatus.NOT_IMPLEMENTED, exception); - } - public static TiesException clientException(String message, String details) { return new TiesException(message, details, HttpStatus.BAD_REQUEST, null); } + public static TiesException schemaInDeletingState(String moduleName) { + return new TiesException("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) { this.status = status; this.message = message; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangException.java new file mode 100644 index 0000000..bb337f2 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangException.java @@ -0,0 +1,32 @@ +/* + * ============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.exception; + +public class YangException extends Exception { + + public YangException(final String message) { + super(message); + } + + public YangException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangModelException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangModelException.java index 9f7d321..47ff57a 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exception/YangModelException.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangModelException.java @@ -20,22 +20,9 @@ */ package org.oran.smo.teiv.exception; -import lombok.extern.slf4j.Slf4j; - -import org.oran.smo.yangtools.parser.findings.Finding; -import org.oran.smo.yangtools.parser.findings.FindingsManager; - -@Slf4j public class YangModelException extends Exception { public YangModelException(final String message) { super(message); } - - public YangModelException(final String message, FindingsManager findingsManager) { - super(message); - for (Finding f : findingsManager.getAllFindings()) { - log.error("Finding: {}", f); - } - } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java new file mode 100644 index 0000000..9ea5529 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java @@ -0,0 +1,32 @@ +/* + * ============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.exception; + +public class YangParsingException extends YangException { + + public YangParsingException(final String message, final Throwable cause) { + super(message, cause); + } + + public static YangParsingException failedIOExecution(Exception e) { + return new YangParsingException("Failed to execute IO operation", e); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangSchemaException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangSchemaException.java new file mode 100644 index 0000000..da655b6 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangSchemaException.java @@ -0,0 +1,36 @@ +/* + * ============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.exception; + +public class YangSchemaException extends YangException { + + public YangSchemaException(final String message) { + super(message); + } + + public static YangSchemaException failedToLoadSchema() { + return new YangSchemaException("Module registry is not initialized"); + } + + public static YangSchemaException failedToLoadModels() { + return new YangSchemaException("Failed to load models, no input files provided"); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exception/YangValidationException.java b/teiv/src/main/java/org/oran/smo/teiv/exception/YangValidationException.java new file mode 100644 index 0000000..76f0f72 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/exception/YangValidationException.java @@ -0,0 +1,54 @@ +/* + * ============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.exception; + +import java.util.Set; +import java.util.stream.Collectors; + +import org.oran.smo.yangtools.parser.findings.Finding; + +public class YangValidationException extends YangException { + public final transient Set errorMessages; + + public YangValidationException(final String message) { + super(message); + errorMessages = null; + } + + public YangValidationException(final String message, final Throwable cause) { + super(message, cause); + errorMessages = null; + } + + public YangValidationException(final Set errorMessages, final String message) { + super(message); + this.errorMessages = errorMessages; + } + + public static YangValidationException validationFailed(final Set errorMessages) { + String message = errorMessages.stream().map(Finding::getMessage).collect(Collectors.joining("\n")); + return new YangValidationException(errorMessages, message); + } + + public static YangValidationException invalidSourceId(final Object sourceId) { + return new YangValidationException("Invalid sourceId found: " + sourceId.getClass().getSimpleName()); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/audit/LoggerHandler.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/audit/LoggerHandler.java index 9ba5716..9a7d2ec 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/audit/LoggerHandler.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/audit/LoggerHandler.java @@ -32,6 +32,10 @@ public class LoggerHandler { log.info("Audit Log: {} - Request Info: {}", message, requestInfo); } + public void logAuditBase(Logger log, String auditInfo, String cloudEventSource) { + log.info("Audit Base Log: Audit Info: {}, Cloud Event Source: {}", auditInfo, cloudEventSource); + } + private String getRequestInfo(HttpServletRequest context) { String method = context.getMethod(); String requestURI = context.getRequestURI(); 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 a346280..40ee832 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 @@ -30,6 +30,7 @@ import org.oran.smo.teiv.exposure.consumerdata.operation.ClassifiersOperation; import org.oran.smo.teiv.exposure.spi.ModelRepository; import org.oran.smo.teiv.schema.ConsumerDataCache; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -45,6 +46,7 @@ import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; @Slf4j @Service @RequiredArgsConstructor +@Profile("exposure") public class ClassifiersServiceImpl implements ClassifiersService { private final ModelRepository modelRepository; 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 22e6acf..01c2108 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 @@ -39,6 +39,7 @@ 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.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -48,6 +49,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(TiesConstants.REQUEST_MAPPING) @RequiredArgsConstructor +@Profile("exposure") public class ClassifiersRestController implements ClassifiersApi { private final ClassifiersService classifiersService; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataOperationRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataOperationRegistry.java index 27877db..85c9ae9 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataOperationRegistry.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataOperationRegistry.java @@ -29,10 +29,12 @@ import org.oran.smo.teiv.exposure.consumerdata.operation.DeleteClassifiersOperat import org.oran.smo.teiv.exposure.consumerdata.operation.DeleteDecoratorsOperation; import org.oran.smo.teiv.exposure.consumerdata.operation.MergeClassifiersOperation; import org.oran.smo.teiv.exposure.consumerdata.operation.MergeDecoratorsOperation; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor +@Profile("exposure") public class ConsumerDataOperationRegistry { private final MergeClassifiersOperation mergeClassifiersOperation; private final DeleteClassifiersOperation deleteClassifiersOperation; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepository.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepository.java index 0c782c7..ce34d61 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepository.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/consumerdata/ConsumerDataRepository.java @@ -22,7 +22,6 @@ package org.oran.smo.teiv.exposure.consumerdata; import org.oran.smo.teiv.schema.YangDataTypes; -import java.util.List; import java.util.Map; import java.util.Set; @@ -42,13 +41,4 @@ public interface ConsumerDataRepository { */ Map loadDecorators(); - /** - * Store classifier in the ties_model.classifiers - */ - void storeClassifiers(final List elements, final String moduleName); - - /** - * Store decorators in the ties_model.decorators - */ - void storeDecorators(final Map elements, final String moduleName); } 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 b6ebafb..44d8a63 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 @@ -21,29 +21,21 @@ package org.oran.smo.teiv.exposure.consumerdata; import static org.jooq.impl.DSL.field; -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.MODULE_REFERENCE; -import static org.oran.smo.teiv.utils.TiesConstants.MODULE_REFERENCE_NAME; -import static org.oran.smo.teiv.utils.TiesConstants.NAME; -import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -import static org.oran.smo.teiv.utils.TiesConstants.SEMICOLON_SEPARATION; import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Supplier; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jooq.DSLContext; import org.jooq.Field; -import org.jooq.InsertValuesStepN; import org.jooq.Record; import org.jooq.Record1; import org.jooq.Record2; @@ -90,36 +82,6 @@ public class ConsumerDataRepositoryImpl implements ConsumerDataRepository { return result; } - @Override - public void storeClassifiers(final List elements, final String moduleName) { - insertValues(CLASSIFIERS, List.of(NAME, String.format(QUOTED_STRING, MODULE_REFERENCE_NAME)), executable -> { - for (String element : elements) { - executable = executable.values(String.format(SEMICOLON_SEPARATION, moduleName, element), moduleName); - } - }); - } - - @Override - public void storeDecorators(final Map elements, final String moduleName) { - insertValues(DECORATORS, List.of(NAME, String.format(QUOTED_STRING, "dataType"), String.format(QUOTED_STRING, - MODULE_REFERENCE_NAME)), executable -> { - for (Map.Entry element : elements.entrySet()) { - executable = executable.values(String.format(SEMICOLON_SEPARATION, moduleName, element.getKey()), - element.getValue(), moduleName); - } - }); - } - - private void insertValues(final String tableName, final List columns, - final Consumer> consumer) { - InsertValuesStepN executable = writeDataDslContext.insertInto(table(String.format(TIES_CONSUMER_DATA, - tableName))).columns(columns.stream().map(column -> field(column, String.class)).toList()); - - consumer.accept(executable); - - runMethodSafe(executable::execute); - } - protected T runMethodSafe(Supplier supp) { try { return supp.get(); 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 f031072..eb66562 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 @@ -38,15 +38,18 @@ import org.oran.smo.teiv.exposure.consumerdata.model.PersistableIdMap; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import static org.jooq.impl.DSL.exists; 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; @Component +@Profile("exposure") public class DeleteClassifiersOperation extends ClassifiersOperation { public DeleteClassifiersOperation(DSLContext readDataDslContext, DSLContext writeDataDslContext) { @@ -83,8 +86,8 @@ public class DeleteClassifiersOperation extends ClassifiersOperation { } private Condition existsCondition(final String classifiersColumnName, final String data) { - return exists(select(field("1")).from(table("jsonb_array_elements_text(" + classifiersColumnName + ")").as( - "element")).where(field("element").eq(data))); + return exists(select(field("1")).from(table("jsonb_array_elements_text(" + field(classifiersColumnName) + ")").as( + "element")).where(field("element").eq(val(data)))); } /** 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 68e4cf8..04f6e7e 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 @@ -36,6 +36,7 @@ import org.oran.smo.teiv.exposure.consumerdata.model.PersistableIdMap; import org.oran.smo.teiv.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.jooq.Result; @@ -44,9 +45,11 @@ import org.jooq.UpdateResultStep; 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; @Component +@Profile("exposure") public class DeleteDecoratorsOperation extends DecoratorsOperation { public DeleteDecoratorsOperation(DSLContext readDataDslContext, DSLContext writeDataDslContext) { @@ -79,7 +82,7 @@ public class DeleteDecoratorsOperation extends DecoratorsOperation { } private Condition keyExistsCondition(final String decoratorsColumnName, final String key) { - return condition(String.format("jsonb_exists(%s, '%s')", decoratorsColumnName, key)); + return condition("jsonb_exists(?, ?)", field(decoratorsColumnName), val(key)); } /** 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 e251eb7..d55316b 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 @@ -25,7 +25,6 @@ import java.util.List; import java.util.ArrayList; import java.util.Map; -import lombok.extern.slf4j.Slf4j; import org.jooq.DSLContext; import org.jooq.Condition; import org.jooq.Field; @@ -35,16 +34,18 @@ import org.jooq.Result; import org.jooq.UpdateResultStep; import org.oran.smo.teiv.exposure.consumerdata.model.PersistableIdMap; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import static org.jooq.impl.DSL.field; 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; @Component -@Slf4j +@Profile("exposure") public class MergeClassifiersOperation extends ClassifiersOperation { public MergeClassifiersOperation(DSLContext readDataDslContext, DSLContext writeDataDslContext) { @@ -87,7 +88,7 @@ public class MergeClassifiersOperation extends ClassifiersOperation { } private Condition notExistsCondition(final String classifiersColumnName, final String data) { - return notExists(select(field("1")).from(table("jsonb_array_elements_text(" + classifiersColumnName + ")").as( - "element")).where(field("element").eq(data))); + return notExists(select(field("1")).from(table("jsonb_array_elements_text(" + field(classifiersColumnName) + ")") + .as("element")).where(field("element").eq(val(data)))); } } 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 3493bb9..1967b52 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 @@ -20,7 +20,6 @@ */ package org.oran.smo.teiv.exposure.consumerdata.operation; -import lombok.extern.slf4j.Slf4j; import org.jooq.Condition; import org.jooq.DSLContext; import org.jooq.Field; @@ -30,6 +29,7 @@ import org.jooq.Result; import org.jooq.UpdateResultStep; import org.oran.smo.teiv.exposure.consumerdata.model.PersistableIdMap; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.util.Map; @@ -39,12 +39,13 @@ import java.util.ArrayList; 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.not; import static org.jooq.impl.DSL.table; import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -@Slf4j @Component +@Profile("exposure") public class MergeDecoratorsOperation extends DecoratorsOperation { public MergeDecoratorsOperation(DSLContext readDataDslContext, DSLContext writeDataDslContext) { @@ -88,10 +89,10 @@ public class MergeDecoratorsOperation extends DecoratorsOperation { } private Condition keyValuePairExistsCondition(final String decoratorsColumnName, final String key, final Object value) { - return condition(String.format("%s -> '%s' = '%s'", decoratorsColumnName, key, transformValue(value))); + return condition("? -> ? = ?", field(decoratorsColumnName), inline(key), inline(transformValue(value))); } private Condition keyExistsCondition(final String decoratorsColumnName, final String key) { - return condition(String.format("jsonb_exists(%s, '%s')", decoratorsColumnName, key)); + return condition("jsonb_exists(?, ?)", field(decoratorsColumnName), inline(key)); } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/DataService.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/DataService.java index 99e10be..4f59d2c 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/DataService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/data/api/DataService.java @@ -127,7 +127,7 @@ public interface DataService { * @return a collection of relationships for entity type */ OranTeivRelationshipsResponseMessage getAllRelationshipsForObjectId(final String domain, final String entityType, - final String targetFilter, final String scopeFilter, final String id, final RequestDetails requestDetails); + final String id, final String targetFilter, final String scopeFilter, final RequestDetails requestDetails); /** * Get relationship with specified id 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 323586a..a72a403 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 @@ -38,6 +38,7 @@ 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.utils.RequestDetails; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import org.oran.smo.teiv.api.model.OranTeivDomains; @@ -64,6 +65,7 @@ import static org.oran.smo.teiv.exposure.utils.PaginationUtil.selfHref; @Service @RequiredArgsConstructor +@Profile({ "exposure", "groups" }) public class DataServiceImpl implements DataService { private final DataRepository dataRepository; private final ScopeResolver scopeResolver; 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 bd151cc..7a94aa5 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 @@ -33,6 +33,7 @@ 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.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -50,6 +51,7 @@ import jakarta.validation.constraints.NotNull; @RestController @RequestMapping(TiesConstants.REQUEST_MAPPING) @RequiredArgsConstructor +@Profile("exposure") public class DataController implements EntitiesAndRelationshipsApi { public static final String SCOPE_FILTER = "scopeFilter"; public static final String TARGET_FILTER = "targetFilter"; 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 7f166c5..29353cd 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 @@ -32,6 +32,7 @@ import org.oran.smo.teiv.exposure.spi.ModelRepository; import org.oran.smo.teiv.schema.ConsumerDataCache; import org.oran.smo.teiv.schema.YangDataTypes; import org.oran.smo.teiv.service.models.OperationResult; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import java.util.Collections; @@ -45,6 +46,7 @@ import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; @Slf4j @Service @RequiredArgsConstructor +@Profile("exposure") public class DecoratorsServiceImpl implements DecoratorsService { private final ModelRepository modelRepository; 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 3f49902..2b14804 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 @@ -39,6 +39,7 @@ 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.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -48,6 +49,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(TiesConstants.REQUEST_MAPPING) @RequiredArgsConstructor +@Profile("exposure") public class DecoratorsRestController implements DecoratorsApi { private final DecoratorsService decoratorsService; diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/ModelService.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/ModelService.java index c46b488..0553e90 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/ModelService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/model/api/ModelService.java @@ -32,7 +32,7 @@ public interface ModelService { * @param yangFile * the yang content */ - void createModule(final MultipartFile yangFile); + String createModule(final MultipartFile yangFile); /** * Gets all modules in a domain @@ -49,7 +49,7 @@ public interface ModelService { * Gets module content * * @param name - * name name + * name * @return the content */ String getModuleContentByName(final String name); 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 2deee52..252eb62 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 @@ -27,7 +27,6 @@ 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.YangModelException; -import org.oran.smo.teiv.exposure.consumerdata.ConsumerDataRepository; import org.oran.smo.teiv.exposure.model.api.ModelService; import org.oran.smo.teiv.exposure.spi.ModelRepository; import org.oran.smo.teiv.exposure.spi.Module; @@ -36,6 +35,7 @@ import org.oran.smo.teiv.exposure.utils.RequestDetails; import org.oran.smo.teiv.schema.ConsumerDataCache; import org.oran.smo.teiv.service.SchemaCleanUpService; import org.oran.smo.teiv.utils.YangParser; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -55,24 +55,21 @@ 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.TiesConstants.SCHEMA_ALREADY_EXISTS; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_CONSUMER_DATA; -import static org.oran.smo.teiv.utils.TiesConstants.TIES_MODEL; @Slf4j @Service @RequiredArgsConstructor +@Profile("exposure") public class ModelServiceImpl implements ModelService { private static final String CONTENT_HREF = "%s/%s/content"; private final ModelRepository modelRepository; private final YangParser yangParser; - private final ConsumerDataRepository consumerDataRepository; private final ConsumerDataCache consumerDataCaches; private final SchemaCleanUpService schemaCleanUpService; @Override - public void createModule(final MultipartFile yangFile) { + public String createModule(final MultipartFile yangFile) { log.debug("Create module with file: {}", yangFile); final Map result; final String content; @@ -80,37 +77,24 @@ public class ModelServiceImpl implements ModelService { try { result = yangParser.validateSchemasYang(yangFile); content = Base64.getEncoder().encodeToString(yangFile.getBytes()); - } catch (IOException | YangModelException e) { - log.warn(INVALID_SCHEMA, e); - throw TiesException.invalidFileInput(INVALID_SCHEMA); + } catch (YangModelException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); } String moduleName = (String) result.get("moduleName"); String revision = (String) result.get("revision"); List classifiers = (List) result.get(CLASSIFIERS); Map decorators = (Map) result.get(DECORATORS); - - if (modelRepository.doesModuleExists(TIES_MODEL, moduleName) || modelRepository.doesModuleExists(TIES_CONSUMER_DATA, - moduleName)) { - throw TiesException.invalidFileInput(SCHEMA_ALREADY_EXISTS); - } - if (classifiers.isEmpty() && decorators.isEmpty()) { + log.warn("No classifiers and decorators found in module {} ", moduleName); throw TiesException.invalidFileInput(INVALID_SCHEMA); } - - modelRepository.createModule(Module.builder().name(moduleName).content(content).revision(revision).ownerAppId("APP") - .status(ModuleStatus.IN_USAGE).build()); - - if (!classifiers.isEmpty()) { - consumerDataRepository.storeClassifiers(classifiers, moduleName); - } - - if (!decorators.isEmpty()) { - consumerDataRepository.storeDecorators(decorators, moduleName); - } - + modelRepository.createConsumerDataModule(Module.builder().name(moduleName).content(content).revision(revision) + .ownerAppId("APP").status(ModuleStatus.IN_USAGE).build(), classifiers, decorators); consumerDataCaches.emptyConsumerDataCaches(); + return moduleName; } 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 e3422fe..bfdf412 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 @@ -22,7 +22,6 @@ package org.oran.smo.teiv.exposure.model.rest.controller; import java.util.Objects; -import org.apache.commons.lang3.StringUtils; import org.oran.smo.teiv.api.SchemasApi; import org.oran.smo.teiv.api.model.OranTeivSchemaList; import org.oran.smo.teiv.exception.TiesException; @@ -33,6 +32,7 @@ import org.oran.smo.teiv.exposure.utils.RequestValidator; import org.oran.smo.teiv.utils.TiesConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -53,6 +53,7 @@ import lombok.extern.slf4j.Slf4j; @RestController @RequestMapping(TiesConstants.REQUEST_MAPPING) @RequiredArgsConstructor +@Profile("exposure") public class ModelController implements SchemasApi { private final ModelService modelService; @@ -63,9 +64,17 @@ public class ModelController implements SchemasApi { @Override public ResponseEntity createSchema(String accept, String contentType, MultipartFile file) { - requestValidator.validateYangFile(file); - runSafeMethod(() -> modelService.createModule(file), "create"); - return new ResponseEntity<>(HttpStatus.CREATED); + try { + requestValidator.validateYangFile(file); + 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) { + loggerHandler.logAudit(logger, String.format("Failed - Create schema using provided file, %s", ex.getDetails()), + context); + log.error("Exception during service call", ex); + throw ex; + } } @Override @@ -89,17 +98,13 @@ public class ModelController implements SchemasApi { @Override public ResponseEntity deleteSchema(String accept, String schemaName) { - runSafeMethod(() -> modelService.deleteConsumerModule(schemaName), "delete"); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - protected void runSafeMethod(final Runnable runnable, String operation) { try { - runnable.run(); - loggerHandler.logAudit(logger, String.format("%s schema (successful)", StringUtils.capitalize(operation)), - context); + modelService.deleteConsumerModule(schemaName); + loggerHandler.logAudit(logger, String.format("Successful - Delete schema %s", schemaName), context); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } catch (TiesException ex) { - loggerHandler.logAudit(logger, String.format("%s schema (failed)", StringUtils.capitalize(operation)), context); + loggerHandler.logAudit(logger, String.format("Failed - Delete schema %s, %s", schemaName, ex.getDetails()), + context); log.error("Exception during service call", ex); throw ex; } diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/ModelRepository.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/ModelRepository.java index 320f29e..31af778 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/ModelRepository.java +++ b/teiv/src/main/java/org/oran/smo/teiv/exposure/spi/ModelRepository.java @@ -21,6 +21,7 @@ package org.oran.smo.teiv.exposure.spi; import java.util.List; +import java.util.Map; import java.util.Optional; /** @@ -72,14 +73,6 @@ public interface ModelRepository { */ String getModuleContentByName(final String name); - /** - * Creates module. - * - * @param module - * - module to create - */ - void createModule(Module module); - /** * Updates module status. * @@ -98,4 +91,16 @@ public interface ModelRepository { */ void deleteModuleByName(final String name); + /** + * Creates module and store classifiers and decorators. + * + * @param module + * - module to create + * @param classifiers + * - list of classifiers + * @param decorators + * - Map of decorators + */ + void createConsumerDataModule(Module module, final List classifiers, final Map decorators); + } 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 1e40eea..4cdcf05 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 @@ -24,22 +24,34 @@ 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 java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import org.jooq.DSLContext; +import org.jooq.InsertValuesStepN; import org.jooq.Record; import org.jooq.Record1; import org.jooq.Select; import org.jooq.SelectConditionStep; +import org.jooq.exception.IntegrityConstraintViolationException; +import org.jooq.impl.DSL; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,6 +64,7 @@ import org.oran.smo.teiv.exposure.spi.ModuleStatus; @Slf4j @Component @RequiredArgsConstructor +@Profile("exposure") public class ModelRepositoryImpl implements ModelRepository { public static final String STATUS = "status"; public static final String REVISION = "revision"; @@ -92,8 +105,13 @@ public class ModelRepositoryImpl implements ModelRepository { @Override public List getDeletingModulesOnStartup() { - return runMethodSafe(() -> readWriteDataDslContext.select().from(table(String.format(TIES_CONSUMER_DATA, - MODULE_REFERENCE))).where(field(STATUS).eq(ModuleStatus.DELETING.name())).fetchInto(Module.class)); + return runMethodSafe(() -> { + Select moduleRecords = readDataDslContext.select().from(table(String.format(TIES_CONSUMER_DATA, + MODULE_REFERENCE))).where(field(STATUS).eq(ModuleStatus.DELETING.name())); + Function buildModuleFunction; + buildModuleFunction = buildConsumerModules(); + return moduleRecords.stream().map(buildModuleFunction).toList(); + }); } @Override @@ -107,12 +125,11 @@ public class ModelRepositoryImpl implements ModelRepository { }); } - @Override - public void createModule(Module module) { - runMethodSafe(() -> writeDataDslContext.insertInto(table(String.format(TIES_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()); + private void createModule(DSLContext transactionalDSL, Module module) { + createModuleWithDuplicateCheck(() -> transactionalDSL.insertInto(table(String.format(TIES_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()); } @Override @@ -159,6 +176,54 @@ public class ModelRepositoryImpl implements ModelRepository { field("name").eq(name)).limit(1).fetchAnyInto(String.class); } + @Override + public void createConsumerDataModule(Module module, List classifiers, Map decorators) { + writeDataDslContext.transaction(configuration -> { + DSLContext transactionalDSL = DSL.using(configuration); + createModule(transactionalDSL, module); + if (!classifiers.isEmpty()) { + storeClassifiers(transactionalDSL, classifiers, module.getName()); + } + if (!decorators.isEmpty()) { + storeDecorators(transactionalDSL, decorators, module.getName()); + } + }); + log.debug("Create consumer data module transaction successful for module {}", module); + } + + private void storeClassifiers(final DSLContext transactionalDSL, final List elements, final String moduleName) { + log.debug("Storing classifiers {} for module {}", elements, moduleName); + insertValues(transactionalDSL, CLASSIFIERS, List.of(NAME, String.format(QUOTED_STRING, MODULE_REFERENCE_NAME)), + executable -> { + for (String element : elements) { + executable = executable.values(String.format(SEMICOLON_SEPARATION, moduleName, element), + moduleName); + } + }); + } + + private void storeDecorators(final DSLContext transactionalDSL, final Map elements, + final String moduleName) { + log.debug("Storing decorators {} for module {}", elements.keySet(), moduleName); + insertValues(transactionalDSL, DECORATORS, List.of(NAME, String.format(QUOTED_STRING, "dataType"), String.format( + QUOTED_STRING, MODULE_REFERENCE_NAME)), executable -> { + for (Map.Entry element : elements.entrySet()) { + executable = executable.values(String.format(SEMICOLON_SEPARATION, moduleName, element.getKey()), + element.getValue(), moduleName); + } + }); + } + + 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))) + .columns(columns.stream().map(column -> field(column, String.class)).toList()); + + consumer.accept(executable); + + runMethodSafe(executable::execute); + } + private T runMethodSafe(Supplier supp) { try { return supp.get(); @@ -167,4 +232,29 @@ public class ModelRepositoryImpl implements ModelRepository { throw TiesException.serverSQLException(); } } + + private T createModuleWithDuplicateCheck(Supplier supp, String moduleName) { + log.debug("Creating module: {}", moduleName); + try { + return supp.get(); + } catch (IntegrityConstraintViolationException icve) { + if (isModuleInDeletingState(moduleName)) { + log.warn("Module in deleting state", icve); + throw TiesException.schemaInDeletingState(moduleName); + } else { + log.warn("Module already exists", icve); + throw TiesException.invalidFileInput(SCHEMA_ALREADY_EXISTS); + } + } catch (Exception ex) { + log.warn("Exception occurred during query execution.", ex); + throw TiesException.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( + ModuleStatus.DELETING.name()))); + return query.fetchAny() != null; + } } 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/tiespath/innerlanguage/AndLogicalBlock.java index 2e6c9c5..15791cd 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/tiespath/innerlanguage/AndLogicalBlock.java @@ -20,13 +20,26 @@ */ package org.oran.smo.teiv.exposure.tiespath.innerlanguage; -import lombok.EqualsAndHashCode; +import java.util.List; + import org.jooq.Condition; +import lombok.EqualsAndHashCode; + @EqualsAndHashCode(callSuper = true) public class AndLogicalBlock extends AndOrLogicalBlock { + public static AndLogicalBlock fromLogicalBlockList(List children) { + AndLogicalBlock andLogicalBlock = new AndLogicalBlock(); + andLogicalBlock.addAllChild(children); + return andLogicalBlock; + } + @Override public Condition getCondition() { - return children.get(0).getCondition().and(children.get(1).getCondition()); + Condition combinedCondition = children.get(0).getCondition(); + for (int i = 1; i < children.size(); i++) { + combinedCondition = combinedCondition.and(children.get(i).getCondition()); + } + return combinedCondition; } } 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/tiespath/innerlanguage/AndOrLogicalBlock.java index 9f1bb95..ea925b8 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/tiespath/innerlanguage/AndOrLogicalBlock.java @@ -54,4 +54,8 @@ public abstract class AndOrLogicalBlock extends LogicalBlock { public void addChild(LogicalBlock logicalBlock) { children.add(logicalBlock); } + + public void addAllChild(List logicalBlocks) { + children.addAll(logicalBlocks); + } } 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/tiespath/innerlanguage/ConditionFactory.java index 54faceb..300b6a4 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/tiespath/innerlanguage/ConditionFactory.java @@ -22,7 +22,9 @@ package org.oran.smo.teiv.exposure.tiespath.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.utils.PersistableUtil.getTableNameWithColumnName; import static org.oran.smo.teiv.utils.TiesConstants.ITEM; @@ -31,9 +33,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import org.jooq.Condition; -import org.jooq.Field; import org.jooq.JSONB; import lombok.experimental.UtilityClass; @@ -47,8 +49,9 @@ import org.oran.smo.teiv.utils.query.exception.TiesPathException; @UtilityClass public class ConditionFactory { - private static final String INVALID_TOPOLOGY_OBJECT_TYPE = "Invalid topology object type"; - private static final String INVALID_QUERY_FUNCTION = "Invalid query function"; + private final String sharedRegex = "-?[\\d]+([.][\\d]+)? -?[\\d]+([.][\\d]+)?"; + private final String pointRegex = "'(POINT|point) ?[(]" + sharedRegex + "[)]'"; + private final String polygonRegex = "(POLYGON|polygon) ?[(][(](?:" + sharedRegex + ", ?){3,}(" + sharedRegex + ")[)][)]"; public static AnyCondition create(final ScopeObject scopeObject) { @@ -59,6 +62,7 @@ public class ConditionFactory { case ASSOCIATION -> new AssociationCondition(); case CLASSIFIERS, SOURCE_IDS -> new ConsumerDataListCondition(); case DECORATORS -> new ConsumerDataMapCondition(); + case METADATA -> new MetaDataMapCondition(); }; } @@ -85,13 +89,58 @@ public class ConditionFactory { return JSONB.valueOf(scopeObject.getParameter()); } case GEOGRAPHIC -> { - validateGeographicParameter(scopeObject.getParameter()); + validateGeographicPoint(scopeObject.getParameter(), true); return scopeObject.getParameter(); } default -> throw TiesPathException.invalidQueryCondition("Unexpected value: " + scopeObject.getDataType()); } } + protected static String processContainers(final Persistable persistable, final List innerContainer) { + String tableName = persistable.getTableName(); + String rootElement = name(innerContainer.get(0)).toString(); + if (innerContainer.size() == 1) { + return String.format("%s.%s", tableName, rootElement); + } + + List remainingElements = innerContainer.subList(1, innerContainer.size()); + String path = remainingElements.stream().map(element -> String.format("'%s'", element)).collect(Collectors + .joining(" -> ")); + return String.format("%s.%s -> %s", tableName, rootElement, path); + } + + protected static String processArrayContainers(final Persistable persistable, final List innerContainer) { + String tableName = persistable.getTableName(); + String rootElement = name(innerContainer.get(0)).toString(); + if (innerContainer.size() == 1) { + return String.format("%s.%s", tableName, rootElement); + } + + List middleElements = innerContainer.subList(1, innerContainer.size() - 1); + String middlePath = middleElements.stream().map(element -> String.format("'%s'", element)).collect(Collectors + .joining(" -> ")); + + String lastElement = String.format("'%s'", innerContainer.get(innerContainer.size() - 1)); + String path = middleElements.isEmpty() ? + String.format("->> %s", lastElement) : + String.format("-> %s ->> %s", middlePath, lastElement); + return String.format("%s.%s %s", tableName, rootElement, path); + } + + public static String handleEqComplexParameter(final ScopeObject scopeObject) { + if (scopeObject.getDataType() == DataType.INTEGER) { + return scopeObject.getParameter(); + } + return String.valueOf(name(scopeObject.getParameter())); + } + + public static String handleLikeComplexParameter(final ScopeObject scopeObject) { + if (scopeObject.getDataType() == DataType.INTEGER) { + return scopeObject.getParameter(); + } + return String.format("%%%s%%", scopeObject.getParameter()); + } + protected static Persistable getPersistable(final ScopeObject scopeObject) { switch (scopeObject.getTopologyObjectType()) { case ENTITY -> { @@ -100,27 +149,24 @@ public class ConditionFactory { case RELATION -> { return SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + default -> throw TiesPathException.invalidTopologyObjectType(); } } - private static void validateGeographicParameter(final String parameter) { - if (!parameter.toLowerCase().startsWith("point(") || !parameter.endsWith(")")) { - throw TiesPathException.invalidQueryCondition("Invalid geographic format."); - } - - final String[] coordinates = parameter.substring(parameter.indexOf("(") + 1, parameter.indexOf(")")).split(" "); - if (coordinates.length != 2) { - throw TiesPathException.invalidQueryCondition( - "A point should have 2 coordinates (longitude and latitude)."); - } - - for (String coord : coordinates) { - try { - new BigDecimal(coord); - } catch (NumberFormatException ex) { - throw TiesPathException.invalidQueryCondition(String.format("Invalid coordinate: %s", coord)); + private static void validateGeographicPoint(final String point, boolean allowHeight) { + final boolean is2D = point.matches("(?i)POINT\\([-?\\d]+(\\.\\d+)? -?\\d+(\\.\\d+)?\\)"); + final boolean is3D = point.matches("(?i)POINT Z \\([-?\\d]+(\\.\\d+)? -?\\d+(\\.\\d+)? -?\\d+(\\.\\d+)?\\)"); + + if (!is2D && !is3D) { + if (allowHeight) { + throw TiesPathException.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)"); + } else { + throw TiesPathException.invalidQueryCondition( + "Invalid geographic format, geographic type must be 2D coordinate. For example: POINT(39.40 67.94)"); } + } else if (is3D && !allowHeight) { + throw TiesPathException.invalidQueryCondition("Invalid geographic format, 3D coordinates are not allowed."); } } } @@ -129,121 +175,85 @@ public class ConditionFactory { @Override public Condition getCondition(final ScopeObject scopeObject) { - if (scopeObject.getInnerContainer().isEmpty()) { - return handleSimpleAttribute(scopeObject); - } - return handleComplexAttribute(scopeObject); - } - - private Condition handleSimpleAttribute(final ScopeObject scopeObject) { - switch (scopeObject.getQueryFunction()) { - case EQ -> { - if (scopeObject.getDataType().equals(DataType.GEOGRAPHIC)) { - return condition(String.format("%s = st_geomfromtext('%s')", handleSimpleLeaf(scopeObject), convert( - scopeObject))); - } - return field(handleSimpleLeaf(scopeObject)).eq(convert(scopeObject)); - } - case CONTAINS -> { - if (scopeObject.getDataType().equals(DataType.GEOGRAPHIC)) { - throw TiesPathException.invalidQueryCondition("Cannot have CONTAINS on geography type data"); + return switch (scopeObject.getQueryFunction()) { + case EQ -> equalsCondition(scopeObject); + case CONTAINS -> containsCondition(scopeObject); + case WITHIN_METERS -> withinMetersCondition(scopeObject); + case COVERED_BY -> coveredByCondition(scopeObject); + case NOT_NULL -> { + if (!scopeObject.getInnerContainer().isEmpty()) { + throw TiesPathException.invalidQueryCondition("Inner container should be empty"); } - return field(handleSimpleLeaf(scopeObject)).contains(convert(scopeObject)); + yield field(getTableNameWithColumnName(getPersistable(scopeObject).getTableName(), scopeObject + .getLeaf())).isNotNull(); } default -> { - return field(handleSimpleLeaf(scopeObject)).isNotNull(); + throw TiesPathException.invalidQueryFunction(); } - } + }; } - private Condition handleComplexAttribute(final ScopeObject scopeObject) { - switch (scopeObject.getQueryFunction()) { - case EQ -> { - if (scopeObject.getLeaf().equals(ITEM)) { - return condition(handleContainers(scopeObject) + String.format(" @> '%s'", handleEqComplexParameter( - scopeObject))); - } - return field(handleContainers(scopeObject) + String.format(" -> '%s'", scopeObject.getLeaf())).eq(field( - applyQuotes(handleEqComplexParameter(scopeObject)))); - } - case CONTAINS -> { - if (scopeObject.getLeaf().equals(ITEM)) { - return condition(handleContainersForArray(scopeObject) + String.format("::text like '%%%s%%'", - scopeObject.getParameter())); - } - return condition(field(handleContainers(scopeObject) + String.format(" ->> '%s'", scopeObject - .getLeaf())).like(handleLikeComplexParameter(scopeObject))); + private static Condition equalsCondition(final ScopeObject scopeObject) { + if (scopeObject.getInnerContainer().isEmpty()) { + if (scopeObject.getDataType() == DataType.GEOGRAPHIC) { + return condition(getTableNameWithColumnName(getPersistable(scopeObject).getTableName(), scopeObject + .getLeaf()) + " = st_geomfromtext(?)", val(convert(scopeObject))); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + return field(getTableNameWithColumnName(getPersistable(scopeObject).getTableName(), scopeObject.getLeaf())) + .eq(convert(scopeObject)); + } else if (scopeObject.getLeaf().equals(ITEM)) { + return condition(processContainers(getPersistable(scopeObject), scopeObject.getInnerContainer()) + " @> ?", + inline(handleEqComplexParameter(scopeObject))); + } else { + return field(processContainers(getPersistable(scopeObject), scopeObject.getInnerContainer()) + " -> ?", val( + scopeObject.getLeaf())).eq(field(inline(handleEqComplexParameter(scopeObject)))); } } - private String handleEqComplexParameter(final ScopeObject scopeObject) { - if (scopeObject.getDataType().equals(DataType.INTEGER)) { - return scopeObject.getParameter(); + private static Condition containsCondition(final ScopeObject scopeObject) { + if (scopeObject.getInnerContainer().isEmpty()) { + if (scopeObject.getDataType() == DataType.GEOGRAPHIC) { + throw TiesPathException.invalidQueryCondition("Cannot have CONTAINS on geography type data"); + } + return field(getTableNameWithColumnName(getPersistable(scopeObject).getTableName(), scopeObject.getLeaf())) + .contains(convert(scopeObject)); + } else if (scopeObject.getLeaf().equals(ITEM)) { + return condition(processArrayContainers(getPersistable(scopeObject), scopeObject + .getInnerContainer()) + "::text like ?", val("%" + scopeObject.getParameter() + "%")); + } else { + return condition(field(processContainers(getPersistable(scopeObject), scopeObject + .getInnerContainer()) + " ->> ?", val(scopeObject.getLeaf())).like(handleLikeComplexParameter( + scopeObject))); } - return String.valueOf(name(scopeObject.getParameter())); } - private String handleLikeComplexParameter(final ScopeObject scopeObject) { - if (scopeObject.getDataType().equals(DataType.INTEGER)) { - return scopeObject.getParameter(); + private static Condition withinMetersCondition(final ScopeObject scopeObject) { + if (scopeObject.getDataType() != DataType.GEOGRAPHIC) { + throw TiesPathException.invalidQueryCondition("Within meters condition needs geography type data"); } - return String.format("%%%s%%", scopeObject.getParameter()); - } - - private String handleSimpleLeaf(final ScopeObject scopeObject) { - return handleTopologyObjectType(scopeObject).getTableName() + "." + name(scopeObject.getLeaf()); - } - - private String handleContainers(final ScopeObject scopeObject) { - - if (scopeObject.getInnerContainer().size() > 1) { - StringBuilder sb = new StringBuilder(); - for (String element : scopeObject.getInnerContainer().subList(1, scopeObject.getInnerContainer().size())) { - sb.append(" -> ").append(applyQuotes(element)); - } - return handleTopologyObjectType(scopeObject).getTableName() + "." + name(scopeObject.getInnerContainer() - .get(0)) + sb; + String[] parameters = scopeObject.getParameter().split(","); + if (parameters.length != 2 || !parameters[0].matches(pointRegex)) { + throw TiesPathException.invalidQueryCondition("Invalid parameter for within meters condition"); } - return handleTopologyObjectType(scopeObject).getTableName() + "." + name(scopeObject.getInnerContainer().get( - 0)); - } - - private String handleContainersForArray(final ScopeObject scopeObject) { - if (scopeObject.getInnerContainer().size() > 1) { - StringBuilder sb = new StringBuilder(); - - for (String element : scopeObject.getInnerContainer().subList(1, scopeObject.getInnerContainer() - .size() - 1)) { - sb.append(" -> ").append(applyQuotes(element)); - } - sb.append(" ->> ").append(applyQuotes(scopeObject.getInnerContainer().get(scopeObject.getInnerContainer() - .size() - 1))); - return handleTopologyObjectType(scopeObject).getTableName() + "." + name(scopeObject.getInnerContainer() - .get(0)) + sb; - } - return handleTopologyObjectType(scopeObject).getTableName() + "." + name(scopeObject.getInnerContainer().get( - 0)); + return condition("ST_DWithin(?, ST_GeographyFromText(?), ?)", field("\"" + scopeObject.getLeaf() + "\""), field( + parameters[0]), field(parameters[1].replaceAll(" ", ""))); } - private Persistable handleTopologyObjectType(final ScopeObject scopeObject) { - Persistable persistable; + private static Condition coveredByCondition(final ScopeObject scopeObject) { + if (scopeObject.getDataType() != DataType.GEOGRAPHIC) { + throw TiesPathException.invalidQueryCondition("Covered by condition needs geography type data"); + } - 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); + if (!scopeObject.getParameter().matches(polygonRegex)) { + throw TiesPathException.invalidQueryCondition("Invalid parameter for covered by condition"); } - return persistable; + return condition("ST_CoveredBy(?, ST_GeographyFromText(?))", field("\"" + scopeObject.getLeaf() + "\""), val( + scopeObject.getParameter())); } - private static String applyQuotes(String element) { - return String.format("'%s'", element); - } } static class RelationCondition extends AnyCondition { @@ -258,7 +268,7 @@ public class ConditionFactory { case NOT_NULL -> { return notNullCondition(scopeObject); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TiesPathException.invalidQueryFunction(); } } @@ -282,7 +292,7 @@ public class ConditionFactory { return Objects.requireNonNull(persistable).getTableName() + "." + name(persistable.getIdColumnName()); } else { - throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + throw TiesPathException.invalidTopologyObjectType(); } } @@ -296,100 +306,156 @@ public class ConditionFactory { @Override public Condition getCondition(final ScopeObject scopeObject) { + return switch (scopeObject.getQueryFunction()) { + case EQ, CONTAINS -> createEqOrContainsCondition(scopeObject); + case NOT_NULL -> field(SchemaRegistry.getReferenceColumnName(getRelationType(scopeObject))).isNotNull(); + default -> throw TiesPathException.invalidQueryFunction(); + }; + } - RelationType relation; + private Condition createEqOrContainsCondition(final ScopeObject scopeObject) { + return scopeObject.getLeaf().equals("id") ? + createIdCondition(scopeObject) : + createAttributeCondition(scopeObject); + } - switch (scopeObject.getTopologyObjectType()) { + private static Condition createIdCondition(final ScopeObject scopeObject) { + RelationType relation = getRelationType(scopeObject); + if (scopeObject.getDataType() == null) { + scopeObject.setDataType(DataType.PRIMITIVE); + } - case ENTITY -> { - final List relationTypes = SchemaRegistry.getAllRelationNamesByAssociationName(scopeObject - .getInnerContainer().get(0)); - relation = relationTypes.stream().filter(r -> r.getASide().getName().equals(scopeObject - .getTopologyObject()) || r.getBSide().getName().equals(scopeObject.getTopologyObject())) - .findFirst().orElseThrow(() -> TiesPathException.invalidQueryCondition( - "Relation was not found")); - } - case RELATION -> relation = SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); - default -> throw TiesPathException.invalidQueryCondition(INVALID_TOPOLOGY_OBJECT_TYPE); + String idColumn = getIdColumn(scopeObject, relation); + if (relation.getRelationshipStorageLocation() == RelationshipDataLocation.RELATION) { + String fullColumnName = getTableNameWithColumnName(relation.getTableName(), idColumn); + return createEqualsOrContainsCondition(scopeObject, fullColumnName); } - switch (scopeObject.getQueryFunction()) { - case EQ, CONTAINS -> { - - EntityType entityType; - String sideColumnName; - - if (Objects.requireNonNull(relation).getRelationshipStorageLocation().equals( - RelationshipDataLocation.A_SIDE)) { - entityType = relation.getASide(); - sideColumnName = relation.bSideColumnName(); - } else if (relation.getRelationshipStorageLocation().equals(RelationshipDataLocation.B_SIDE)) { - entityType = relation.getBSide(); - sideColumnName = relation.aSideColumnName(); - } else { - if (relation.isConnectsSameEntity()) { - sideColumnName = checkSameEntityRelationship(relation, scopeObject); - } else { - sideColumnName = checkManyToMany(relation, scopeObject); - } - if (scopeObject.getQueryFunction().equals(EQ)) { - return condition(field(getTableNameWithColumnName(relation.getTableName(), sideColumnName)).eq( - scopeObject.getParameter())); - } - return condition(field(getTableNameWithColumnName(relation.getTableName(), sideColumnName)) - .contains(scopeObject.getParameter())); + EntityType entityType = relation.getStoringSideEntityType(); + idColumn = relation.getNotStoringSideEntityIdColumnNameInStoringSideTable(); + boolean isEntityTypeMatch = matchTopologyObjectOrAssociation(scopeObject, entityType); + if (isEntityTypeMatch) { + String fullIdColumn = getTableNameWithColumnName(entityType.getTableName(), idColumn); + return createEqualsOrContainsCondition(scopeObject, fullIdColumn); + } - } - return ConditionFactory.getConditionContainsOrEquals(scopeObject, relation, entityType, sideColumnName); - } - case NOT_NULL -> { - return condition(field(SchemaRegistry.getReferenceColumnName(Objects.requireNonNull(relation))) - .isNotNull()); + String nonNullColumn = getTableNameWithColumnName(entityType.getTableName(), idColumn); + String fullIdColumn = getTableNameWithColumnName(entityType.getTableName(), entityType.getIdColumnName()); + return field(nonNullColumn).isNotNull().and(createEqualsOrContainsCondition(scopeObject, fullIdColumn)); + } + + private static Condition createAttributeCondition(final ScopeObject scopeObject) { + RelationType relation = getRelationType(scopeObject); + EntityType entityType = getEntityTypeOnFilterSide(scopeObject, relation); + if (scopeObject.getDataType() == null) { + throw TiesPathException.invalidQueryCondition("Datatype for parameter is missing"); + } + if (scopeObject.getQueryFunction().equals(QueryFunction.CONTAINS) && scopeObject.getDataType().equals( + DataType.GEOGRAPHIC)) { + throw TiesPathException.invalidQueryCondition("Cannot have CONTAINS on geography type data"); + } + List innerContainer = scopeObject.getInnerContainer().subList(1, scopeObject.getInnerContainer() + .size()); + if (innerContainer.isEmpty() && scopeObject.getDataType() == DataType.GEOGRAPHIC) { + return condition(getTableNameWithColumnName(entityType.getTableName(), scopeObject + .getLeaf()) + " = st_geomfromtext(?)", val(convert(scopeObject))); + } + + String compareField = getAttributeColumn(scopeObject, innerContainer, relation); + if (!relation.getRelationshipStorageLocation().equals(RelationshipDataLocation.RELATION)) { + if (relation.getStoringSideEntityType().equals(entityType)) { + String idColumn = getTableNameWithColumnName(entityType.getTableName(), getIdColumn(scopeObject, + relation)); + return field(idColumn).isNotNull().and(createEqualsOrContainsCondition(scopeObject, compareField)); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + return createEqualsOrContainsCondition(scopeObject, compareField); } + return createEqualsOrContainsCondition(scopeObject, compareField); } - 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())) { - return relation.bSideColumnName(); - } else { - return relation.aSideColumnName(); + private static String getIdColumn(final ScopeObject scopeObject, final RelationType relation) { + if (relation.getRelationshipStorageLocation() != RelationshipDataLocation.RELATION) { + return relation.getNotStoringSideEntityIdColumnNameInStoringSideTable(); + } + if (!relation.isConnectsSameEntity()) { + return matchTopologyObjectOrAssociation(scopeObject, relation.getASide()) ? + relation.bSideColumnName() : + relation.aSideColumnName(); } + boolean aSideAssociation = relation.getASideAssociation().getName().equals(scopeObject.getInnerContainer().get( + 0)); + return aSideAssociation ? relation.aSideColumnName() : relation.bSideColumnName(); } - private static String checkSameEntityRelationship(RelationType relation, ScopeObject scopeObject) { - if (relation.getASideAssociation().getName().equals(scopeObject.getInnerContainer().get(0))) { - return relation.aSideColumnName(); - } else { - return relation.bSideColumnName(); + private static String getAttributeColumn(final ScopeObject scopeObject, final List innerContainer, + final RelationType relation) { + if (!scopeObject.getTopologyObjectType().equals(TopologyObjectType.ENTITY)) { + throw TiesPathException.invalidTopologyObjectType(); + } + EntityType entityType = getEntityTypeOnFilterSide(scopeObject, relation); + if (innerContainer.isEmpty()) { + return getTableNameWithColumnName(entityType.getTableName(), scopeObject.getLeaf()); + } + return processContainers(entityType, innerContainer) + String.format(" -> '%s'", scopeObject.getLeaf()); + } + + private static RelationType getRelationType(final ScopeObject scopeObject) { + switch (scopeObject.getTopologyObjectType()) { + case ENTITY: + return SchemaRegistry.getAllRelationNamesByAssociationName(scopeObject.getInnerContainer().get(0)) + .stream().filter(r -> topologyObjectEquals(scopeObject, r.getASide()) || topologyObjectEquals( + scopeObject, r.getBSide())).findFirst().orElseThrow(() -> TiesPathException + .invalidQueryCondition("Relation was not found")); + case RELATION: + return SchemaRegistry.getRelationTypeByName(scopeObject.getTopologyObject()); + default: + throw TiesPathException.invalidTopologyObjectType(); } } + + private static EntityType getEntityTypeOnFilterSide(final ScopeObject scopeObject, final RelationType relation) { + boolean isTopologyObjASide = matchTopologyObjectOrAssociation(scopeObject, relation.getASide()); + return isTopologyObjASide ? relation.getBSide() : relation.getASide(); + } + + private static boolean matchTopologyObjectOrAssociation(final ScopeObject scopeObject, + final EntityType entityType) { + RelationType relation = getRelationType(scopeObject); + return topologyObjectEquals(scopeObject, entityType) || SchemaRegistry.getEntityTypeOnAssociationSide(relation, + scopeObject.getInnerContainer().get(0)).equals(entityType); + } + + private static boolean topologyObjectEquals(final ScopeObject scopeObject, final EntityType entityType) { + return entityType.getName().equals(scopeObject.getTopologyObject()); + } + + private static Condition createEqualsOrContainsCondition(final ScopeObject scopeObject, final String field) { + return scopeObject.getQueryFunction() == EQ ? + condition(field(field).eq(convert(scopeObject))) : + condition(field(field).contains(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())) { - Field field = field(getTableNameWithColumnName(Objects.requireNonNull(entityType).getTableName(), - sideColumnName)); + static class MetaDataMapCondition extends AnyCondition { - if (scopeObject.getQueryFunction().equals(EQ)) { - return condition(field.eq(scopeObject.getParameter())); + @Override + public Condition getCondition(final ScopeObject scopeObject) { + if (!scopeObject.getQueryFunction().equals(EQ)) { + throw TiesPathException.invalidQueryFunction(); } - return condition(field.contains(scopeObject.getParameter())); + return equalsCondition(scopeObject); + } - } else { - if (scopeObject.getQueryFunction().equals(EQ)) { - return condition(field(getTableNameWithColumnName(entityType.getTableName(), sideColumnName)).isNotNull()) - .and(condition(field(getTableNameWithColumnName(entityType.getTableName(), entityType - .getIdColumnName())).eq(scopeObject.getParameter()))); - } - return condition(field(getTableNameWithColumnName(entityType.getTableName(), sideColumnName)).isNotNull()).and( - condition(field(getTableNameWithColumnName(entityType.getTableName(), entityType.getIdColumnName())) - .contains(scopeObject.getParameter()))); + private static String getColumnName(final ScopeObject scopeObject) { + + final Persistable persistable = getPersistable(scopeObject); + + return Objects.requireNonNull(persistable).getTableName() + "." + name(persistable.getMetadataColumnName()); + } + + private static Condition equalsCondition(final ScopeObject scopeObject) { + return condition("? -> ? = ?", field(getColumnName(scopeObject)), inline(scopeObject.getLeaf()), inline( + "\"" + convert(scopeObject) + "\"")); } } @@ -416,7 +482,7 @@ public class ConditionFactory { String newValue = scopeObject.getParameter(); - if (scopeObject.getDataType().equals(DataType.PRIMITIVE)) { + if (scopeObject.getDataType() == DataType.PRIMITIVE) { newValue = String.format("\"%s\"", convert(scopeObject)); } @@ -458,13 +524,13 @@ public class ConditionFactory { private static Condition equalsCondition(final ScopeObject scopeObject) { - return condition(String.format("%s @> '\"%s\"'", getColumnName(scopeObject), scopeObject.getParameter())); + return condition("? @> ?", field(getColumnName(scopeObject)), inline("\"" + scopeObject.getParameter() + "\"")); } private static Condition containsCondition(final ScopeObject scopeObject) { - return condition(String.format("%s::text like '%%%s%%'", getColumnName(scopeObject), scopeObject - .getParameter())); + return condition("?::text like ?", field(getColumnName(scopeObject)), val("%" + scopeObject + .getParameter() + "%")); } } @@ -483,7 +549,7 @@ public class ConditionFactory { case NOT_NULL -> { return field(getColumnName(scopeObject)).isNotNull(); } - default -> throw TiesPathException.invalidQueryCondition(INVALID_QUERY_FUNCTION); + default -> throw TiesPathException.invalidQueryFunction(); } } 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/tiespath/innerlanguage/ContainerType.java index 3543c5d..97b7c22 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/tiespath/innerlanguage/ContainerType.java @@ -35,7 +35,8 @@ public enum ContainerType { //ToDo Resolver should not treat below two as containers but refinement do so this needs to be fixed ASSOCIATION("association", false), - RELATION("relation", false); + RELATION("relation", false), + METADATA("metadata", false); private final String value; private final boolean isParamAllowedInTargetFilter; 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/tiespath/innerlanguage/InnerFilterCriteria.java index b44c7d0..8b71412 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/tiespath/innerlanguage/InnerFilterCriteria.java @@ -26,6 +26,7 @@ import static org.oran.smo.teiv.exposure.tiespath.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; @@ -41,7 +42,6 @@ import org.jooq.Table; import lombok.Builder; import lombok.Data; -import lombok.extern.slf4j.Slf4j; import org.oran.smo.teiv.exception.TiesException; import org.oran.smo.teiv.schema.DataType; import org.oran.smo.teiv.schema.Persistable; @@ -55,7 +55,6 @@ import java.util.Map; import java.util.Set; @Data -@Slf4j @Builder public class InnerFilterCriteria { private List targets; @@ -126,7 +125,7 @@ public class InnerFilterCriteria { switch (targetObject.getContainer()) { case ATTRIBUTES -> { if (targetObject.isAllParamQueried()) { - select.putAll(persistable.getSpecificAttributeColumns(List.of())); + select.putAll(persistable.getSpecificAttributeColumns(persistable.getAttributeNames())); } else { select.putAll(persistable.getSpecificAttributeColumns(targetObject.getParams())); } @@ -137,6 +136,9 @@ public class InnerFilterCriteria { case CLASSIFIERS -> select.put(field(getTableNameWithColumnName(persistable.getTableName(), persistable .getClassifiersColumnName()), JSONB.class).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable .getFullyQualifiedName(), CLASSIFIERS))), DataType.CONTAINER); + case METADATA -> select.put(field(getTableNameWithColumnName(persistable.getTableName(), persistable + .getMetadataColumnName()), JSONB.class).as(hashAlias(getFullyQualifiedNameWithColumnName(persistable + .getFullyQualifiedName(), METADATA))), DataType.CONTAINER); case ID -> { } case SOURCE_IDS -> select.put(field(getTableNameWithColumnName(persistable.getTableName(), persistable 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/tiespath/innerlanguage/OrLogicalBlock.java index 5cc7d57..badbc12 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/tiespath/innerlanguage/OrLogicalBlock.java @@ -21,12 +21,26 @@ package org.oran.smo.teiv.exposure.tiespath.innerlanguage; import lombok.EqualsAndHashCode; + +import java.util.List; + import org.jooq.Condition; @EqualsAndHashCode(callSuper = true) public class OrLogicalBlock extends AndOrLogicalBlock { + + public static OrLogicalBlock fromLogicalBlockList(List children) { + OrLogicalBlock orLogicalBlock = new OrLogicalBlock(); + orLogicalBlock.addAllChild(children); + return orLogicalBlock; + } + @Override public Condition getCondition() { - return children.get(0).getCondition().or(children.get(1).getCondition()); + Condition combinedCondition = children.get(0).getCondition(); + for (int i = 1; i < children.size(); i++) { + combinedCondition = combinedCondition.or(children.get(i).getCondition()); + } + return combinedCondition; } } 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/tiespath/innerlanguage/QueryFunction.java index a52fe57..f75ca0f 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/tiespath/innerlanguage/QueryFunction.java @@ -27,7 +27,9 @@ import org.oran.smo.teiv.utils.query.exception.TiesPathException; public enum QueryFunction { EQ("="), CONTAINS("contains"), - NOT_NULL("notNull"); + NOT_NULL("notNull"), + WITHIN_METERS("withinMeters"), + COVERED_BY("coveredBy"); private final String 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/tiespath/innerlanguage/ScopeLogicalBlock.java index ccd17db..6b4fb0f 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/tiespath/innerlanguage/ScopeLogicalBlock.java @@ -98,7 +98,7 @@ public class ScopeLogicalBlock extends LogicalBlock { String col2 = getTableNameWithColumnName(entityType.getTableName(), ID_COLUMN_NAME); joinCondition.add(constructJoinConditionPair(relationType, col1, col2)); - } else if (!relationType.getStoringSideEntityType().equals(scopeObject.getTopologyObject())) { + } else if (!relationType.getStoringSideEntityType().getName().equals(scopeObject.getTopologyObject())) { String col1 = constructColumnNameForJoinCondition(relationType, relationType .getNotStoringSideEntityIdColumnNameInStoringSideTable()); String col2 = getTableNameWithColumnName(relationType.getNotStoringSideTableName(), ID_COLUMN_NAME); 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/tiespath/refiner/AliasMapper.java index 17196ee..9537d50 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/tiespath/refiner/AliasMapper.java @@ -36,6 +36,7 @@ import org.oran.smo.teiv.exception.TiesException; @Slf4j @UtilityClass public class AliasMapper { + private static final String SHA_1 = "SHA-1"; private static final int POSTGRES_MAX_IDENTIFIER_LENGTH = 63; private static final Map originalToHashed = new ConcurrentHashMap<>(); 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/tiespath/refiner/BasePathRefinement.java index 37cd05f..1e31205 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/tiespath/refiner/BasePathRefinement.java @@ -42,6 +42,7 @@ 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 java.util.ArrayList; @@ -52,6 +53,7 @@ import java.util.List; import org.oran.smo.teiv.exposure.tiespath.innerlanguage.TargetObject; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -60,9 +62,10 @@ import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import lombok.extern.slf4j.Slf4j; + 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; @@ -583,7 +586,7 @@ public class BasePathRefinement { } case RELATION -> { RelationType relationType = SchemaRegistry.getRelationTypeByName(topologyObject); - List notMatchingParams2 = params.stream().filter(a -> !relationType.getAttributes().containsKey(a)) + List notMatchingParams2 = params.stream().filter(a -> !relationType.getAttributeNames().contains(a)) .toList(); if (!notMatchingParams2.isEmpty()) { throw TiesPathException.columnNamesError(topologyObject, notMatchingParams2); @@ -627,6 +630,9 @@ public class BasePathRefinement { case DECORATORS: validateDecoratorsParameter(so); break; + case METADATA: + validateMetadataParameter(so); + break; default: break; } @@ -665,6 +671,19 @@ public class BasePathRefinement { so.setDataType(DataType.PRIMITIVE); } + private void validateMetadataParameter(final ScopeObject so) { + if (so.getLeaf() != null && so.getLeaf().equals("reliabilityIndicator")) { + if (so.getResolverDataType().equals(ResolverDataType.STRING)) { + validateReliabilityIndicator(so.getParameter()); + } else { + throw TiesPathException.grammarError("Invalid data type provided for scopeFilter"); + } + } else { + throw TiesPathException.invalidMetadaFilter(so.getLeaf()); + } + 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"); @@ -677,7 +696,7 @@ public class BasePathRefinement { private void validateDecoratorsParameter(final ScopeObject so) { Object value = null; if (so.getResolverDataType().equals(ResolverDataType.INTEGER)) { - so.setDataType(BIGINT); + so.setDataType(DataType.BIGINT); value = Integer.valueOf(so.getParameter()); } else { so.setDataType(DataType.PRIMITIVE); @@ -884,4 +903,12 @@ public class BasePathRefinement { .topologyObjectType(TopologyObjectType.RELATION).queryFunction(QueryFunction.NOT_NULL).container( ContainerType.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"); + } + } } 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/tiespath/refiner/PathToJooqRefinement.java index 8ac102d..1ce8e27 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/tiespath/refiner/PathToJooqRefinement.java @@ -20,7 +20,6 @@ */ package org.oran.smo.teiv.exposure.tiespath.refiner; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.jooq.Field; import org.jooq.JSONB; @@ -47,7 +46,6 @@ import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.selectCount; import static org.oran.smo.teiv.utils.TiesConstants.QUOTED_STRING; -@Slf4j @UtilityClass @SuppressWarnings({ "rawtypes", "unchecked" }) public class PathToJooqRefinement { @@ -111,6 +109,10 @@ 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 { resolvedFields.add(field("null").as(field.getKey().getName())); } @@ -176,6 +178,10 @@ 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 { nulledFields.add(field("null").as(field.getName())); } 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/tiespath/resolver/ResolverDataType.java index a796558..6cf9cda 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/tiespath/resolver/ResolverDataType.java @@ -23,5 +23,7 @@ package org.oran.smo.teiv.exposure.tiespath.resolver; public enum ResolverDataType { INTEGER, STRING, + DOUBLE, + DECIMAL, NOT_NULL } 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 index 4e4c841..a8073f6 100644 --- 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 @@ -44,7 +44,7 @@ public class ResolverUtil { } 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 getTopologyObjectWhenTwoContainers(rootObject, firstContainer, containerNames.get(1)); } return Optional.ofNullable(rootObject).orElse(WILDCARD); @@ -60,8 +60,9 @@ public class ResolverUtil { return ContainerType.fromValue(containerNames.get(containerNames.size() - 1)); } - private static String getTopologyObjectWhenTwoContainers(final String rootObject, final String firstContainer) { - if (null == rootObject || firstContainer.equals(rootObject)) { + private static String getTopologyObjectWhenTwoContainers(final String rootObject, final String firstContainer, + final String secondContainer) { + if (null == rootObject || firstContainer.equals(rootObject) || secondContainer.equals(rootObject)) { return firstContainer; } else { throw TiesPathException.grammarError( 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/tiespath/resolver/ScopeFilterListener.java index 7e45e37..1ccbce2 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/tiespath/resolver/ScopeFilterListener.java @@ -106,6 +106,35 @@ public class ScopeFilterListener extends tiesPathBaseListener { addScopeLogicalBlock(scopeObjectBuilder); } + @Override + public void exitWithinMetersFunctionCondition(final tiesPathParser.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) { + parameter += ctx.DoubleLiteral().getText(); + } else if (ctx.DecimalLiteral() != null) { + parameter += ctx.DecimalLiteral().getText(); + } else { + throw TiesPathException.grammarError("Integer, decimal or double meters parameter expected!"); + } + + scopeObjectBuilder.parameter(parameter).resolverDataType(ResolverDataType.STRING); + + addScopeLogicalBlock(scopeObjectBuilder); + } + + @Override + public void exitCoveredByFunctionCondition(final tiesPathParser.CoveredByFunctionConditionContext ctx) { + final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), + QueryFunction.COVERED_BY); + scopeObjectBuilder.parameter(removeQuotes(ctx.StringLiteral().getText())).resolverDataType(ResolverDataType.STRING); + addScopeLogicalBlock(scopeObjectBuilder); + } + @Override public void exitLeafCondition(final tiesPathParser.LeafConditionContext ctx) { final ScopeObject.ScopeObjectBuilder scopeObjectBuilder = getScopeObjectBuilder(ctx.leafName().getText(), 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 new file mode 100644 index 0000000..9f1f49d --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/GroupsCustomMetrics.java @@ -0,0 +1,116 @@ +/* + * ============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; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import lombok.Data; + +@Data +@Component +@Profile("groups") +public class GroupsCustomMetrics { + + private final Counter httpCreateGroupFailedCount; + private final Counter httpGetAllGroupsFailedCount; + private final Counter httpGetGroupByIdFailedCount; + private final Counter httpDeleteGroupFailedCount; + private final Counter httpUpdateGroupNameFailedCount; + private final Counter httpGetMembersFailedCount; + private final Counter httpGetProvidedMembersFailedCount; + 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( + meterRegistry); + this.httpGetGroupByIdFailedCount = Counter.builder("ties_groups_http_get_group_by_id_fail_total").register( + meterRegistry); + this.httpDeleteGroupFailedCount = Counter.builder("ties_groups_http_delete_group_fail_total").register( + meterRegistry); + this.httpUpdateGroupNameFailedCount = Counter.builder("ties_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") + .register(meterRegistry); + this.httpUpdateProvidedMembersFailedCount = Counter.builder("ties_groups_http_update_provided_members_fail_total") + .register(meterRegistry); + } + + /** + * It increments the httpCreateGroupFailedCount metric. + */ + public void incrementHttpCreateGroupFailedCount() { + httpCreateGroupFailedCount.increment(); + } + + /** + * It increments the httpGetAllGroupsFailedCount metric. + */ + public void incrementHttpGetAllGroupsFailedCount() { + httpGetAllGroupsFailedCount.increment(); + } + + /** + * It increments the httpGetGroupByIdFailedCount metric. + */ + public void incrementHttpGetGroupByIdFailedCount() { + httpGetGroupByIdFailedCount.increment(); + } + + /** + * It increments the httpDeleteGroupFailedCount metric. + */ + public void incrementHttpDeleteGroupFailedCount() { + httpDeleteGroupFailedCount.increment(); + } + + /** + * It increments the httpUpdateGroupNameFailedCount metric. + */ + public void incrementHttpUpdateGroupNameFailedCount() { + httpUpdateGroupNameFailedCount.increment(); + } + + /** + * It increments the httpGetMembersFailedCount metric. + */ + public void incrementHttpGetMembersFailedCount() { + httpGetMembersFailedCount.increment(); + } + + /** + * It increments the httpGetProvidedMembersFailedCount metric. + */ + public void incrementHttpGetProvidedMembersFailedCount() { + httpGetProvidedMembersFailedCount.increment(); + } + + /** + * It increments the httpUpdateProvidedMembersFailedCount metric. + */ + public void incrementHttpUpdateProvidedMembersFailedCount() { + httpUpdateProvidedMembersFailedCount.increment(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/GroupsService.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/GroupsService.java new file mode 100644 index 0000000..ea38cc7 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/GroupsService.java @@ -0,0 +1,110 @@ +/* + * ============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.api; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupsResponse; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.api.model.OranTeivUpdateGroupNamePayload; +import org.oran.smo.teiv.api.model.OranTeivUpdateProvidedMembersPayload; +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +public interface GroupsService { + + /** + * Creates a new group. + * + * @param createGroupPayload + * - A {@link OranTeivCreateGroupPayload} to create + * @return created group response + */ + OranTeivGroupByIdResponse createGroup(final OranTeivCreateGroupPayload createGroupPayload); + + /** + * Get all groups. + * + * @param requestDetails + * The request details containing pagination info. + * @return The groups response containing the list of groups. + */ + OranTeivGroupsResponse getAllGroups(final RequestDetails requestDetails, final String name); + + /** + * Deletes the group. + * + * @param groupId + * - group id + */ + void deleteGroup(final String groupId); + + /** + * Updates a group name + * + * @param groupId + * - group id + */ + void renameGroup(final String groupId, final OranTeivUpdateGroupNamePayload newGroupName); + + /** + * Get group by specified id. + * + * @param groupId + * - group id + */ + OranTeivGroupByIdResponse getGroupById(final String groupId); + + /** + * Resolves the members of the group. + * + * @param groupId + * - group id + * @param requestDetails + * - details from the request used for pagination + * @return resolved members of the group + */ + OranTeivMembersResponse getResolvedMembers(final String groupId, final RequestDetails requestDetails); + + /** + * Update the provided members of a static group by specified id. + * + * @param groupId + * - group id + * @param updateProvidedMembersPayload + * - A {@link OranTeivUpdateProvidedMembersPayload} to update provided members ids + */ + void updateProvidedMembers(final String groupId, + final OranTeivUpdateProvidedMembersPayload updateProvidedMembersPayload); + + /** + * Get provided members of a static group based on the status. + * + * @param groupId + * - group id + * @param status + * - status + * @param requestDetails + * - details from the request used for pagination + * @return provided members of the group + */ + OranTeivMembersResponse getProvidedMembersByStatus(final String groupId, final String status, + final RequestDetails requestDetails); +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/GroupsServiceImpl.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/GroupsServiceImpl.java new file mode 100644 index 0000000..df0559a --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/GroupsServiceImpl.java @@ -0,0 +1,232 @@ +/* + * ============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.api.impl; + +import static org.oran.smo.teiv.exposure.utils.PaginationUtil.firstHref; +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.groups.rest.controller.GroupsUtil.generateMembersHref; +import static org.oran.smo.teiv.groups.rest.controller.GroupsUtil.generateProvidedMembersHref; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivDynamicEnum; +import org.oran.smo.teiv.api.model.OranTeivDynamicGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivDynamicGroupResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupsResponse; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.api.model.OranTeivStaticEnum; +import org.oran.smo.teiv.api.model.OranTeivStaticGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivStaticGroupResponse; +import org.oran.smo.teiv.api.model.OranTeivUpdateGroupNamePayload; +import org.oran.smo.teiv.api.model.OranTeivUpdateProvidedMembersPayload; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.api.GroupsService; +import org.oran.smo.teiv.groups.api.impl.creator.DynamicGroupCreator; +import org.oran.smo.teiv.groups.api.impl.creator.StaticGroupCreator; +import org.oran.smo.teiv.groups.api.impl.resolver.DynamicGroupResolver; +import org.oran.smo.teiv.groups.api.impl.resolver.GroupResolver; +import org.oran.smo.teiv.groups.api.impl.resolver.ProvidedMembersRetriever; +import org.oran.smo.teiv.groups.api.impl.resolver.ProvidedMembersRetrieverRegistry; +import org.oran.smo.teiv.groups.api.impl.resolver.StaticGroupResolver; +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import org.oran.smo.teiv.groups.spi.GroupRecord; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.groups.spi.ProvidedMembersStatus; +import org.oran.smo.teiv.groups.spi.StaticGroupMemberProcessor; + +@Slf4j +@Service +@RequiredArgsConstructor +@Profile("groups") +public class GroupsServiceImpl implements GroupsService { + private final GroupsRepository groupsRepository; + private final DynamicGroupCreator dynamicGroupCreator; + private final StaticGroupCreator staticGroupCreator; + private final StaticGroupResolver staticGroupResolver; + private final DynamicGroupResolver dynamicGroupResolver; + private final ObjectMapper objectMapper; + private final StaticGroupMemberProcessor staticGroupMemberProcessor; + private final ProvidedMembersRetrieverRegistry providedMembersRetrieverRegistry; + + @Override + public OranTeivGroupByIdResponse createGroup(final OranTeivCreateGroupPayload createGroupPayload) { + if (createGroupPayload.getType().equals("dynamic")) { + return dynamicGroupCreator.create(createGroupPayload); + } else { + return staticGroupCreator.create(createGroupPayload); + } + } + + @Override + public OranTeivGroupsResponse getAllGroups(final RequestDetails requestDetails, final String name) { + Pair, Integer> results; + if (name != null) { + results = groupsRepository.getGroupsByName(name, requestDetails.getOffset(), requestDetails.getLimit()); + } else { + results = groupsRepository.getAllGroups(requestDetails.getOffset(), requestDetails.getLimit()); + } + int totalCount = results.getRight(); + List items = new ArrayList<>(); + if (!results.getLeft().isEmpty()) { + items = results.getLeft().stream().map(this::mapToGroupResponse).toList(); + } + return OranTeivGroupsResponse.builder().items(items).self(selfHref(requestDetails)).first(firstHref(requestDetails)) + .prev(prevHref(requestDetails, totalCount)).next(nextHref(requestDetails, totalCount)).last(lastHref( + requestDetails, totalCount)).totalCount(totalCount).build(); + } + + @Override + public void deleteGroup(final String groupId) { + try { + groupsRepository.deleteGroupById(groupId); + } catch (final GroupNotFoundException e) { + log.warn("Error while deleting the group: ", e); + throw GroupsException.resourceNotFoundException(); + } + } + + @Override + public void renameGroup(final String groupId, final OranTeivUpdateGroupNamePayload newGroupName) { + try { + groupsRepository.renameGroupById(groupId, newGroupName.getName()); + } catch (final GroupNotFoundException e) { + log.warn("Error while updating the group name: ", e); + throw GroupsException.resourceNotFoundException(); + } + } + + @Override + public OranTeivGroupByIdResponse getGroupById(final String groupId) { + try { + final GroupRecord grpRecord = groupsRepository.getGroupById(groupId); + if (grpRecord.getGroupType().equals("dynamic")) { + OranTeivCriteria groupCriteria = objectMapper.readValue(groupsRepository.getCriteriaByGroupId(groupId), + OranTeivCriteria.class); + return OranTeivDynamicGroupByIdResponse.builder().id(groupId).name(grpRecord.getGroupName()).type( + OranTeivDynamicEnum.DYNAMIC).members(generateMembersHref(groupId)).criteria(groupCriteria).build(); + } else { + return OranTeivStaticGroupByIdResponse.builder().id(groupId).name(grpRecord.getGroupName()).type( + OranTeivStaticEnum.STATIC).members(generateMembersHref(groupId)).providedMembers( + generateProvidedMembersHref(groupId)).build(); + } + } catch (final GroupNotFoundException e) { + log.warn("Error while fetching the group: ", e); + throw GroupsException.resourceNotFoundException(); + } catch (final JsonProcessingException ex) { + log.warn("Error while deserializing the criteria for the dynamic group: {} ", groupId, ex); + throw GroupsException.criteriaDeserializationException(ex.getMessage()); + } + } + + @Override + public OranTeivMembersResponse getResolvedMembers(final String groupId, final RequestDetails requestDetails) { + try { + final String type = groupsRepository.getGroupTypeById(groupId); + return getGroupResolver(type).resolve(groupId, requestDetails); + } catch (final GroupNotFoundException e) { + log.warn("Error while getting members of the group: ", e); + throw GroupsException.resourceNotFoundException(); + } + } + + @Override + public void updateProvidedMembers(final String groupId, + final OranTeivUpdateProvidedMembersPayload updateProvidedMembersPayload) { + final String type; + try { + type = groupsRepository.getGroupTypeById(groupId); + } catch (final GroupNotFoundException e) { + log.warn("Error while updating provided members of static group: ", e); + throw GroupsException.resourceNotFoundException(); + } + if (type.equals("static")) { + final Pair, Integer> groupDetails = groupsRepository.getStaticGroupDetailsById(groupId); + final Map> providedMembers = staticGroupMemberProcessor.groupProvidedMembers( + updateProvidedMembersPayload.getProvidedMembers(), groupId); + if (updateProvidedMembersPayload.getOperation().equals( + OranTeivUpdateProvidedMembersPayload.OperationEnum.MERGE)) { + groupsRepository.mergeProvidedMembersToGroup(groupId, providedMembers, groupDetails.getLeft(), groupDetails + .getRight()); + } else { + groupsRepository.removeProvidedMembersFromGroup(groupId, providedMembers, groupDetails.getLeft()); + } + } else { + log.warn("Error when updating provided members for a group with id: {} as group type is not static", groupId); + throw GroupsException.providedMembersUpdateException( + "The specified provided members for group cannot be updated as group type is not static"); + } + } + + @Override + public OranTeivMembersResponse getProvidedMembersByStatus(final String groupId, final String status, + final RequestDetails requestDetails) { + try { + final ProvidedMembersStatus providedMembersStatus = ProvidedMembersStatus.fromValue(status); + final String type = groupsRepository.getGroupTypeById(groupId); + if (!type.equals("static")) { + log.warn("Error retrieving provided members for a group with id: {} as group type is not static", groupId); + throw GroupsException.providedMembersRetrievalException( + "Provided members can be retrieved only for static group"); + } + ProvidedMembersRetriever retriever = providedMembersRetrieverRegistry.getProvidedMembersByStatus( + providedMembersStatus); + return retriever.retrieve(groupId, requestDetails); + } catch (GroupNotFoundException e) { + log.warn("Error while getting provided members of the group: ", e); + throw GroupsException.resourceNotFoundException(); + } + } + + private GroupResolver getGroupResolver(final String type) { + return type.equals("dynamic") ? dynamicGroupResolver : staticGroupResolver; + } + + private OranTeivGroupResponse mapToGroupResponse(GroupRecord groupRecord) { + if ("static".equals(groupRecord.getGroupType())) { + return OranTeivStaticGroupResponse.builder().id(groupRecord.getId()).name(groupRecord.getGroupName()).type( + OranTeivStaticEnum.STATIC).providedMembers(generateProvidedMembersHref(groupRecord.getId())).members( + generateMembersHref(groupRecord.getId())).build(); + } else { + return OranTeivDynamicGroupResponse.builder().id(groupRecord.getId()).name(groupRecord.getGroupName()).type( + OranTeivDynamicEnum.DYNAMIC).members(generateMembersHref(groupRecord.getId())).build(); + } + } +} 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 new file mode 100644 index 0000000..0647e23 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreator.java @@ -0,0 +1,73 @@ +/* + * ============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.api.impl.creator; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsUtil.generateMembersHref; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivDynamic; +import org.oran.smo.teiv.api.model.OranTeivDynamicEnum; +import org.oran.smo.teiv.api.model.OranTeivDynamicGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.DynamicGroupRecord; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.utils.JooqTypeConverter; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class DynamicGroupCreator implements GroupCreator { + private final ObjectMapper objectMapper; + private final GroupsRepository groupsRepository; + + @Override + public OranTeivGroupByIdResponse create(final OranTeivCreateGroupPayload createGroupPayload) { + log.debug("Create a dynamic group: {}", createGroupPayload.toString()); + final OranTeivDynamic dynamicGroup = (OranTeivDynamic) createGroupPayload; + String criteriaString; + try { + criteriaString = objectMapper.writeValueAsString(dynamicGroup.getCriteria()); + } catch (JsonProcessingException e) { + log.warn("Error while serializing the criteria for the dynamic group: {}", dynamicGroup, e); + throw GroupsException.criteriaSerializationException(e.getMessage()); + } + + final String groupId = GroupCreator.generateGroupId(); + final DynamicGroupRecord groupRecord = DynamicGroupRecord.builder().id(groupId).groupName(dynamicGroup.getName()) + .groupType(dynamicGroup.getType()).criteria(JooqTypeConverter.toJsonb(criteriaString)).build(); + + groupsRepository.createDynamicGroup(groupRecord); + + return OranTeivDynamicGroupByIdResponse.builder().id(groupId).name(dynamicGroup.getName()).type( + OranTeivDynamicEnum.DYNAMIC).members(generateMembersHref(groupId)).criteria(dynamicGroup.getCriteria()) + .build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/GroupCreator.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/GroupCreator.java new file mode 100644 index 0000000..f5804b6 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/GroupCreator.java @@ -0,0 +1,43 @@ +/* + * ============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.api.impl.creator; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.GROUP_ID_PREFIX; + +import java.util.UUID; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; + +public interface GroupCreator { + /** + * Creates a group. + * + * @param createGroupPayload + * - group to create + * @return created group response + */ + OranTeivGroupByIdResponse create(final OranTeivCreateGroupPayload createGroupPayload); + + static String generateGroupId() { + return GROUP_ID_PREFIX.concat(UUID.randomUUID().toString()); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/StaticGroupCreator.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/StaticGroupCreator.java new file mode 100644 index 0000000..fdbb680 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/creator/StaticGroupCreator.java @@ -0,0 +1,67 @@ +/* + * ============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.api.impl.creator; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsUtil.generateMembersHref; +import static org.oran.smo.teiv.groups.rest.controller.GroupsUtil.generateProvidedMembersHref; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivStatic; +import org.oran.smo.teiv.api.model.OranTeivStaticEnum; +import org.oran.smo.teiv.api.model.OranTeivStaticGroupByIdResponse; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.groups.spi.StaticGroupRecord; +import org.oran.smo.teiv.groups.spi.StaticGroupMemberProcessor; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class StaticGroupCreator implements GroupCreator { + + private final GroupsRepository groupsRepository; + private final StaticGroupMemberProcessor staticGroupMemberProcessor; + + @Override + public OranTeivGroupByIdResponse create(final OranTeivCreateGroupPayload createGroupPayload) { + log.debug("Create a static group: {}", createGroupPayload.toString()); + final OranTeivStatic staticGroup = (OranTeivStatic) createGroupPayload; + + final String groupId = GroupCreator.generateGroupId(); + final StaticGroupRecord staticGroupRecord = StaticGroupRecord.builder().id(groupId).groupName(staticGroup.getName()) + .groupType(staticGroup.getType()).groupedProvidedMembers(staticGroupMemberProcessor.groupProvidedMembers( + staticGroup.getProvidedMembers(), groupId)).build(); + + groupsRepository.createStaticGroup(staticGroupRecord); + + return OranTeivStaticGroupByIdResponse.builder().id(groupId).name(staticGroup.getName()).type( + OranTeivStaticEnum.STATIC).providedMembers(generateProvidedMembersHref(groupId)).members( + generateMembersHref(groupId)).build(); + } + +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/AllProvidedMembersRetriever.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/AllProvidedMembersRetriever.java new file mode 100644 index 0000000..8751a38 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/AllProvidedMembersRetriever.java @@ -0,0 +1,53 @@ +/* + * ============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.api.impl.resolver; + +import java.util.List; + +import org.apache.commons.lang3.tuple.Pair; +import org.jooq.Record; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +@Slf4j +@Component +@Profile("groups") +public class AllProvidedMembersRetriever extends ProvidedMembersRetriever { + private final GroupsRepository groupsRepository; + + public AllProvidedMembersRetriever(GroupsRepository groupsRepository) { + super(groupsRepository); + this.groupsRepository = groupsRepository; + } + + @Override + public OranTeivMembersResponse retrieve(final String groupId, final RequestDetails requestDetails) { + Pair, Integer> results = groupsRepository.getAllProvidedMembersByGroupId(groupId, requestDetails + .getOffset(), requestDetails.getLimit()); + return buildResponse(results.getLeft(), results.getRight(), requestDetails); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolver.java new file mode 100644 index 0000000..d0315b1 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolver.java @@ -0,0 +1,38 @@ +/* + * ============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.api.impl.resolver; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +public interface CriteriaResolver { + + /** + * Resolves the given criteria. + * + * @param criteria + * - criteria to resolve + * @param requestDetails + * - request details + */ + OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails); +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolverRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolverRegistry.java new file mode 100644 index 0000000..976acf8 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/CriteriaResolverRegistry.java @@ -0,0 +1,63 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class CriteriaResolverRegistry { + private final EntityByDomainResolver entityByDomainResolver; + private final EntityByTypeResolver entityByTypeResolver; + private final RelationshipByEntityIdResolver relationshipByEntityIdResolver; + private final RelationshipByTypeResolver relationshipByTypeResolver; + + /** + * Gets the group resolver based on the group type. + * + * @param queryType + * - group type + * @return {@link GroupResolver} + */ + public CriteriaResolver getResolver(final String queryType) { + log.debug("Get criteria resolver for query type: {}", queryType); + switch (queryType) { + case "getEntitiesByDomain" -> { + return this.entityByDomainResolver; + } + case "getEntitiesByType" -> { + return this.entityByTypeResolver; + } + case "getRelationshipsForEntityId" -> { + return this.relationshipByEntityIdResolver; + } + case "getRelationshipsByType" -> { + return this.relationshipByTypeResolver; + } + default -> throw new IllegalArgumentException("Unsupported query type: " + queryType); + } + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolver.java new file mode 100644 index 0000000..a6dd505 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolver.java @@ -0,0 +1,61 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import org.oran.smo.teiv.groups.spi.GroupsRepository; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class DynamicGroupResolver implements GroupResolver { + private final GroupsRepository groupsRepository; + private final ObjectMapper objectMapper; + private final CriteriaResolverRegistry criteriaResolverRegistry; + + @Override + public OranTeivMembersResponse resolve(final String groupId, final RequestDetails requestDetails) + throws GroupNotFoundException { + try { + final String criteriaString = this.groupsRepository.getCriteriaByGroupId(groupId); + final OranTeivCriteria criteria = objectMapper.readValue(criteriaString, OranTeivCriteria.class); + return criteriaResolverRegistry.getResolver(criteria.getQueryType()).resolveByCriteria(criteria, + requestDetails); + } catch (final JsonProcessingException e) { + log.warn("Error while deserializing the criteria for the dynamic group: {} ", groupId, e); + throw GroupsException.criteriaDeserializationException(e.getMessage()); + } + } + +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByDomainResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByDomainResolver.java new file mode 100644 index 0000000..d2fda88 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByDomainResolver.java @@ -0,0 +1,54 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivEntitiesResponseMessage; +import org.oran.smo.teiv.api.model.OranTeivGetEntitiesByDomain; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.data.api.DataService; +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class EntityByDomainResolver implements CriteriaResolver { + private final DataService dataService; + + @Override + public OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails) { + log.debug("Resolve group with getEntitiesByDomain criteria: {}", criteria); + OranTeivGetEntitiesByDomain entitiesByDomainCriteria = (OranTeivGetEntitiesByDomain) criteria; + final OranTeivEntitiesResponseMessage entitiesByDomain = dataService.getEntitiesByDomain(entitiesByDomainCriteria + .getDomain(), entitiesByDomainCriteria.getTargetFilter(), entitiesByDomainCriteria.getScopeFilter(), + requestDetails); + + return OranTeivMembersResponse.builder().items(entitiesByDomain.getItems()).first(entitiesByDomain.getFirst()).prev( + entitiesByDomain.getPrev()).self(entitiesByDomain.getSelf()).next(entitiesByDomain.getNext()).last( + entitiesByDomain.getLast()).totalCount(entitiesByDomain.getTotalCount()).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByTypeResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByTypeResolver.java new file mode 100644 index 0000000..05f16ee --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/EntityByTypeResolver.java @@ -0,0 +1,55 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivEntitiesResponseMessage; +import org.oran.smo.teiv.api.model.OranTeivGetEntitiesByType; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.data.api.DataService; +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class EntityByTypeResolver implements CriteriaResolver { + private final DataService dataService; + + @Override + public OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails) { + log.debug("Resolve group with getEntitiesByName criteria: {}", criteria); + OranTeivGetEntitiesByType getEntitiesByTypeCriteria = (OranTeivGetEntitiesByType) criteria; + final OranTeivEntitiesResponseMessage entitiesByName = dataService.getTopologyByType(getEntitiesByTypeCriteria + .getDomain(), getEntitiesByTypeCriteria.getEntityTypeName(), getEntitiesByTypeCriteria.getTargetFilter(), + getEntitiesByTypeCriteria.getScopeFilter(), requestDetails); + + return OranTeivMembersResponse.builder().items(entitiesByName.getItems()).first(entitiesByName.getFirst()).prev( + entitiesByName.getPrev()).self(entitiesByName.getSelf()).next(entitiesByName.getNext()).last(entitiesByName + .getLast()).totalCount(entitiesByName.getTotalCount()).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/GroupResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/GroupResolver.java new file mode 100644 index 0000000..4084976 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/GroupResolver.java @@ -0,0 +1,42 @@ +/* + * ============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.api.impl.resolver; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; + +public interface GroupResolver { + + /** + * Resolves the members of the group. + * + * @param groupId + * - group id + * @param requestDetails + * - request details + * @return resolved members of the group with pagination + * @throws GroupNotFoundException + * if group id doesn't exists + */ + OranTeivMembersResponse resolve(final String groupId, final RequestDetails requestDetails) + throws GroupNotFoundException; +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/InvalidProvidedMembersRetriever.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/InvalidProvidedMembersRetriever.java new file mode 100644 index 0000000..28d8135 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/InvalidProvidedMembersRetriever.java @@ -0,0 +1,61 @@ +/* + * ============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.api.impl.resolver; + +import java.util.ArrayList; +import java.util.List; + +import org.jooq.Record2; +import org.jooq.Select; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.schema.Persistable; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.utils.RequestDetails; + +@Slf4j +@Component +@Profile("groups") +public class InvalidProvidedMembersRetriever extends ProvidedMembersRetriever { + private final GroupsRepository groupsRepository; + + public InvalidProvidedMembersRetriever(final GroupsRepository groupsRepository) { + super(groupsRepository); + this.groupsRepository = groupsRepository; + } + + @Override + public OranTeivMembersResponse retrieve(final String groupId, final RequestDetails requestDetails) { + List topologyTypes = groupsRepository.getTopologyTypesByGroupId(groupId); + List>> combinedQueries = new ArrayList<>(); + topologyTypes.forEach(topologyType -> { + Persistable topologyObjectType = resolveTopologyObjectType(topologyType, groupId); + if (topologyObjectType == null) { + combinedQueries.add(groupsRepository.createQueryForProvidedMembersByTopologyType(groupId, topologyType)); + } + }); + return processCombinedQueries(combinedQueries, requestDetails); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/NotPresentProvidedMembersRetriever.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/NotPresentProvidedMembersRetriever.java new file mode 100644 index 0000000..a142962 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/NotPresentProvidedMembersRetriever.java @@ -0,0 +1,67 @@ +/* + * ============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.api.impl.resolver; + +import java.util.ArrayList; +import java.util.List; + +import org.jooq.Record2; +import org.jooq.Select; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.groups.spi.StaticGroupRecord; +import org.oran.smo.teiv.schema.Persistable; + +@Slf4j +@Component +@Profile("groups") +public class NotPresentProvidedMembersRetriever extends ProvidedMembersRetriever { + private final GroupsRepository groupsRepository; + + public NotPresentProvidedMembersRetriever(final GroupsRepository groupsRepository) { + super(groupsRepository); + this.groupsRepository = groupsRepository; + } + + @Override + public OranTeivMembersResponse retrieve(final String groupId, final RequestDetails requestDetails) + throws GroupNotFoundException { + StaticGroupRecord staticGroupRecord = groupsRepository.getProvidedMembersById(groupId); + List>> combinedQueries = new ArrayList<>(); + staticGroupRecord.getGroupedProvidedMembers().forEach((topologyType, providedMembersIds) -> { + Persistable topologyObjectType = resolveTopologyObjectType(topologyType, groupId); + if (topologyObjectType == null) { + return; + } + combinedQueries.add(groupsRepository.createQueryForNotPresentProvidedMembers(topologyObjectType.getTableName(), + topologyType, providedMembersIds, topologyObjectType.getIdColumnName())); + }); + + return processCombinedQueries(combinedQueries, requestDetails); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/PresentProvidedMembersRetriever.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/PresentProvidedMembersRetriever.java new file mode 100644 index 0000000..5ed0a4e --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/PresentProvidedMembersRetriever.java @@ -0,0 +1,66 @@ +/* + * ============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.api.impl.resolver; + +import java.util.ArrayList; +import java.util.List; + +import org.jooq.Record2; +import org.jooq.Select; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.groups.spi.StaticGroupRecord; +import org.oran.smo.teiv.schema.Persistable; + +@Slf4j +@Component +@Profile("groups") +public class PresentProvidedMembersRetriever extends ProvidedMembersRetriever { + private final GroupsRepository groupsRepository; + + public PresentProvidedMembersRetriever(final GroupsRepository groupsRepository) { + super(groupsRepository); + this.groupsRepository = groupsRepository; + } + + @Override + public OranTeivMembersResponse retrieve(final String groupId, final RequestDetails requestDetails) + throws GroupNotFoundException { + StaticGroupRecord staticGroupRecord = groupsRepository.getProvidedMembersById(groupId); + List>> combinedQueries = new ArrayList<>(); + staticGroupRecord.getGroupedProvidedMembers().forEach((topologyType, providedMembersIds) -> { + Persistable topologyObjectType = resolveTopologyObjectType(topologyType, groupId); + if (topologyObjectType == null) { + return; + } + combinedQueries.add(groupsRepository.createQueryForPresentProvidedMembers(topologyObjectType.getTableName(), + topologyType, providedMembersIds, topologyObjectType.getIdColumnName())); + }); + return processCombinedQueries(combinedQueries, requestDetails); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetriever.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetriever.java new file mode 100644 index 0000000..790d4e0 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetriever.java @@ -0,0 +1,112 @@ +/* + * ============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.api.impl.resolver; + +import static org.oran.smo.teiv.exposure.utils.PaginationUtil.firstHref; +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 java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.tuple.Pair; +import org.jooq.Record; +import org.jooq.Record2; +import org.jooq.Select; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import org.oran.smo.teiv.schema.Persistable; +import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.schema.SchemaRegistryException; + +@Slf4j +@RequiredArgsConstructor +public abstract class ProvidedMembersRetriever { + + private final GroupsRepository groupsRepository; + + /** + * Retrieves provided members of the group. + * + * @param groupId + * - group id + * @param requestDetails + * - request details used for pagination link construction + * @return provided members of the group + */ + public abstract OranTeivMembersResponse retrieve(final String groupId, final RequestDetails requestDetails) + throws GroupNotFoundException; + + protected final Persistable resolveTopologyObjectType(final String topologyType, final String groupId) { + final String[] parts = topologyType.split(":"); + if (parts.length != 2) { + log.info( + "Invalid topology type: {} for groupId: {}. The topology object is neither an entity nor a relationship.", + topologyType, groupId); + return null; + } + final String moduleName = parts[0]; + final String topologyTypeName = parts[1]; + try { + return SchemaRegistry.getTopologyTypeByModuleAndTopologyName(moduleName, topologyTypeName); + } catch (SchemaRegistryException e) { + log.info( + "Failed to resolve topology type: {} for groupId: {}. The topology object is neither an entity nor a relationship.", + topologyType, groupId, e); + return null; + } + } + + protected final OranTeivMembersResponse processCombinedQueries( + final List>> combinedQueries, final RequestDetails requestDetails) { + if (combinedQueries.isEmpty()) { + return buildResponse(Collections.emptyList(), 0, requestDetails); + } + Select> unionQuery = combinedQueries.stream().reduce(Select::unionAll).orElse(null); + Pair, Integer> result = groupsRepository.getStaticMembers(unionQuery, requestDetails.getOffset(), + requestDetails.getLimit()); + return buildResponse(result.getLeft(), result.getRight(), requestDetails); + } + + protected final OranTeivMembersResponse buildResponse(final List memberRecords, final int totalCount, + final RequestDetails requestDetails) { + List items = new ArrayList<>(); + memberRecords.forEach(staticGroupRecord -> { + String id = staticGroupRecord.getValue("id", String.class); + String topologyType = staticGroupRecord.getValue("topology_type", String.class); + items.add(Map.of(topologyType, List.of(Map.of("id", id)))); + }); + + return OranTeivMembersResponse.builder().totalCount(totalCount).items(items).first(firstHref(requestDetails)).prev( + prevHref(requestDetails, totalCount)).self(selfHref(requestDetails)).next(nextHref(requestDetails, + totalCount)).last(lastHref(requestDetails, totalCount)).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetrieverRegistry.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetrieverRegistry.java new file mode 100644 index 0000000..829a8c2 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/ProvidedMembersRetrieverRegistry.java @@ -0,0 +1,56 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.groups.spi.ProvidedMembersStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class ProvidedMembersRetrieverRegistry { + private final PresentProvidedMembersRetriever presentProvidedMembersRetriever; + private final NotPresentProvidedMembersRetriever notPresentProvidedMembersRetriever; + private final InvalidProvidedMembersRetriever invalidProvidedMembersRetriever; + private final AllProvidedMembersRetriever allProvidedMembersRetriever; + + /** + * Gets the provided members retriever based on the status. + * + * @param status + * - status + * @return {@link ProvidedMembersRetriever} + */ + public ProvidedMembersRetriever getProvidedMembersByStatus(final ProvidedMembersStatus status) { + log.debug("Get status resolver for status: {}", status); + return switch (status) { + case PRESENT -> presentProvidedMembersRetriever; + case NOT_PRESENT -> notPresentProvidedMembersRetriever; + case INVALID -> invalidProvidedMembersRetriever; + case ALL -> allProvidedMembersRetriever; + }; + } +} 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 new file mode 100644 index 0000000..9c6652c --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByEntityIdResolver.java @@ -0,0 +1,58 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivGetRelationshipsForEntityId; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +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; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class RelationshipByEntityIdResolver implements CriteriaResolver { + private final DataService dataService; + + @Override + public OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails) { + log.debug("Resolve group with getRelationshipsByEntityId criteria: {}", criteria); + + OranTeivGetRelationshipsForEntityId relForEntityId = (OranTeivGetRelationshipsForEntityId) criteria; + final OranTeivRelationshipsResponseMessage relationshipsByEntityId = this.dataService + .getAllRelationshipsForObjectId(relForEntityId.getDomain(), relForEntityId.getEntityTypeName(), + relForEntityId.getEntityId(), relForEntityId.getTargetFilter(), relForEntityId.getScopeFilter(), + requestDetails); + + return OranTeivMembersResponse.builder().items(relationshipsByEntityId.getItems()).first(relationshipsByEntityId + .getFirst()).prev(relationshipsByEntityId.getPrev()).self(relationshipsByEntityId.getSelf()).next( + relationshipsByEntityId.getNext()).last(relationshipsByEntityId.getLast()).totalCount( + relationshipsByEntityId.getTotalCount()).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByTypeResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByTypeResolver.java new file mode 100644 index 0000000..e0d16b4 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/RelationshipByTypeResolver.java @@ -0,0 +1,55 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.api.model.OranTeivGetRelationshipsByType; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +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; + +@Slf4j +@Component +@RequiredArgsConstructor +@Profile("groups") +public class RelationshipByTypeResolver implements CriteriaResolver { + private final DataService dataService; + + @Override + public OranTeivMembersResponse resolveByCriteria(final OranTeivCriteria criteria, final RequestDetails requestDetails) { + log.debug("Resolve group with getRelationshipsByName criteria: {}", criteria); + OranTeivGetRelationshipsByType relByTypeCriteria = (OranTeivGetRelationshipsByType) criteria; + final OranTeivRelationshipsResponseMessage relationshipsByType = this.dataService.getRelationshipsByType( + relByTypeCriteria.getDomain(), relByTypeCriteria.getRelationshipTypeName(), relByTypeCriteria + .getTargetFilter(), relByTypeCriteria.getScopeFilter(), requestDetails); + + return OranTeivMembersResponse.builder().items(relationshipsByType.getItems()).first(relationshipsByType.getFirst()) + .prev(relationshipsByType.getPrev()).self(relationshipsByType.getSelf()).next(relationshipsByType.getNext()) + .last(relationshipsByType.getLast()).totalCount(relationshipsByType.getTotalCount()).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/StaticGroupResolver.java b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/StaticGroupResolver.java new file mode 100644 index 0000000..0f4c3c2 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/api/impl/resolver/StaticGroupResolver.java @@ -0,0 +1,44 @@ +/* + * ============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.api.impl.resolver; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; + +@Component +@Slf4j +@Profile("groups") +@RequiredArgsConstructor +public class StaticGroupResolver implements GroupResolver { + private final PresentProvidedMembersRetriever presentProvidedMembersRetriever; + + @Override + public OranTeivMembersResponse resolve(String groupId, RequestDetails requestDetails) throws GroupNotFoundException { + return presentProvidedMembersRetriever.retrieve(groupId, requestDetails); + } +} 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 new file mode 100644 index 0000000..f212e02 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/AuditInfo.java @@ -0,0 +1,88 @@ +/* + * ============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.audit; + +import static org.oran.smo.teiv.groups.audit.ExecutionStatus.SUCCESS; + +import java.util.List; + +import lombok.Builder; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivDynamic; +import org.oran.smo.teiv.api.model.OranTeivStatic; + +@Builder +public class AuditInfo { + private final ExecutionStatus status; + private final GroupOperation operation; + private final OranTeivCreateGroupPayload createGroupPayload; + private final String groupId; + private final String groupName; + private final List providedMembers; + private final String exceptionMessage; + + @Override + public String toString() { + if (status.equals(SUCCESS)) { + return generateSuccessMessage(); + } + return generateFailureMessage(); + } + + private String generateFailureMessage() { + return switch (operation) { + case CREATE -> String.format("%s - Create %s, %s", status, 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); + case MERGE_PROVIDED_MEMBERS -> String.format("%s - Merge provided members %s for group %s, %s", status, + providedMembers, groupId, exceptionMessage); + case REMOVE_PROVIDED_MEMBERS -> String.format("%s - Remove provided members %s for group %s, %s", status, + providedMembers, groupId, exceptionMessage); + }; + } + + 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 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", + providedMembers, groupId)); + case REMOVE_PROVIDED_MEMBERS -> str.append(String.format("Remove provided members %s for group %s", + providedMembers, groupId)); + } + return str.toString(); + } + + private String generateCreateGroupMsg() { + if (createGroupPayload instanceof OranTeivDynamic payload) { + return String.format("Create group type=dynamic, name=%s, criteria=%s", payload.getName(), payload + .getCriteria()); + } else if (createGroupPayload instanceof OranTeivStatic payload) { + return String.format("Create group type=static, name=%s, providedMembers=%s", payload.getName(), payload + .getProvidedMembers()); + } + return null; + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/audit/ExecutionStatus.java b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/ExecutionStatus.java new file mode 100644 index 0000000..ccfd2c3 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/ExecutionStatus.java @@ -0,0 +1,29 @@ +/* + * ============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.audit; + +import lombok.Getter; + +@Getter +public enum ExecutionStatus { + SUCCESS, + FAILED +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/audit/GroupOperation.java b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/GroupOperation.java new file mode 100644 index 0000000..74d3068 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/audit/GroupOperation.java @@ -0,0 +1,29 @@ +/* + * ============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.audit; + +public enum GroupOperation { + CREATE, + UPDATE_NAME, + DELETE, + MERGE_PROVIDED_MEMBERS, + REMOVE_PROVIDED_MEMBERS +} 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 new file mode 100644 index 0000000..f17e7c6 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsConstants.java @@ -0,0 +1,30 @@ +/* + * ============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.rest.controller; + +import lombok.experimental.UtilityClass; + +@UtilityClass +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="; +} 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 new file mode 100644 index 0000000..9aeb063 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java @@ -0,0 +1,221 @@ +/* + * ============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.rest.controller; + +import static org.oran.smo.teiv.groups.audit.ExecutionStatus.FAILED; +import static org.oran.smo.teiv.groups.audit.ExecutionStatus.SUCCESS; +import static org.oran.smo.teiv.groups.audit.GroupOperation.CREATE; +import static org.oran.smo.teiv.groups.audit.GroupOperation.DELETE; +import static org.oran.smo.teiv.groups.audit.GroupOperation.MERGE_PROVIDED_MEMBERS; +import static org.oran.smo.teiv.groups.audit.GroupOperation.REMOVE_PROVIDED_MEMBERS; +import static org.oran.smo.teiv.groups.audit.GroupOperation.UPDATE_NAME; +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE; +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.PROVIDED_MEMBERS_HREF_TEMPLATE; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import org.apache.commons.lang3.tuple.Pair; +import org.oran.smo.teiv.api.model.OranTeivDynamicGroupByIdResponse; +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.springframework.context.annotation.Profile; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.oran.smo.teiv.api.model.OranTeivUpdateProvidedMembersPayload; +import io.micrometer.core.annotation.Timed; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.api.GroupsApi; +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivErrorMessage; +import org.oran.smo.teiv.api.model.OranTeivGroupByIdResponse; +import org.oran.smo.teiv.api.model.OranTeivGroupsResponse; +import org.oran.smo.teiv.api.model.OranTeivMembersResponse; +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; + +@Slf4j +@RestController +@RequestMapping(TiesConstants.REQUEST_MAPPING) +@RequiredArgsConstructor +@Profile("groups") +public class GroupsController implements GroupsApi { + private final GroupsService groupsService; + private final GroupsCustomMetrics customMetrics; + private final LoggerHandler loggerHandler; + private final HttpServletRequest context; + + @Override + @Timed("ties_groups_http_create_group_seconds") + public ResponseEntity createGroup(final String accept, final String contentType, + final OranTeivCreateGroupPayload createGroupPayload) { + return runWithFailCheck(() -> { + final OranTeivGroupByIdResponse getGroupByIdResponse; + try { + getGroupByIdResponse = groupsService.createGroup(createGroupPayload); + if (getGroupByIdResponse instanceof OranTeivStaticGroupByIdResponse staticResponse) { + loggerHandler.logAudit(log, AuditInfo.builder().operation(CREATE).createGroupPayload(createGroupPayload) + .groupId(staticResponse.getId()).status(SUCCESS).build().toString(), context); + } else if (getGroupByIdResponse instanceof OranTeivDynamicGroupByIdResponse dynamicResponse) { + loggerHandler.logAudit(log, AuditInfo.builder().operation(CREATE).createGroupPayload(createGroupPayload) + .groupId(dynamicResponse.getId()).status(SUCCESS).build().toString(), context); + } + } catch (final Exception ex) { + final String exceptionMessage = (ex instanceof GroupsException groupsException) ? + groupsException.getDetails() : + ex.getLocalizedMessage(); + loggerHandler.logAudit(log, AuditInfo.builder().operation(CREATE).createGroupPayload(createGroupPayload) + .status(FAILED).exceptionMessage(exceptionMessage).build().toString(), context); + log.error("Exception while creating the group: ", ex); + throw ex; + } + return ResponseEntity.status(HttpStatus.CREATED).body(getGroupByIdResponse); + }, customMetrics::incrementHttpCreateGroupFailedCount); + } + + @Override + @Timed("ties_groups_http_get_all_groups_seconds") + public ResponseEntity getAllGroups(final String accept, final Integer offset, + final Integer limit, final String name) { + return runWithFailCheck(() -> { + final RequestDetails requestDetails = RequestDetails.builder().basePath("/groups").offset(offset).limit(limit) + .queryParam("name", name).build(); + return ResponseEntity.ok(groupsService.getAllGroups(requestDetails, name)); + }, customMetrics::incrementHttpGetAllGroupsFailedCount); + } + + @Override + @Timed("ties_groups_http_delete_group_seconds") + public ResponseEntity deleteGroup(final String groupId) { + return runWithFailCheck(() -> { + runWithAuditLogs(() -> groupsService.deleteGroup(groupId), response -> loggerHandler.logAudit(log, AuditInfo + .builder().operation(DELETE).groupId(groupId).status(response.getKey()).exceptionMessage(response + .getValue()).build().toString(), context)); + return ResponseEntity.noContent().build(); + }, customMetrics::incrementHttpDeleteGroupFailedCount); + } + + @Override + @Timed("ties_groups_http_update_group_name_seconds") + public ResponseEntity updateGroupName(final String contentType, final String groupId, + final OranTeivUpdateGroupNamePayload groupNameUpdatePayload) { + return runWithFailCheck(() -> { + runWithAuditLogs(() -> groupsService.renameGroup(groupId, groupNameUpdatePayload), response -> loggerHandler + .logAudit(log, AuditInfo.builder().operation(UPDATE_NAME).groupId(groupId).status(response.getKey()) + .groupName(groupNameUpdatePayload.getName()).exceptionMessage(response.getValue()).build() + .toString(), context)); + return ResponseEntity.noContent().build(); + }, customMetrics::incrementHttpUpdateGroupNameFailedCount); + } + + @Override + @Timed("ties_groups_http_get_members_seconds") + public ResponseEntity getMembers(final String accept, final String groupId, + final Integer offset, final Integer limit) { + return runWithFailCheck(() -> { + final RequestDetails requestDetails = RequestDetails.builder().basePath(String.format(MEMBERS_HREF_TEMPLATE, + groupId)).offset(offset).limit(limit).build(); + return ResponseEntity.ok(groupsService.getResolvedMembers(groupId, requestDetails)); + }, customMetrics::incrementHttpGetMembersFailedCount); + } + + @Override + @Timed("ties_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(() -> { + final RequestDetails requestDetails = RequestDetails.builder().basePath(String.format( + PROVIDED_MEMBERS_HREF_TEMPLATE, groupId)).offset(offset).limit(limit).queryParam("status", status) + .build(); + return ResponseEntity.ok(groupsService.getProvidedMembersByStatus(groupId, status, requestDetails)); + }, customMetrics::incrementHttpGetProvidedMembersFailedCount); + } + + @Override + @Timed("ties_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") + public ResponseEntity updateProvidedMembers(final String accept, final String contentType, final String groupId, + final OranTeivUpdateProvidedMembersPayload updateProvidedMembersPayload) { + return runWithFailCheck(() -> { + runWithAuditLogs(() -> groupsService.updateProvidedMembers(groupId, updateProvidedMembersPayload), + response -> loggerHandler.logAudit(log, AuditInfo.builder().operation(updateProvidedMembersPayload + .getOperation().getValue().equals("merge") ? MERGE_PROVIDED_MEMBERS : REMOVE_PROVIDED_MEMBERS) + .groupId(groupId).status(response.getKey()).providedMembers(updateProvidedMembersPayload + .getProvidedMembers()).exceptionMessage(response.getValue()).build().toString(), + context)); + return ResponseEntity.noContent().build(); + }, customMetrics::incrementHttpUpdateProvidedMembersFailedCount); + } + + @ExceptionHandler(GroupsException.class) + public ResponseEntity handleGroupsException(final GroupsException exception) { + if (exception.getException() != null) { + log.warn(exception.getMessage(), exception.getException()); + } + final OranTeivErrorMessage errorMessage = OranTeivErrorMessage.builder().status(exception.getStatus().name()) + .message(exception.getMessage()).details(exception.getDetails()).build(); + + return new ResponseEntity<>(errorMessage, exception.getStatus()); + } + + private T runWithFailCheck(final Supplier supp, final Runnable runnable) { + try { + return supp.get(); + } catch (Exception ex) { + log.error("Exception during service call", ex); + runnable.run(); + throw ex; + } + } + + private void runWithAuditLogs(final Runnable runnable, final Consumer> logAudit) { + try { + runnable.run(); + logAudit.accept(Pair.of(SUCCESS, null)); + } catch (Exception ex) { + log.error("Exception during service call", ex); + if (ex instanceof GroupsException groupsException) { + logAudit.accept(Pair.of(FAILED, groupsException.getDetails())); + } else { + logAudit.accept(Pair.of(FAILED, ex.getMessage())); + } + throw ex; + } + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsException.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsException.java new file mode 100644 index 0000000..b2e2779 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsException.java @@ -0,0 +1,90 @@ +/* + * ============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.rest.controller; + +import org.springframework.http.HttpStatus; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@Builder +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class GroupsException extends RuntimeException { + private final HttpStatus status; + private final String message; + private final String details; + private final Exception exception; + + public static GroupsException resourceNotFoundException() { + return GroupsException.builder().status(HttpStatus.NOT_FOUND).message("Resource Not Found").details( + "The requested group is not found").build(); + } + + public static GroupsException criteriaSerializationException(final String msg) { + return GroupsException.builder().status(HttpStatus.INTERNAL_SERVER_ERROR).message( + "Criteria serialization exception").details(msg).build(); + } + + public static GroupsException criteriaDeserializationException(final String msg) { + return GroupsException.builder().status(HttpStatus.INTERNAL_SERVER_ERROR).message( + "Criteria deserialization exception").details(msg).build(); + } + + public static GroupsException providedMembersSerializationException(final String msg) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Provided members serialization exception") + .details(msg).build(); + } + + public static GroupsException invalidProvidedMembers(final String msg) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Invalid providedMembers").details(String + .format("Unable to parse the given providedMembers. %s", msg)).build(); + } + + public static GroupsException providedMembersSingleRequestLimitViolationException(final int proposedInsertCount, + final int insertMaxLimit) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Limit exceeded").details(String.format( + "The total number of topology identifiers in the request is %s. The maximum allowed in a single request is %s.", + proposedInsertCount, insertMaxLimit)).build(); + } + + public static GroupsException providedMembersMaxLimitViolationException(final int proposedInsertCount, + final int maxLimit) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Limit exceeded").details(String.format( + "Merging topology identifiers in request to the group will result in %s members. The maximum allowed members in the static group is %s.", + proposedInsertCount, maxLimit)).build(); + } + + public static GroupsException providedMembersUpdateException(final String msg) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Provided members update exception") + .details(msg).build(); + } + + public static GroupsException invalidStatusException(final String msg) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Invalid status").details(msg).build(); + } + + public static GroupsException providedMembersRetrievalException(final String msg) { + return GroupsException.builder().status(HttpStatus.BAD_REQUEST).message("Provided members retrieval exception") + .details(msg).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsUtil.java b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsUtil.java new file mode 100644 index 0000000..9e28705 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsUtil.java @@ -0,0 +1,40 @@ +/* + * ============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.rest.controller; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE; +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.PROVIDED_MEMBERS_HREF_TEMPLATE; + +import lombok.experimental.UtilityClass; + +import org.oran.smo.teiv.api.model.OranTeivHref; + +@UtilityClass +public class GroupsUtil { + + public static OranTeivHref generateMembersHref(final String groupId) { + return OranTeivHref.builder().href(String.format(MEMBERS_HREF_TEMPLATE, groupId)).build(); + } + + public static OranTeivHref generateProvidedMembersHref(final String groupId) { + return OranTeivHref.builder().href(String.format(PROVIDED_MEMBERS_HREF_TEMPLATE, groupId)).build(); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/DynamicGroupRecord.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/DynamicGroupRecord.java new file mode 100644 index 0000000..bfd7d9d --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/DynamicGroupRecord.java @@ -0,0 +1,34 @@ +/* + * ============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.spi; + +import org.jooq.JSONB; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; + +@Value +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +public class DynamicGroupRecord extends GroupRecord { + JSONB criteria; +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupNotFoundException.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupNotFoundException.java new file mode 100644 index 0000000..4095f2b --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupNotFoundException.java @@ -0,0 +1,30 @@ +/* + * ============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.spi; + +/** + * This exception is thrown when a group doesn't exist with the given groupId. + */ +public class GroupNotFoundException extends Exception { + public GroupNotFoundException(final String msg) { + super(msg); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupRecord.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupRecord.java new file mode 100644 index 0000000..91ce852 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupRecord.java @@ -0,0 +1,36 @@ +/* + * ============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.spi; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class GroupRecord { + String id; + String groupName; + String groupType; +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupsRepository.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupsRepository.java new file mode 100644 index 0000000..e9f4a02 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/GroupsRepository.java @@ -0,0 +1,258 @@ +/* + * ============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.spi; + +import java.util.List; +import org.apache.commons.lang3.tuple.Pair; + +import org.jooq.Record; +import org.jooq.Record2; +import org.jooq.Select; + +import java.util.Map; +import java.util.Set; + +public interface GroupsRepository { + + /** + * Gets the group by given ID. + * + * @param groupId + * - group id + * @return the group record + * @throws GroupNotFoundException + * if group id doesn't exists + */ + GroupRecord getGroupById(final String groupId) throws GroupNotFoundException; + + /** + * Gets the group type by id. + * + * @param groupId + * - group id + * @return group type + * @throws GroupNotFoundException + * if group id doesn't exists + */ + String getGroupTypeById(final String groupId) throws GroupNotFoundException; + + /** + * Gets the dynamic group criteria by given group ID. + * + * @param groupId + * - group id + * @return the dynamic group criteria + * @throws GroupNotFoundException + * if group id doesn't exists + */ + String getCriteriaByGroupId(final String groupId) throws GroupNotFoundException; + + /** + * Gets all the groups by name. + * + * @param name + * - group name + * @param offset + * - number of items to skip + * @param limit + * - number of records to fetch + * @return the list of group records that matches the name along with the total count + */ + Pair, Integer> getGroupsByName(final String name, final int offset, final int limit); + + /** + * Gets all the groups. + * + * @param offset + * - number of items to skip + * @param limit + * - number of records to fetch + * @return the list of all group records along with the total count + */ + Pair, Integer> getAllGroups(final int offset, final int limit); + + /** + * Gets members of a static group. + * + * @param query + * - query to be executed + * @param offset + * - number of items to skip + * @param limit + * - number of records to fetch + * @return the list of all records along with the total count + */ + Pair, Integer> getStaticMembers(final Select> query, final int offset, + final int limit); + + /** + * Gets all topology types of a Static group. + * + * @param groupId + * - group id + * @return the list of all topology types + */ + List getTopologyTypesByGroupId(final String groupId); + + /** + * Gets all provided members of a Static group. + * + * @param groupId + * - group id + * @param offset + * - number of items to skip + * @param limit + * - number of records to fetch + * @return the list of all records along with the total count + */ + Pair, Integer> getAllProvidedMembersByGroupId(final String groupId, final int offset, final int limit); + + /** + * Gets static group details for a group by id. + * + * @param groupId + * - group id + * @return A tuple which consists of a set of all available topology types and count of all provided members ids stored + * in a group for a group by id + */ + Pair, Integer> getStaticGroupDetailsById(String groupId); + + /** + * Creates a new dynamic group. + * + * @param groupRecord + * - A {@link DynamicGroupRecord} to create + */ + void createDynamicGroup(final DynamicGroupRecord groupRecord); + + /** + * Creates a new static group. + * + * @param groupRecord + * - A {@link StaticGroupRecord} to create + */ + void createStaticGroup(final StaticGroupRecord groupRecord); + + /** + * Merges members to the existing group. + * + * @param groupId + * - group id + * @param membersToMerge + * - members to merge to the group + * @param availableTopologyType + * - set of all topology types present in a group + * @param availableProvidedMembersCount + * - count of all provided member identifiers present in a group + */ + void mergeProvidedMembersToGroup(final String groupId, final Map> membersToMerge, + final Set availableTopologyType, final int availableProvidedMembersCount); + + /** + * Removes members from the existing group. + * + * @param groupId + * - group id + * @param membersToRemove + * - members to remove from the group + * @param availableTopologyType + * - set of all topology types present in a group + */ + void removeProvidedMembersFromGroup(final String groupId, final Map> membersToRemove, + final Set availableTopologyType); + + /** + * Renames the existing group. + * + * @param groupId + * - group id + * @param newGroupName + * - new group name + * @throws GroupNotFoundException + * if group id doesn't exists + */ + void renameGroupById(final String groupId, final String newGroupName) throws GroupNotFoundException; + + /** + * Deletes the group by given id. + * + * @param groupId + * - group id + * @throws GroupNotFoundException + * if group id doesn't exists + */ + void deleteGroupById(final String groupId) throws GroupNotFoundException; + + /** + * Gets all provided members of static group by the groupId. + * + * @param groupId + * - group id + * @return a key value pair of topology type and provided member ids + * @throws GroupNotFoundException + * if group id doesn't exist + */ + StaticGroupRecord getProvidedMembersById(String groupId) throws GroupNotFoundException; + + /** + * Retrieves all members of the specified static group that are present in the network for the given topology type + * + * @param tableName + * - table name where entity is stored + * @param topologyType + * - topology type entity relates to + * @param providedMembersIds + * - provided members ids to be matched on + * @param idColumnName + * - id column name + * @return a query to select present provided members + */ + Select> createQueryForPresentProvidedMembers(String tableName, String topologyType, + List providedMembersIds, String idColumnName); + + /** + * Retrieves all members of the specified static group that are not present in the network for the given topology type + * + * @param tableName + * - table name where entity is stored + * @param topologyType + * - topology type entity relates to + * @param providedMembersIds + * - provided members ids to be matched on + * @param idColumnName + * - id column name + * @return a query to select non present provided members + */ + Select> createQueryForNotPresentProvidedMembers(String tableName, String topologyType, + List providedMembersIds, String idColumnName); + + /** + * Retrieves all members of the specified static group that are invalid in the network for the given topology type + * + * @param topologyType + * - topology type entity relates to + * @param groupId + * - group id + * @return a query to select invalid provided members + */ + Select> createQueryForProvidedMembersByTopologyType(final String groupId, + final String topologyType); +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/ProvidedMembersStatus.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/ProvidedMembersStatus.java new file mode 100644 index 0000000..36c753b --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/ProvidedMembersStatus.java @@ -0,0 +1,50 @@ +/* + * ============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.spi; + +import java.util.Optional; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import org.oran.smo.teiv.groups.rest.controller.GroupsException; + +@Getter +@RequiredArgsConstructor +public enum ProvidedMembersStatus { + PRESENT("present"), + NOT_PRESENT("not-present"), + INVALID("invalid"), + ALL(null); + + private final String value; + + public static ProvidedMembersStatus fromValue(final String value) { + return Optional.ofNullable(value).map(val -> { + for (ProvidedMembersStatus status : ProvidedMembersStatus.values()) { + if (status.value != null && status.value.equals(value)) { + return status; + } + } + throw GroupsException.invalidStatusException("Unsupported status for provided members: " + value); + }).orElse(ALL); + } +} 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 new file mode 100644 index 0000000..34870ac --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupMemberProcessor.java @@ -0,0 +1,108 @@ +/* + * ============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.spi; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.GROUP_ID_PREFIX; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.oran.smo.teiv.groups.rest.controller.GroupsException; + +@Slf4j +@Component +@RequiredArgsConstructor +public class StaticGroupMemberProcessor { + + @Value("${groups.static.provided-members-ids.insert-max-limit}") + private int insertMaxLimit; + + private final ObjectMapper objectMapper; + + public Map> groupProvidedMembers(final List providedMembersObject, final String groupId) { + Map> groupedProvidedMembers = new HashMap<>(); + JsonNode providedMembers; + try { + providedMembers = objectMapper.readValue(objectMapper.writeValueAsString(providedMembersObject), + JsonNode.class); + } catch (final JsonProcessingException ex) { + log.warn("Error while serializing the providedMembers for the static group: {}", groupId, ex); + throw GroupsException.providedMembersSerializationException(ex.getMessage()); + } + + for (final JsonNode providedMember : providedMembers) { + validateListItem(providedMember); + final Map.Entry topologyEntry = providedMember.fields().next(); + final String topologyType = topologyEntry.getKey(); + 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); + groupedProvidedMembers.computeIfAbsent(topologyType, v -> new ArrayList<>()).add(id); + } else { + throw GroupsException.invalidProvidedMembers(String.format("Invalid key/value present in %s.", + topologyIdObject)); + } + } + } + validateProvidedMembersSize(groupedProvidedMembers); + return groupedProvidedMembers; + } + + private void validateListItem(final JsonNode jsonNode) { + if (!jsonNode.isObject()) { + throw GroupsException.invalidProvidedMembers("List elements are not of the type object."); + } else if (jsonNode.isEmpty()) { + throw GroupsException.invalidProvidedMembers("Empty object present in providedMembers."); + } else if (jsonNode.size() > 1) { + throw GroupsException.invalidProvidedMembers(String.format("More than one key:value present in %s.", jsonNode)); + } + } + + private void groupIdCheck(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)); + } + } + + private void validateProvidedMembersSize(final Map> groupedProvidedMembers) { + final int totalProvidedMembersIds = groupedProvidedMembers.values().stream().mapToInt(List::size).sum(); + if (totalProvidedMembersIds > insertMaxLimit) { + throw GroupsException.providedMembersSingleRequestLimitViolationException(totalProvidedMembersIds, + insertMaxLimit); + } + } + +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupRecord.java b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupRecord.java new file mode 100644 index 0000000..16a0b94 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/StaticGroupRecord.java @@ -0,0 +1,35 @@ +/* + * ============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.spi; + +import java.util.List; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; + +@Value +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +public class StaticGroupRecord extends GroupRecord { + Map> groupedProvidedMembers; +} 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 new file mode 100644 index 0000000..b1211ca --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java @@ -0,0 +1,412 @@ +/* + * ============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.spi.impl; + +import static org.jooq.impl.DSL.count; +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.function; +import static org.jooq.impl.DSL.name; +import static org.jooq.impl.DSL.select; +import static org.jooq.impl.DSL.sum; +import static org.jooq.impl.DSL.table; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.tuple.Pair; +import org.jooq.Configuration; +import org.jooq.DSLContext; +import org.jooq.JSONB; +import org.jooq.Query; +import org.jooq.Record4; +import org.jooq.Field; +import org.jooq.Record; +import org.jooq.Select; +import org.jooq.SelectForUpdateStep; +import org.jooq.SelectJoinStep; +import org.jooq.Record2; +import org.jooq.Record3; +import org.jooq.Result; +import org.jooq.Row2; +import org.jooq.Table; +import org.jooq.impl.DSL; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.DynamicGroupRecord; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import org.oran.smo.teiv.groups.spi.GroupRecord; +import org.oran.smo.teiv.groups.spi.GroupsRepository; +import org.oran.smo.teiv.groups.spi.StaticGroupRecord; + +@Slf4j +@Repository +@RequiredArgsConstructor +@Profile("groups") +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 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 Field CRITERIA = field(name("criteria"), JSONB.class); + private static final Table STATIC_GROUPS_TABLE = table(String.format(TIES_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); + + private final DSLContext readDataDslContext; + private final DSLContext writeDataDslContext; + + @Override + public GroupRecord getGroupById(String groupId) throws GroupNotFoundException { + return Optional.ofNullable(readDataDslContext.select().from(GROUPS_TABLE).where(GROUP_ID.eq(groupId)).fetchOne( + grpRecord -> GroupRecord.builder().groupType(grpRecord.getValue("type", String.class)).groupName(grpRecord + .getValue("name", String.class)).build())).orElseThrow(() -> { + log.warn("Group with ID: {} does not exist.", groupId); + return new GroupNotFoundException(groupId); + }); + } + + @Override + @Cacheable("groupTypeByIdCache") + public String getGroupTypeById(final String groupId) throws GroupNotFoundException { + log.debug("Get group type for the group with id: {}", groupId); + return Optional.ofNullable(readDataDslContext.select(GROUP_TYPE).from(GROUPS_TABLE).where(GROUP_ID.as("id").eq( + groupId)).fetchOneInto(String.class)).orElseThrow(() -> { + log.warn("Group with ID: {} does not exist when trying to get the type.", groupId); + return new GroupNotFoundException( + "Group with ID: " + groupId + "doesn't exist when trying to get the type."); + }); + } + + @Override + public Pair, Integer> getStaticGroupDetailsById(String groupId) { + Set topologyType = new HashSet<>(); + int providedMembersCount = 0; + Record2 result = readDataDslContext.select(function("array_agg", String[].class, + TOPOLOGY_TYPE).as("topology_type"), sum(function("array_length", Integer.class, PROVIDED_MEMBERS_IDS, DSL + .inline(1))).as("provided_members_count")).from(STATIC_GROUPS_TABLE).where(GROUP_ID.eq(groupId)) + .fetchOne(); + if (result != null && result.get("topology_type") != null && result.get("provided_members_count") != null) { + topologyType = Arrays.stream(result.get("topology_type", String[].class)).collect(Collectors.toSet()); + providedMembersCount = result.get("provided_members_count", Integer.class); + } + return Pair.of(topologyType, providedMembersCount); + } + + @Override + public String getCriteriaByGroupId(final String groupId) throws GroupNotFoundException { + return Optional.ofNullable(readDataDslContext.select(CRITERIA).from(DYNAMIC_GROUPS_TABLE).where(GROUP_ID.eq( + groupId)).fetchOneInto(String.class)).orElseThrow(() -> { + log.warn("Group with ID: {} does not exist when trying to get the criteria.", groupId); + return new GroupNotFoundException(groupId); + }); + } + + @Override + public Pair, Integer> getAllGroups(final int offset, final int limit) { + log.debug("Fetch all groups"); + Select> paginatedQuery = createBasicQuery(Optional.empty(), false, limit, + offset); + Select> countQuery = createBasicQuery(Optional.empty(), true, limit, + offset); + List> results = paginatedQuery.unionAll(countQuery).fetch(); + int totalCount = results.get(results.size() - 1).get("totalCount", Integer.class); + List groupRecords = results.stream().limit((long) results.size() - 1).map(groupRecord -> groupRecord + .into(GroupRecord.class)).toList(); + return Pair.of(groupRecords, totalCount); + } + + @Override + public Pair, Integer> getGroupsByName(final String name, final int offset, final int limit) { + log.debug("Fetch groups by name: {}", name); + Select> paginatedQuery = createBasicQuery(Optional.of(name), false, limit, + offset); + Select> countQuery = createBasicQuery(Optional.of(name), true, limit, + offset); + int totalCount = Optional.ofNullable(countQuery.fetchOne()).map(totalRecord -> totalRecord.get("totalCount", + Integer.class)).orElse(0); + List groupRecords = new ArrayList<>(); + if (totalCount > 0) { + List> results = paginatedQuery.unionAll(countQuery).fetch(); + groupRecords = results.stream().limit((long) results.size() - 1).map(groupRecord -> groupRecord.into( + GroupRecord.class)).toList(); + } + return Pair.of(groupRecords, totalCount); + } + + @Override + public Pair, Integer> getStaticMembers(Select> unionQuery, int offset, int limit) { + Table unionTable = unionQuery.asTable("combined_query"); + SelectForUpdateStep> combinedQuery = readDataDslContext.select(unionTable.field( + "id", String.class), unionTable.field("topology_type", String.class), count().over().as("total_count")) + .from(unionTable).orderBy(unionTable.field("id", String.class)).limit(limit).offset(offset); + Result> result = readDataDslContext.fetch(combinedQuery); + int totalCount = result.isEmpty() ? 0 : result.get(0).get("total_count", Integer.class); + List records = new ArrayList<>(result); + return Pair.of(records, totalCount); + } + + @Override + public Pair, Integer> getAllProvidedMembersByGroupId(final String groupId, final int offset, + final int limit) { + Select> countQuery = readDataDslContext.select(DSL.val((String) null).as( + "topology_type"), DSL.val((String) null).as("id"), DSL.count(DSL.field("unnested_id")).as("total_count")) + .from(readDataDslContext.select(DSL.field("unnest(" + PROVIDED_MEMBERS_IDS.getName() + ")", String.class) + .as("unnested_id")).from(STATIC_GROUPS_TABLE).where(GROUP_ID.eq(groupId)).asTable( + "unnested_members")); + Select> paginatedQuery = readDataDslContext.select(TOPOLOGY_TYPE, field( + "unnest(" + PROVIDED_MEMBERS_IDS.getName() + ")", String.class).as("id"), DSL.val((Integer) null).as( + "total_count")).from(STATIC_GROUPS_TABLE).where(GROUP_ID.eq(groupId)).orderBy(TOPOLOGY_TYPE, field( + "id")).limit(limit).offset(offset); + Result> result = countQuery.unionAll(paginatedQuery).fetch(); + int totalCount = result.isEmpty() ? 0 : result.get(0).get("total_count", Integer.class); + List records = result.stream().skip(1).collect(Collectors.toList()); + return Pair.of(records, totalCount); + } + + @Override + public void createDynamicGroup(final DynamicGroupRecord groupRecord) { + log.debug("Create a dynamic group with name {}", groupRecord.getGroupName()); + writeDataDslContext.transaction((Configuration trx) -> { + trx.dsl().insertInto(GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(GROUP_NAME, groupRecord + .getGroupName()).set(GROUP_TYPE, groupRecord.getGroupType()).execute(); + trx.dsl().insertInto(DYNAMIC_GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(CRITERIA, groupRecord + .getCriteria()).execute(); + }); + } + + @Override + public void createStaticGroup(final StaticGroupRecord groupRecord) { + log.debug("Create a static group with name {}", groupRecord.getGroupName()); + writeDataDslContext.transaction((Configuration trx) -> { + trx.dsl().insertInto(GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(GROUP_NAME, groupRecord + .getGroupName()).set(GROUP_TYPE, groupRecord.getGroupType()).execute(); + trx.dsl().batch(insertGroupedProvidedMembers(trx, groupRecord)).execute(); + }); + } + + @Override + public void mergeProvidedMembersToGroup(final String groupId, final Map> membersToMerge, + final Set availableTopologyType, final int availableProvidedMembersCount) { + log.debug("Merging provided members to group with ID: {}", groupId); + writeDataDslContext.transaction((Configuration trx) -> trx.dsl().batch(mergeGroupedProvidedMembers(trx, groupId, + membersToMerge, availableTopologyType, availableProvidedMembersCount)).execute()); + + } + + @Override + public void removeProvidedMembersFromGroup(final String groupId, final Map> membersToRemove, + final Set availableTopologyType) { + log.debug("Removing members from group with ID: {}", groupId); + writeDataDslContext.transaction((Configuration trx) -> trx.dsl().batch(removeGroupedProvidedMembers(trx, groupId, + membersToRemove, availableTopologyType)).execute()); + } + + @Override + public void renameGroupById(final String groupId, final String newGroupName) throws GroupNotFoundException { + log.debug("Rename group with id: {} to {}", groupId, newGroupName); + final int updatedRows = writeDataDslContext.update(GROUPS_TABLE).set(GROUP_NAME, newGroupName).where(GROUP_ID.eq( + groupId)).execute(); + if (updatedRows == 0) { + log.warn("Group with ID: {} does not exist when trying to rename the group.", groupId); + throw new GroupNotFoundException( + "Group with ID: " + groupId + " does not exist when trying to rename the group."); + } + } + + @Override + public void deleteGroupById(final String groupId) throws GroupNotFoundException { + log.debug("Delete group with id: {}", groupId); + final int deletedRows = writeDataDslContext.deleteFrom(GROUPS_TABLE).where(GROUP_ID.eq(groupId)).execute(); + 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."); + } + } + + @Override + public StaticGroupRecord getProvidedMembersById(final String groupId) throws GroupNotFoundException { + final List> result = readDataDslContext.select(TOPOLOGY_TYPE, PROVIDED_MEMBERS_IDS).from( + STATIC_GROUPS_TABLE).where(field(name("id")).eq(groupId)).fetch(); + 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."); + } + final Map> groupedProvidedMembers = new HashMap<>(); + result.forEach(staticGroupRecord -> groupedProvidedMembers.put(staticGroupRecord.get(TOPOLOGY_TYPE), List.of( + staticGroupRecord.get(PROVIDED_MEMBERS_IDS)))); + return StaticGroupRecord.builder().id(groupId).groupedProvidedMembers(groupedProvidedMembers).build(); + } + + @Override + public List getTopologyTypesByGroupId(String groupId) { + return readDataDslContext.select(TOPOLOGY_TYPE).from(STATIC_GROUPS_TABLE).where(GROUP_ID.eq(groupId)).fetchInto( + String.class); + } + + @Override + public Select> createQueryForPresentProvidedMembers(String tableName, String topologyType, + List providedMembersIds, String idColumnName) { + return readDataDslContext.select(DSL.field(DSL.name(idColumnName), String.class).as("id"), DSL.inline(topologyType) + .as("topology_type")).from(DSL.table(tableName)).where(DSL.field(DSL.name(idColumnName)).in( + providedMembersIds)); + } + + @Override + public Select> createQueryForNotPresentProvidedMembers(String tableName, String topologyType, + List providedMembersIds, String idColumnName) { + Select> providedIdsQuery = readDataDslContext.select(DSL.field("id", String.class), DSL + .inline(topologyType).as("topology_type")).from(DSL.values(providedMembersIds.stream().map(id -> DSL.row(DSL + .inline(id), DSL.inline(topologyType))).toArray(Row2[]::new)).as("provided_ids", "id", + "topology_type")); + Select> existingIdsQuery = readDataDslContext.select(DSL.field(DSL.name(idColumnName), + String.class).as("id"), DSL.inline(topologyType).as("topology_type")).from(DSL.table(tableName)); + return providedIdsQuery.except(existingIdsQuery); + } + + @Override + public Select> createQueryForProvidedMembersByTopologyType(final String groupId, + final String topologyType) { + return readDataDslContext.select(DSL.val(topologyType).as("topology_type"), DSL.field( + "unnest(" + PROVIDED_MEMBERS_IDS.getName() + ")", String.class).as("id")).from(STATIC_GROUPS_TABLE).where( + GROUP_ID.eq(groupId).and(TOPOLOGY_TYPE.eq(topologyType))); + } + + /** + * Task runs every 5 hours to clear the cache used by groups repository + */ + @CacheEvict(value = { "groupTypeByIdCache" }, allEntries = true) + @Scheduled(fixedRateString = "18000000") + public void evictGroupRepositoryCache() { + log.debug("Emptying group repository cache"); + } + + private Select> createBasicQuery(Optional groupName, boolean countMode, + int limit, int offset) { + SelectJoinStep> baseQuery = readDataDslContext.select(GROUP_ID, GROUP_NAME + .as("groupName"), GROUP_TYPE.as("groupType"), DSL.val((Integer) null).as("totalCount")).from(GROUPS_TABLE); + groupName.ifPresent(s -> baseQuery.where(GROUP_NAME.eq(s))); + if (countMode) { + return readDataDslContext.select(DSL.val((String) null).as("id"), DSL.val((String) null).as("groupName"), DSL + .val((String) null).as("groupType"), DSL.selectCount().from(baseQuery.asTable()).asField("totalCount")); + } else { + return baseQuery.limit(limit).offset(offset); + } + } + + private List insertGroupedProvidedMembers(final Configuration trx, final StaticGroupRecord groupRecord) { + List insertQuery = new ArrayList<>(); + groupRecord.getGroupedProvidedMembers().forEach((key, value) -> insertQuery.add(trx.dsl().insertInto( + STATIC_GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(TOPOLOGY_TYPE, key).set(PROVIDED_MEMBERS_IDS, + value.toArray(new String[0])))); + return insertQuery; + } + + private List mergeGroupedProvidedMembers(final Configuration trx, final String groupId, + final Map> membersToMerge, final Set availableTopologyType, + final int availableProvidedMembersCount) { + final int totalCountAfterMerge = availableProvidedMembersCount + membersToMerge.values().stream().mapToInt( + List::size).sum(); + List mergeQueries = new ArrayList<>(); + if (totalCountAfterMerge <= maxLimit) { + for (Map.Entry> entry : membersToMerge.entrySet()) { + final String[] providedMembersToMerge = entry.getValue().toArray(new String[0]); + final String topologyType = entry.getKey(); + if (availableTopologyType.contains(topologyType)) { + Field updatedProvidedMembers = field( + "array(SELECT unnest(\"provided_members_ids\") UNION SELECT unnest(?::text[]))", String[].class, + (Object) providedMembersToMerge); + mergeQueries.add(trx.dsl().update(STATIC_GROUPS_TABLE).set(PROVIDED_MEMBERS_IDS, updatedProvidedMembers) + .where(GROUP_ID.eq(groupId).and(TOPOLOGY_TYPE.eq(topologyType)))); + } else { + mergeQueries.add(trx.dsl().insertInto(STATIC_GROUPS_TABLE).set(GROUP_ID, groupId).set(TOPOLOGY_TYPE, + topologyType).set(PROVIDED_MEMBERS_IDS, providedMembersToMerge)); + } + } + } else { + log.warn( + "Updating provided members for group with id: {} causing the total to exceed beyond the maximum allowed for a group which is: {}", + groupId, maxLimit); + throw GroupsException.providedMembersMaxLimitViolationException(totalCountAfterMerge, maxLimit); + } + return mergeQueries; + } + + private List removeGroupedProvidedMembers(final Configuration trx, final String groupId, + final Map> membersToRemove, final Set availableTopologyType) { + List removeQueries = new ArrayList<>(); + membersToRemove.forEach((topologyType, providedMembersToRemove) -> { + if (availableTopologyType.contains(topologyType)) { + final String[] providedMembersToMerge = providedMembersToRemove.toArray(new String[0]); + final List unavailableProvidedMember = readDataDslContext.select(field("unnest(array[?]::text[])", + String.class, (Object) providedMembersToMerge)).except(select(field( + "unnest(\"provided_members_ids\")", String.class)).from(STATIC_GROUPS_TABLE).where(GROUP_ID + .eq(groupId)).and(TOPOLOGY_TYPE.eq(topologyType))).fetchInto(String.class); + if (unavailableProvidedMember.isEmpty()) { + Field updatedProvidedMembers = field( + "array(SELECT unnest(\"provided_members_ids\") EXCEPT SELECT unnest(?::text[]))", + String[].class, (Object) providedMembersToMerge); + removeQueries.add(trx.dsl().update(STATIC_GROUPS_TABLE).set(PROVIDED_MEMBERS_IDS, + updatedProvidedMembers).where(GROUP_ID.eq(groupId).and(TOPOLOGY_TYPE.eq(topologyType)))); + } else { + log.warn( + "Updating provided members for group with id: {} failed due to unavailable provided member {} provided.", + groupId, unavailableProvidedMember); + throw GroupsException.providedMembersUpdateException(String.format( + "The specified provided members topology identifier: %s is not part of the group.", + unavailableProvidedMember)); + } + } else { + log.warn( + "Updating provided members for group with id: {} failed due to unavailable topology entity/relation {} provided.", + groupId, topologyType); + throw GroupsException.providedMembersUpdateException(String.format( + "The specified topology entity/relation: %s is not part of the group.", topologyType)); + } + }); + removeQueries.add(trx.dsl().deleteFrom(STATIC_GROUPS_TABLE).where(GROUP_ID.eq(groupId)).and(field( + "array_length(\"provided_members_ids\", 1)").isNull())); + return removeQueries; + } + +} 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 bf508e4..c2dfe53 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 @@ -25,6 +25,8 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.cloudevent.data.ParsedCloudEventData; @@ -33,6 +35,8 @@ 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; + @Component @Slf4j @Profile("ingestion") @@ -42,6 +46,7 @@ public class CreateTopologyProcessor implements TopologyProcessor { private final CloudEventParser cloudEventParser; private final CustomMetrics customMetrics; private final TiesDbOperations tiesDbOperations; + private final IngestionAuditLogger auditLogger; @Override public void process(final CloudEvent cloudEvent, final String messageKey) { @@ -49,7 +54,10 @@ public class CreateTopologyProcessor implements TopologyProcessor { stopWatch.start(); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); if (null == parsedCloudEventData) { + log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedCreateCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, + "Failed to parse the CloudEvent"); return; } parsedCloudEventData.sort(); @@ -58,21 +66,27 @@ public class CreateTopologyProcessor implements TopologyProcessor { customMetrics.incrementNumSuccessfullyParsedCreateCloudEvents(); stopWatch.start(); + final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { - tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData); + tiesDbOperations.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()); customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e + .getMessage()); return; } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e + .getMessage()); return; } stopWatch.stop(); customMetrics.incrementNumSuccessfullyPersistedCreateCloudEvents(); customMetrics.recordCloudEventCreatePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); + auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, ""); } } 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 59c9395..7112f95 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 @@ -29,6 +29,8 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jooq.DSLContext; 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.schema.EntityType; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.RelationshipDataLocation; @@ -43,6 +45,8 @@ 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; + @Component @Slf4j @AllArgsConstructor @@ -53,6 +57,7 @@ public class DeleteTopologyProcessor implements TopologyProcessor { private final TiesDbService tiesDbService; private final TiesDbOperations tiesDbOperations; private final CustomMetrics customMetrics; + private final IngestionAuditLogger auditLogger; //spotless:off @Override @@ -61,7 +66,9 @@ public class DeleteTopologyProcessor implements TopologyProcessor { stopWatch.start(); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); if (parsedCloudEventData == null) { + log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } parsedCloudEventData.sort(); @@ -99,11 +106,13 @@ public class DeleteTopologyProcessor implements TopologyProcessor { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, e.getMessage()); return; } stopWatch.stop(); customMetrics.recordCloudEventDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); customMetrics.incrementNumSuccessfullyPersistedDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, ""); } //spotless:on } 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 e2e0ea8..08858a7 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 @@ -20,11 +20,10 @@ */ package org.oran.smo.teiv.listener; -import java.util.ArrayList; -import java.util.List; import org.oran.smo.teiv.CustomMetrics; -import org.oran.smo.teiv.service.models.OperationResult; +import org.oran.smo.teiv.listener.audit.ExecutionStatus; +import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; import org.oran.smo.teiv.utils.CloudEventUtil; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -39,6 +38,8 @@ 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; + @AllArgsConstructor @Component @Profile("ingestion") @@ -49,6 +50,7 @@ public class MergeTopologyProcessor implements TopologyProcessor { private final CloudEventParser cloudEventParser; private final CustomMetrics customMetrics; private final TiesDbOperations tiesDbOperations; + private final IngestionAuditLogger auditLogger; //spotless:off @Override @@ -57,7 +59,9 @@ public class MergeTopologyProcessor implements TopologyProcessor { stopWatch.start(); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); if (null == parsedCloudEventData) { + log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent)); customMetrics.incrementNumUnsuccessfullyParsedMergeCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "Failed to parse the CloudEvent"); return; } parsedCloudEventData.sort(); @@ -66,24 +70,27 @@ public class MergeTopologyProcessor implements TopologyProcessor { customMetrics.incrementNumSuccessfullyParsedMergeCloudEvents(); stopWatch.start(); - List operationResults = new ArrayList<>(); + final String sourceAdapter = String.valueOf(cloudEvent.getSource()); try { - operationResults = tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData); + tiesDbOperations.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()); + CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); return; } catch (RuntimeException e) { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", - CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); + CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage()); return; } stopWatch.stop(); customMetrics.incrementNumSuccessfullyPersistedMergeCloudEvents(); customMetrics.recordCloudEventMergePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); + auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, ""); } //spotless:on } 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 bb3f915..d2e7704 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 @@ -25,6 +25,8 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; +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.jooq.DSLContext; @@ -44,6 +46,8 @@ import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.service.TiesDbOperations; import org.oran.smo.teiv.service.TiesDbService; +import static org.oran.smo.teiv.utils.TiesConstants.CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE; + @Component @Slf4j @AllArgsConstructor @@ -53,6 +57,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { private final ObjectMapper objectMapper; private final CustomMetrics customMetrics; private final TiesDbOperations tiesDbOperations; + private final IngestionAuditLogger auditLogger; @Override public void process(CloudEvent cloudEvent, String messageKey) { @@ -65,6 +70,8 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { } catch (IOException e) { log.error("Error while parsing the {} event.", e.getMessage()); customMetrics.incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + "Failed to parse the CloudEvent"); return; } @@ -73,6 +80,8 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { log.error("Unsupported type: {} for source-entity-delete event. Event: {}", sourceEntityDelete.type, cloudEvent); customMetrics.incrementNumReceivedCloudEventNotSupported(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + String.format("Unsupported type: %s for source-entity-delete event.", sourceEntityDelete.type)); return; } @@ -98,12 +107,16 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor { log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage()); customMetrics.incrementNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + e.getMessage()); return; } stopWatch.stop(); customMetrics.recordCloudEventSourceEntityDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos()); customMetrics.incrementNumSuccessfullyPersistedSourceEntityDeleteCloudEvents(); + auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey, + ""); } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/ExecutionStatus.java b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/ExecutionStatus.java new file mode 100644 index 0000000..1e14de6 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/ExecutionStatus.java @@ -0,0 +1,29 @@ +/* + * ============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.listener.audit; + +import lombok.Getter; + +@Getter +public enum ExecutionStatus { + SUCCESS, + FAILED +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java new file mode 100644 index 0000000..2dad952 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java @@ -0,0 +1,44 @@ +/* + * ============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.listener.audit; + +import static org.oran.smo.teiv.listener.audit.ExecutionStatus.SUCCESS; + +import org.apache.commons.lang3.StringUtils; + +import lombok.Builder; + +@Builder +public class IngestionAuditInfo { + private final ExecutionStatus status; + private final String operation; + private final String messageKey; + private final String cloudEvent; + private final String exceptionMessage; + + @Override + public String toString() { + String baseMessage = String.format("%s - %s topology. Message key: %s, CloudEvent: %s", status, StringUtils + .capitalize(operation), messageKey, cloudEvent); + + return status.equals(SUCCESS) ? baseMessage : (baseMessage + ", " + exceptionMessage); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java new file mode 100644 index 0000000..e1068a4 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java @@ -0,0 +1,44 @@ +/* + * ============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.listener.audit; + +import org.oran.smo.teiv.exposure.audit.LoggerHandler; +import org.springframework.stereotype.Component; + +import org.oran.smo.teiv.utils.CloudEventUtil; +import io.cloudevents.CloudEvent; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@AllArgsConstructor +@Component +public class IngestionAuditLogger { + + private final LoggerHandler loggerHandler; + + public void auditLog(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey, + String errorMsg) { + loggerHandler.logAuditBase(log, IngestionAuditInfo.builder().status(status).operation(operationType).messageKey( + messageKey).cloudEvent(CloudEventUtil.cloudEventToPrettyString(cloudEvent)).exceptionMessage(errorMsg) + .build().toString(), String.valueOf(cloudEvent.getSource())); + } +} 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 155eb9a..7e72446 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 @@ -28,7 +28,10 @@ public enum DataType { INTEGER, BIGINT, CONTAINER, - GEOGRAPHIC; + GEOGRAPHIC, + TIMESTAMPTZ, + BYTEA, + RELIABILITY; public static DataType fromDbDataType(final String dbDatatype) { return switch (dbDatatype.toUpperCase(Locale.US)) { @@ -38,6 +41,9 @@ public enum DataType { case "BIGINT", "INT8" -> BIGINT; case "JSONB" -> CONTAINER; case "GEOGRAPHY" -> GEOGRAPHIC; + case "TIMESTAMPTZ" -> TIMESTAMPTZ; + case "BYTEA" -> BYTEA; + case "RELIABILITY" -> RELIABILITY; 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 654f10e..dea111b 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 @@ -30,8 +30,11 @@ 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; @@ -52,11 +55,16 @@ 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; String tableName; Module module; + List attributeNames; + private static final String UPDATED_TIME = "updated_time"; @Override public String getTableName() { @@ -100,11 +108,6 @@ public class EntityType implements Persistable { return fieldList; } - public List getAttributeNames() { - return this.fields.keySet().stream().filter(field -> (!field.startsWith(REL_PREFIX) && !field.startsWith( - CONSUMER_DATA_PREFIX) && !field.equals(ID_COLUMN_NAME))).toList(); - } - /** * Gets the fully qualified name of the entity. Format - : * @@ -130,8 +133,45 @@ 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 attributeDbName) { + return getDbName(String.format(RELIABILITY_INDICATOR_COL, attributeDbName)); + } + + /** + * 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 attributeDbName) { + return getDbName(String.format(RESPONSIBLE_ADAPTER_COL, attributeDbName)); + } + + @Override + public String getMetadataColumnName() { + return getDbName(METADATA); + } + @Override 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 d9c6575..7391ecd 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 @@ -73,7 +73,7 @@ public interface Persistable { * @return the list of {@link Field} */ default List getAllFieldsWithId() { - List result = new ArrayList<>(getSpecificAttributeColumns(List.of()).keySet()); + List result = new ArrayList<>(getSpecificAttributeColumns(this.getAttributeNames()).keySet()); String fullyQuelifiedName = getFullyQualifiedName(); result.add(field(getTableName() + "." + String.format(QUOTED_STRING, getIdColumnName())).as(hashAlias( getFullyQualifiedNameWithColumnName(fullyQuelifiedName, ID_COLUMN_NAME)))); @@ -109,6 +109,8 @@ public interface Persistable { */ String getDecoratorsColumnName(); + String getMetadataColumnName(); + String getName(); /** @@ -124,4 +126,11 @@ 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 a393a05..29a3797 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 @@ -98,7 +98,7 @@ public class PostgresSchemaLoader extends SchemaLoader { } @Override - public void loadEntityTypes() { + public void loadEntityTypes() throws SchemaLoaderException { log.debug("Start loading entities"); List entityTypes = new ArrayList<>(); final String tableName = "table_name"; @@ -110,9 +110,17 @@ public class PostgresSchemaLoader extends SchemaLoader { SelectJoinStep entityInfoRecords = runMethodSafe(() -> readWriteDataDslContext.select().from(String.format( TIES_MODEL, "entity_info"))); - entityInfoRecords.forEach(entityInfoRecord -> { + for (Record entityInfoRecord : entityInfoRecords) { String name = (String) entityInfoRecord.get("name"); final String storedAt = (String) entityInfoRecord.get("storedAt"); + JSONB attributeNames = (JSONB) entityInfoRecord.get("attributeNames"); + List attributeNamesList = new ArrayList<>(); + try { + attributeNamesList = objectMapper.readValue(attributeNames.data(), List.class); + } catch (IOException e) { + log.error("Exception occurred while retrieving attribute name", e); + throw new SchemaLoaderException("Unable to load entities please check the logs for more details.", e); + } //load attributes Map fields = new HashMap<>(); @@ -123,9 +131,10 @@ public class PostgresSchemaLoader extends SchemaLoader { }); final EntityType entityType = EntityType.builder().name(name).tableName(storedAt).fields(fields).module( - SchemaRegistry.getModuleByName((String) entityInfoRecord.get("moduleReferenceName"))).build(); + SchemaRegistry.getModuleByName((String) entityInfoRecord.get("moduleReferenceName"))).attributeNames( + attributeNamesList).build(); entityTypes.add(entityType); - }); + } SchemaRegistry.initializeEntityTypes(entityTypes); log.debug("Entities initialized successfully"); @@ -163,7 +172,7 @@ public class PostgresSchemaLoader extends SchemaLoader { .relationshipStorageLocation(RelationshipDataLocation.valueOf((String) entry.get( "relationshipDataLocation"))).connectsSameEntity((Boolean) (entry.get("connectSameEntity"))) .tableName((String) entry.get("storedAt")).module(SchemaRegistry.getModuleByName((String) entry.get( - "moduleReferenceName"))).build(); + "moduleReferenceName"))).attributeNames(List.of()).build(); relationTypes.add(relationType); } 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 546bffe..4cb3c9c 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 @@ -28,7 +28,10 @@ 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 org.oran.smo.teiv.exposure.spi.Module; @@ -37,7 +40,6 @@ import java.util.List; import java.util.Map; import lombok.Builder; -import lombok.Singular; import lombok.Value; import org.jooq.Field; @@ -51,18 +53,22 @@ public class RelationType implements Persistable { private static final String REL_SOURCE_IDS_COL_PREFIX = "REL_CD_sourceIds_%s"; 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; EntityType aSide; Association bSideAssociation; EntityType bSide; - @Singular - Map attributes; boolean connectsSameEntity; RelationshipDataLocation relationshipStorageLocation; String tableName; Module module; + List attributeNames; @Override public String getTableName() { @@ -72,7 +78,7 @@ public class RelationType implements Persistable { @Override public String getIdColumnName() { if (relationshipStorageLocation.equals(RELATION)) { - return ID_COLUMN_NAME; + return getDbName(ID_COLUMN_NAME); } else { return getDbName(String.format(REL_ID_COL_PREFIX, name)); } @@ -103,6 +109,19 @@ 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. * @@ -141,6 +160,15 @@ public class RelationType implements Persistable { } } + @Override + public String getMetadataColumnName() { + if (relationshipStorageLocation.equals(RELATION)) { + return getDbName(METADATA); + } else { + return getDbName(String.format(REL_METADATA_COL_PREFIX, name)); + } + } + /** * Gets the aSide column name of the relation. * @@ -188,29 +216,33 @@ public class RelationType implements Persistable { }; } - public String getStoringSideEntityType() { + public EntityType getStoringSideEntityType() { return switch (relationshipStorageLocation) { case RELATION -> null; - case A_SIDE -> aSide.getName(); - case B_SIDE -> bSide.getName(); + case A_SIDE -> aSide; + case B_SIDE -> bSide; }; } - public String getNotStoringSideEntityType() { + public EntityType getNotStoringSideEntityType() { return switch (relationshipStorageLocation) { case RELATION -> null; - case A_SIDE -> bSide.getName(); - case B_SIDE -> aSide.getName(); + case A_SIDE -> bSide; + case B_SIDE -> aSide; }; } - public List getAttributeNames() { - // attributes are yet to be supported for relations - return List.of(); - } - @Override 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 new file mode 100644 index 0000000..ab2e3f1 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/Reliability.java @@ -0,0 +1,49 @@ +/* + * ============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.schema; + +import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; + +import org.jooq.EnumType; +import org.jooq.Schema; +import org.jooq.impl.SchemaImpl; +import jakarta.validation.constraints.NotNull; + +public enum Reliability implements EnumType { + OK, + RESTORED, + ADVISED; + + @Override + public @NotNull String getLiteral() { + return this.name(); + } + + @Override + public Schema getSchema() { + return new SchemaImpl(TIES_DATA_SCHEMA); + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } +} 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 new file mode 100644 index 0000000..8c2affd --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/schema/ResponsibleAdapter.java @@ -0,0 +1,71 @@ +/* + * ============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.schema; + +import org.oran.smo.teiv.exception.TiesException; +import lombok.Value; + +import java.nio.charset.StandardCharsets; +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; + +@Value +public class ResponsibleAdapter { + + private static final String RESPONSIBLE_ADAPTER_TABLE_NAME = String.format(TIES_DATA, getDbName(RESPONSIBLE_ADAPTER)); + + String id; + byte[] hashedId; + + public ResponsibleAdapter(String name) { + this.id = name; + this.hashedId = this.generateHashId(); + } + + public String getTableName() { + return RESPONSIBLE_ADAPTER_TABLE_NAME; + } + + public String getIdColumnName() { + return ID_COLUMN_NAME; + } + + public String getHashIdsColumnName() { + return getDbName("hashed_id"); + } + + private static MessageDigest getDigest() { + try { + return MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException exception) { + throw TiesException.serverException("Invalid Hashing algorithm", "Error while hashing alias", exception); + } + } + + private byte[] generateHashId() { + return getDigest().digest(this.id.getBytes(StandardCharsets.UTF_8)); + } +} 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 19a3532..87f5164 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 @@ -200,6 +200,26 @@ public class SchemaRegistry { }); } + /** + * Gets the {@link Persistable} by the given module name and the topology type name. + * + * @param moduleName + * - name of the module + * @param topologyTypeName + * - name of the topologyType + * @return the topology type + */ + public static Persistable getTopologyTypeByModuleAndTopologyName(final String moduleName, final String topologyTypeName) + throws SchemaRegistryException { + try { + return getEntityTypeByModuleAndName(moduleName, topologyTypeName); + } catch (SchemaRegistryException e) { + log.debug("Failed to get entity type by module: {} and topology: {}. Attempting relation type lookup.", + moduleName, topologyTypeName, e); + return getRelationTypeByModuleAndName(moduleName, topologyTypeName); + } + } + /** * Gets the list of {@link EntityType} by the given domain. * diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/SchemaCleanUpService.java b/teiv/src/main/java/org/oran/smo/teiv/service/SchemaCleanUpService.java index 3396dc8..708412d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/SchemaCleanUpService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/SchemaCleanUpService.java @@ -46,6 +46,7 @@ import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.SchemaRegistry; import org.oran.smo.teiv.service.models.OperationResult; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -55,6 +56,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor +@Profile("exposure") public class SchemaCleanUpService { private final ModelRepository modelRepository; private final DataRepository dataRepository; @@ -83,8 +85,8 @@ public class SchemaCleanUpService { log.error("Exception during [{}] schema deletion: {}", name, ex.getMessage(), ex); } } - modelRepository.deleteModuleByName(name); + log.debug("Schema {} deletion successful", name); } private boolean innerCleanUp(final String schemaName) { diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java b/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java index 2e94883..e6fa376 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/TiesDbOperations.java @@ -23,9 +23,11 @@ package org.oran.smo.teiv.service; 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.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.jooq.impl.DSL.field; import static org.jooq.impl.DSL.jsonExists; @@ -33,6 +35,8 @@ 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; @@ -43,7 +47,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.jooq.Field; +import org.jooq.JSONB; import org.oran.smo.teiv.exception.IllegalManyToManyRelationshipUpdateException; import org.oran.smo.teiv.exception.IllegalOneToManyRelationshipUpdateException; import org.jooq.Configuration; @@ -51,11 +57,12 @@ 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.schema.ResponsibleAdapter; import org.oran.smo.teiv.utils.JooqTypeConverter; import org.springframework.stereotype.Component; -import lombok.AllArgsConstructor; - import org.jooq.Record; import org.oran.smo.teiv.exception.InvalidFieldInYangDataException; @@ -77,9 +84,12 @@ import org.oran.smo.teiv.utils.TiesConstants; import org.oran.smo.teiv.utils.schema.Geography; @Component -@AllArgsConstructor +@RequiredArgsConstructor public class TiesDbOperations { + private static final Map RELIABILITY_INDICATOR_OK_MAP = Map.of(RELIABILITY_INDICATOR, Reliability.OK + .name()); + private final TiesDbService tiesDbService; private final IngestionOperationValidatorFactory ingestionOperationValidatorFactory; @@ -100,27 +110,37 @@ public class TiesDbOperations { * 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. - * @return The number of modified rows. + * @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) { + public int merge(DSLContext context, String tableName, Map values, String updatedTimeColumnName) { Map valuesToInsert = new HashMap<>(values.size()); values.forEach((key, value) -> { - if (value instanceof Geography geographyValue) { - valuesToInsert.put(key, field("'" + geographyValue + "'", OTHER)); + if ((value instanceof Geography)) { + valuesToInsert.put(key, field("'" + value + "'", OTHER)); + } else if (value instanceof Map mapValue) { + valuesToInsert.put(key, toJsonb(mapValue)); } else { valuesToInsert.put(key, value); } }); Map valuesToUpdate = new HashMap<>(valuesToInsert); valuesToUpdate.remove(ID_COLUMN_NAME); + if (valuesToUpdate.isEmpty()) { return context.insertInto(table(tableName)).set(valuesToInsert).onConflict(field(ID_COLUMN_NAME)).doNothing() - .execute(); - } else { - return context.insertInto(table(tableName)).set(valuesToInsert).onConflict(field(ID_COLUMN_NAME)).doUpdate() - .set(valuesToUpdate).execute(); + .execute() > 0 ? 0 : -1; + } + 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) { + return fetch.getValue("xmax", int.class); } + return -1; } public List deleteEntity(DSLContext context, EntityType entityType, String entityId) { @@ -151,9 +171,8 @@ public class TiesDbOperations { } else { 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())), JooqTypeConverter - .toJsonb(List.of())).where(field(String.format(QUOTED_STRING, manySideEntityIdColumn)).eq( - manySideEntityId)).execute(); + .set(field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) + .where(field(String.format(QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).execute(); return updateResult > 0 ? relationshipList : List.of(); } @@ -167,9 +186,8 @@ public class TiesDbOperations { 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())), JooqTypeConverter - .toJsonb(List.of())).where(field(String.format(QUOTED_STRING, relationType - .getIdColumnName())).eq(relationshipId)).execute(); + field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())) + .where(field(String.format(QUOTED_STRING, relationType.getIdColumnName())).eq(relationshipId)).execute(); return affectedRows > 0 ? Optional.of(OperationResult.createRelationshipOperationResult(relationshipId, relationType.getName())) : Optional.empty(); @@ -195,16 +213,18 @@ public class TiesDbOperations { Optional.empty(); } - public List executeEntityAndRelationshipMergeOperations(ParsedCloudEventData parsedCloudEventData) - throws InvalidFieldInYangDataException, MaximumCardinalityViolationException { + public List executeEntityAndRelationshipMergeOperations(ParsedCloudEventData parsedCloudEventData, + 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(); for (Entity entity : parsedCloudEventData.getEntities()) { - dbOperations.add(getEntityOperation(entity, results)); + dbOperations.add(getEntityOperation(entity, results, updateTime, respAdapterHash)); } for (Relationship relationship : parsedCloudEventData.getRelationships()) { - dbOperations.addAll(getRelationshipOperations(relationship, results)); + dbOperations.addAll(getRelationshipOperations(relationship, results, updateTime, respAdapterHash)); } dbOperations.add(dslContext -> ingestionOperationValidatorFactory.createValidator(dslContext).validate( parsedCloudEventData)); @@ -212,6 +232,16 @@ public class TiesDbOperations { return results; } + public Consumer getResponsibleAdapterOperation(ResponsibleAdapter responsibleAdapter) throws TiesException { + + Map dbMap = new HashMap<>(); + dbMap.put(responsibleAdapter.getIdColumnName(), responsibleAdapter.getId()); + dbMap.put(responsibleAdapter.getHashIdsColumnName(), responsibleAdapter.getHashedId()); + + return dslContext -> dslContext.insertInto(table(responsibleAdapter.getTableName())).set(dbMap).onConflict(field( + responsibleAdapter.getIdColumnName())).doNothing().execute(); + } + 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( @@ -219,39 +249,51 @@ public class TiesDbOperations { QUOTED_STRING, "id"))).fetch().getValues(field(String.format(QUOTED_STRING, "id"), String.class)); } - private Consumer getEntityOperation(Entity entity, List results) - throws InvalidFieldInYangDataException { + private Consumer getEntityOperation(Entity entity, List results, Timestamp updateTime, + 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()) { - DataType dataType = fieldsFromModel.get(entry.getKey()); + final String attributeName = entry.getKey(); + final String dbName = getDbName(attributeName); + DataType dataType = fieldsFromModel.get(attributeName); if (dataType == null) { throw new InvalidFieldInYangDataException(String.format( - "Received field: %s isn't a valid field of entity type: %s", entry.getKey(), entity.getType())); + "Received field: %s isn't a valid field of entity type: %s", attributeName, entity.getType())); } switch (dataType) { - case GEOGRAPHIC -> dbMap.put(getDbName(entry.getKey()), JooqTypeConverter.toGeography(entry.getValue())); - case CONTAINER -> dbMap.put(getDbName(entry.getKey()), JooqTypeConverter.toJsonb(entry.getValue())); - case PRIMITIVE, DECIMAL, INTEGER, BIGINT -> dbMap.put(getDbName(entry.getKey()), entry.getValue()); + 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()); } } dbMap.put(ID_COLUMN_NAME, entity.getId()); if (entity.getSourceIds() != null) { - dbMap.put(entityType.getSourceIdsColumnName(), JooqTypeConverter.toJsonb(entity.getSourceIds())); + dbMap.put(entityType.getSourceIdsColumnName(), toJsonb(entity.getSourceIds())); } + return dslContext -> { - int affectedRows = merge(dslContext, entityType.getTableName(), dbMap); - if (affectedRows > 0) { + int xmax = merge(dslContext, entityType.getTableName(), dbMap, entityType.getUpdatedTimeColumnName()); + 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.createEntityOperationResult(entity.getId(), entity.getType(), dbMap, entity - .getSourceIds())); + .getSourceIds(), isUpdatedInDb).setMetadata(metadata)); + } }; } - private List> getRelationshipOperations(Relationship relationship, List results) { + private List> getRelationshipOperations(Relationship relationship, List results, + Timestamp updateTime, byte[] respAdapterByteArray) { List> relationshipOperations = new ArrayList<>(); RelationType relationType = SchemaRegistry.getRelationTypeByName(relationship.getType()); RelationshipDataLocation relationshipDataLocation = relationType.getRelationshipStorageLocation(); @@ -261,9 +303,8 @@ public class TiesDbOperations { dbMap.put(relationType.aSideColumnName(), relationship.getASide()); dbMap.put(relationType.bSideColumnName(), relationship.getBSide()); if (relationship.getSourceIds() != null) { - dbMap.put(relationType.getSourceIdsColumnName(), JooqTypeConverter.toJsonb(relationship.getSourceIds())); + dbMap.put(relationType.getSourceIdsColumnName(), toJsonb(relationship.getSourceIds())); } - if (relationshipDataLocation == RELATION) { relationshipOperations.add(outer -> { try { @@ -271,7 +312,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); + createMissingEntities(outer, relationship, relationType, results, updateTime, respAdapterByteArray); mergeManyToManyRelationship(outer, relationship, results, relationType, dbMap); } else { throw e; @@ -280,14 +321,15 @@ public class TiesDbOperations { }); } else { relationshipOperations.add(dslContext -> mergeOneToManyOrOneToOneRelationship(dslContext, relationship, results, - relationType, dbMap)); + relationType, dbMap, updateTime, respAdapterByteArray)); } return relationshipOperations; } private void mergeOneToManyOrOneToOneRelationship(DSLContext dslContext, Relationship relationship, - List results, RelationType relationType, Map dbMap) { + List results, RelationType relationType, Map dbMap, Timestamp updateTime, + byte[] respAdapterByteArray) { AtomicBoolean isManySideEntityMissingAtTheBeginning = new AtomicBoolean(false); try { dslContext.dsl().transaction((Configuration nested) -> updateRelationshipInEntityTable(nested.dsl(), @@ -297,9 +339,10 @@ public class TiesDbOperations { ID_COLUMN_NAME, relationship.getStoringSideEntityId(), dslContext); if (manySideRow == null) { isManySideEntityMissingAtTheBeginning.set(true); - createMissingStoringSideEntity(dslContext, relationship, relationType); - addEntityToOperationResults(results, relationship.getStoringSideEntityId(), relationType - .getStoringSideEntityType()); + createMissingStoringSideEntity(dslContext, relationship, relationType, updateTime, + respAdapterByteArray); + addEntityToOperationResults(results, relationship.getStoringSideEntityId(), + RELIABILITY_INDICATOR_OK_MAP, relationType.getStoringSideEntityType().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse( results::add, () -> { throw new IllegalOneToManyRelationshipUpdateException(relationship, true); @@ -313,13 +356,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); - addEntityToOperationResults(results, relationship.getStoringSideEntityId(), relationType - .getStoringSideEntityType()); + createMissingStoringSideEntity(dslContext, relationship, relationType, updateTime, + respAdapterByteArray); + addEntityToOperationResults(results, relationship.getStoringSideEntityId(), + RELIABILITY_INDICATOR_OK_MAP, relationType.getStoringSideEntityType().getName()); } - createMissingNotStoringSideEntity(dslContext, relationship, relationType); - addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), relationType - .getNotStoringSideEntityType()); + createMissingNotStoringSideEntity(dslContext, relationship, relationType, updateTime, respAdapterByteArray); + addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), RELIABILITY_INDICATOR_OK_MAP, + relationType.getNotStoringSideEntityType().getName()); updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse(results::add, () -> { throw new IllegalOneToManyRelationshipUpdateException(relationship, false); @@ -338,20 +382,22 @@ public class TiesDbOperations { .getNotStoringSideEntityId())))); Map valuesToUpdate = new HashMap<>(values); valuesToUpdate.remove(ID_COLUMN_NAME); - int numberOfUpdatedRows = dslContext.update(table(relationType.getTableName())).set(valuesToUpdate).where(condition) - .execute(); - - return numberOfUpdatedRows != 0 ? - Optional.of(OperationResult.createRelationshipOperationResult(relationship)) : - Optional.empty(); + Record fetch = dslContext.update(table(relationType.getTableName())).set(valuesToUpdate).where(condition).returning( + field("xmax", int.class)).fetchOne(); + if (fetch != null) { + boolean isUpdatedInDb = fetch.getValue("xmax", int.class) != 0; + return Optional.of(OperationResult.createRelationshipOperationResult(relationship, isUpdatedInDb).setMetadata( + RELIABILITY_INDICATOR_OK_MAP)); + } + return Optional.empty(); } private void handleOneToManyRelationshipFaults(Record manySideRow, Relationship relationship, RelationType relationType) { if (relationshipMergeValidator.anotherRelationshipAlreadyExistsOnStoringSideEntity(manySideRow, relationType, relationship)) { - String manySideEntityType = relationType.getStoringSideEntityType(); + String manySideEntityType = relationType.getStoringSideEntityType().getName(); String exceptionMessage = String.format( "Another relationship with id %s of type %s already exists on entity with id %s of type %s, can't override it with new relationship with id %s", manySideRow.get(relationType.getIdColumnName()), relationType.getName(), relationship @@ -368,30 +414,37 @@ public class TiesDbOperations { String primaryKeyColumn = relationType.getIdColumnName(); Map valuesToUpdate = new HashMap<>(valuesToInsert); valuesToUpdate.remove(primaryKeyColumn); - int affectedRows = dslContext.insertInto(table(relationType.getTableName())).set(valuesToInsert).onConflict(field( + Record fetch = dslContext.insertInto(table(relationType.getTableName())).set(valuesToInsert).onConflict(field( primaryKeyColumn)).doUpdate().set(valuesToUpdate).where(field(relationType.getTableName() + "." + name( relationType.aSideColumnName())).eq(relationship.getASide()).and(field(relationType .getTableName() + "." + name(relationType.bSideColumnName())).eq(relationship.getBSide()))) - .execute(); - if (affectedRows > 0) { - results.add(OperationResult.createRelationshipOperationResult(relationship)); + .returning(field("xmax", int.class)).fetchOne(); + if (fetch != null) { + boolean isUpdatedInDb = fetch.getValue("xmax", int.class) != 0; + results.add(OperationResult.createRelationshipOperationResult(relationship, isUpdatedInDb).setMetadata( + RELIABILITY_INDICATOR_OK_MAP)); } else { throw new IllegalManyToManyRelationshipUpdateException(relationship); } } private void createMissingEntities(DSLContext dslContext, Relationship relationship, RelationType relationType, - List results) { + List results, Timestamp updateTime, byte[] respAdapterByteArray) { String aSideTableName = relationType.getASide().getTableName(); String aSideId = relationship.getASide(); String bSideTableName = relationType.getBSide().getTableName(); String bSideId = relationship.getBSide(); + String relationshipId = relationship.getId(); - if (createMissingEntity(aSideTableName, ID_COLUMN_NAME, aSideId, dslContext) == 1) { - results.add(OperationResult.createEntityOperationResult(aSideId, relationType.getASide().getName())); + if (createMissingEntity(aSideTableName, aSideId, relationshipId, dslContext, relationType.getASide(), updateTime, + respAdapterByteArray) == 1) { + results.add(OperationResult.createEntityOperationResult(aSideId, relationType.getASide().getName(), List.of( + relationshipId))); } - if (createMissingEntity(bSideTableName, ID_COLUMN_NAME, bSideId, dslContext) == 1) { - results.add(OperationResult.createEntityOperationResult(bSideId, relationType.getBSide().getName())); + if (createMissingEntity(bSideTableName, bSideId, relationshipId, dslContext, relationType.getBSide(), updateTime, + respAdapterByteArray) == 1) { + results.add(OperationResult.createEntityOperationResult(bSideId, relationType.getBSide().getName(), List.of( + relationshipId))); } } @@ -416,21 +469,24 @@ public class TiesDbOperations { return deletedIds; } - private int createMissingEntity(String entityTableName, String entityIdColumnName, String entityId, - DSLContext dslContext) { - return dslContext.insertInto(table(entityTableName)).set(field(name(entityIdColumnName)), entityId) - .onConflictDoNothing().execute(); + private int createMissingEntity(String entityTableName, String entityId, String relationshipId, DSLContext dslContext, + EntityType entityType, Timestamp updateTime, byte[] respAdapterByteArray) { + 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(); } private void createMissingNotStoringSideEntity(DSLContext dslContext, Relationship relationship, - RelationType relationType) { - createMissingEntity(relationType.getNotStoringSideTableName(), ID_COLUMN_NAME, relationship - .getNotStoringSideEntityId(), dslContext); + RelationType relationType, Timestamp updateTime, byte[] respAdapterByteArray) { + createMissingEntity(relationType.getNotStoringSideTableName(), relationship.getNotStoringSideEntityId(), + relationship.getId(), dslContext, relationType.getNotStoringSideEntityType(), updateTime, + respAdapterByteArray); } - private void createMissingStoringSideEntity(DSLContext dslContext, Relationship relationship, - RelationType relationType) { - createMissingEntity(relationType.getTableName(), ID_COLUMN_NAME, relationship.getStoringSideEntityId(), dslContext); + private void createMissingStoringSideEntity(DSLContext dslContext, Relationship relationship, RelationType relationType, + Timestamp updateTime, byte[] respAdapterByteArray) { + createMissingEntity(relationType.getTableName(), relationship.getStoringSideEntityId(), relationship.getId(), + dslContext, relationType.getStoringSideEntityType(), updateTime, respAdapterByteArray); } private Record selectColumnsByIdForUpdate(List columnNames, String tableName, String idFieldName, @@ -440,8 +496,9 @@ public class TiesDbOperations { .fetchOne(); } - private void addEntityToOperationResults(List results, String entityId, String entityType) { - OperationResult result = OperationResult.createEntityOperationResult(entityId, entityType); + private void addEntityToOperationResults(List results, String entityId, Map metadata, + String entityType) { + OperationResult result = OperationResult.createEntityOperationResult(entityId, entityType).setMetadata(metadata); if (!results.contains(result)) { results.add(result); } 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 97fcfbe..1937466 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 @@ -22,181 +22,149 @@ package org.oran.smo.teiv.service.cloudevent; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; + +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeType; import io.cloudevents.CloudEvent; -import io.cloudevents.CloudEventData; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.oran.smo.teiv.exception.InvalidRelationshipException; -import org.oran.smo.teiv.exception.YangModelException; -import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.exception.CloudEventParserException; +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.yangparser.IngestionYangParser; import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; +import org.oran.smo.yangtools.parser.data.instance.AbstractStructureInstance; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.oran.smo.yangtools.parser.data.dom.YangDataDomDocumentRoot; 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.YangParser; -import static org.oran.smo.teiv.utils.CloudEventUtil.hasInvalidCharacter; +import static org.oran.smo.teiv.utils.TiesConstants.ENTITIES; +import static org.oran.smo.teiv.utils.TiesConstants.RELATIONSHIPS; @Slf4j @Component @RequiredArgsConstructor public class CloudEventParser { - private static final String ENTITIES = "entities"; - private static final String RELATIONSHIPS = "relationships"; - private static final String ILLEGAL_CHARACTER_FOUND = "Illegal character found in relationship %s: %s"; + private final CustomMetrics customMetrics; private final ObjectMapper objectMapper; - public ParsedCloudEventData getCloudEventData(CloudEvent cloudEvent) { - final CloudEventData cloudEventData = Objects.requireNonNull(cloudEvent.getData()); - JsonNode eventPayload; - try { - eventPayload = objectMapper.readValue(cloudEventData.toBytes(), JsonNode.class); - } catch (IOException e) { - log.error("Cannot parse CloudEvent data: ", e); - return null; - } - - boolean areSidesMandatory = !cloudEvent.getType().split("\\.")[1].equals( - TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE); + @Value("${yang-data-validation.ingestion-events}") + private boolean isYangValidationEnabled; - final List entities = new ArrayList<>(); - Boolean parsedEntities = processEntities(eventPayload, entities); - if (parsedEntities.equals(Boolean.FALSE)) { + public ParsedCloudEventData getCloudEventData(final CloudEvent cloudEvent) { + try { + JsonNode eventPayload = processEventPayload(cloudEvent); + boolean areSidesMandatory = !cloudEvent.getType().split("\\.")[1].equals( + TiesConstants.CLOUD_EVENT_WITH_TYPE_DELETE); + List entities = processEntities(eventPayload, areSidesMandatory); + List relationships = processRelationships(eventPayload, areSidesMandatory); + if (entities.isEmpty() && relationships.isEmpty()) { + log.warn("CloudEvent data contains no entities and no relationships. \nEvent id: {}", cloudEvent.getId()); + } + return new ParsedCloudEventData(entities, relationships); + } catch (CloudEventParserException e) { + log.error("{}", e.getMessage()); return null; } + } - final List relationships = new ArrayList<>(); - Boolean parsedRelationship = processRelationships(eventPayload, relationships, areSidesMandatory); - if (parsedRelationship.equals(Boolean.FALSE)) { - return null; + private JsonNode processEventPayload(final CloudEvent cloudEvent) throws CloudEventParserException { + try { + if (cloudEvent == null || cloudEvent.getData() == null) { + throw CloudEventParserException.noEventData(); + } + return objectMapper.readValue(Objects.requireNonNull(cloudEvent.getData()).toBytes(), JsonNode.class); + } catch (IOException e) { + throw CloudEventParserException.eventDataReading(CloudEventUtil.cloudEventToPrettyString(cloudEvent), e); } - - return new ParsedCloudEventData(entities, relationships); } - private Boolean processEntities(JsonNode eventPayload, List entities) { + private List processEntities(final JsonNode eventPayload, final boolean areSidesMandatory) + throws CloudEventParserException { JsonNode entitiesJsonNode = eventPayload.get(ENTITIES); - if (entitiesJsonNode != null && (entitiesJsonNode.getNodeType() == JsonNodeType.ARRAY)) { + + if (entitiesJsonNode == null) { + return Collections.emptyList(); + } else if (entitiesJsonNode.getNodeType() == JsonNodeType.ARRAY) { + List entities = new ArrayList<>(); for (JsonNode entityNode : entitiesJsonNode) { - if (!parseEntities(entities, entitiesJsonNode, entityNode)) { - return false; - } + entities.addAll(parseEntities(entityNode, areSidesMandatory)); } + return entities; + } else { + throw CloudEventParserException.invalidStructure(entitiesJsonNode.toString()); } - return true; } - private boolean parseEntities(List entities, JsonNode entitiesJsonNode, JsonNode entityNode) { + private List parseEntities(final JsonNode entityNode, final boolean areSidesMandatory) + throws CloudEventParserException { + List entities = new ArrayList<>(); try { - parseEntities(entityNode, entities); - } catch (IOException | YangModelException e) { - log.error("Cannot parse entity: " + entitiesJsonNode, e); - return false; + if (isYangValidationEnabled) { + List abstractInstance = IngestionYangParser.parseData(entityNode.toString(), + areSidesMandatory, customMetrics).getStructureChildren().stream().filter(instance -> instance + .getDataDomNode() != null).toList(); + for (AbstractStructureInstance structureInstance : abstractInstance) { + entities.add(Entity.fromAbstractStructureInstance(structureInstance)); + } + } else { + IngestionYangParser.parseData(entityNode.toString()).getChildren().forEach(child -> entities.add(Entity + .fromYangDataDom(child))); + } + } catch (YangParsingException e) { + throw CloudEventParserException.entityParsing(entityNode.toString(), e); + } catch (YangValidationException e) { + throw CloudEventParserException.entityValidating(entityNode.toString(), e); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); } - return true; + + return entities; } - private Boolean processRelationships(JsonNode eventPayload, List relationships, - boolean areSidesMandatory) { + private List processRelationships(final JsonNode eventPayload, final boolean areSidesMandatory) + throws CloudEventParserException { JsonNode relationshipJsonNode = eventPayload.get(RELATIONSHIPS); - if (relationshipJsonNode != null && (relationshipJsonNode.getNodeType() == JsonNodeType.ARRAY)) { - return processRelationshipsArray(relationshipJsonNode, relationships, areSidesMandatory); - } - return true; - } - private boolean processRelationshipsArray(JsonNode relationshipJsonNode, List relationships, - boolean areSidesMandatory) { - for (JsonNode relationshipNode : relationshipJsonNode) { - try { - parseRelationships(relationshipNode, relationships, areSidesMandatory); - } catch (IOException e) { - log.error("Cannot parse relationship: " + relationshipJsonNode, e); - return false; - } catch (InvalidRelationshipException e) { - log.error("Invalid relationship: " + e); - return false; + if (relationshipJsonNode == null) { + return Collections.emptyList(); + } else if (relationshipJsonNode.getNodeType() == JsonNodeType.ARRAY) { + List relationships = new ArrayList<>(); + for (JsonNode relationshipNode : relationshipJsonNode) { + relationships.addAll(parseRelationships(relationshipNode, areSidesMandatory)); } + return relationships; + } else { + throw CloudEventParserException.invalidStructure(relationshipJsonNode.toString()); } - return true; } - private boolean processRelationshipsObject(JsonNode relationshipJsonNode, List relationships, - boolean areSidesMandatory) { + private List parseRelationships(final JsonNode relationshipNode, final boolean areSidesMandatory) + throws CloudEventParserException { + List relationships = new ArrayList<>(); try { - parseRelationships(relationshipJsonNode, relationships, areSidesMandatory); - } catch (IOException e) { - log.error("Cannot parse relationship: " + relationshipJsonNode, e); - return false; - } catch (InvalidRelationshipException e) { - log.error("Invalid relationship: " + e); - return false; - } - return true; - } - - public void parseEntities(JsonNode entitiesJsonNode, List entities) throws IOException, YangModelException { - YangDataDomDocumentRoot entityDom = YangParser.getYangDataDomDocumentRoot(entitiesJsonNode); - entityDom.getChildren().forEach(child -> { - Entity entity = new Entity(); - entity.parseObject(child); - entities.add(entity); - }); - } - - private static void validateCharactersInId(Entity entity) throws IOException { - if (hasInvalidCharacter(entity.getId())) { - throw new IOException("Illegal character found in entity id:" + entity.getId()); - } - } - - private void parseRelationships(JsonNode relationshipNode, List relationships, boolean areSidesMandatory) - throws IOException, InvalidRelationshipException { - YangDataDomDocumentRoot relDom = YangParser.getYangDataDomDocumentRoot(relationshipNode); - - for (YangDataDomNode child : relDom.getChildren()) { - Relationship relationship = new Relationship(); - relationship.parseObject(child); - if (relationship.getId() == null) { - throw new InvalidRelationshipException("Relationship is missing id! " + objectMapper.writeValueAsString( - relationship)); - } - if (areSidesMandatory && (relationship.getASide() == null || relationship.getBSide() == null)) { - throw new InvalidRelationshipException("Relationship is missing a side! " + relationship.getId()); - } - if (SchemaRegistry.getRelationTypeByName(relationship.getType()) == null) { - throw new InvalidRelationshipException("Invalid relationship type! " + relationship.getId()); - } - if (!SchemaRegistry.getModuleRegistry().containsKey(relationship.getModule())) { - throw new InvalidRelationshipException("Invalid relationship module! " + relationship.getId()); - } - String moduleName = SchemaRegistry.getRelationTypeByName(relationship.getType()).getModule().getName(); - if (!moduleName.equals(relationship.getModule())) { - log.error("Type: {} corresponding module: {}", relationship.getType(), moduleName); - throw new InvalidRelationshipException("Invalid relationship module-type pair! " + relationship.getId()); + List relationshipNodes = IngestionYangParser.parseData(relationshipNode.toString()) + .getChildren(); + for (YangDataDomNode singleNode : relationshipNodes) { + relationships.add(Relationship.fromYangDataDom(singleNode, areSidesMandatory)); } - validateCharactersInId(relationship); - relationships.add(relationship); + } catch (SchemaRegistryException | YangParsingException e) { + throw CloudEventParserException.relationshipParsing(relationshipNode.toString(), e); + } catch (YangValidationException e) { + throw CloudEventParserException.relationshipValidating(relationshipNode.toString(), e); } - } - private static void validateCharactersInId(Relationship relationship) throws IOException { - if (hasInvalidCharacter(relationship.getId())) { - throw new IOException(String.format(ILLEGAL_CHARACTER_FOUND, "id", relationship.getId())); - } - if (hasInvalidCharacter(relationship.getASide())) { - throw new IOException(String.format(ILLEGAL_CHARACTER_FOUND, "aSide", relationship.getASide())); - } - if (hasInvalidCharacter(relationship.getBSide())) { - throw new IOException(String.format(ILLEGAL_CHARACTER_FOUND, "bSide", relationship.getBSide())); - } + return relationships; } } 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 6528c06..ec5c591 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 @@ -20,23 +20,41 @@ */ package org.oran.smo.teiv.service.cloudevent.data; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.oran.smo.teiv.exception.IllegalCharacterException; +import org.oran.smo.teiv.schema.EntityType; +import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.schema.SchemaRegistryException; import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; +import org.oran.smo.yangtools.parser.data.instance.AbstractContentInstance; +import org.oran.smo.yangtools.parser.data.instance.AbstractStructureInstance; +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; +@Slf4j public class Entity extends ModuleObject { @Getter private final Map attributes; + private static final ObjectWriter objectWriter = new ObjectMapper().writer(); + public Entity(String module, String type, String id, Map attributes, List sourceIds) { super(module, type, id, sourceIds); if (attributes == null) { @@ -50,6 +68,20 @@ public class Entity extends ModuleObject { this.attributes = new HashMap<>(); } + public static Entity fromAbstractStructureInstance(final AbstractStructureInstance instance) + throws IllegalCharacterException, JsonProcessingException { + Entity entity = new Entity(); + entity.parseObjectFromValidatedInstance(instance); + validateEntityIdentifierCharacters(entity); + return entity; + } + + public static Entity fromYangDataDom(final YangDataDomNode node) { + Entity entity = new Entity(); + entity.parseObject(node); + return entity; + } + @Override public void parseObject(final YangDataDomNode node) { final String name = node.getName(); @@ -117,4 +149,102 @@ public class Entity extends ModuleObject { private String getQuotedString(final String str) { return String.format(QUOTED_STRING, str); } + + public void parseObjectFromValidatedInstance(AbstractStructureInstance instance) throws JsonProcessingException { + type = instance.getName(); + module = instance.getDataDomNode().getModuleName(); + for (AbstractStructureInstance structureInstance : instance.getStructureChildren()) { + if ("attributes".equals(structureInstance.getName())) { + try { + parseAttributes(structureInstance); + } catch (SchemaRegistryException e) { + log.error("Error parsing entity attributes for module {} and entity type name {}", module, type, e); + } + } + } + for (AbstractContentInstance contentInstance : instance.getContentChildren()) { + if ("id".equals(contentInstance.getName())) { + id = contentInstance.getValue().toString(); + } + } + instance.getContentChildren().get(0).getParent().getDataDomNode().getChildren().stream().filter(child -> "sourceIds" + .equals(child.getName())).forEach(domNode -> addSourceIds(domNode.getStringValue())); + } + + private void parseAttributes(AbstractStructureInstance structureInstance) throws JsonProcessingException, + SchemaRegistryException { + attributes.putAll(getMapFromContentChildren(structureInstance.getContentChildren())); + EntityType entityTypeByModuleAndName = SchemaRegistry.getEntityTypeByModuleAndName(module, type); + for (String attributeName : entityTypeByModuleAndName.getAttributeNames()) { + if (!attributes.containsKey(attributeName) && Objects.nonNull(structureInstance.getDataDomNode())) { + structureInstance.getDataDomNode().getChildren().stream().filter(attribute -> attribute.getName().equals( + attributeName) && Objects.isNull(attribute.getValue()) && attribute.getChildren().isEmpty()) + .forEach(attribute -> attributes.put(attributeName, attribute.getValue())); + } + } + for (AbstractStructureInstance complexAttribute : structureInstance.getStructureChildren()) { + if (complexAttribute.getDataDomNode() != null && !complexAttribute.getDataDomNode().getChildren().isEmpty()) { + attributes.put(complexAttribute.getName(), parseComplexAttributeIntoJsonString(complexAttribute)); + } + } + for (NamespaceModuleIdentifier emptyListIdentifier : structureInstance.getEmptyChildLeafListIdentifiers()) { + attributes.put(emptyListIdentifier.getIdentifier(), "[]"); + } + } + + private static String parseComplexAttributeIntoJsonString(AbstractStructureInstance complexAttribute) + throws JsonProcessingException { + Map map = getMapFromStructureInstance(complexAttribute); + return objectWriter.writeValueAsString(map); + } + + private static Map getMapFromStructureInstance(AbstractStructureInstance structureInstance) + throws JsonProcessingException { + Map map = new HashMap<>(); + map.putAll(getMapFromContentChildren(structureInstance.getContentChildren())); + for (AbstractStructureInstance structureChild : structureInstance.getStructureChildren()) { + map.put(structureChild.getName(), getMapFromStructureInstance(structureChild)); + } + return map; + } + + private static Map getMapFromContentChildren(List contentChildren) + throws JsonProcessingException { + Map returnMap = new HashMap<>(); + Map> attributesWithTypeOfArray = new HashMap<>(); + for (AbstractContentInstance contentInstance : contentChildren) { + if (isContentInstancePartOfArray(contentInstance)) { + final String key = contentInstance.getName(); + attributesWithTypeOfArray.computeIfAbsent(key, k -> new ArrayList<>()); + attributesWithTypeOfArray.get(key).add(contentInstance.getValue()); + } else { + returnMap.put(contentInstance.getName(), getAttributeValueAsJavaType(contentInstance)); + } + } + for (var entry : attributesWithTypeOfArray.entrySet()) { + returnMap.put(entry.getKey(), objectWriter.writeValueAsString(entry.getValue())); + } + return returnMap; + } + + private static boolean isContentInstancePartOfArray(AbstractContentInstance contentInstance) { + return "leaf-list".equals(contentInstance.getSchemaNode().getDomElement().getName()); + } + + private static Object getAttributeValueAsJavaType(AbstractContentInstance contentInstance) { + final String typeFromYangSchema = contentInstance.getSchemaNode().getChild(new StatementModuleAndName("YANG CORE", + "type")).getDomElement().getValue(); + return switch (typeFromYangSchema) { + case "int64" -> Long.valueOf(contentInstance.getValue().toString()); + case "uint64" -> Long.parseUnsignedLong(contentInstance.getValue().toString()); + case "decimal64" -> new BigDecimal(contentInstance.getValue().toString()); + default -> contentInstance.getValue(); + }; + } + + private static void validateEntityIdentifierCharacters(Entity entity) throws IllegalCharacterException { + if (hasInvalidCharacter(entity.getId())) { + throw IllegalCharacterException.inEntity("id", entity.getId()); + } + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Relationship.java b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Relationship.java index ed821b9..899aa2d 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Relationship.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/cloudevent/data/Relationship.java @@ -24,10 +24,15 @@ import lombok.Getter; import lombok.NoArgsConstructor; import java.util.List; +import org.oran.smo.teiv.exception.IllegalCharacterException; +import org.oran.smo.teiv.exception.InvalidRelationshipException; +import org.oran.smo.teiv.schema.SchemaRegistryException; import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; import org.oran.smo.teiv.schema.RelationType; import org.oran.smo.teiv.schema.SchemaRegistry; +import static org.oran.smo.teiv.utils.CloudEventUtil.hasInvalidCharacter; + @NoArgsConstructor public class Relationship extends ModuleObject { @@ -43,6 +48,16 @@ public class Relationship extends ModuleObject { this.bSide = bSide; } + public static Relationship fromYangDataDom(final YangDataDomNode node, final boolean areSidesMandatory) + throws SchemaRegistryException, InvalidRelationshipException, IllegalCharacterException { + Relationship relationship = new Relationship(); + relationship.parseObject(node); + validateRelationshipTypeAndModule(relationship); + validateRelationshipIdentifierCharacters(relationship); + validateRelationshipRequiredFields(relationship, areSidesMandatory); + return relationship; + } + @Override public void parseObject(final YangDataDomNode node) { final String name = node.getName(); @@ -82,4 +97,47 @@ public class Relationship extends ModuleObject { case B_SIDE -> getBSide(); }; } + + private static void validateRelationshipRequiredFields(final Relationship relationship, final boolean areSidesMandatory) + throws InvalidRelationshipException { + if (relationship.getId() == null) { + throw InvalidRelationshipException.missingId(relationship); + } + if (areSidesMandatory && (relationship.getASide() == null || relationship.getBSide() == null)) { + throw InvalidRelationshipException.missingSide(relationship); + } + if (areSidesMandatory && (relationship.getSourceIds() == null || relationship.getSourceIds().size() < 2)) { + throw InvalidRelationshipException.missingSourceIds(relationship.getId()); + } + } + + private static void validateRelationshipTypeAndModule(final Relationship relationship) + throws InvalidRelationshipException, SchemaRegistryException { + String module = relationship.getModule(); + if (!SchemaRegistry.getModuleRegistry().containsKey(module)) { + throw InvalidRelationshipException.invalidModule(relationship); + } + if (SchemaRegistry.getRelationTypeByModuleAndName(module, relationship.getType()) == null) { + throw InvalidRelationshipException.invalidType(relationship); + } + String moduleName = SchemaRegistry.getRelationTypeByModuleAndName(module, relationship.getType()).getModule() + .getName(); + if (!moduleName.equals(relationship.getModule())) { + throw InvalidRelationshipException.invalidModule(relationship); + } + + } + + private static void validateRelationshipIdentifierCharacters(final Relationship relationship) + throws IllegalCharacterException { + if (hasInvalidCharacter(relationship.getId())) { + throw IllegalCharacterException.inRelationship("id", relationship.getId()); + } + if (hasInvalidCharacter(relationship.getASide())) { + throw IllegalCharacterException.inRelationship("aSide", relationship.getASide()); + } + if (hasInvalidCharacter(relationship.getBSide())) { + throw IllegalCharacterException.inRelationship("bSide", relationship.getBSide()); + } + } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaFactory.java b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaFactory.java index 0f681f2..0167d0b 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaFactory.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaFactory.java @@ -33,6 +33,7 @@ import org.oran.smo.teiv.config.KafkaAdminConfig; import org.oran.smo.teiv.config.KafkaConfig; import org.oran.smo.teiv.config.KafkaSecurityConfig; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; @@ -47,6 +48,7 @@ import org.springframework.util.backoff.FixedBackOff; @Component @EnableKafka @RequiredArgsConstructor +@Profile({ "exposure", "ingestion" }) public class KafkaFactory { private final KafkaConfig kafkaConfig; diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java index 5eb992b..ae7d7c4 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java @@ -20,28 +20,34 @@ */ package org.oran.smo.teiv.service.kafka; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; + +import io.cloudevents.CloudEvent; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.NewTopic; import org.apache.kafka.common.KafkaException; import org.apache.kafka.common.config.TopicConfig; import org.oran.smo.teiv.config.KafkaAdminConfig; import org.oran.smo.teiv.config.KafkaConfig; import org.oran.smo.teiv.utils.RetryOperationUtils; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Profile; import org.springframework.kafka.config.TopicBuilder; import org.springframework.kafka.core.KafkaAdmin; +import org.springframework.kafka.core.KafkaTemplate; import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; @AllArgsConstructor @Component @Slf4j -@Profile("ingestion") +@Profile({ "exposure", "ingestion" }) public class KafkaTopicService { private final KafkaAdminConfig kafkaAdminConfig; @@ -52,21 +58,27 @@ public class KafkaTopicService { @Getter private final KafkaConfig kafkaConfig; + @Qualifier("topologyAuditKafkaTemplate") + private final KafkaTemplate topologyAuditkafkaTemplate; + public boolean checkTopologyIngestionTopic() { return checkTopicCreated(kafkaConfig.getTopologyIngestion().getTopicName()); } public boolean isTopicCreated(String topicName) { - try (AdminClient client = AdminClient.create(kafkaAdmin.getConfigurationProperties())) { + try (Admin client = Admin.create(kafkaAdmin.getConfigurationProperties())) { Set existingTopics = client.listTopics().names().get(); if (!existingTopics.contains(topicName)) { log.info("Topic does not exist: {}", topicName); throw new KafkaException("Topic does not exist"); } - } catch (InterruptedException | ExecutionException e) { + } catch (ExecutionException e) { log.error("Error checking if topic exists: {}", topicName, e); - Thread.currentThread().interrupt(); throw new KafkaException("Error checking if topic exists: " + topicName); + } catch (InterruptedException e) { + log.error("Error checking if topic exists: {}", topicName, e); + Thread.currentThread().interrupt(); + throw new KafkaException("Topic does not exist"); } return true; } @@ -97,10 +109,12 @@ public class KafkaTopicService { private boolean createTopologyIngestionTopic() { final KafkaConfig.TopologyIngestion topologyIngestionConfig = kafkaConfig.getTopologyIngestion(); + Map configMap = new HashMap<>(); + configMap.put(TopicConfig.RETENTION_MS_CONFIG, topologyIngestionConfig.getRetention()); + configMap.put(TopicConfig.RETENTION_BYTES_CONFIG, topologyIngestionConfig.getRetentionBytes()); + configMap.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_DELETE); NewTopic topic = TopicBuilder.name(topologyIngestionConfig.getTopicName()).partitions(topologyIngestionConfig - .getPartitions()).replicas(topologyIngestionConfig.getReplicas()).config(TopicConfig.RETENTION_MS_CONFIG, - topologyIngestionConfig.getRetention()).config(TopicConfig.CLEANUP_POLICY_CONFIG, - TopicConfig.CLEANUP_POLICY_DELETE).build(); + .getPartitions()).replicas(topologyIngestionConfig.getReplicas()).configs(configMap).build(); return createTopic(topic, topologyIngestionConfig.getTopicName()); } diff --git a/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java b/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java index 0e73c4c..38abb07 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java +++ b/teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java @@ -20,6 +20,7 @@ */ package org.oran.smo.teiv.service.models; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,11 +43,19 @@ public class OperationResult { private String bSide; private List classifiers; private Map decorators; + private Map metadata; private List sourceIds; + private boolean isUpdatedInDb; + private static final String ENTITY = "entity"; + + public static OperationResult createEntityOperationResult(String id, String type, Map attributes, + List sourceIds, boolean isUpdatedInDb) { + return new OperationResult(id, type, ENTITY, attributes, null, null, null, null, null, sourceIds, isUpdatedInDb); + } public static OperationResult createEntityOperationResult(String id, String type, Map attributes, List sourceIds) { - return new OperationResult(id, type, "entity", attributes, null, null, null, null, sourceIds); + return new OperationResult(id, type, ENTITY, attributes, null, null, null, null, null, sourceIds, false); } public static OperationResult createEntityOperationResult(String id, String type, Map attributes) { @@ -57,37 +66,42 @@ public class OperationResult { return OperationResult.createEntityOperationResult(id, type, null, null); } + public static OperationResult createEntityOperationResult(String id, String type, List sourceIds) { + return OperationResult.createEntityOperationResult(id, type, null, sourceIds); + } + public static OperationResult createEntityOperationResult(Entity entity) { return OperationResult.createEntityOperationResult(entity.getId(), entity.getType(), entity.getAttributes(), entity .getSourceIds()); } public static OperationResult createRelationshipOperationResult(String id, String type, String aSide, String bSide, - List sourceIds) { - return new OperationResult(id, type, "relationship", null, aSide, bSide, null, null, sourceIds); + List sourceIds, boolean isUpdatedInDb) { + return new OperationResult(id, type, "relationship", null, aSide, bSide, null, null, null, sourceIds, + isUpdatedInDb); } public static OperationResult createRelationshipOperationResult(String id, String type, String aSide, String bSide) { - return createRelationshipOperationResult(id, type, aSide, bSide, null); + return createRelationshipOperationResult(id, type, aSide, bSide, null, false); } public static OperationResult createRelationshipOperationResult(String id, String type) { - return OperationResult.createRelationshipOperationResult(id, type, null, null, null); + return OperationResult.createRelationshipOperationResult(id, type, null, null, null, false); } - public static OperationResult createRelationshipOperationResult(Relationship relationship) { + public static OperationResult createRelationshipOperationResult(Relationship relationship, boolean isUpdatedInDb) { return OperationResult.createRelationshipOperationResult(relationship.getId(), relationship.getType(), relationship - .getASide(), relationship.getBSide(), relationship.getSourceIds()); + .getASide(), relationship.getBSide(), relationship.getSourceIds(), isUpdatedInDb); } public static OperationResult createClassifierOperationResult(String id, String type, String category, List classifiers) { - return new OperationResult(id, type, category, null, null, null, classifiers, null, null); + return new OperationResult(id, type, category, null, null, null, classifiers, null, null, null, true); } public static OperationResult createDecoratorOperationResult(String id, String type, String category, Map decorators) { - return new OperationResult(id, type, category, null, null, null, null, decorators, null); + return new OperationResult(id, type, category, null, null, null, null, decorators, null, null, true); } @JsonIgnore @@ -97,6 +111,11 @@ public class OperationResult { @JsonIgnore public boolean isEntity() { - return getCategory().equals("entity"); + return getCategory().equals(ENTITY); + } + + public OperationResult setMetadata(Map metadata) { + this.metadata = metadata.isEmpty() ? null : new HashMap<>(metadata); + return this; } } diff --git a/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaCleanUpHandler.java b/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaCleanUpHandler.java new file mode 100644 index 0000000..affd8b2 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaCleanUpHandler.java @@ -0,0 +1,53 @@ +/* + * ============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.startup; + +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.annotation.Profile; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.teiv.exposure.spi.ModelRepository; +import org.oran.smo.teiv.service.SchemaCleanUpService; + +@Component +@Slf4j +@RequiredArgsConstructor +@Profile("exposure") +public class SchemaCleanUpHandler { + private final ModelRepository modelRepository; + private final SchemaCleanUpService schemaCleanUpService; + + /** + * Continue schema clean up at application startup. + */ + @Order(value = 15) + @EventListener(value = ApplicationReadyEvent.class) + public void cleanUpSchema() { + log.debug("Start schema clean up"); + modelRepository.getDeletingModulesOnStartup().forEach(module -> schemaCleanUpService.cleanUpModule(module + .getName())); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaHandler.java b/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaHandler.java index d88f90f..cc2b771 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaHandler.java +++ b/teiv/src/main/java/org/oran/smo/teiv/startup/SchemaHandler.java @@ -20,8 +20,9 @@ */ package org.oran.smo.teiv.startup; -import org.oran.smo.teiv.exposure.spi.ModelRepository; -import org.oran.smo.teiv.service.SchemaCleanUpService; +import org.oran.smo.teiv.exception.YangException; +import org.oran.smo.teiv.utils.yangparser.ExposureYangParser; +import org.oran.smo.teiv.utils.yangparser.IngestionYangParser; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; @@ -33,36 +34,31 @@ import org.oran.smo.teiv.schema.SchemaLoaderException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.io.IOException; + @Component @Slf4j @RequiredArgsConstructor public class SchemaHandler { private final SchemaLoader postgresSchemaLoader; private final HealthStatus healthStatus; - private final ModelRepository modelRepository; - private final SchemaCleanUpService schemaCleanUpService; /** * Loads the schema registry at application startup. + * + * @throws YangException + * + * @throws IOException */ @Order(value = 10) @EventListener(value = ApplicationReadyEvent.class) - public void initializeSchema() throws SchemaLoaderException { + public void initializeSchema() throws SchemaLoaderException, YangException { log.debug("Start schema initialization"); healthStatus.setSchemaInitialized(false); postgresSchemaLoader.loadSchemaRegistry(); log.info("Schema initialized successfully..."); + IngestionYangParser.loadModels(); + ExposureYangParser.loadAndValidateModels(); healthStatus.setSchemaInitialized(true); } - - /** - * Continue schema clean up at application startup. - */ - @Order(value = 15) - @EventListener(value = ApplicationReadyEvent.class) - public void cleanUpSchema() { - log.debug("Start schema clean up"); - modelRepository.getDeletingModulesOnStartup().forEach(module -> schemaCleanUpService.cleanUpModule(module - .getName())); - } } 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 d4ae088..6874e71 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 @@ -24,6 +24,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.jooq.JSONB; import org.jooq.tools.json.JSONArray; @@ -64,7 +65,7 @@ public class JooqTypeConverter { } /** - * Creates a jooq.JSONB object from a json formatted String. + * Creates a jooq.JSONB object from a json formatted object. * * 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, @@ -81,11 +82,24 @@ public class JooqTypeConverter { return null; } else if (value instanceof String str && isJsonObjectOrArray(str)) { return JSONB.jsonb(str); + } else if (value instanceof Map map) { + return toJsonb(objectMapper.convertValue(map, ObjectNode.class).toString()); } else { return JSONB.jsonb(makeSingleElementJsonArray(value)); } } + /** + * Creates a jooq.JSONB object from a key-value pair. + * + * @param key + * @param value + * @return The jooq.JSONB object created from the key-value pair + */ + public static JSONB toJsonb(final String key, String value) { + return JooqTypeConverter.toJsonb(objectMapper.createObjectNode().put(key, value).toString()); + } + /** * Creates a jooq.JSONB object from a List of strings. * diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/JooqUtils.java b/teiv/src/main/java/org/oran/smo/teiv/utils/JooqUtils.java new file mode 100644 index 0000000..10186e6 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/JooqUtils.java @@ -0,0 +1,70 @@ +/* + * ============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 static org.jooq.impl.DSL.field; + +import org.jooq.Field; +import org.jooq.JSONB; +import org.jooq.Record; +import org.jooq.Table; +import org.jooq.impl.DSL; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class JooqUtils { + public static Field stringField(Table table, String fieldName) { + return table.field(fieldName, String.class); + } + + public static Field jsonbField(Table table, String fieldName) { + return table.field(fieldName, JSONB.class); + } + + public static Field stringField(String fieldName) { + return field(DSL.name(fieldName), String.class); + } + + public static Field jsonbField(String fieldName) { + return field(DSL.name(fieldName), JSONB.class); + } + + public static Field byteArrayField(String fieldName) { + return field(DSL.name(fieldName), byte[].class); + } + + public static Field jsonbFieldWithKey(String columnName, String jsonbKey) { + return field("{0} ->> {1}", String.class, DSL.name(columnName), DSL.inline(jsonbKey)); + } + + public static Field totalCount() { + return DSL.count().over().as("total_count"); + } + + public static Field valueField(String value) { + return DSL.val(value); + } + + public static Table tableName(String tableName) { + return DSL.table(tableName); + } +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java b/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java index 99c3d8b..c278d4e 100644 --- a/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/TiesConstants.java @@ -24,11 +24,16 @@ import lombok.experimental.UtilityClass; @UtilityClass public class TiesConstants { + public static final String ENTITIES = "entities"; + public static final String RELATIONSHIPS = "relationships"; public static final String API_VERSION = "v1alpha11"; public static final String REQUEST_MAPPING = "/topology-inventory/" + API_VERSION; + 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"; @@ -36,11 +41,16 @@ public class TiesConstants { public static final String ST_TO_STRING_COLUMN_WITH_TABLE_NAME = "ST_AsText(%s)"; public static final String QUOTED_STRING = "\"%s\""; public static final String ID_COLUMN_NAME = "id"; + public static final String HASHED_ID_COLUMN_NAME = "hashed_id"; public static final String CONSUMER_DATA_PREFIX = "CD_"; public static final String SOURCE_IDS = "sourceIds"; public static final String CLASSIFIERS = "classifiers"; 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"; @@ -67,4 +77,9 @@ public class TiesConstants { public static final String DOT_SEPARATION = "%s.%s"; public static final String WILDCARD = "*"; public static final String INVALID_SCHEMA = "Invalid schema"; + public static final String RELIABILITY_INDICATOR = "reliabilityIndicator"; + + 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"; } 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/TiesPathUtil.java index 9af63f2..b94bc5e 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/TiesPathUtil.java @@ -29,7 +29,10 @@ import org.antlr.v4.runtime.CommonTokenStream; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class TiesPathUtil { - + /** + * @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); 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/TiesPathException.java index e27e91e..a977a44 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/TiesPathException.java @@ -24,7 +24,6 @@ import lombok.Getter; import org.springframework.http.HttpStatus; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -35,7 +34,6 @@ public class TiesPathException extends RuntimeException { private final String details; private final HttpStatus httpStatus; private final transient List response; - private static final List defaultResponse = Collections.emptyList(); public static TiesPathException invalidRelationshipName(final String relationship) { return clientException("Invalid relationship name", String.format("%s is not a known relationship", relationship)); @@ -117,6 +115,10 @@ public class TiesPathException extends RuntimeException { "%s did not match any topology objects in the given domain", leaf)); } + public static TiesPathException invalidMetadaFilter(String leaf) { + return clientException("Invalid metadata content", String.format("%s is not a valid metadata", leaf)); + } + public static TiesPathException ambiguousTopologyObject(String topologyObject) { return clientException("Invalid topology object", String.format( "%s is ambiguous, %s matches multiple topology object types", topologyObject, topologyObject)); @@ -145,6 +147,14 @@ public class TiesPathException extends RuntimeException { return clientException("Invalid query condition", details); } + public static TiesPathException invalidQueryFunction() { + return clientException("Invalid query condition", "Unknown or unexpected query function"); + } + + public static TiesPathException invalidTopologyObjectType() { + return clientException("Invalid query condition", "Invalid topology object type"); + } + private TiesPathException(final String message, final String details, final HttpStatus httpStatus, final List response) { this.message = message; 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 6fafdcf..d89b1f9 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 @@ -22,49 +22,77 @@ package org.oran.smo.teiv.utils.schema; import java.io.IOException; -import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; @Data -@EqualsAndHashCode @AllArgsConstructor +@RequiredArgsConstructor public class Geography { private static final ObjectMapper objectMapper = new ObjectMapper(); + @NonNull private Double latitude; + @NonNull private Double longitude; + private Double height; /** * Creates a Geography object from a standard (RFC 9179) YANG geo-location type. - * Only "latitude" and "longitude" fields are supported. All other fields in the json are ignored. + * The "latitude" and "longitude" fields, are mandatory. + * Optionally, it also supports the "height" field if provided in the JSON. + * All other fields in the json are ignored. * * @param json - * A json that conforms to the "RFC 9179: A YANG Grouping for Geographic Location" standard. + * 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. */ - public Geography(String json) throws IOException { - JsonParser jsonParser = objectMapper.readTree(json).traverse(); + public Geography(final String json) throws IOException { + JsonNode rootNode = objectMapper.readTree(json); - while (jsonParser.nextToken() != null) { - if ("latitude".equals(jsonParser.currentName())) { - latitude = jsonParser.getDoubleValue(); - } else if ("longitude".equals(jsonParser.currentName())) { - longitude = jsonParser.getDoubleValue(); + JsonNode latitudeNode = findNode(rootNode, "latitude"); + JsonNode longitudeNode = findNode(rootNode, "longitude"); + + if (isValidNumber(latitudeNode) && isValidNumber(longitudeNode)) { + latitude = latitudeNode.asDouble(); + longitude = longitudeNode.asDouble(); + JsonNode heightNode = findNode(rootNode, "height"); + if (isValidNumber(heightNode)) { + height = heightNode.asDouble(); } - if (latitude != null && longitude != null) { - return; + } else { + throw new IOException("Cannot find latitude, longitude fields in json: " + json); + } + } + + private boolean isValidNumber(JsonNode node) { + return node != null && node.isNumber(); + } + + private JsonNode findNode(final JsonNode node, final String fieldName) { + if (node.has(fieldName)) { + return node.get(fieldName); + } + for (JsonNode child : node) { + JsonNode found = findNode(child, fieldName); + if (found != null) { + return found; } } - throw new IOException("Cannot find latitude and longitude fields in json: " + json); + return null; } @Override public String toString() { - return "POINT(" + latitude + " " + longitude + ")"; + return (height == null) ? + String.format("POINT(%s %s)", latitude, longitude) : + String.format("POINT Z (%s %s %s)", latitude, longitude, height); } - } 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 new file mode 100644 index 0000000..32f6119 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java @@ -0,0 +1,139 @@ +/* + * ============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.yangparser; + +import static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TiesConstants.SEMICOLON_SEPARATION; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.springframework.web.multipart.MultipartFile; + +import org.oran.smo.yangtools.parser.ParserExecutionContext; +import org.oran.smo.yangtools.parser.YangDeviceModel; +import org.oran.smo.yangtools.parser.findings.FindingFilterPredicate; +import org.oran.smo.yangtools.parser.findings.ModuleAndFindingTypeAndSchemaNodePathFilterPredicate; +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.YangParsingException; +import org.oran.smo.teiv.exception.YangSchemaException; + +public class ExposureYangParser extends YangModelLoader { + private static final List yangModelInputs = new CopyOnWriteArrayList<>(); + + private static final Set FILTER_PREDICATES = Set.of( + ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("ietf-*;*;*"), + ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("_3gpp*;*;*")); + + public static void loadAndValidateModels() throws YangSchemaException { + ParserExecutionContext context = createParserExecutionContext(List.of(), List.of(), FILTER_PREDICATES); + context.setFailFast(false); + final List yangModels = YangModelLoader.loadModulesFromSchemaRegistry(); + List models = YangModelLoader.parseModelsIntoContext(context, yangModels); + yangModelInputs.clear(); + yangModelInputs.addAll(models); + } + + public static Map validateSchemasYang(final MultipartFile file) throws YangParsingException { + ParserExecutionContext context = createParserExecutionContext(List.of(), List.of(), FILTER_PREDICATES); + context.setFailFast(false); + + List localYangModelInputs = new ArrayList<>(); + YangModel inputYangModel = executeIOOperation(() -> new YangModel(new ByteArrayYangInput(file.getBytes(), + "requestYang"), ConformanceType.IMPORT)); + localYangModelInputs.add(inputYangModel); + localYangModelInputs.addAll(yangModelInputs); + + new YangDeviceModel("R1 Schema validation model").parseIntoYangModels(context, localYangModelInputs); + + Map result = new ConcurrentHashMap<>(); + result.put("classifiers", getClassifiers(inputYangModel.getYangDomDocumentRoot().getChildren().get(0).getChildren(), + findPrefixName(inputYangModel))); + result.put("decorators", getDecorators(inputYangModel.getYangDomDocumentRoot().getChildren().get(0).getChildren())); + result.put("moduleName", inputYangModel.getModuleIdentity().getModuleName()); + result.put("revision", inputYangModel.getModuleIdentity().getRevision()); + return result; + } + + private static String findPrefixName(YangModel yangModel) { + return yangModel.getYangDomDocumentRoot().getChildren().get(0).getChildren().stream().filter(child -> child + .getValue().contains("common-yang-types")).findFirst().map(child -> child.getChildren().get(0).getValue()) + .orElse(null); + } + + private static List getClassifiers(List elements, String prefixName) { + + List result = new ArrayList<>(); + String formattedName = String.format(SEMICOLON_SEPARATION, prefixName, CLASSIFIERS); + + elements.stream().filter(element -> element.getName().contains("identity")).forEach(element -> { + String childValue = element.getChildren().get(0).getValue(); + String classifier; + if (!childValue.equals(formattedName)) { + List domElement = element.getParentElement().getChildren().stream().filter(parent -> parent + .getName().contains("identity")).filter(parent -> parent.getValue().equals(childValue) && parent + .getChildren().get(0).getValue().equals(formattedName)).toList(); + + if (domElement.isEmpty()) { + throw TiesException.invalidSchema("Invalid classifier " + element.getValue()); + } else { + classifier = element.getValue(); + } + } else { + classifier = element.getValue(); + } + if (result.contains(classifier)) { + throw TiesException.duplicateEntryForClassifiers(classifier); + } else { + result.add(classifier); + } + }); + return result; + } + + private static Map getDecorators(final List elements) { + Map resultMap = new HashMap<>(); + elements.stream().filter(key -> key.getValue().contains("decorators")).flatMap(key -> key.getChildren().stream()) + .forEach(yangDomElement -> { + String key = yangDomElement.getValue(); + String value = switch (yangDomElement.getChildren().get(0).getValue()) { + case "string" -> "TEXT"; + case "boolean" -> "BOOLEAN"; + case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT"; + default -> throw TiesException.invalidFileInput("Invalid data type"); + }; + if (resultMap.putIfAbsent(key, value) != null) { + throw TiesException.duplicateEntryForDecorators(key); + } + }); + return resultMap; + } + +} diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java new file mode 100644 index 0000000..76ba229 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java @@ -0,0 +1,105 @@ +/* + * ============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.yangparser; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.oran.smo.yangtools.parser.ParserExecutionContext; +import org.oran.smo.yangtools.parser.YangDeviceModel; +import org.oran.smo.yangtools.parser.data.YangData; +import org.oran.smo.yangtools.parser.data.dom.YangDataDomDocumentRoot; +import org.oran.smo.yangtools.parser.data.instance.DataTreeBuilderPredicate; +import org.oran.smo.yangtools.parser.data.instance.RootInstance; +import org.oran.smo.yangtools.parser.findings.Finding; +import org.oran.smo.yangtools.parser.findings.FindingFilterPredicate; +import org.oran.smo.yangtools.parser.findings.ModuleAndFindingTypeAndSchemaNodePathFilterPredicate; +import org.oran.smo.yangtools.parser.input.BufferedStreamYangInput; +import org.oran.smo.yangtools.parser.input.DirectYangInputResolver; +import org.oran.smo.yangtools.parser.input.YangInput; +import org.oran.smo.yangtools.parser.model.YangModel; +import org.oran.smo.yangtools.parser.model.statements.StatementClassSupplier; +import org.oran.smo.yangtools.parser.model.statements.ietf.IetfExtensionsClassSupplier; +import org.oran.smo.yangtools.parser.model.statements.threegpp.ThreeGppExtensionsClassSupplier; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.exception.YangParsingException; +import org.oran.smo.teiv.exception.YangSchemaException; +import org.oran.smo.teiv.exception.YangValidationException; + +public class IngestionYangParser extends YangModelLoader { + private static final List yangModelInputs = new CopyOnWriteArrayList<>(); + + private static final Set FILTER_PREDICATES = Set.of( + ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("ietf-*;*;*"), + ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("_3gpp*;*;*")); + + private static final List EXTENSION_CREATORS = List.of(new IetfExtensionsClassSupplier(), + new ThreeGppExtensionsClassSupplier()); + + public static void loadModels() throws YangSchemaException, YangValidationException { + ParserExecutionContext context = createParserExecutionContext(EXTENSION_CREATORS, List.of(), FILTER_PREDICATES); + final List yangModels = YangModelLoader.loadModulesFromSchemaRegistry(); + List models = YangModelLoader.parseModelsIntoContext(context, yangModels); + yangModelInputs.clear(); + yangModelInputs.addAll(models); + } + + public static YangDataDomDocumentRoot parseData(final String data) throws YangParsingException, + YangValidationException { + ParserExecutionContext context = createParserExecutionContext(List.of(), List.of(), Set.of( + ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("ietf-*;*;*"))); + context.setFailFast(false); + + InputStream inputStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)); + YangInput yangInput = executeIOOperation(() -> new BufferedStreamYangInput("yang-topology", inputStream, + YangInput.MEDIA_TYPE_YANG_DATA_JSON)); + YangData yangData = new YangData(yangInput); + yangData.parse(context); + + YangDataDomDocumentRoot yangDataDomDocument = yangData.getYangDataDomDocumentRoot(); + final Set findings = yangDataDomDocument.getFindings(); + if (!findings.isEmpty()) { + throw YangValidationException.validationFailed(findings); + } + + return yangDataDomDocument; + } + + public static synchronized RootInstance parseData(final String data, final boolean areSidesAndSourceIdsMandatory, + CustomMetrics customMetrics) throws YangParsingException, YangValidationException { + ParserExecutionContext context = createParserExecutionContext(EXTENSION_CREATORS, List.of(), FILTER_PREDICATES); + + InputStream inputStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)); + YangInput yangInput = executeIOOperation(() -> new BufferedStreamYangInput("yang-topology", inputStream, + YangInput.MEDIA_TYPE_YANG_DATA_JSON)); + List localYangModelInputs = List.copyOf(yangModelInputs); + YangDeviceModel yangDeviceModel = new YangDeviceModel("YangDeviceModel to parse into"); + yangDeviceModel.parseIntoYangModels(context, localYangModelInputs); + yangDeviceModel.parseYangData(context, new DirectYangInputResolver(Set.of(yangInput)), + DataTreeBuilderPredicate.ALLOW_ALL); + + return yangDeviceModel.getCombinedInstanceDataRoot(); + } +} 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 new file mode 100644 index 0000000..14d02bd --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangFindingsManager.java @@ -0,0 +1,144 @@ +/* + * ============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.yangparser; + +import static org.oran.smo.teiv.utils.TiesConstants.INVALID_SCHEMA; +import static org.oran.smo.teiv.utils.TiesConstants.SCHEMA_ALREADY_EXISTS; + +import java.util.HashSet; +import java.util.Set; + +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.yangtools.parser.findings.Finding; +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.YangValidationException; + +@Slf4j +class YangFindingsManager { + private static final String SCHEMA_NODE_NOT_FOUND_CODE = "P075_CORRESPONDING_SCHEMA_NODE_NOT_FOUND"; + private static final String NULL_VALUE_CODE = "P080_NULL_VALUE"; + private static final String WRONG_ENCODING_CODE = "D710_WRONG_ENCODING"; + private static final String CARDINALITY_VIOLATION_CODE = "D712_CARDINALITY_VIOLATION"; + + private static final String UNSPECIFIED_ERROR = "UNSPECIFIED_ERROR"; + + private static final String ATTRIBUTES_MSG = "/attributes/"; + private static final String SOURCE_IDS_MSG = "/sourceIds'"; + private static final String SOURCE_IDS_IN_DELETE_MSG = "'sourceIds'"; + private static final String NUMERIC_TYPE_ENCODING_REGEX = "(int64|uint64|decimal64) values must be encoded as strings in JSON\\."; + + private YangFindingsManager() { + } + + private static FindingSeverity calculateSeverity(FindingSeverityCalculator severityCalculator, final Finding finding, + final boolean areSidesAndSourceIdsMandatory) { + String findingType = finding.getFindingType(); + String findingMsg = finding.getMessage(); + FindingSeverity severity = severityCalculator.calculateSeverity(findingType); + switch (findingType) { + case SCHEMA_NODE_NOT_FOUND_CODE: + if (findingMsg.contains(SOURCE_IDS_MSG)) { + severity = FindingSeverity.SUPPRESS; + } else if (findingMsg.contains(ATTRIBUTES_MSG)) { + severity = FindingSeverity.WARNING; + } + break; + case NULL_VALUE_CODE: + if (findingMsg.contains(ATTRIBUTES_MSG)) { + severity = FindingSeverity.WARNING; + } + break; + case WRONG_ENCODING_CODE: + if (findingMsg.matches(".*" + NUMERIC_TYPE_ENCODING_REGEX + ".*")) { + severity = FindingSeverity.SUPPRESS; + } + break; + case CARDINALITY_VIOLATION_CODE: + if (!areSidesAndSourceIdsMandatory && findingMsg.contains(SOURCE_IDS_IN_DELETE_MSG)) { + severity = FindingSeverity.SUPPRESS; + } + break; + default: + break; + } + return severity; + } + + protected static void handleExposureFindings(FindingsManager findingsManager) { + FindingSeverityCalculator severityCalculator = findingsManager.getFindingSeverityCalculator(); + for (Finding finding : findingsManager.getAllFindings()) { + if (isErrorFinding(severityCalculator, finding)) { + if (isInvalidSchemaFinding(finding)) { + throw TiesException.invalidFileInput(INVALID_SCHEMA); + } else if (finding.getFindingType().contains("P044_SAME_MODULE_IMPLEMENTS_AND_IMPORTS")) { + throw TiesException.invalidFileInput(SCHEMA_ALREADY_EXISTS); + } else { + throw TiesException.invalidFileInput(finding.getMessage()); + } + } + } + } + + protected static void handleIngestionFindings(FindingsManager findingsManager, + final boolean areSidesAndSourceIdsMandatory, CustomMetrics customMetrics) throws YangValidationException { + Set findings = new HashSet<>(); + for (Finding finding : findingsManager.getAllFindings()) { + switch (calculateSeverity(findingsManager.getFindingSeverityCalculator(), finding, + areSidesAndSourceIdsMandatory)) { + case ERROR: + findings.add(finding); + break; + case WARNING: + if (isIgnorableAttributeFinding(finding) && customMetrics != null) { + customMetrics.incrementNumIgnoredAttributes(); + } + log.warn("Warning: {}", finding.getMessage()); + break; + case INFO: + log.info(finding.getMessage()); + break; + default: + break; + } + } + + if (!findings.isEmpty()) { + throw YangValidationException.validationFailed(findings); + } + } + + private static boolean isErrorFinding(FindingSeverityCalculator severityCalculator, final Finding finding) { + return severityCalculator.calculateSeverity(finding.getFindingType()).equals(FindingSeverity.ERROR); + } + + private static boolean isIgnorableAttributeFinding(final Finding finding) { + return finding.getFindingType().equals(SCHEMA_NODE_NOT_FOUND_CODE) && finding.getMessage().contains(ATTRIBUTES_MSG); + } + + private static boolean isInvalidSchemaFinding(final Finding finding) { + return finding.getMessage().contains("exception") || finding.getFindingType().contains(UNSPECIFIED_ERROR); + } +} 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 new file mode 100644 index 0000000..7bf5b06 --- /dev/null +++ b/teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java @@ -0,0 +1,115 @@ +/* + * ============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.yangparser; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import org.oran.smo.yangtools.parser.CustomProcessor; +import org.oran.smo.yangtools.parser.ParserExecutionContext; +import org.oran.smo.yangtools.parser.YangDeviceModel; +import org.oran.smo.yangtools.parser.findings.FindingFilterPredicate; +import org.oran.smo.yangtools.parser.findings.FindingsManager; +import org.oran.smo.yangtools.parser.findings.ModifyableFindingSeverityCalculator; +import org.oran.smo.yangtools.parser.input.StringYangInput; +import org.oran.smo.yangtools.parser.model.ConformanceType; +import org.oran.smo.yangtools.parser.model.YangModel; +import org.oran.smo.yangtools.parser.model.statements.StatementClassSupplier; +import org.oran.smo.teiv.exception.YangParsingException; +import org.oran.smo.teiv.exception.YangSchemaException; +import org.oran.smo.teiv.exposure.spi.Module; +import org.oran.smo.teiv.schema.SchemaRegistry; + +public abstract class YangModelLoader { + private static final Set MODULES_TO_IMPORT = Set.of("_3gpp-common-yang-extensions", "_3gpp-common-yang-types", + "ietf-geo-location", "ietf-inet-types", "ietf-yang-types"); + + private static final Set MODULES_TO_IMPLEMENT = Set.of("o-ran-smo-teiv-common-yang-extensions", + "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran", + "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-rel-oam-ran"); + + public static ParserExecutionContext createParserExecutionContext(List extensions, + List customProcessors, Set filterPredicates) { + FindingsManager findingsManager = new FindingsManager(new ModifyableFindingSeverityCalculator()); + ParserExecutionContext context = new ParserExecutionContext(findingsManager, extensions, customProcessors); + filterPredicates.forEach(findingsManager::addFilterPredicate); + context.setIgnoreImportedProtocolAccessibleObjects(true); + return context; + } + + public static List loadModulesFromSchemaRegistry() throws YangSchemaException { + Map modules = SchemaRegistry.getModuleRegistry(); + if (modules == null) { + throw YangSchemaException.failedToLoadSchema(); + } + List implementList = new ArrayList<>(); + List importList = new ArrayList<>(); + modules.values().stream().filter(module -> module.getContent() != null).forEach(module -> { + String content = new String(Base64.getDecoder().decode(module.getContent()), StandardCharsets.UTF_8); + if (MODULES_TO_IMPORT.contains(module.getName())) { + importList.add(content); + } else if (MODULES_TO_IMPLEMENT.contains(module.getName())) { + implementList.add(content); + } + }); + return createYangModels(importList, implementList); + } + + public static List parseModelsIntoContext(ParserExecutionContext context, List yangModelInputs) + throws YangSchemaException { + if (yangModelInputs.isEmpty()) { + throw YangSchemaException.failedToLoadModels(); + } + new YangDeviceModel("Schema validation model").parseIntoYangModels(context, yangModelInputs); + return yangModelInputs; + } + + public static List createYangModels(List importList, List implementList) { + List yangModelInputs = new ArrayList<>(); + yangModelInputs.addAll(createYangModels(importList, ConformanceType.IMPORT)); + yangModelInputs.addAll(createYangModels(implementList, ConformanceType.IMPLEMENT)); + return yangModelInputs; + } + + private static List createYangModels(List resources, ConformanceType conformanceType) { + return resources.stream().map(resource -> new YangModel(new StringYangInput(resource, "", + "application/yang-data+json"), conformanceType)).filter(Objects::nonNull).toList(); + } + + public static T executeIOOperation(IOSupplier operation) throws YangParsingException { + try { + return operation.get(); + } catch (IOException e) { + throw YangParsingException.failedIOExecution(e); + } + } + + @FunctionalInterface + public interface IOSupplier { + T get() throws IOException; + } +} diff --git a/teiv/src/main/resources/application.yaml b/teiv/src/main/resources/application.yaml index f75a41a..40b8ca0 100644 --- a/teiv/src/main/resources/application.yaml +++ b/teiv/src/main/resources/application.yaml @@ -54,6 +54,8 @@ management: enabled: "true" spring: + profiles: + active: exposure datasource: read: jdbc-url: ${SERVICE_DB_REPLICA_URL:jdbc:postgresql://dbpostgresql:5432/topology_exposure_db} @@ -146,4 +148,13 @@ database: retry-policies: deadlock: retry-attempts: 10 - retry-backoff-ms: 200 \ No newline at end of file + retry-backoff-ms: 200 + +groups: + static: + provided-members-ids: + max-limit: 25000 + insert-max-limit: 2000 + +yang-data-validation: + ingestion-events: true \ No newline at end of file diff --git a/teiv/src/main/resources/logback-json.xml b/teiv/src/main/resources/logback-json.xml index 3db898e..358fb2a 100644 --- a/teiv/src/main/resources/logback-json.xml +++ b/teiv/src/main/resources/logback-json.xml @@ -21,34 +21,27 @@ --> - + - + version 1.2.0 - timestamp - - - - user - - - true - - { - "service_id": "${SERVICE_ID:-unknown}", - "message": "%msg" - } - - + + timestamp + yyyy-MM-dd'T'HH:mm:ss.SSSZ + + + user true { - "facility": "%X{facility}", - "subject": "%X{subject}", + "service_id": "${SERVICE_ID:-unknown}", + "message": "%msg", + "facility": "%X{facility}", + "subject": "%X{subject}", "extra_data": { "logger": "%logger", "thread_info": { @@ -64,7 +57,7 @@ } - + diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-cloud.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-cloud.yang index ee41dc1..34ade3b 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-cloud.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-cloud.yang @@ -38,6 +38,12 @@ module o-ran-smo-teiv-cloud { SPDX-License-Identifier: Apache-2.0"; + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology objects."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-02" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -54,6 +60,7 @@ module o-ran-smo-teiv-cloud { description "A RAN Network Function software that is deployed in the O-Cloud via one or more NF Deployments."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -68,6 +75,7 @@ module o-ran-smo-teiv-cloud { description "A software deployment on O-Cloud resources that realizes, all or part of, a Cloudified NF."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -83,6 +91,7 @@ module o-ran-smo-teiv-cloud { groups of resources within a single cluster."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -97,6 +106,7 @@ module o-ran-smo-teiv-cloud { description "A NodeCluster manages a collection of Nodes."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -112,6 +122,7 @@ module o-ran-smo-teiv-cloud { hosts the NF Deployment."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -128,6 +139,7 @@ module o-ran-smo-teiv-cloud { or-teiv-yext:biDirectionalTopologyRelationship CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT { // 1 to 1..n uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list comprised-nFDeployment { @@ -148,6 +160,7 @@ module o-ran-smo-teiv-cloud { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE { // 1..n to 1..n uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list deployed-on-ocloudNamespace { @@ -168,6 +181,7 @@ module o-ran-smo-teiv-cloud { or-teiv-yext:biDirectionalTopologyRelationship OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER { // 1..n to 1 uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf deployed-on-nodeCluster { @@ -188,6 +202,7 @@ module o-ran-smo-teiv-cloud { or-teiv-yext:biDirectionalTopologyRelationship NODECLUSTER_LOCATED_AT_OCLOUDSITE { // 1..n to 1..n uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list located-at-ocloudSite { 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 ba20e1a..57a4a30 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 @@ -7,30 +7,36 @@ module o-ran-smo-teiv-common-yang-types { import _3gpp-common-yang-types { prefix types3gpp; } - organization "ORAN"; - contact "The Authors"; - description - "Topology and Inventory common types model + organization "ORAN"; + contact "The Authors"; + description + "Topology and Inventory common types model - This model contains re-usable data types that topology and inventory models - will frequently use as part of types and relationships. + This model contains re-usable data types that topology and inventory models + will frequently use as part of types and relationships. - Copyright (C) 2024 Ericsson - Modifications Copyright (C) 2024 OpenInfra Foundation Europe + 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 + 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 + 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. + 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"; + SPDX-License-Identifier: Apache-2.0"; + + revision "2024-10-04" { + description "Added Origin_Entity_Mapping_Grp and Origin_Relationship_Mapping_Grp + for sourceIds and reliabilityIndicator to metadata."; + or-teiv-yext:label 0.4.0; + } revision "2024-05-24" { description "Initial revision."; @@ -74,35 +80,87 @@ module o-ran-smo-teiv-common-yang-types { type identityref { base classifier; } } - leaf-list sourceIds { - description - "An ordered list of identities that represent the set of native - source identifiers for participating entities. + grouping Origin_Entity_Mapping_Grp { + description "Grouping to identify sourceIds on a topology entity."; - This is a consumer data and can be attached to Topology Entity or - Topology Relation instance, outside of the declared Topology Entity - or Topology Relationship's attributes. This cannot be instantiated, - and it MUST NOT be augmented or deviated in any way, unless stated - otherwise."; + leaf-list sourceIds { - type string; - ordered-by user; + description + "An ordered list of identities that represent the set of native + source identifiers for participating entities. + + This must be attached to the Topology Entity instance, outside of the + declared Topology Entity'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."; + + type sourceId; + ordered-by user; + min-elements 1; + } + } + + grouping Origin_Relationship_Mapping_Grp { + description "Grouping to identify sourceIds on a topology relationship."; + + leaf-list sourceIds { + + description + "An ordered list of identities that represent the set of native + source identifiers for participating entities in the relationship. + + This must be attached to the Topology Relation instance, outside of the + declared 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."; + + type sourceId; + ordered-by user; + min-elements 2; + } } container metadata { description - "This container serves as extension point to define metadata. They - can only be defined in name value pair. - - This is a consumer data and can be attached to Topology Entity or - Topology Relation instance, outside of the declared Topology Entity - or Topology Relationship's attributes. This cannot be instantiated, - and it MUST NOT be augmented or deviated in any way, unless stated - otherwise."; + "This container serves as an extension point to define metadata. They + can only be defined in name value pairs. + + 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."; + + 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."; + value 0; + } + enum RESTORED { + description "The data was restored from backup and the responsible + adapters are checking to ensure the data is current."; + value 1; + } + enum ADVISED { + description "Entity implicitly created by Topology Exposure Handling and + potentially not aligned with the source of truth."; + value 2; + } + } + } } - identity classifier{ + identity classifier { description "The classifier is used as a base to provide all classifiers - with identity. "; + with identity. "; + } + + typedef sourceId { + description "An identity that represents a native identifier of a topology entity."; + type string; } } \ No newline at end of file diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-equipment.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-equipment.yang index 21fd623..0595350 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-equipment.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-equipment.yang @@ -36,6 +36,23 @@ module o-ran-smo-teiv-equipment { WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and"; + revision "2024-10-21" { + description "Deprecate AntennaModule attribute antennaBeamWidth. + To be replaced by horizontalBeamWidth and verticalBeamWidth."; + or-teiv-yext:label 0.6.0; + } + + revision "2024-10-08" { + description "Added azimuth attribute for AntennaModule."; + or-teiv-yext:label 0.5.0; + } + + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology objects."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -45,71 +62,105 @@ module o-ran-smo-teiv-equipment { list AntennaModule { description "An Antenna Module represents the physical aspect of an - antenna."; + antenna."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { leaf antennaModelNumber { description "Vendor-specific antenna model identifier. This - attribute is part of AISG v3 ADB Standard and has no - operational impact."; + attribute is part of AISG v3 ADB Standard and has no + operational impact."; type string; } leaf mechanicalAntennaBearing { description "Antenna bearing on antenna subunit where antenna - unit is installed."; + unit is installed."; type int32; } leaf mechanicalAntennaTilt { description "The fixed antenna tilt of the installation, defined - as the inclination of the antenna element respect to the - vertical plane. It is a signed value. Positive indicates - downtilt, and negative indicates uptilt."; + as the inclination of the antenna element respect to the + vertical plane. It is a signed value. Positive indicates + downtilt, and negative indicates uptilt."; type int32; } leaf positionWithinSector { description "Antenna unit position within sector. This attribute - is part of AISG v3 ADB Standard and has no operational - impact."; + is part of AISG v3 ADB Standard and has no operational + impact."; type string; } leaf totalTilt { description "Total antenna elevation including the installed - tilt and the tilt applied by the Remote Electrical - Tilt (RET)."; + tilt and the tilt applied by the Remote Electrical + Tilt (RET)."; type int32; } leaf electricalAntennaTilt { description "Electrically-controlled tilt of main beam maximum - with respect to direction orthogonal to antenna element - axis (see 3GPP TS 25.466). Value is signed; tilt down is - positive, tilt up is negative."; + with respect to direction orthogonal to antenna element + axis (see 3GPP TS 25.466). Value is signed; tilt down is + positive, tilt up is negative."; type int32; } leaf-list antennaBeamWidth { description "The angular span of the main lobe of the antenna - radiation pattern in the horizontal plane. Measured in - degrees."; + radiation pattern in the horizontal plane. Measured in + degrees. + + Deprecated: Since 24.Q4. Replaced by AntennaModule::horizontalBeamWidth + and AntennaModule::verticalBeamWidth. Planned to be removed."; type uint32; } + leaf horizontalBeamWidth { + description "The angular span of the main lobe of the antenna + radiation pattern in the horizontal plane."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + + leaf verticalBeamWidth { + description "The angular span of the main lobe of the antenna + radiation pattern in the vertical plane."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + + leaf azimuth { + description "The value of the azimuth of the Antenna Module."; + type decimal64 { + fraction-digits 1; + range "0..360"; + } + units "decimal degrees"; + } + uses geo:geo-location; } } list Site { description "A site is a physical location where an equipment can be - installed."; + installed."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -119,13 +170,21 @@ module o-ran-smo-teiv-equipment { } uses geo:geo-location; - } } or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_INSTALLED_AT_SITE { // 0..n to 0..1 + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the Site type. + The Site represents the physical location where the AntennaModule is installed. + An AntennaModule instance can only be installed at one Site. + A Site instance can have many installed AntennaModules. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf installed-at-site { diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-oam.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-oam.yang index 25a0902..9079e7c 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-oam.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-oam.yang @@ -33,6 +33,11 @@ module o-ran-smo-teiv-oam { SPDX-License-Identifier: Apache-2.0"; + revision "2024-10-04" { + description "Added grouping, Origin_Entity_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -42,12 +47,13 @@ module o-ran-smo-teiv-oam { list ManagedElement { description "A Managed Element (ME) is a node into a telecommunication - network providing support and/or service to subscribers. An ME - communicates with a manager application (directly or indirectly) - over one or more interfaces for the purpose of being monitored - and/or controlled."; + network providing support and/or service to subscribers. An ME + communicates with a manager application (directly or indirectly) + over one or more interfaces for the purpose of being monitored + and/or controlled."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; } } \ No newline at end of file diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-ran.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-ran.yang index 60286df..c70a579 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-ran.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-ran.yang @@ -40,9 +40,15 @@ module o-ran-smo-teiv-ran { SPDX-License-Identifier: Apache-2.0"; - revision "2024-05-24" { - description "Initial revision."; - or-teiv-yext:label 0.3.0; + revision "2024-10-08" { + description "Added range for azimuth attribute of Sector."; + or-teiv-yext:label 0.6.0; + } + + revision "2024-10-04" { + description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp + to the corresponding topology object."; + or-teiv-yext:label 0.5.0; } revision "2024-07-15" { @@ -50,6 +56,11 @@ module o-ran-smo-teiv-ran { or-teiv-yext:label 0.4.0; } + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + or-teiv-yext:domain RAN; list ORUFunction { @@ -68,6 +79,7 @@ module o-ran-smo-teiv-ran { the O-RU object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -91,6 +103,7 @@ module o-ran-smo-teiv-ran { the Near-RT RIC object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -126,9 +139,15 @@ module o-ran-smo-teiv-ran { the gNB-DU object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { + container dUpLMNId { + description "PLMN identifier used as part of PM Events data"; + uses types3gpp:PLMNId; + } + leaf gNBDUId { description "Unique identifier for the DU within a gNodeB"; type int64; @@ -169,6 +188,7 @@ module o-ran-smo-teiv-ran { delete the O-CU-CP object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -218,6 +238,7 @@ module o-ran-smo-teiv-ran { delete the O-CU-UP object."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -255,6 +276,7 @@ module o-ran-smo-teiv-ran { using both PSS and SSS."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -299,6 +321,7 @@ module o-ran-smo-teiv-ran { using both PSS and SSS."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -335,6 +358,7 @@ module o-ran-smo-teiv-ran { cells."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -373,6 +397,7 @@ module o-ran-smo-teiv-ran { The MO also controls the maximum output power of the sector."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -401,6 +426,7 @@ module o-ran-smo-teiv-ran { coverage area."; uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; container attributes { @@ -416,9 +442,10 @@ module o-ran-smo-teiv-ran { description "Average value of the azimuths of the cells comprising the sector, determined during sector discovery."; type decimal64{ - fraction-digits 6; + fraction-digits 1; + range "0..360"; } - units "degrees"; + units "decimal degrees"; } } } @@ -426,7 +453,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_PROVIDES_NRCELLDU { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ODUFunction type. + The bSide of this relationship is an instance of the NRCellDU type. + The ODUFunction represents the DU component of a gNB that provides the NRCellDU. + A ODUFunction instance can provide many NRCellDUs. + An NRCellDU instance must be provided by an ODUFunction. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list provided-nrCellDu { @@ -445,7 +481,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTION_PROVIDES_NRSECTORCARRIER { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ODUFunction type. + The bSide of this relationship is an instance of the NRSectorCarrier type. + The ODUFunction represents the DU component of a gNB that provides the NRSectorCarrier. + A ODUFunction instance can provide many NRSectorCarriers. + An NRSectorCarrier instance must be provided by an ODUFunction. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list provided-nrSectorCarrier { @@ -464,7 +509,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship OCUCPFUNCTION_PROVIDES_NRCELLCU { // 1 to 0..n + description + "The aSide of this relationship is an instance of the OCUCPFunction type. + The bSide of this relationship is an instance of the NRCellCU type. + The OCUCPFunction represents the CU-CP component of a gNB that provides the NRCellCU. + A OCUCPFunction instance can provide many NRCellCU. + An NRCellCU instance must be provided by an OCUCPFunction. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list provided-nrCellCu { @@ -483,7 +537,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship NRCELLDU_USES_NRSECTORCARRIER { // 0..1 to 0..n + description + "The aSide of this relationship is an instance of the NRCellDU type. + The bSide of this relationship is an instance of the NRSectorCarrier type. + The NRCellDU represents the cell that uses the NRSectorCarrier. + An NRCellDU instance can use many NRSectorCarriers. + An NRSectorCarrier instance can only be used by one NRCellDU. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list used-nrSectorCarrier { @@ -501,7 +564,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship NRSECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1 + description + "The aSide of this relationship is an instance of the NRSectorCarrier type. + The bSide of this relationship is an instance of the AntennaCapability type. + The NRSectorCarrier represents the carrier that uses the AntennaCapability. + An NRSectorCarrier instance can use only one AntennaCapability. + An AntennaCapability instance can be used by many NRSectorCarriers. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf used-antennaCapability { @@ -519,7 +591,16 @@ module o-ran-smo-teiv-ran { or-teiv-yext:biDirectionalTopologyRelationship SECTOR_GROUPS_NRCELLDU { // 0..1 to 0..n + description + "The aSide of this relationship is an instance of the Sector type. + The bSide of this relationship is an instance of the NRCellDU type. + The Sector represents the geographical area that groups the NRCellDUs. + A Sector instance can group many NRCellDUs. + An NRCellDU instance can only be grouped by one Sector. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list grouped-nrCellDu { diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-cloud-ran.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-cloud-ran.yang index c5c89f0..4024f4d 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-cloud-ran.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-cloud-ran.yang @@ -35,6 +35,11 @@ module o-ran-smo-teiv-rel-cloud-ran { SPDX-License-Identifier: Apache-2.0"; + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-02" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -50,6 +55,7 @@ module o-ran-smo-teiv-rel-cloud-ran { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_SERVES_ODUFUNCTION { // 0..n to 0..m uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list serviced-oduFunction { @@ -68,6 +74,7 @@ module o-ran-smo-teiv-rel-cloud-ran { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_SERVES_OCUCPFUNCTION { // 0..n to 0..m uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list serviced-ocucpFunction { @@ -86,6 +93,7 @@ module o-ran-smo-teiv-rel-cloud-ran { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_SERVES_OCUUPFUNCTION { // 0..n to 0..m uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list serviced-ocuupFunction { @@ -104,6 +112,7 @@ module o-ran-smo-teiv-rel-cloud-ran { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION { // 0..n to 0..m uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list serviced-nearRTRICFunction { diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-equipment-ran.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-equipment-ran.yang index 1ad570e..2068a60 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-equipment-ran.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-equipment-ran.yang @@ -37,6 +37,17 @@ module o-ran-smo-teiv-rel-equipment-ran { SPDX-License-Identifier: Apache-2.0"; + revision "2024-10-08" { + description + "Added new relationship ANTENNAMODULE_SERVES_NRCELLDU."; + or-teiv-yext:label 0.5.0; + } + + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-24" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -46,7 +57,16 @@ module o-ran-smo-teiv-rel-equipment-ran { or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_SERVES_ANTENNACAPABILITY { // 0..n to 0..m + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the AntennaCapability type. + The AntennaModule represents the physical antenna that serves the AntennaCapability. + An AntennaModule instance can serve many AntennaCapabilities. + An AntennaCapability instance can be served by many AntennaModules. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list serviced-antennaCapability { @@ -62,9 +82,46 @@ module o-ran-smo-teiv-rel-equipment-ran { } } + or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_SERVES_NRCELLDU { // 1..n to 0..m + + description + "The aSide of this relationship is an instance of the AntennaModule type. + The bSide of this relationship is an instance of the NRCellDU type. + The AntennaModule represents the physical antenna that serves the NRCellDU. + An AntennaModule instance can serve many NRCellDUs. + An NRCellDU instance can be served by many AntennaModules. + "; + + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; + key id; + + leaf-list serviced-nrCellDu { + description "NR Cell-DU serviced by this Antenna Module."; + or-teiv-yext:aSide or-teiv-equip:AntennaModule; + type instance-identifier; + } + + leaf-list serving-antennaModule { + description "Antenna Module serves this NR Cell-DU."; + or-teiv-yext:bSide or-teiv-ran:NRCellDU; + type instance-identifier; + min-elements 1; + } + } + or-teiv-yext:biDirectionalTopologyRelationship SECTOR_GROUPS_ANTENNAMODULE { // 0..1 to 0..n + description + "The aSide of this relationship is an instance of the Sector type. + The bSide of this relationship is an instance of the AntennaModule type. + The Sector represents the geographical area that groups the AntennaModules. + A Sector instance can group many AntennaModules. + An AntennaModule instance can only be grouped by one Sector. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf-list grouped-antennaModule { diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-cloud.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-cloud.yang index 9fa408f..dbf6947 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-cloud.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-cloud.yang @@ -35,6 +35,11 @@ module o-ran-smo-teiv-rel-oam-cloud { SPDX-License-Identifier: Apache-2.0"; + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.4.0; + } + revision "2024-05-02" { description "Initial revision."; or-teiv-yext:label 0.3.0; @@ -50,6 +55,7 @@ module o-ran-smo-teiv-rel-oam-cloud { or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF { // 0..1 to 1 uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf deployed-as-cloudifiedNF { @@ -69,6 +75,7 @@ module o-ran-smo-teiv-rel-oam-cloud { or-teiv-yext:biDirectionalTopologyRelationship NFDEPLOYMENT_SERVES_MANAGEDELEMENT { // 1..n to 1 uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Relationship_Mapping_Grp; key id; leaf serviced-managedElement { diff --git a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-ran.yang b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-ran.yang index 6fdd5ae..818e665 100644 --- a/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-ran.yang +++ b/teiv/src/main/resources/models/o-ran-smo-teiv-rel-oam-ran.yang @@ -35,9 +35,9 @@ module o-ran-smo-teiv-rel-oam-ran { SPDX-License-Identifier: Apache-2.0"; - revision "2024-05-24" { - description "Initial revision."; - or-teiv-yext:label 0.3.0; + revision "2024-10-04" { + description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object."; + or-teiv-yext:label 0.5.0; } revision "2024-07-15" { @@ -45,11 +45,25 @@ module o-ran-smo-teiv-rel-oam-ran { or-teiv-yext:label 0.4.0; } + revision "2024-05-24" { + description "Initial revision."; + or-teiv-yext:label 0.3.0; + } + or-teiv-yext:domain REL_OAM_RAN; or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ODUFUNCTION { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ManagedElement type. + The bSide of this relationship is an instance of the ODUFunction type. + The ManagedElement represents the node that manages the ODUFunction. + A ManagedElement instance can manage many ODUFunctions. + An ODUFunction instance must be managed by one ManagedElement. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list managed-oduFunction { @@ -68,7 +82,16 @@ module o-ran-smo-teiv-rel-oam-ran { or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUCPFUNCTION { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ManagedElement type. + The bSide of this relationship is an instance of the OCUCPFunction type. + The ManagedElement represents the node that manages the OCUCPFunction. + A ManagedElement instance can manage many OCUCPFunctions. + An OCUCPFunction instance must be managed by one ManagedElement. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list managed-ocucpFunction { @@ -87,7 +110,16 @@ module o-ran-smo-teiv-rel-oam-ran { or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUUPFUNCTION { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ManagedElement type. + The bSide of this relationship is an instance of the OCUUPFunction type. + The ManagedElement represents the node that manages the OCUUPFunction. + A ManagedElement instance can manage many OCUUPFunctions. + An OCUUPFunction instance must be managed by one ManagedElement. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list managed-ocuupFunction { @@ -106,7 +138,16 @@ module o-ran-smo-teiv-rel-oam-ran { or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ORUFUNCTION { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ManagedElement type. + The bSide of this relationship is an instance of the ORUFunction type. + The ManagedElement represents the node that manages the ORUFunction. + A ManagedElement instance can manage many ORUFunction. + An ORUFunction instance must be managed by one ManagedElement. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list managed-oruFunction { @@ -125,7 +166,16 @@ module o-ran-smo-teiv-rel-oam-ran { or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION { // 1 to 0..n + description + "The aSide of this relationship is an instance of the ManagedElement type. + The bSide of this relationship is an instance of the NearRTRICFunction type. + The ManagedElement represents the node that manages the NearRTRICFunction. + A ManagedElement instance can manage many NearRTRICFunction. + An NearRTRICFunction instance must be managed by one ManagedElement. + "; + uses or-teiv-types:Top_Grp_Type; + uses or-teiv-types:Origin_Entity_Mapping_Grp; key id; leaf-list managed-nearRTRICFunction { diff --git a/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml b/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml new file mode 100644 index 0000000..9fe392e --- /dev/null +++ b/teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml @@ -0,0 +1,265 @@ +# +# ============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========================================================= +# + +asyncapi: '2.6.0' +info: + x-api-id: 65a97ba2-dadb-475b-be39-d55f0c5bd9af + x-audience: external-partner + title: Topology Exposure and Inventory Ingestion API + version: 0.0.1 + description: | + Topology Exposure and Inventory data is information that represents entities in a + telecommunications network and the relationships between them that + provide insight into a particular aspect of the network of importance to + specific use cases. Topology data can be derived from inventory, + configuration, or other data. + + The Network Topology objects are managed and standardized using YANG + models which are structured into modules and submodules. These YANG + models describe managed network entities and their attributes, while also + providing information on the relations between the network entities. + + The Kafka interface is the integration point that allows for Network + Topology to be populated. Topology and Inventory Kafka API provides the + capabilities to create, update and delete Entities and Relationships. + + The format of the Kafka message received from the interface is cloudEvent + containing all the entities and their associated relationships in + yang-data+json format. + + 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 + termsOfService: http://www.apache.org/licenses/LICENSE-2.0 +defaultContentType: application/json + +channels: + topology-inventory-ingestion: + publish: + summary: Use this channel to perform create, merge, and delete operations. + operationId: Ingestion + description: This channel is used for Topology and Inventory operations + related to the creating, merging, and deleting of topology entities + and relationships. + message: + oneOf: + - $ref: '#/components/messages/ingestionCreate' + - $ref: '#/components/messages/ingestionMerge' + - $ref: '#/components/messages/ingestionDelete' + +components: + messages: + ingestionCreate: + messageId: create + name: ingestionCreate + title: Topology and Inventory Create + summary: Creates components in topology and inventory. + contentType: application/json + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/topologyChangePayload" + examples: + - name: CloudEvents format for Create + payload: + entities: + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + attributes: + cellLocalId: 4589 + nRPCI: 12 + nRTAC: 310 + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + attributes: + cellLocalId: 4590 + nRPCI: 32 + nRTAC: 510 + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + relationships: + - 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" + - 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" + headers: + ce_specversion: '1.0' + ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd233 + ce_source: dmi-plugin:nm-1 + ce_type: topology-inventory-ingestion.create + ce_time: 2023-06-12T09:05:00Z + content-type: application/json + ce_dataschema: topology-inventory-ingestion:events:create:1.0.0 + + ingestionMerge: + messageId: merge + name: ingestionMerge + title: Topology and Inventory Merge + summary: Updates components in topology and inventory. + contentType: application/json + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/topologyChangePayload" + examples: + - name: CloudEvents format for Merge + payload: + entities: + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + attributes: + cellLocalId: 4579 + nRPCI: 12 + nRTAC: 310 + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + attributes: + cellLocalId: 4580 + nRPCI: 32 + nRTAC: 510 + sourceIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:cmHandle:395221E080CCF0FD1924103B15873814" + relationships: + - 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" + - 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" + headers: + ce_specversion: '1.0' + ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd234 + ce_source: dmi-plugin:nm-1 + ce_type: topology-inventory-ingestion.merge + ce_time: 2023-06-12T09:05:00Z + content-type: application/json + ce_dataschema: topology-inventory-ingestion:events:merge:1.0.0 + + ingestionDelete: + messageId: delete + name: ingestionDelete + title: Topology and Inventory Delete + summary: Deletes components in topology and inventory. + contentType: application/json + traits: + - $ref: '#/components/messageTraits/commonHeaders' + payload: + $ref: "#/components/schemas/topologyChangePayload" + examples: + - name: CloudEvents format for Delete + payload: + entities: + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + relationships: + - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: + - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER: + - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78" + headers: + ce_specversion: '1.0' + ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd235 + ce_source: dmi-plugin:nm-1 + ce_type: topology-inventory-ingestion.delete + ce_time: 2023-06-12T09:05:00Z + content-type: application/json + ce_dataschema: topology-inventory-ingestion:events:delete:1.0.0 + + schemas: + topologyChangePayload: + type: object + properties: + entities: + $ref: "#/components/schemas/entities" + relationships: + $ref: "#/components/schemas/relationships" + entities: + type: array + items: + type: object + description: Entities schema will adhere to the entity types and + attributes mentioned in the yang modules. Refer to EIC Developer + Portal for Yang Modules. + relationships: + type: array + items: + type: object + description: Relationship schema will adhere to the relationship + types mentioned in the yang modules. Refer to EIC Developer Portal + for Yang Modules. + messageTraits: + commonHeaders: + headers: + type: object + required: + - ce_specversion + - ce_id + - ce_source + - ce_type + properties: + ce_specversion: + description: The version of the CloudEvents specification which + the event uses. + type: string + const: '1.0' + ce_id: + description: Unique identifier for the event + type: string + ce_source: + description: Source of the CloudEvent + type: string + format: uri + ce_type: + description: Event type. It shall be one of + topology-inventory-ingestion.merge, + topology-inventory-ingestion.delete or + topology-inventory-ingestion.create + type: string + ce_time: + description: Event timestamp + type: string + format: date-time + content-type: + description: Content-type of the data contained within the cloud + event. It will be application/json + type: string + const: 'application/json' + ce_dataschema: + description: URI representing the schema of the data. This + references the event-specific yang schema + type: string + format: uri 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 782fcf8..1d6a962 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,10 @@ info: Decorators are user-defined attributes (key-value pairs) which can be applied to topology entities and relationships. + 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. + Topology Exposure and Inventory API provides the capabilities to fetch topology data. Using the filtering options, it is possible to define more specific query requests. @@ -61,24 +65,35 @@ 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 matches the given property in the *scopeFilter* parameter. | RAN | GNBDUFunction | | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | 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=3 and @gNBId=111] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 and the gNBId equals 111 | - | 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=3] | /sourceIds[contains (@item, 'SubNetwork=Ireland')] | Unique set of ids of GNBDUFunctions, where the gNBIdLength equals 3 or the sourceIds contains an item with "SubNetwork=Ireland" | + | 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" | ## 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 | + + ## 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 | |:-----------------------------------------------------------------------------------------------------------------------------------------------|-------------|:---------------|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - | 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 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 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. | + | 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. | + | 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. | + | 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. | ## Querying entities for relationships The *entityTypeName* is used as the root of the queries. @@ -105,7 +120,7 @@ info: | 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 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. | The *entityName* is used as the root of the queries. @@ -145,8 +160,8 @@ tags: description: "Provides the capability to update or remove user-defined keywords or tags on entities and relationships." - name: Decorators description: "Provides the capability to update or remove user-defined values on entities and relationships." - - name: Topology Groups - description: "Provides the capability to group topology entities of any type, with an appropriate description and other criteria." + - name: Groups + description: "Provides the capability to group topology entities and/or relationships of any type. Groups can be created in static or dynamic way. *Static groups*: Group members are defined statically upon group creation. It can include a maximum of 25,000 members. *Dynamic groups*: Group members are dynamically selected based on the defined resource query." servers: - url: https://{host}/topology-inventory/v1alpha11 @@ -328,7 +343,7 @@ paths: /domains/{domainName}/relationship-types: get: - description: Get all the available topology relationship types. + description: Get all the available topology relationship types in a specified domain. tags: - Entities and relationships summary: Get all the available topology relationship types. @@ -430,8 +445,8 @@ paths: /domains/{domainName}/entities: get: - description: Get topology entities by domain, using specified - targetFilter as mandatory query parameter. + description: Get topology entities by domain, using a specified + *targetFilter* as a query parameter. tags: - Entities and relationships summary: "Get entities by domain" @@ -464,7 +479,7 @@ paths: /schemas: post: - description: Create a new schema. The request body shall contain the schema in YANG format. + description: Create a new schema. The request body contains the schema in YANG format. tags: - Schemas summary: Create a new schema. @@ -521,6 +536,7 @@ paths: $ref: '#/components/responses/Forbidden' '500': $ref: '#/components/responses/InternalServerError' + /schemas/{schemaName}/content: get: description: Get the model schema by name. @@ -591,8 +607,10 @@ paths: schema: $ref: '#/components/schemas/Classifier' examples: - classifier: - $ref: '#/components/examples/ClassifierExample' + updateClassifier: + $ref: '#/components/examples/ClassifierMergeExample' + removeClassifier: + $ref: '#/components/examples/ClassifierDeleteExample' responses: '204': $ref: '#/components/responses/NoContent' @@ -624,8 +642,10 @@ paths: schema: $ref: '#/components/schemas/Decorator' examples: - decorator: - $ref: '#/components/examples/DecoratorExample' + mergeDecorator: + $ref: '#/components/examples/DecoratorMergeExample' + removeDecorator: + $ref: '#/components/examples/DecoratorDeleteExample' responses: '204': $ref: '#/components/responses/NoContent' @@ -642,11 +662,11 @@ paths: /groups: post: - description: Create group. + description: Create a group of entities and/or relationships in a static or dynamic way. tags: - - Topology Groups - summary: Create group. - operationId: createGroup + - Groups + summary: Create a new group. + operationId: "createGroup" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/contentTypeJsonInHeader' @@ -655,71 +675,61 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Group' + $ref: '#/components/schemas/CreateGroupPayload' examples: - dynamicGroup: - $ref: '#/components/examples/DynamicGroupExample' staticGroup: - $ref: '#/components/examples/StaticGroupExample' + $ref: '#/components/examples/CreateStaticGroupPayloadExample' + dynamicGroup: + $ref: '#/components/examples/CreateDynamicGroupGetEntitiesByDomainPayloadExample' responses: '201': description: Created content: application/json: schema: - $ref: '#/components/schemas/GroupResponse' + $ref: '#/components/schemas/GroupByIdResponse' examples: - group: - $ref: '#/components/examples/GroupResponseExample' + static: + $ref: '#/components/examples/StaticGroupResponseExample' + dynamic: + $ref: '#/components/examples/DynamicGroupResponseExample' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' - '409': - $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' - get: description: Get all groups. tags: - - Topology Groups + - Groups summary: Get all groups. operationId: "getAllGroups" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/offsetParam' - $ref: '#/components/parameters/limitParam' + - $ref: '#/components/parameters/groupNameOptionalInQuery' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/Groups' + $ref: '#/components/schemas/GroupsResponse' examples: groups: $ref: '#/components/examples/GroupsResponseExample' - '204': - $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '500': $ref: '#/components/responses/InternalServerError' /groups/{groupId}: get: - description: Get a Group with specified id. + description: Get a group with specified id. tags: - - Topology Groups + - Groups summary: Get a group with specified id. - operationId: "getGroup" + operationId: "getGroupById" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' @@ -729,29 +739,44 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/GroupResponse' + $ref: '#/components/schemas/GroupByIdResponse' examples: - group: - $ref: '#/components/examples/GroupResponseExample' + static: + $ref: '#/components/examples/StaticGroupResponseExample' + dynamic: + $ref: '#/components/examples/DynamicGroupResponseExample' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + delete: + description: Delete a group with specified id. + tags: + - Groups + summary: Delete a group with specified id. + operationId: "deleteGroup" + parameters: + - $ref: '#/components/parameters/groupIdInPath' + responses: + '204': + $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' + /groups/{groupId}/name: put: - description: Update a Group. + description: Update the name of a group. tags: - - Topology Groups - summary: Update a Group. - operationId: updateGroup + - Groups + summary: Update the name of a group. + operationId: "updateGroupName" parameters: - - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/contentTypeJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' requestBody: @@ -759,49 +784,108 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Group' + $ref: '#/components/schemas/UpdateGroupNamePayload' examples: - dynamicGroup: - $ref: '#/components/examples/DynamicGroupExample' - staticGroup: - $ref: '#/components/examples/StaticGroupExample' + GroupNameUpdatePayload: + $ref: '#/components/examples/UpdateGroupNamePayloadExample' responses: '204': $ref: '#/components/responses/NoContent' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' - '409': - $ref: '#/components/responses/Conflict' + '404': + $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' - delete: - description: Delete a group with specified id. + /groups/{groupId}/members: + get: + description: Get the members of a group with specified id. tags: - - Topology Groups - summary: Delete a group with specified id. - operationId: "deleteGroup" + - Groups + summary: Get the members of a group with specified id. + operationId: "getMembers" parameters: - $ref: '#/components/parameters/acceptJsonInHeader' - $ref: '#/components/parameters/groupIdInPath' + - $ref: '#/components/parameters/offsetParam' + - $ref: '#/components/parameters/limitParam' responses: - '204': - $ref: '#/components/responses/NoContent' + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + examples: + members: + $ref: '#/components/examples/MembersResponseExample' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + + /groups/{groupId}/provided-members: + get: + description: Get the provided members of a static group with specified id. + tags: + - Groups + summary: Get the provided members of a static group with specified id. + operationId: "getProvidedMembers" + parameters: + - $ref: '#/components/parameters/acceptJsonInHeader' + - $ref: '#/components/parameters/groupIdInPath' + - $ref: '#/components/parameters/groupMembersStatusOptionalInQuery' + - $ref: '#/components/parameters/offsetParam' + - $ref: '#/components/parameters/limitParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MembersResponse' + examples: + members: + $ref: '#/components/examples/ProvidedMembersResponseExample' '400': $ref: '#/components/responses/BadRequest' - '401': - $ref: '#/components/responses/Unauthorized' - '403': - $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' + /groups/{groupId}/provided-members-operations: + post: + description: Merge or remove members in an existing topology group. This operation is applicable for static group only. + tags: + - Groups + summary: Merge or remove members of a static group. + operationId: "updateProvidedMembers" + parameters: + - $ref: '#/components/parameters/acceptJsonInHeader' + - $ref: '#/components/parameters/contentTypeJsonInHeader' + - $ref: '#/components/parameters/groupIdInPath' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProvidedMembersPayload' + examples: + mergeMembersPayload: + $ref: '#/components/examples/MergeProvidedMembersPayloadExample' + deleteMembersPayload: + $ref: '#/components/examples/RemoveProvidedMembersPayloadExample' + responses: + '204': + $ref: '#/components/responses/NoContent' + '400': + $ref: '#/components/responses/BadRequest' + '500': + $ref: '#/components/responses/InternalServerError' components: schemas: @@ -826,74 +910,6 @@ components: type: array items: type: string - GroupResponse: - type: object - properties: - id: - type: string - groupName: - type: string - criteria: - oneOf: - - $ref: '#/components/schemas/StaticSelection' - - $ref: '#/components/schemas/DynamicSelection' - Group: - type: object - properties: - groupName: - type: string - criteria: - $ref: '#/components/schemas/TopologySelection' - Groups: - type: object - title: Groups - properties: - items: - type: array - items: - $ref: '#/components/schemas/GroupResponse' - self: - $ref: '#/components/schemas/Href' - first: - $ref: '#/components/schemas/Href' - prev: - $ref: '#/components/schemas/Href' - next: - $ref: '#/components/schemas/Href' - last: - $ref: '#/components/schemas/Href' - totalCount: - type: integer - TopologySelection: - oneOf: - - $ref: '#/components/schemas/StaticSelection' - - $ref: '#/components/schemas/DynamicSelection' - StaticSelection: - type: object - properties: - resourceInstances: - type: array - minItems: 1 - items: - type: string - DynamicSelection: - type: object - additionalProperties: false - properties: - resourceQuery: - type: object - properties: - url: - type: string - method: - type: string - queryParams: - type: object - requestBody: - type: object - required: - - url - Decorator: type: object title: Decorator @@ -906,7 +922,7 @@ components: decorators: type: object additionalProperties: true - description: Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by it's schema. + description: Decorators must be defined in schema before use. Data type of a decorator is restricted as defined by its schema. entityIds: type: array items: @@ -1091,6 +1107,314 @@ components: $ref: '#/components/schemas/Href' totalCount: type: integer + StaticEnum: + type: string + enum: + - static + DynamicEnum: + type: string + enum: + - dynamic + CreateGroupPayload: + title: CreateGroupPayload + type: object + oneOf: + - $ref: '#/components/schemas/static' + - $ref: '#/components/schemas/dynamic' + discriminator: + propertyName: type + static: + title: CreateStaticGroupPayload + type: object + required: + - name + - type + - providedMembers + properties: + name: + type: string + description: A name of the topology group. + minLength: 1 + maxLength: 150 + type: + type: string + description: 'Allowed: static' + providedMembers: + type: array + minItems: 1 + items: + type: object + description: Refer to yang model for schema definition of topology objects. + dynamic: + title: CreateDynamicGroupPayload + type: object + required: + - name + - type + - criteria + properties: + name: + type: string + description: A name of the topology group. + minLength: 1 + maxLength: 150 + type: + type: string + description: 'Allowed: dynamic' + criteria: + $ref: '#/components/schemas/Criteria' + Criteria: + title: Criteria + type: object + oneOf: + - $ref: '#/components/schemas/getEntitiesByDomain' + - $ref: '#/components/schemas/getEntitiesByType' + - $ref: '#/components/schemas/getRelationshipsForEntityId' + - $ref: '#/components/schemas/getRelationshipsByType' + discriminator: + propertyName: queryType + getEntitiesByDomain: + title: getEntitiesByDomain + type: object + required: + - queryType + - domain + properties: + queryType: + type: string + description: 'Allowed: getEntitiesByDomain' + domain: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getEntitiesByType: + title: getEntitiesByType + type: object + required: + - queryType + - domain + - entityTypeName + properties: + queryType: + type: string + description: 'Allowed: getEntitiesByType' + domain: + type: string + entityTypeName: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getRelationshipsForEntityId: + title: getRelationshipsForEntityId + type: object + required: + - queryType + - domain + - entityTypeName + - entityId + properties: + queryType: + type: string + description: 'Allowed: getRelationshipsForEntityId' + domain: + type: string + entityTypeName: + type: string + entityId: + type: string + targetFilter: + type: string + scopeFilter: + type: string + getRelationshipsByType: + title: getRelationshipsByType + type: object + required: + - queryType + - domain + - relationshipTypeName + properties: + queryType: + type: string + description: 'Allowed: getRelationshipsByType' + domain: + type: string + relationshipTypeName: + type: string + targetFilter: + type: string + scopeFilter: + type: string + GroupsResponse: + title: Groups + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/GroupResponse' + self: + $ref: '#/components/schemas/Href' + first: + $ref: '#/components/schemas/Href' + prev: + $ref: '#/components/schemas/Href' + next: + $ref: '#/components/schemas/Href' + last: + $ref: '#/components/schemas/Href' + totalCount: + type: integer + GroupResponse: + title: Group + type: object + oneOf: + - $ref: '#/components/schemas/StaticGroupResponse' + - $ref: '#/components/schemas/DynamicGroupResponse' + StaticGroupResponse: + title: StaticGroup + type: object + required: + - id + - name + - type + - members + - providedMembers + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/StaticEnum' + members: + $ref: '#/components/schemas/Href' + providedMembers: + $ref: '#/components/schemas/Href' + DynamicGroupResponse: + title: DynamicGroup + type: object + required: + - id + - name + - type + - members + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/DynamicEnum' + members: + $ref: '#/components/schemas/Href' + GroupByIdResponse: + title: Group + type: object + oneOf: + - $ref: '#/components/schemas/StaticGroupByIdResponse' + - $ref: '#/components/schemas/DynamicGroupByIdResponse' + StaticGroupByIdResponse: + title: StaticGroup + type: object + required: + - id + - name + - type + - members + - providedMembers + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/StaticEnum' + members: + $ref: '#/components/schemas/Href' + providedMembers: + $ref: '#/components/schemas/Href' + DynamicGroupByIdResponse: + title: DynamicGroup + type: object + required: + - id + - name + - type + - members + - criteria + properties: + id: + type: string + description: The unique identifier of the topology group. + name: + type: string + description: The unique name of the topology group. + type: + $ref: '#/components/schemas/DynamicEnum' + members: + $ref: '#/components/schemas/Href' + criteria: + $ref: '#/components/schemas/Criteria' + MembersResponse: + title: GroupMembers + type: object + properties: + items: + type: array + items: + type: object + description: Refer to yang model for schema definition of topology objects. + self: + $ref: '#/components/schemas/Href' + first: + $ref: '#/components/schemas/Href' + prev: + $ref: '#/components/schemas/Href' + next: + $ref: '#/components/schemas/Href' + last: + $ref: '#/components/schemas/Href' + totalCount: + type: integer + UpdateProvidedMembersPayload: + title: UpdateProvidedMembersPayload + type: object + required: + - operation + - providedMembers + properties: + operation: + type: string + description: The operation to be performed on the members of topology group. + enum: [merge, remove] + providedMembers: + description: Members to be added or removed from the group. + type: array + minItems: 1 + items: + type: object + description: Refer to yang model for schema definition of topology objects. + UpdateGroupNamePayload: + title: UpdateGroupNamePayload + type: object + required: + - name + properties: + name: + type: string + minLength: 1 + maxLength: 150 responses: NotFound: @@ -1218,6 +1542,7 @@ components: required: true schema: type: string + example: RAN schemaNameInPath: name: schemaName in: path @@ -1264,34 +1589,45 @@ components: type: string examples: domain: - value: ran + value: RAN targetFilterOptionalInQuery: name: targetFilter - description: Use *targetFilter* to specify the entity type and - attributes to be returned in the REST response. The value for - *targetFilter* can also be a list of entity types and attributes. + description: Use *targetFilter* to specify what needs to be returned in the REST response. in: query required: false schema: type: string examples: targetFilter: - value: /attributes(nCI,nRPCI) + value: /sourceIds;/classifiers scopeFilterOptionalInQuery: name: scopeFilter - description: Use *scopeFilter* to specify the attributes to match on. - The value for *scopeFilter* can also be a list of entity types and - attributes. scopeFilter returns a boolean. + description: ScopeFilter is used to specify the conditions to be applied. in: query required: false schema: type: string examples: scopeFilter: - value: /attributes[@nRTAC=310] + value: /sourceIds[contains(@item,'ManagedElement=1')] + groupMembersStatusOptionalInQuery: + name: status + description: Status can be present (or) not-present (or) invalid. If not specified, returns all members of the group. + in: query + required: false + schema: + type: string + enum: [present, not-present, invalid] + groupNameOptionalInQuery: + name: name + description: Group name. If not specified, returns all the groups. + in: query + required: false + schema: + type: string examples: - ClassifierExample: + ClassifierMergeExample: value: operation: merge classifiers: @@ -1303,7 +1639,19 @@ components: - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" - DecoratorExample: + ClassifierDeleteExample: + 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" + relationshipIds: + - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + + DecoratorMergeExample: value: operation: merge decorators: @@ -1314,71 +1662,72 @@ components: - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" relationshipIds: - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + DecoratorDeleteExample: + value: + operation: delete + decorators: + module-x:location: Stockholm + entityIds: + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + relationshipIds: + - "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B" + EntityResponseExample: value: - o-ran-smo-teiv-ran:GNBDUFunction: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + o-ran-smo-teiv-ran:NRCellDU: + - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" attributes: - gNBDUId: 11 - dUpLMNId: - mcc: 110 - mnc: 210 - gNBId: 21 - gNBIdLength: 2 + cellLocalId: 91 + nCI: 91 + nRPCI: 789 + nRTAC: 456 decorators: location: Stockholm classifiers: - Rural sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1" + - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE + EntitiesResponseExample: value: items: - - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" attributes: - cellLocalId: 4589 - nCI: 1 - nRPCI: 12 - nRTAC: 310 - decorators: - location: Stockholm - classifiers: - - Rural + gNBId: 10 + gNBIdLength: 2 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE - - o-ran-smo-teiv-ran:NRCellDU: - - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,GNBCUUPFunction=10" + - "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" + attributes: + gNBId: 13 + gNBIdLength: 2 + sourceIds: + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,GNBCUUPFunction=13" + - "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" + - o-ran-smo-teiv-ran:GNBCUUPFunction: + - id: "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" attributes: - cellLocalId: 4559 - nRPCI: 32 - nRTAC: 510 - decorators: - location: Stockholm - classifiers: - - Rural + gNBId: 14 + gNBIdLength: 2 sourceIds: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:cmHandle:395221E080CCF0FD1924103B15873814" - metadata: - trustLevel: RELIABLE + - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,GNBCUUPFunction=14" + - "urn:cmHandle:D67C0BD04FA613BBFD176B24B68FD6A4" self: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" first: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" prev: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=0&limit=3&targetFilter=/sourceIds;/attributes" next: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=500&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" + href: "/domains/RAN/entities?offset=3&limit=3&targetFilter=/sourceIds;/attributes" last: - href: "/domains/RAN/entity-types/NRCellDU/entities?offset=678&limit=500&targetFilter=attributes(nCI,nRPCI)&scopeFilter=/attributes[@nRTAC=310]" - totalCount: 12 + href: "/domains/RAN/entities?offset=33&limit=3&targetFilter=/sourceIds;/attributes" + totalCount: 3 RelationshipResponseExample: value: @@ -1386,13 +1735,7 @@ components: - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE RelationshipsResponseExample: value: @@ -1401,24 +1744,12 @@ components: - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE - 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" - decorators: - location: Stockholm - classifiers: - - Rural sourceIds: [] - metadata: - trustLevel: RELIABLE self: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" first: @@ -1426,34 +1757,34 @@ components: prev: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" next: - href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=500&limit=500" + href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" last: - href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=678&limit=500" - totalCount: 23 + href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships?offset=0&limit=500" + totalCount: 2 EntityTypesResponseExample: value: items: - - name: "GNBCUUPFunction" + - name: "AntennaCapability" entities: - href: "/domains/RAN/entity-types/GNBCUUPFunction/entities" - - name: "NRCellDU" + href: "/domains/RAN/entity-types/AntennaCapability/entities" + - name: "ENodeBFunction" entities: - href: "/domains/RAN/entity-types/NRCellDU/entities" - - name: "GNBDUFunction" + href: "/domains/RAN/entity-types/ENodeBFunction/entities" + - name: "EUtranCell" entities: - href: "/domains/RAN/entity-types/GNBDUFunction/entities" + href: "/domains/RAN/entity-types/EUtranCell/entities" self: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" first: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" prev: - href: "/domains/RAN/entity-types?offset=0&limit=500" + href: "/domains/RAN/entity-types?offset=0&limit=3" next: - href: "/domains/RAN/entity-types?offset=500&limit=500" + href: "/domains/RAN/entity-types?offset=3&limit=3" last: - href: "/domains/RAN/entity-types?offset=678&limit=500" - totalCount: 43 + href: "/domains/RAN/entity-types?offset=9&limit=3" + totalCount: 11 RelationshipTypesResponseExample: value: @@ -1468,16 +1799,16 @@ components: relationships: href: "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" self: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" first: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" prev: - href: "/domains/RAN/relationship-types?offset=0&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" next: - href: "/domains/RAN/relationship-types?offset=500&limit=500" + href: "/domains/RAN/relationship-types?offset=0&limit=3" last: - href: "/domains/RAN/relationship-types?offset=678&limit=500" - totalCount: 21 + href: "/domains/RAN/relationship-types?offset=0&limit=3" + totalCount: 3 DomainsResponseExample: value: @@ -1497,6 +1828,21 @@ components: href: "/domains/RAN/entity-types" relationshipTypes: href: "/domains/RAN/relationship-types" + - name: "REL_EQUIPMENT_RAN" + entityTypes: + href: "/domains/REL_EQUIPMENT_RAN/entity-types" + relationshipTypes: + href: "/domains/REL_EQUIPMENT_RAN/relationship-types" + - name: "REL_OAM_RAN" + entityTypes: + href: "/domains/REL_OAM_RAN/entity-types" + relationshipTypes: + href: "/domains/REL_OAM_RAN/relationship-types" + - name: "TEIV" + entityTypes: + href: "/domains/TEIV/entity-types" + relationshipTypes: + href: "/domains/TEIV/relationship-types" self: href: "/domains?offset=0&limit=500" first: @@ -1504,81 +1850,10 @@ components: prev: href: "/domains?offset=0&limit=500" next: - href: "/domains?offset=500&limit=500" - last: - href: "/domains?offset=678&limit=500" - totalCount: 343 - - StaticGroupExample: - value: - groupName: "son-cell-filter-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - DynamicGroupExample: - value: - groupName: "son-cell-filter-group-1" - criteria: - resourceQuery: - url: /domains/RAN/entity-types/NRCellDU/entities - method: GET - queryParams: - target:Filter: /sourceIds - scopeFilter: /attributes[@nRTAC=310] - requestBody: "" - - GroupResponseExample: - value: - id: "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=" - groupName: "son-cell-filter-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - GroupsResponseExample: - value: - items: - - id: "urn:o-ran:smo:teiv:group:/JHKJ4H5JH45345TB=" - groupName: "son-cell-group-1" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=3" - - id: "urn:o-ran:smo:teiv:group:/DFJER77R6F7S9VD=" - groupName: "son-cell-group-2" - criteria: - resourceInstances: - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=4" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=5" - - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=6" - - id: "urn:o-ran:smo:teiv:group:/LMND77R6F7S9VD=" - groupName: "son-cell-group-3" - criteria: - resourceQuery: - url: /domains/RAN/entity-types/NRCellDU/entities - method: GET - queryParams: - target:Filter: /sourceIds - scopeFilter: /attributes[@nRTAC=310] - requestBody: "" - - self: - href: "/groups?offset=0&limit=500" - first: - href: "/groups?offset=0&limit=500" - prev: - href: "/groups?offset=0&limit=500" - next: - href: "/groups?offset=0&limit=500" + href: "/domains?offset=0&limit=500" last: - href: "/groups?offset=0&limit=500" - totalCount: 3 + href: "/domains?offset=0&limit=500" + totalCount: 6 SchemasResponseExample: value: @@ -1730,3 +2005,149 @@ components: } } } + + CreateStaticGroupPayloadExample: + value: + name: cell-filter-group-1 + 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 + - 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 + + CreateDynamicGroupGetEntitiesByDomainPayloadExample: + value: + name: cell-filter-group-2 + type: dynamic + criteria: + queryType: getEntitiesByDomain + domain: RAN + targetFilter: /NRCellDU/attributes(nCI) + scopeFilter: /NRCellDU/attributes[@cellLocalId=1] + + + GroupsResponseExample: + value: + items: + - id: urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000 + name: cell-filter-group-1 + type: static + providedMembers: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members + members: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members + - id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 + name: cell-filter-group-2 + type: dynamic + members: + href: /groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members + self: + href: "/groups?offset=0&limit=500" + first: + href: "/groups?offset=0&limit=500" + prev: + href: "/groups?offset=0&limit=500" + next: + href: "/groups?offset=0&limit=500" + last: + href: "/groups?offset=0&limit=500" + totalCount: 2 + + MembersResponseExample: + 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 + - 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 + self: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + first: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + prev: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + next: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + last: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members?offset=0&limit=500" + totalCount: 5 + + ProvidedMembersResponseExample: + 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 + - 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 + self: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + first: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + prev: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + next: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + last: + href: "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/provided-members?offset=0&limit=500" + totalCount: 5 + + MergeProvidedMembersPayloadExample: + value: + operation: "merge" + providedMembers: + - o-ran-smo-teiv-ran:NRCellDU: + - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + + RemoveProvidedMembersPayloadExample: + value: + operation: "remove" + providedMembers: + - o-ran-smo-teiv-ran:NRCellDU: + - id: urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1 + + StaticGroupResponseExample: + value: + id: urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000 + name: cell-filter-group-1 + type: static + providedMembers: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/provided-members + members: + href: /groups/urn:o-ran:smo:teiv:group=123e4567-e89b-12d3-a456-426614174000/members + + + DynamicGroupResponseExample: + value: + id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000 + name: cell-filter-group-2 + type: dynamic + criteria: + queryType: getEntitiesByDomain + domain: RAN + targetFilter: /NRCellDU/attributes(nCI) + scopeFilter: /NRCellDU/attributes[@cellLocalId=1] + members: + href: /groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members + + UpdateGroupNamePayloadExample: + value: + name: "cell-filter-group-5" \ No newline at end of file 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 8cc7a89..abf03e8 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/CoreApplicationTest.java @@ -33,12 +33,14 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.oran.smo.teiv.startup.SchemaCleanUpHandler; import org.springframework.beans.factory.annotation.Autowired; 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.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; @@ -49,12 +51,15 @@ import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @SpringBootTest +@ActiveProfiles({ "test", "exposure" }) @AutoConfigureMockMvc class CoreApplicationTest { @Autowired private MockMvc mvc; @MockBean private SchemaHandler schemaHandler; + @MockBean + private SchemaCleanUpHandler schemaCleanUpHandler; @Test void testMetricsAvailable() throws Exception { diff --git a/teiv/src/test/java/org/oran/smo/teiv/TopologyApiBase.java b/teiv/src/test/java/org/oran/smo/teiv/TopologyApiBase.java new file mode 100644 index 0000000..bf83272 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/TopologyApiBase.java @@ -0,0 +1,69 @@ +/* + * ============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; + +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import io.restassured.module.mockmvc.RestAssuredMockMvc; + +import org.oran.smo.teiv.db.TestPostgresqlContainer; +import org.oran.smo.teiv.startup.SchemaHandler; + +@AutoConfigureMockMvc +public abstract class TopologyApiBase { + public static TestPostgresqlContainer postgresSQLContainer = TestPostgresqlContainer.getInstance(); + + @MockBean + private SchemaHandler schemaHandler; + + @Autowired + private ApplicationContext context; + + @Autowired + private MockMvc mockMvc; + + @DynamicPropertySource + static void setProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.read.jdbc-url", () -> postgresSQLContainer.getJdbcUrl()); + registry.add("spring.datasource.read.username", () -> postgresSQLContainer.getUsername()); + registry.add("spring.datasource.read.password", () -> postgresSQLContainer.getPassword()); + + registry.add("spring.datasource.write.jdbc-url", () -> postgresSQLContainer.getJdbcUrl()); + registry.add("spring.datasource.write.username", () -> postgresSQLContainer.getUsername()); + registry.add("spring.datasource.write.password", () -> postgresSQLContainer.getPassword()); + } + + @BeforeEach + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilters().build(); + + RestAssuredMockMvc.mockMvc(mockMvc); + } +} 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 ad7f0cc..629e045 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 @@ -32,7 +32,7 @@ import java.util.Properties; import java.util.Set; import java.util.function.Supplier; -import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.ListTopicsResult; import org.apache.kafka.clients.admin.MockAdminClient; import org.apache.kafka.clients.admin.NewTopic; @@ -49,6 +49,7 @@ 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; @@ -66,21 +67,24 @@ 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; -@EmbeddedKafka -@ExtendWith(OutputCaptureExtension.class) +@ActiveProfiles({ "test", "ingestion" }) @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@ActiveProfiles({ "test", "ingestion" }) +@TestExecutionListeners(listeners = KafkaTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) +@EmbeddedKafka +@ExtendWith(OutputCaptureExtension.class) public class DependentServiceAvailabilityKafkaTest { - @Autowired - protected EmbeddedKafkaBroker embeddedKafkaBroker; @Value("${spring.embedded.kafka.brokers}") @Getter private String embeddedKafkaServer; + @Autowired + protected EmbeddedKafkaBroker embeddedKafkaBroker; + @Autowired private KafkaAdminConfig kafkaAdminConfig; @@ -126,8 +130,8 @@ public class DependentServiceAvailabilityKafkaTest { void testIsServiceAvailable_ThrowsInterruptedException(CapturedOutput output) throws Exception { Node controller = new Node(0, "localhost", 8121); List brokers = Arrays.asList(controller, new Node(1, "localhost", 8122), new Node(2, "localhost", 8123)); - AdminClient mockedAdminClient = new MockAdminClient(brokers, controller); - AdminClient spiedAdminClient = Mockito.spy(mockedAdminClient); + Admin mockedAdminClient = new MockAdminClient(brokers, controller); + Admin spiedAdminClient = Mockito.spy(mockedAdminClient); final NewTopic newTopic = new NewTopic("test_topic", 1, (short) 1); mockedAdminClient.createTopics(List.of(newTopic)); @@ -137,8 +141,8 @@ public class DependentServiceAvailabilityKafkaTest { doReturn(kafkaFutures).when(topicListresult).names(); doThrow(InterruptedException.class).when(kafkaFutures).get(); - MockedStatic mockedStaticAdminClient = Mockito.mockStatic(AdminClient.class); - mockedStaticAdminClient.when(() -> AdminClient.create(ArgumentMatchers.any(Properties.class)).listTopics().names()) + MockedStatic mockedStaticAdminClient = Mockito.mockStatic(Admin.class); + mockedStaticAdminClient.when(() -> Admin.create(ArgumentMatchers.any(Properties.class)).listTopics().names()) .thenReturn(spiedAdminClient); DependentServiceAvailabilityKafka spiedDependentServiceAvailabilityKafka = Mockito.spy( 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/TiesExposureHealthIndicatorTest.java index 183eae8..c9ab411 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/TiesExposureHealthIndicatorTest.java @@ -34,14 +34,16 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.startup.SchemaHandler; @AutoConfigureMockMvc -@SpringBootTest(properties = { "spring.profiles.active=test", "management.endpoint.health.probes.enabled=true", +@SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", "management.endpoint.health.group.readiness.include=readinessState,tiesExposure" }) +@ActiveProfiles({ "test", "exposure" }) class TiesExposureHealthIndicatorTest { private final String readinessProbePath = "/actuator/health/readiness"; private final String livenessProbePath = "/actuator/health/liveness"; 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/TiesGroupsHealthIndicatorTest.java new file mode 100644 index 0000000..9ee4268 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/controller/health/TiesGroupsHealthIndicatorTest.java @@ -0,0 +1,91 @@ +/* + * ============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.controller.health; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +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.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; + +import org.oran.smo.teiv.exposure.spi.ModelRepository; +import org.oran.smo.teiv.schema.PostgresSchemaLoader; +import org.oran.smo.teiv.service.SchemaCleanUpService; +import org.oran.smo.teiv.startup.SchemaHandler; + +@AutoConfigureMockMvc +@SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", + "management.endpoint.health.group.readiness.include=readinessState,tiesGroups" }) +@ActiveProfiles({ "test", "groups" }) +class TiesGroupsHealthIndicatorTest { + private final String readinessProbePath = "/actuator/health/readiness"; + private final String livenessProbePath = "/actuator/health/liveness"; + private final String tiesGroupsProbePath = "/actuator/health/tiesGroups"; + + @Autowired + private MockMvc mvc; + @Autowired + private HealthStatus healthStatus; + private static final String SERVICE_NAME = "top-exp-inv-groups"; + + @MockBean + private PostgresSchemaLoader postgresSchemaLoader; + @MockBean + ModelRepository modelRepository; + @MockBean + SchemaCleanUpService schemaCleanUpService; + @MockBean + private SchemaHandler schemaHandler; + + @Test + void upAndHealthy() throws Exception { + healthStatus.setSchemaInitialized(true); + mvc.perform(get(readinessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( + 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( + content().json(String.format("{'status':'UP','details':{'UP': '%s is UP and Healthy.'}}", SERVICE_NAME))); + } + + @Test + void downSchemaServiceNotLoaded() throws Exception { + healthStatus.setSchemaInitialized(false); + performReadinessGroupProbesDownWithMessage(" Schema is yet to be initialized."); + } + + private void performReadinessGroupProbesDownWithMessage(String message) throws Exception { + mvc.perform(get(livenessProbePath).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect( + 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()) + .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/TiesIngestionHealthIndicatorTest.java index 312cff0..7d48f3d 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/TiesIngestionHealthIndicatorTest.java @@ -37,6 +37,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka; @@ -44,8 +45,9 @@ import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.startup.SchemaHandler; @AutoConfigureMockMvc -@SpringBootTest(properties = { "spring.profiles.active=test,ingestion", "management.endpoint.health.probes.enabled=true", +@SpringBootTest(properties = { "management.endpoint.health.probes.enabled=true", "management.endpoint.health.group.readiness.include=readinessState,tiesIngestion" }) +@ActiveProfiles({ "test", "ingestion" }) class TiesIngestionHealthIndicatorTest { private final String readinessProbePath = "/actuator/health/readiness"; private final String livenessProbePath = "/actuator/health/liveness"; @@ -97,8 +99,7 @@ class TiesIngestionHealthIndicatorTest { @Test void downKafkaUnavailable() throws Exception { - SchemaHandler schemaHandlerSpy = Mockito.spy(new SchemaHandler(postgresSchemaLoader, healthStatus, modelRepository, - schemaCleanUpService)); + SchemaHandler schemaHandlerSpy = Mockito.spy(new SchemaHandler(postgresSchemaLoader, healthStatus)); schemaHandlerSpy.initializeSchema(); assertTrue(healthStatus.isSchemaInitialized()); doReturn(false).when(spiedDependentServiceAvailabilityKafka).checkService(); 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 ff0cb66..42bd363 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 @@ -21,7 +21,9 @@ package org.oran.smo.teiv.db; import java.io.IOException; +import java.util.List; +import org.jooq.DSLContext; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -38,27 +40,44 @@ public class TestPostgresqlContainer extends PostgreSQLContainer schemas, DSLContext dslContext) { + dslContext.meta().filterSchemas(s -> schemas.contains(s.getName())).getTables().forEach(t -> dslContext.truncate(t) + .cascade().execute()); + } + + public static void loadData() { + try { + container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/data.sql", "--set=pguser=\"test\";"); + } catch (UnsupportedOperationException | IOException | InterruptedException e) { + throw new RuntimeException(e.getMessage()); + } + } + + public static void loadModels() { + try { + container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/01_init-oran-smo-teiv-model.sql", + "--set=pguser=\"test\";"); + container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/model.sql", "--set=pguser=\"test\";"); + } catch (UnsupportedOperationException | IOException | InterruptedException e) { + throw new RuntimeException(e.getMessage()); + } + } + + public static void loadValidationTestData() { + try { + container.execInContainer("psql", "-U", "test", "-w", "-f", + "/pgsqlschema/test-data-for-ingestion-validation.sql", "--set=pguser=\"test\";"); + container.execInContainer("psql", "-U", "test", "-w", "-f", + "/pgsqlschema/test-model-for-ingestion-validation.sql", "--set=pguser=\"test\";"); } catch (UnsupportedOperationException | IOException | InterruptedException e) { throw new RuntimeException(e.getMessage()); } diff --git a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainerV1.java b/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainerV1.java deleted file mode 100644 index 581059f..0000000 --- a/teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainerV1.java +++ /dev/null @@ -1,85 +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.db; - -import java.io.IOException; - -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.utility.DockerImageName; -import org.testcontainers.utility.MountableFile; - -public class TestPostgresqlContainerV1 extends PostgreSQLContainer { - - private static TestPostgresqlContainerV1 container; - - private TestPostgresqlContainerV1(DockerImageName image) { - super(image); - } - - public static TestPostgresqlContainerV1 getInstance() { - if (container == null) { - container = new TestPostgresqlContainerV1(DockerImageName.parse("postgis/postgis:13-3.4-alpine") - .asCompatibleSubstituteFor("postgres")); - container.withCopyFileToContainer(MountableFile.forClasspathResource( - "pgsqlschema/01_init-oran-smo-teiv-model-v1.sql"), "/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql"); - container.withCopyFileToContainer(MountableFile.forClasspathResource( - "pgsqlschema/00_init-oran-smo-teiv-data-v1.sql"), "/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql"); - container.withCopyFileToContainer(MountableFile.forClasspathResource( - "pgsqlschema/02_init-oran-smo-teiv-consumer-data-v1.sql"), - "/pgsqlschema/02_init-oran-smo-teiv-consumer-data-v1.sql"); - container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/model.sql"), - "/pgsqlschema/model.sql"); - container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/data-v1.sql"), - "/pgsqlschema/data-v1.sql"); - container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/consumer-data-v1.sql"), - "/pgsqlschema/consumer-data-v1.sql"); - container.setCommand("postgres", "-c", "max_connections=2000"); - - container.start(); - try { - container.execInContainer("psql", "-U", "test", "-w", "-f", - "/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql", "--set=pguser=\"test\";"); - container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/model.sql", - "--set=pguser=\"test\";"); - container.execInContainer("psql", "-U", "test", "-w", "-f", - "/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql", "--set=pguser=\"test\";"); - container.execInContainer("psql", "-U", "test", "-w", "-f", - "/pgsqlschema/02_init-oran-smo-teiv-consumer-data-v1.sql", "--set=pguser=\"test\";"); - container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/consumer-data-v1.sql", - "--set=pguser=\"test\";"); - } catch (UnsupportedOperationException | IOException | InterruptedException e) { - throw new RuntimeException(e.getMessage()); - } - } - return container; - } - - public static void loadSampleData() { - try { - container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/data-v1.sql", - "--set=pguser=\"test\";"); - container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/consumer-data-v1.sql", - "--set=pguser=\"test\";"); - } catch (UnsupportedOperationException | IOException | InterruptedException e) { - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/api/contract/TopologyExposureApiBase.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/api/contract/TopologyExposureApiBase.java index 345472e..bca07e6 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/api/contract/TopologyExposureApiBase.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/api/contract/TopologyExposureApiBase.java @@ -26,66 +26,48 @@ 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.db.TestPostgresqlContainerV1; -import org.springframework.beans.factory.annotation.Autowired; +import org.oran.smo.teiv.TopologyApiBase; +import org.oran.smo.teiv.db.TestPostgresqlContainer; +import org.oran.smo.teiv.exception.YangException; +import org.oran.smo.teiv.startup.SchemaCleanUpHandler; +import org.oran.smo.teiv.utils.yangparser.ExposureYangParser; 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.context.ApplicationContext; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.context.ActiveProfiles; import com.fasterxml.jackson.databind.ObjectMapper; -import io.restassured.module.mockmvc.RestAssuredMockMvc; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; -import org.oran.smo.teiv.startup.SchemaHandler; + +import java.util.List; + +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; @AutoConfigureMockMvc @SpringBootTest -public abstract class TopologyExposureApiBase { - public static TestPostgresqlContainerV1 postgresSQLContainer = TestPostgresqlContainerV1.getInstance(); +@ActiveProfiles({ "test", "exposure" }) +public abstract class TopologyExposureApiBase extends TopologyApiBase { + // This is required so that "Schema in deleting state" contract test works from 03_postSchemas.groovy @MockBean - private SchemaHandler schemaHandler; - - @Autowired - private ApplicationContext context; - - @Autowired - private MockMvc mockMvc; - - @DynamicPropertySource - static void setProperties(DynamicPropertyRegistry registry) { - registry.add("spring.datasource.read.jdbc-url", () -> postgresSQLContainer.getJdbcUrl()); - registry.add("spring.datasource.read.username", () -> postgresSQLContainer.getUsername()); - registry.add("spring.datasource.read.password", () -> postgresSQLContainer.getPassword()); - - registry.add("spring.datasource.write.jdbc-url", () -> postgresSQLContainer.getJdbcUrl()); - registry.add("spring.datasource.write.username", () -> postgresSQLContainer.getUsername()); - registry.add("spring.datasource.write.password", () -> postgresSQLContainer.getPassword()); - } + private SchemaCleanUpHandler schemaCleanUpHandler; @BeforeAll - public static void beforeAll() throws UnsupportedOperationException, SchemaLoaderException { + public static void beforeAll() throws SchemaLoaderException, YangException { String url = postgresSQLContainer.getJdbcUrl(); DataSource ds = DataSourceBuilder.create().url(url).username("test").password("test").build(); DSLContext dslContext = DSL.using(ds, SQLDialect.POSTGRES); - TestPostgresqlContainerV1.loadSampleData(); + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA, TIES_MODEL_SCHEMA), + dslContext); + TestPostgresqlContainer.loadModels(); + TestPostgresqlContainer.loadSampleData(); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); - } - - @BeforeEach - public void setup() { - mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilters().build(); - - RestAssuredMockMvc.mockMvc(mockMvc); + ExposureYangParser.loadAndValidateModels(); } } diff --git a/teiv/src/test/java/org/oran/smo/teiv/exposure/classifiers/api/ClassifiersServiceContainerizedTest.java b/teiv/src/test/java/org/oran/smo/teiv/exposure/classifiers/api/ClassifiersServiceContainerizedTest.java index de2ecc1..c0d59d9 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/exposure/classifiers/api/ClassifiersServiceContainerizedTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/exposure/classifiers/api/ClassifiersServiceContainerizedTest.java @@ -28,8 +28,12 @@ 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.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 com.fasterxml.jackson.databind.ObjectMapper; import org.apache.kafka.clients.consumer.ConsumerConfig; @@ -41,13 +45,13 @@ import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.SelectConditionStep; import org.jooq.impl.DSL; -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.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.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -59,8 +63,6 @@ import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.apache.kafka.common.serialization.StringDeserializer; -import lombok.Getter; - import javax.sql.DataSource; import java.util.Collections; import java.util.List; @@ -68,37 +70,22 @@ import java.util.Properties; import org.oran.smo.teiv.api.model.OranTeivClassifier; import org.oran.smo.teiv.api.model.OranTeivClassifier.OperationEnum; -import org.oran.smo.teiv.db.TestPostgresqlContainerV1; import org.oran.smo.teiv.exception.TiesException; 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; -import lombok.extern.slf4j.Slf4j; - -@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) @EmbeddedKafka -@Slf4j -@SpringBootTest(properties = { - "kafka.server.bootstrap-server-host:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[0]}", - "kafka.server.bootstrap-server-port:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[1]}", - "kafka.availability.retryIntervalMs:10", "data-catalog.use-dc-for-kafka-bootstrap:true", - "notification.consumer-data.enabled:true" }) +@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) @ActiveProfiles({ "test", "exposure" }) +@SpringBootTest(properties = { SPRING_BOOT_SERVER_HOST, SPRING_BOOT_SERVER_PORT, KAFKA_RETRY_INTERVAL_10_MS }) class ClassifiersServiceContainerizedTest { - public static TestPostgresqlContainerV1 postgreSQLContainer = TestPostgresqlContainerV1.getInstance(); + public static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); private static DSLContext writeDataDslContext; private static DSLContext readDataDslContext; - @Autowired - private ClassifiersService classifiersService; - - @Getter - @Value("${spring.embedded.kafka.brokers}") - private String embeddedKafkaServer; - - private KafkaConsumer testConsumer; private static final String ENTITY_TYPE = "ODUFunction"; private static final String TABLE_NAME = String.format(TIES_DATA, "o-ran-smo-teiv-ran_ODUFunction"); @@ -109,9 +96,18 @@ class ClassifiersServiceContainerizedTest { private static final String RELATIONSHIP_CLASSIFIERS = String.format(QUOTED_STRING, REL_PREFIX + CONSUMER_DATA_PREFIX + CLASSIFIERS + "_" + RELATIONSHIP_TYPE); + @Autowired + private ClassifiersService classifiersService; + + @Autowired + private ObjectMapper objectMapper; + @MockBean private SchemaHandler schemaHandler; + @MockBean + private SchemaCleanUpHandler schemaCleanUpHandler; + @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.read.jdbc-url", () -> postgreSQLContainer.getJdbcUrl()); @@ -124,41 +120,21 @@ class ClassifiersServiceContainerizedTest { } @BeforeAll - static void setUpAll() throws SchemaLoaderException { + static void setupAll() throws SchemaLoaderException { String url = postgreSQLContainer.getJdbcUrl(); DataSource ds = DataSourceBuilder.create().url(url).username("test").password("test").build(); DSLContext dslContext = DSL.using(ds, SQLDialect.POSTGRES); - PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); writeDataDslContext = DSL.using(ds, SQLDialect.POSTGRES); readDataDslContext = DSL.using(ds, SQLDialect.POSTGRES); + PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); - TestPostgresqlContainerV1.loadSampleData(); - } - - @BeforeEach - public void setUp() { - testConsumer = createConsumerForTest(getEmbeddedKafkaServer()); + TestPostgresqlContainer.loadSampleData(); } @BeforeEach - public void reloadBeforeEach() { - reloadData(); - } - - @AfterAll - public static void reloadAfterAll() { - reloadData(); - } - - @AfterEach - public void cleanUp() { - testConsumer.close(); - } - - private static void reloadData() { - writeDataDslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach( - t -> writeDataDslContext.truncate(t).cascade().execute()); - TestPostgresqlContainerV1.loadSampleData(); + public void setupEach() { + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.loadSampleData(); } @Test 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 30d8352..04c81e6 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 @@ -28,13 +28,18 @@ 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 java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.function.Supplier; import javax.sql.DataSource; import org.apache.kafka.clients.consumer.ConsumerConfig; @@ -48,11 +53,12 @@ import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.SelectConditionStep; import org.jooq.impl.DSL; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +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; @@ -67,11 +73,9 @@ import org.springframework.kafka.test.context.EmbeddedKafka; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; import lombok.Getter; import org.oran.smo.teiv.api.model.OranTeivDecorator; -import org.oran.smo.teiv.db.TestPostgresqlContainerV1; import org.oran.smo.teiv.exception.TiesException; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; @@ -80,23 +84,13 @@ import org.oran.smo.teiv.utils.JooqTypeConverter; @DirtiesContext(classMode = ClassMode.BEFORE_CLASS) @EmbeddedKafka -@Slf4j -@SpringBootTest(properties = { - "kafka.server.bootstrap-server-host:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[0]}", - "kafka.server.bootstrap-server-port:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[1]}", - "kafka.availability.retryIntervalMs:10", "notification.consumer-data.enabled:true" }) @ActiveProfiles({ "test", "exposure" }) +@SpringBootTest(properties = { SPRING_BOOT_SERVER_HOST, SPRING_BOOT_SERVER_PORT, KAFKA_RETRY_INTERVAL_10_MS }) class DecoratorsServiceContainerizedTest { - public static TestPostgresqlContainerV1 postgreSQLContainer = TestPostgresqlContainerV1.getInstance(); + public static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); private static DSLContext writeDataDslContext; private static DSLContext readDataDslContext; - @Autowired - private DecoratorsService decoratorsService; - - @Getter - @Value("${spring.embedded.kafka.brokers}") - private String embeddedKafkaServer; private KafkaConsumer testConsumer; @@ -110,9 +104,22 @@ class DecoratorsServiceContainerizedTest { private static final String RELATIONSHIP_DECORATORS = String.format(QUOTED_STRING, REL_PREFIX + CONSUMER_DATA_PREFIX + DECORATORS + "_MANAGEDELEMENT_MANAGES_ODUFUNCTION"); + @Getter + @Value("${spring.embedded.kafka.brokers}") + private String embeddedKafkaServer; + + @Autowired + private DecoratorsService decoratorsService; + + @Autowired + private ObjectMapper objectMapper; + @MockBean private SchemaHandler schemaHandler; + @MockBean + private SchemaCleanUpHandler schemaCleanUpHandler; + @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.read.jdbc-url", () -> postgreSQLContainer.getJdbcUrl()); @@ -125,7 +132,7 @@ class DecoratorsServiceContainerizedTest { } @BeforeAll - static void setUpAll() throws SchemaLoaderException { + static void setupAll() throws SchemaLoaderException { String url = postgreSQLContainer.getJdbcUrl(); DataSource ds = DataSourceBuilder.create().url(url).username("test").password("test").build(); DSLContext dslContext = DSL.using(ds, SQLDialect.POSTGRES); @@ -133,35 +140,22 @@ class DecoratorsServiceContainerizedTest { writeDataDslContext = DSL.using(ds, SQLDialect.POSTGRES); readDataDslContext = DSL.using(ds, SQLDialect.POSTGRES); postgresSchemaLoader.loadSchemaRegistry(); - TestPostgresqlContainerV1.loadSampleData(); + TestPostgresqlContainer.loadSampleData(); } @BeforeEach - public void setUp() { + public void setupEach() { + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA), writeDataDslContext); + TestPostgresqlContainer.loadSampleData(); + Supplier brokers = this::getEmbeddedKafkaServer; testConsumer = createConsumerForTest(getEmbeddedKafkaServer()); } - @BeforeEach - public void reloadBeforeEach() { - reloadData(); - } - - @AfterAll - public static void reloadAfterAll() { - reloadData(); - } - @AfterEach - public void cleanUp() { + public void cleanupEach() { testConsumer.close(); } - private static void reloadData() { - writeDataDslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach( - t -> writeDataDslContext.truncate(t).cascade().execute()); - TestPostgresqlContainerV1.loadSampleData(); - } - @Test void testAdd_emptyEntityDecorators() { Map decoratorsToMerge = Collections.emptyMap(); 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 b9b1054..0921962 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 @@ -25,11 +25,13 @@ 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 java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import javax.sql.DataSource; @@ -44,9 +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.SchemaRegistryException; import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Configuration; import org.oran.smo.teiv.db.TestPostgresqlContainer; @@ -57,12 +58,10 @@ import org.oran.smo.teiv.exposure.tiespath.refiner.BasePathRefinement; import org.oran.smo.teiv.schema.PostgresSchemaLoader; import org.oran.smo.teiv.schema.SchemaLoaderException; import org.oran.smo.teiv.schema.SchemaRegistry; -import org.oran.smo.teiv.startup.SchemaHandler; @Configuration -@SpringBootTest class DataRepositoryImplGETRequestsContainerizedTest { - public static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); + private static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); private static DataRepositoryImpl underTest; private static ModelRepository modelRepository; private static BasePathRefinement basePathRefinement; @@ -70,9 +69,6 @@ class DataRepositoryImplGETRequestsContainerizedTest { private static DSLContext readDataDslContext; private static DSLContext writeDataDslContext; - @MockBean - private SchemaHandler schemaHandler; - @BeforeAll public static void beforeAll() throws UnsupportedOperationException, SchemaLoaderException { String url = postgreSQLContainer.getJdbcUrl(); @@ -83,13 +79,11 @@ class DataRepositoryImplGETRequestsContainerizedTest { modelRepository = new ModelRepositoryImpl(readDataDslContext, readWriteDataDslContext, writeDataDslContext); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(readDataDslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); - TestPostgresqlContainer.loadSampleData(); } @BeforeEach public void deleteAll() { - writeDataDslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach( - t -> writeDataDslContext.truncate(t).cascade().execute()); + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA, TIES_CONSUMER_DATA_SCHEMA), writeDataDslContext); TestPostgresqlContainer.loadSampleData(); } @@ -101,11 +95,9 @@ class DataRepositoryImplGETRequestsContainerizedTest { Assertions.assertFalse(schemaByName.isPresent()); Module schema = Module.builder().name(moduleName).namespace("new-namespace").domain("NEW_DOMAIN").content( - "yang content {} \n\n \t\t\t;").ownerAppId("APP").status(ModuleStatus.IN_USAGE).revision("2024-07-15") + "yang content {} \n\n \t\t\t;").ownerAppId("APP").revision("2024-07-15").status(ModuleStatus.IN_USAGE) .build(); - - modelRepository.createModule(schema); - + modelRepository.createConsumerDataModule(schema, List.of(), Map.of()); schemaByName = modelRepository.getConsumerModuleByName(moduleName); Assertions.assertTrue(schemaByName.isPresent()); @@ -139,43 +131,49 @@ class DataRepositoryImplGETRequestsContainerizedTest { } @Test - void getRelationshipIdsForDecoratorDeletionTest() { + void getRelationshipIdsForDecoratorDeletionTest() throws SchemaRegistryException { Assertions.assertEquals(Collections.singletonList( - "urn:base64:R05CQ1VVUEZ1bmN0aW9uOkJGRUVBQzJDRTYwMjczQ0IwQTc4MzE5Q0MyMDFBN0ZFOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246QUQ0MkQ5MDQ5N0U5M0QyNzYyMTVERjZEM0I4OTlFMTc="), - underTest.getRelationshipIdsForDecoratorDeletion(SchemaRegistry.getRelationTypeByName( - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION"), Set.of("gnbcucp-gnbcuup-model:metadata"))); + "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65"), + underTest.getRelationshipIdsForDecoratorDeletion(SchemaRegistry.getRelationTypeByModuleAndName( + "o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"), Set.of( + "ocucp-ocuup-model:metadata"))); Assertions.assertEquals(Collections.singletonList( - "urn:base64:TWFuYWdlZEVsZW1lbnQ6RTY0MzcxQ0Q0RDEyRUQwQ0VEMjAwREQzQTc1OTE3ODQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QkZFRUFDMkNFNjAyNzNDQjBBNzgzMTlDQzIwMUE3RkU="), - underTest.getRelationshipIdsForDecoratorDeletion(SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION"), Set.of("gnbcucp-gnbcuup-model:metadata"))); + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A"), + underTest.getRelationshipIdsForDecoratorDeletion(SchemaRegistry.getRelationTypeByModuleAndName( + "o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"), Set.of( + "ocucp-ocuup-model:metadata"))); } @Test - void getRelationshipIdsForClassifierDeletionTest() { + void getRelationshipIdsForClassifierDeletionTest() throws SchemaRegistryException { Assertions.assertEquals(Collections.singletonList( - "urn:base64:R05CQ1VVUEZ1bmN0aW9uOkJGRUVBQzJDRTYwMjczQ0IwQTc4MzE5Q0MyMDFBN0ZFOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246QUQ0MkQ5MDQ5N0U5M0QyNzYyMTVERjZEM0I4OTlFMTc="), - underTest.getRelationshipIdsForClassifierDeletion(SchemaRegistry.getRelationTypeByName( - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION"), Set.of("gnbcucp-gnbcuup-model:Weekend"))); + "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65"), + underTest.getRelationshipIdsForClassifierDeletion(SchemaRegistry.getRelationTypeByModuleAndName( + "o-ran-smo-teiv-rel-equipment-ran", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"), Set.of( + "ocucp-ocuup-model:Weekend"))); Assertions.assertEquals(Collections.singletonList( - "urn:base64:TWFuYWdlZEVsZW1lbnQ6RTY0MzcxQ0Q0RDEyRUQwQ0VEMjAwREQzQTc1OTE3ODQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QkZFRUFDMkNFNjAyNzNDQjBBNzgzMTlDQzIwMUE3RkU="), - underTest.getRelationshipIdsForClassifierDeletion(SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION"), Set.of("gnbcucp-gnbcuup-model:Weekend"))); + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A"), + underTest.getRelationshipIdsForClassifierDeletion(SchemaRegistry.getRelationTypeByModuleAndName( + "o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"), Set.of( + "ocucp-ocuup-model:Weekend"))); } @Test - void getEntityIdsForDecoratorDeletionTest() { - Assertions.assertEquals(Collections.singletonList("E49D942C16E0364E1E0788138916D70C"), underTest - .getEntityIdsForDecoratorDeletion(SchemaRegistry.getEntityTypeByName("NRSectorCarrier"), Set.of( - "gnbcucp-gnbcuup-model:metadata"))); + void getEntityIdsForDecoratorDeletionTest() throws SchemaRegistryException { + Assertions.assertEquals(Collections.singletonList( + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1"), + underTest.getEntityIdsForDecoratorDeletion(SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + "NRSectorCarrier"), Set.of("ocucp-ocuup-model:metadata"))); } @Test - void getEntityIdsForClassifierDeletionTest() { - Assertions.assertEquals(Collections.singletonList("E49D942C16E0364E1E0788138916D70C"), underTest - .getEntityIdsForClassifierDeletion(SchemaRegistry.getEntityTypeByName("NRSectorCarrier"), Set.of( - "gnbcucp-gnbcuup-model:Weekend"))); + void getEntityIdsForClassifierDeletionTest() throws SchemaRegistryException { + Assertions.assertEquals(Collections.singletonList( + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1"), + underTest.getEntityIdsForClassifierDeletion(SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-ran", "NRSectorCarrier"), Set.of("ocucp-ocuup-model:Weekend"))); } } 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/tiespath/innerlanguage/DtoToJooqTest.java index 24128c7..6dba279 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/tiespath/innerlanguage/DtoToJooqTest.java @@ -30,6 +30,7 @@ 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.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -50,7 +51,8 @@ class DtoToJooqTest { private static final String ANTENNA_CAPABILITY = "AntennaCapability"; private static final String ANTENNA_MODULE = "AntennaModule"; private static final String MANAGED_ELEMENT = "ManagedElement"; - private static final String NR_CELL_DU = "NRCellDU"; + private static final String NRCELLDU = "NRCellDU"; + private static final String SECTOR = "Sector"; @BeforeAll static void setUp() throws SchemaLoaderException { @@ -71,28 +73,26 @@ class DtoToJooqTest { LogicalBlock lb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock lb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock olb1 = new OrLogicalBlock(); - olb1.setChildren(List.of(lb1, lb2)); // 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") - .toString(), olb1.getCondition().toString()); + .toString(), getTestOrCondition(List.of(lb1, lb2)).toString()); // spotless:on } @Test void testConditions_entityAttributes_primitive() { - ScopeObject scopeObject1 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject1 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("nRPCI").queryFunction(QueryFunction.EQ).parameter("ABC789").dataType( DataType.PRIMITIVE).build(); - ScopeObject scopeObject2 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject2 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("nRPCI").queryFunction(QueryFunction.CONTAINS).parameter("ABC789").dataType( DataType.PRIMITIVE).build(); - ScopeObject scopeObject3 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject3 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("nRPCI").queryFunction(QueryFunction.NOT_NULL).dataType(DataType.PRIMITIVE) .build(); @@ -100,13 +100,6 @@ class DtoToJooqTest { LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - AndOrLogicalBlock alb2 = new OrLogicalBlock(); - alb2.setChildren(List.of(alb1, slb3)); - - Condition actualCondition = alb2.getCondition(); // spotless:off assertEquals(condition( "\n" + @@ -121,59 +114,51 @@ class DtoToJooqTest { " '!_'\n" + " )) || '%') escape '!'\n" + " or ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nRPCI\" is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(slb1, slb2, slb3)).toString()); // spotless:on } @Test void testConditions_entityAttributes_bigint() { - ScopeObject scopeObject1 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject1 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("gNBId").queryFunction(QueryFunction.EQ).parameter("1").dataType( DataType.BIGINT).build(); - ScopeObject scopeObject2 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject2 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("gNBId").queryFunction(QueryFunction.EQ).parameter("2").dataType( DataType.BIGINT).build(); LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb1.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(slb1, slb2)).toString()); // spotless:on } @Test void testConditions_entityAttributes_decimal() { - ScopeObject scopeObject1 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject1 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("decimalColumn").queryFunction(QueryFunction.EQ).parameter("2.5").dataType( DataType.DECIMAL).build(); - ScopeObject scopeObject2 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject2 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("decimalColumn").queryFunction(QueryFunction.EQ).parameter("15.25").dataType( DataType.DECIMAL).build(); LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb1.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -187,6 +172,10 @@ class DtoToJooqTest { ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( "POINT(39.4019881 67.9419888)").dataType(DataType.GEOGRAPHIC).build(); + ScopeObject valid3 = ScopeObject.builder("AntennaModule").topologyObjectType(TopologyObjectType.ENTITY).container( + ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( + "POINT Z (39.4019881 67.9419888 123.9878)").dataType(DataType.GEOGRAPHIC).build(); + ScopeObject invalidContains = ScopeObject.builder("AntennaModule").topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.CONTAINS).parameter( "POINT(39.4019881 67.9419888)").dataType(DataType.GEOGRAPHIC).build(); @@ -205,7 +194,11 @@ class DtoToJooqTest { ScopeObject invalidCoordinate3 = ScopeObject.builder("AntennaModule").topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( - "POINT(39.4019881 67.9419888 123.9878)").dataType(DataType.GEOGRAPHIC).build(); + "POINT(39.4019881 INVALID)").dataType(DataType.GEOGRAPHIC).build(); + + ScopeObject invalidCoordinate4 = ScopeObject.builder("AntennaModule").topologyObjectType(TopologyObjectType.ENTITY) + .container(ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( + "POINT Z (39.4019881 67.9419888)").dataType(DataType.GEOGRAPHIC).build(); ScopeObject invalidFormat1 = ScopeObject.builder("AntennaModule").topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter( @@ -224,12 +217,15 @@ class DtoToJooqTest { .toString(), new ScopeLogicalBlock(valid1).getCondition().toString()); assertEquals(condition("ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('POINT(39.4019881 67.9419888)')") .toString(), new ScopeLogicalBlock(valid2).getCondition().toString()); + assertEquals(condition("ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"geoColumn\" = st_geomfromtext('POINT Z (39.4019881 67.9419888 123.9878)')") + .toString(), new ScopeLogicalBlock(valid3).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(invalidCoordinate4)::getCondition); assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat1)::getCondition); assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat2)::getCondition); assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidFormat3)::getCondition); @@ -253,16 +249,12 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb1.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(slb1, slb2)).toString()); assertThrows(TiesPathException.class, new ScopeLogicalBlock(invalidQueryFunction)::getCondition); // spotless:on @@ -274,67 +266,225 @@ class DtoToJooqTest { .container(ContainerType.ATTRIBUTES).innerContainer(List.of("dUpLMNId", "mcc")).leaf("mcca").queryFunction( QueryFunction.EQ).parameter("789").dataType(DataType.PRIMITIVE).build(); - ScopeObject scopeObject11 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) + ScopeObject scopeObject2 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).innerContainer(List.of("dUpLMNId", "mcc")).leaf("mccb").queryFunction( QueryFunction.EQ).parameter("789").dataType(DataType.INTEGER).build(); - ScopeObject scopeObject2 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) + ScopeObject scopeObject3 = ScopeObject.builder(ODU_FUNCTION).topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).innerContainer(List.of("dUpLMNId", "mcc")).leaf("mcca").queryFunction( QueryFunction.CONTAINS).parameter("789").dataType(DataType.PRIMITIVE).build(); - LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); - LogicalBlock slb11 = new ScopeLogicalBlock(scopeObject11); - LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb11)); - - AndOrLogicalBlock alb2 = new OrLogicalBlock(); - alb2.setChildren(List.of(alb1, slb2)); + LogicalBlock lb1 = new ScopeLogicalBlock(scopeObject1); + LogicalBlock lb2 = new ScopeLogicalBlock(scopeObject2); + LogicalBlock lb3 = new ScopeLogicalBlock(scopeObject3); - Condition actualCondition = alb2.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(lb1, lb2, lb3)).toString()); // spotless:on } + @Test + void testConditions_geoLocation_withinMeters() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( + "'POINT (12.3426 -45.24568)', 500").resolverDataType(ResolverDataType.STRING).queryFunction( + QueryFunction.WITHIN_METERS).build()); + + Condition actualCondition = scopeObject.getCondition(); + assertEquals(condition("ST_DWithin(\"geo-location\", ST_GeographyFromText('POINT (12.3426 -45.24568)'), 500)") + .toString(), actualCondition.toString()); + } + + @Test + void testConditions_geoLocation_withinMeters_invalidParameter() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_withinMeters_invalidParameter2() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_withinMeters_invalidParameter3() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_withinMeters_invalidParameter4() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_withinMeters_invalidParameter5() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_withinMeters_withoutSpaceAfterComma() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( + "'POINT (12.3426 45.24568)',500").resolverDataType(ResolverDataType.STRING).queryFunction( + QueryFunction.WITHIN_METERS).build()); + + Condition actualCondition = scopeObject.getCondition(); + assertEquals(condition("ST_DWithin(\"geo-location\", ST_GeographyFromText('POINT (12.3426 45.24568)'), 500)") + .toString(), actualCondition.toString()); + } + + @Test + void testConditions_geoLocation_withinMeters2() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").dataType(DataType.GEOGRAPHIC).topologyObjectType(TopologyObjectType.ENTITY).parameter( + "'POINT(12 45.24568)',500").resolverDataType(ResolverDataType.STRING).queryFunction( + QueryFunction.WITHIN_METERS).build()); + + Condition actualCondition = scopeObject.getCondition(); + assertEquals(condition("ST_DWithin(\"geo-location\", ST_GeographyFromText('POINT(12 45.24568)'), 500)").toString(), + actualCondition.toString()); + } + + @Test + void testConditions_geoLocation_coveredBy() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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()); + + Condition actualCondition = scopeObject.getCondition(); + assertEquals(condition( + "ST_CoveredBy(\"geo-location\", ST_GeographyFromText('POLYGON((12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568))'))") + .toString(), actualCondition.toString()); + } + + @Test + void testConditions_geoLocation_coveredBy2() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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, 35.2 45.6))") + .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.COVERED_BY).build()); + + Condition actualCondition = scopeObject.getCondition(); + assertEquals(condition( + "ST_CoveredBy(\"geo-location\", ST_GeographyFromText('POLYGON((12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 -44.24568, 35.2 45.6))'))") + .toString(), actualCondition.toString()); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidParameter() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidParameter2() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidParameter3() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidParameter4() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidParameter5() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + + @Test + void testConditions_geoLocation_coveredBy_invalidDataType() { + ScopeLogicalBlock scopeObject = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .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); + } + @Test void testConditions_entityAttributes_containerArray() { ScopeObject scopeObject1 = ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).innerContainer(List.of("eUtranFqBands")).leaf(ITEM).queryFunction( QueryFunction.EQ).parameter("789").dataType(DataType.PRIMITIVE).build(); - ScopeObject scopeObject11 = ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType(TopologyObjectType.ENTITY) + ScopeObject scopeObject2 = ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).innerContainer(List.of("eUtranFqBands")).leaf(ITEM).queryFunction( QueryFunction.EQ).parameter("789").dataType(DataType.INTEGER).build(); - ScopeObject scopeObject2 = ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType(TopologyObjectType.ENTITY) + ScopeObject scopeObject3 = ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType(TopologyObjectType.ENTITY) .container(ContainerType.ATTRIBUTES).innerContainer(List.of("eUtranFqBands")).leaf(ITEM).queryFunction( QueryFunction.CONTAINS).parameter("456").dataType(DataType.PRIMITIVE).build(); - LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); - LogicalBlock slb11 = new ScopeLogicalBlock(scopeObject11); - LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb11)); - - AndOrLogicalBlock alb2 = new OrLogicalBlock(); - alb2.setChildren(List.of(alb1, slb2)); + LogicalBlock lb1 = new ScopeLogicalBlock(scopeObject1); + LogicalBlock lb2 = new ScopeLogicalBlock(scopeObject2); + LogicalBlock lb3 = new ScopeLogicalBlock(scopeObject3); - Condition actualCondition = alb2.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(lb1, lb2, lb3)).toString()); // spotless:on } @@ -355,24 +505,19 @@ class DtoToJooqTest { "levelTwoField")).leaf(ITEM).queryFunction(QueryFunction.CONTAINS).parameter("456").dataType( DataType.INTEGER).build(); - LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); - LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - - AndOrLogicalBlock alb1 = new OrLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - AndOrLogicalBlock alb2 = new OrLogicalBlock(); - alb2.setChildren(List.of(alb1, slb3)); + LogicalBlock lb1 = new ScopeLogicalBlock(scopeObject1); + LogicalBlock lb2 = new ScopeLogicalBlock(scopeObject2); + LogicalBlock lb3 = new ScopeLogicalBlock(scopeObject3); - Condition actualCondition = alb2.getCondition(); // 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" + + " (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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(lb1, lb2, lb3)).toString()); // spotless:on } @@ -386,35 +531,27 @@ class DtoToJooqTest { .container(ContainerType.ATTRIBUTES).leaf("decimalId").queryFunction(QueryFunction.EQ).parameter("2.5") .dataType(DataType.DECIMAL).build(); - ScopeObject scopeObject3 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject3 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).leaf("nRPCI").queryFunction(QueryFunction.CONTAINS).parameter("ABC789").dataType( DataType.PRIMITIVE).build(); - ScopeObject scopeObject4 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject4 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ATTRIBUTES).innerContainer(List.of("pLMNId")).leaf("mnc").queryFunction(QueryFunction.EQ) .parameter("789").dataType(DataType.PRIMITIVE).build(); - LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); - LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - LogicalBlock slb4 = new ScopeLogicalBlock(scopeObject4); - - AndOrLogicalBlock alb1 = new AndLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - AndOrLogicalBlock alb2 = new AndLogicalBlock(); - alb2.setChildren(List.of(slb3, slb4)); - - AndOrLogicalBlock alb3 = new AndLogicalBlock(); - alb3.setChildren(List.of(alb1, alb2)); + LogicalBlock lb1 = new ScopeLogicalBlock(scopeObject1); + LogicalBlock lb2 = new ScopeLogicalBlock(scopeObject2); + LogicalBlock lb3 = new ScopeLogicalBlock(scopeObject3); + LogicalBlock lb4 = new ScopeLogicalBlock(scopeObject4); - Condition actualCondition = alb3.getCondition(); // 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" + + " 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" + + " replace(\n" + " replace('ABC789', '!', '!!'),\n" + " '%',\n" + @@ -424,7 +561,7 @@ class DtoToJooqTest { " '!_'\n" + " )) || '%') escape '!'\n" + " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"pLMNId\" -> 'mnc' = '\"789\"'\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(lb1, lb2, lb3, lb4)).toString()); // spotless:on } @@ -441,16 +578,12 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -467,7 +600,7 @@ class DtoToJooqTest { @Test void testConditions_relation() { - ScopeObject scopeObject1 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject1 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.RELATION).innerContainer(List.of("ODUFUNCTION_PROVIDES_NRCELLDU")).queryFunction( QueryFunction.EQ).parameter("urn:base64:TWFuYWdlZEV").dataType(DataType.PRIMITIVE).build(); @@ -484,20 +617,15 @@ class DtoToJooqTest { LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - AndOrLogicalBlock alb1 = new AndLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - - AndOrLogicalBlock alb2 = new AndLogicalBlock(); - alb2.setChildren(List.of(alb1, slb3)); - - Condition actualCondition = alb2.getCondition(); // 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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2, slb3)).toString()); // spotless:on } @@ -531,22 +659,19 @@ class DtoToJooqTest { .container(ContainerType.ID).queryFunction(QueryFunction.EQ).parameter("ABC123").dataType( DataType.PRIMITIVE).build(); - ScopeObject scopeObject2 = ScopeObject.builder(NR_CELL_DU).topologyObjectType(TopologyObjectType.ENTITY).container( + ScopeObject scopeObject2 = ScopeObject.builder(NRCELLDU).topologyObjectType(TopologyObjectType.ENTITY).container( ContainerType.ID).queryFunction(QueryFunction.CONTAINS).parameter("DEF456").dataType(DataType.PRIMITIVE) .build(); LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // 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" + + " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"id\" like (('%' || replace(\n" + + " replace(\n" + " replace('DEF456', '!', '!!'),\n" + " '%',\n" + @@ -555,7 +680,7 @@ class DtoToJooqTest { " '_',\n" + " '!_'\n" + " )) || '%') escape '!'\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -606,16 +731,13 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU\" is not null\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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -634,7 +756,7 @@ class DtoToJooqTest { } @Test - void testConditions_entityAssociation_oneToMany1() { + void testConditions_entityAssociation_oneToMany_equals_id() { ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction").topologyObjectType( TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( "managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.EQ).parameter("me1").build()); @@ -644,45 +766,88 @@ class DtoToJooqTest { "managed-by-managedElement")).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") - .toString(), actualCondition.toString()); + "\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") + .toString(), + getTestAndCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_entityAssociation_oneToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(MANAGED_ELEMENT).topologyObjectType( + ScopeLogicalBlock scopeObject3 = 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( + ScopeLogicalBlock scopeObject4 = 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()); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(scopeObject1, scopeObject2)); + // 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") + .toString(), + getTestAndCondition(List.of(scopeObject3, scopeObject4)).toString()); + // spotless:on + } - Condition actualCondition = alb.getCondition(); + @Test + void testConditions_entityAssociation_oneToMany_equals_attribute() { + ScopeLogicalBlock associationScope1 = new ScopeLogicalBlock(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()); // 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") - .toString(), actualCondition.toString()); + "ties_data.\"o-ran-smo-teiv-ran_Sector\".\"geoColumn\" = st_geomfromtext('point(39.4019881 67.9419888)')") + .toString(), associationScope1.getCondition().toString()); + // spotless:on + + // Condition for Sectors where NRCellDU's nCI equals.. + ScopeLogicalBlock associationScope2 = new ScopeLogicalBlock(ScopeObject.builder(SECTOR).topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("grouped-nrCellDu")) + .leaf("nCI").queryFunction(QueryFunction.EQ).parameter("400").dataType(DataType.BIGINT).build()); + // spotless:off + assertEquals(condition("\n" + + " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_grouped-by-sector\" is not null\n" + + + " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"nCI\" = 400\n").toString(), + associationScope2.getCondition().toString()); + // spotless:on + } + + @Test + void testConditions_entityAssociation_oneToMany_contains_id() { + 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()); + + Condition actualCondition = scopeObject1.getCondition(); + // spotless:off + assertEquals( + ("ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\"like(('%'||replace(" + + "\n" + + "replace(" + "\n" + + "replace('me1','!','!!')," + "\n" + + "'%'," + "\n" + + "'!%'" + "\n" + + ")," + "\n" + + "'_'," + "\n" + + "'!_'" + "\n" + + "))||'%')escape'!'").replace(" ", ""), + actualCondition.toString().replace(" ", "")); // spotless:on } @Test - void testConditions_entityAssociation_manyToOne1() { + void testConditions_entityAssociation_manyToOne_equals_id() { ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("installed-at-site")) .leaf("id").queryFunction(QueryFunction.EQ).parameter("site1").build()); @@ -691,120 +856,115 @@ class DtoToJooqTest { TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("installed-at-site")) .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") - .toString(), actualCondition.toString()); + "\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") + .toString(), + getTestOrCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_entityAssociation_manyToOne2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( + ScopeLogicalBlock scopeObject3 = 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( + ScopeLogicalBlock scopeObject4 = 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()); - AndOrLogicalBlock alb = new OrLogicalBlock(); - alb.setChildren(List.of(scopeObject1, scopeObject2)); - - Condition actualCondition = alb.getCondition(); // spotless:off 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" + - " )\n" + - " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") - .toString(), actualCondition.toString()); + "\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" + + + " )\n" + + " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") + .toString(), + getTestOrCondition(List.of(scopeObject3, scopeObject4)).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()); - - Condition actualCondition = scopeObject1.getCondition(); + void testConditions_entityAssociation_manyToOne_equals_attribute() { + ScopeLogicalBlock associationScope1 = new ScopeLogicalBlock(ScopeObject.builder("AntennaModule").topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("installed-at-site")) + .leaf("geoColumn").queryFunction(QueryFunction.EQ).parameter("point(39.4019881 67.9419888)").dataType( + DataType.GEOGRAPHIC).build()); // 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 (" + - "('%' || replace(" + "\n"+ - "replace(" + "\n"+ - "replace('am1', '!', '!!')," + "\n"+ - "'%'," + "\n"+ - "'!%'" + "\n"+ - ")," + "\n"+ - "'_'," + "\n"+ - "'!_'" + "\n"+ - ")) || '%') escape '!'" + "\n") - .toString().replace(" ", ""), actualCondition.toString().replace(" ", "")); + "((ties_data.\"o-ran-smo-teiv-equipment_Site\".\"geoColumn\" = st_geomfromtext('point(39.4019881 67.9419888)')))") + .toString(), String.format("((%s))", associationScope1.getCondition().toString())); // spotless:on - } - @Test - void testConditions_entityAssociation_manyToMany1Contains() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_MODULE).topologyObjectType( + ScopeLogicalBlock associationScope2 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "serviced-antennaCapability")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("ac1") - .build()); + "installed-antennaModule")).leaf("electronicalAntennaTilt").queryFunction(QueryFunction.EQ) + .parameter("10").dataType(DataType.BIGINT).build()); - Condition actualCondition = scopeObject1.getCondition(); // spotless:off - assertEquals(("ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" + - ".\"bSide_AntennaCapability\"like(('%'||replace(" + "\n"+ - "replace(" + "\n"+ - "replace('ac1','!','!!')," + "\n"+ - "'%'," + "\n"+ - "'!%'" + "\n"+ - ")," + "\n"+ - "'_'," + "\n"+ - "'!_'" + "\n"+ - "))||'%')escape'!'") - .replace(" ", ""), actualCondition.toString().replace(" ", "")); + 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\".\"electronicalAntennaTilt\" = 10\n") + .toString(), associationScope2.getCondition().toString()); // spotless:on } @Test - void testConditions_entityAssociation_oneToMany1Contains() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ORUFunction").topologyObjectType( + void testConditions_entityAssociation_manyToOne_contains_id() { + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("Site").topologyObjectType( TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( - "managed-by-managedElement")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("me1") + "installed-antennaModule")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("am1") .build()); - Condition actualCondition = scopeObject1.getCondition(); // spotless:off - assertEquals( - ("ties_data.\"o-ran-smo-teiv-ran_ORUFunction\".\"REL_FK_managed-by-managedElement\"like(('%'||replace(" + "\n" + - "replace(" +"\n"+ - "replace('me1','!','!!')," + "\n" + + 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 (" + + + "('%' || replace(" + "\n" + + "replace(" + "\n" + + "replace('am1', '!', '!!')," + "\n" + "'%'," + "\n" + "'!%'" + "\n" + ")," + "\n" + "'_'," + "\n" + "'!_'" + "\n" + - "))||'%')escape'!'" - ).replace(" ", ""), actualCondition.toString().replace(" ", "")); + ")) || '%') escape '!'" + "\n") + .toString().replace(" ", ""), scopeObject1.getCondition().toString().replace(" ", "")); + // spotless:on + + ScopeLogicalBlock scopeObject2 = 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()); + + // spotless:off + assertEquals(("ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" + + ".\"bSide_AntennaCapability\"like(('%'||replace(" + "\n" + + "replace(" + "\n" + + "replace('ac1','!','!!')," + "\n" + + "'%'," + "\n" + + "'!%'" + "\n" + + ")," + "\n" + + "'_'," + "\n" + + "'!_'" + "\n" + + "))||'%')escape'!'") + .replace(" ", ""), scopeObject2.getCondition().toString().replace(" ", "")); // spotless:on } @Test - void testConditions_entityAssociation_manyToMany1() { + void testConditions_entityAssociation_manyToMany_equals_id() { 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()); @@ -814,44 +974,93 @@ class DtoToJooqTest { "serviced-antennaCapability")).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" + + " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + + " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_entityAssociation_manyToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder(ANTENNA_CAPABILITY).topologyObjectType( + ScopeLogicalBlock scopeObject3 = 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( + ScopeLogicalBlock scopeObject4 = 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()); - 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" + + " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + + " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject3, scopeObject4)).toString()); + // spotless:on + } + + @Test + void testConditions_entityAssociation_manyToMany_contains_id() { + ScopeLogicalBlock associationScope1 = new ScopeLogicalBlock(ScopeObject.builder("AntennaModule").topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serviced-antennaCapability")).leaf("nRFqBands").queryFunction(QueryFunction.EQ).parameter( + "13252AC12BF").dataType(DataType.PRIMITIVE).build()); + + // spotless:off + assertEquals(condition( + "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"nRFqBands\" = '13252AC12BF'") + .toString(), String.format("(%s)", associationScope1.getCondition().toString())); + // spotless:on + + ScopeLogicalBlock associationScope2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability") + .topologyObjectType(TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serving-antennaModule")).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter( + "AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A") + .build()); + // spotless:off + assertEquals(("ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" + + ".\"aSide_AntennaModule\"like(('%'||replace(" + "\n" + + "replace(" + "\n" + + "replace('AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A','!','!!')," + + "\n" + + "'%'," + "\n" + + "'!%'" + "\n" + + ")," + "\n" + + "'_'," + "\n" + + "'!_'" + "\n" + + "))||'%')escape'!'") + .replace(" ", ""), associationScope2.getCondition().toString().replace(" ", "")); + // spotless:on + } + + @Test + void testConditions_entityAssociation_manyToMany_equals_attribute() { + ScopeLogicalBlock associationScope1 = new ScopeLogicalBlock(ScopeObject.builder("AntennaModule").topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serviced-antennaCapability")).leaf("nRFqBands").queryFunction(QueryFunction.EQ).parameter( + "13252AC12BF").dataType(DataType.PRIMITIVE).build()); + + // spotless:off + assertEquals(condition( + "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"nRFqBands\" = '13252AC12BF'") + .toString(), String.format("(%s)", associationScope1.getCondition().toString())); + // spotless:on + + ScopeLogicalBlock associationScope2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability") + .topologyObjectType(TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serving-antennaModule")).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)')") + .toString(), associationScope2.getCondition().toString()); // spotless:on } @Test - void testConditions_relationAssociation_oneToMany1() { + void testConditions_relationAssociation_oneToMany_equals_id() { 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") @@ -862,46 +1071,38 @@ class DtoToJooqTest { .of("managed-by-managedElement")).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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_relationAssociation_oneToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("MANAGEDELEMENT_MANAGES_ORUFUNCTION") + ScopeLogicalBlock scopeObject3 = 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") + ScopeLogicalBlock scopeObject4 = 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()); - 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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject3, scopeObject4)).toString()); // spotless:on } @Test - void testConditions_relationAssociation_manyToOne1() { + void testConditions_relationAssociation_manyToOne_equals_id() { 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()); @@ -910,49 +1111,41 @@ class DtoToJooqTest { .topologyObjectType(TopologyObjectType.RELATION).container(ContainerType.ASSOCIATION).innerContainer(List .of("installed-at-site")).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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_relationAssociation_manyToOne2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_INSTALLED_AT_SITE") + ScopeLogicalBlock scopeObject3 = 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") + ScopeLogicalBlock scopeObject4 = 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()); - AndOrLogicalBlock alb = new OrLogicalBlock(); - alb.setChildren(List.of(scopeObject1, scopeObject2)); - - Condition actualCondition = alb.getCondition(); // spotless:off 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" + + " 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" + + " )\n" + " or ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestOrCondition(List.of(scopeObject3, scopeObject4)).toString()); // spotless:on } @Test - void testConditions_relationAssociation_manyToMany1() { + void testConditions_relationAssociation_manyToMany_equals_id() { 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") @@ -963,49 +1156,115 @@ class DtoToJooqTest { .of("serviced-antennaCapability")).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" + + " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + + " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject1, scopeObject2)).toString()); // spotless:on - } - @Test - void testConditions_relationAssociation_manyToMany2() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("ANTENNAMODULE_SERVES_ANTENNACAPABILITY") + ScopeLogicalBlock scopeObject3 = 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") + ScopeLogicalBlock scopeObject4 = 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()); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(scopeObject1, scopeObject2)); + // spotless:off + assertEquals(condition( + "\n" + + " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + + + " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") + .toString(), getTestAndCondition(List.of(scopeObject3, scopeObject4)).toString()); + // spotless:on + } + + @Test + void testConditions_entityAssociation_sameEntity_equals_id() { + ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("AntennaModule").topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serving-antennaModule")).leaf("id").queryFunction(QueryFunction.EQ).parameter("ac1").build()); + + ScopeLogicalBlock scopeObject2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaModule").topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of( + "serving-antennaModule")).leaf(null).queryFunction(QueryFunction.NOT_NULL).parameter(null).build()); - Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" + + " ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" + + " and ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(scopeObject1, scopeObject2)).toString()); + // spotless:on + } + + @Test + void testConditions_entityAssociation_equals_attributes_nested_leaf() { + ScopeLogicalBlock associationScope3 = new ScopeLogicalBlock(ScopeObject.builder(SECTOR).topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("grouped-nrCellDu", + "plmnId")).leaf("mcc").queryFunction(QueryFunction.EQ).parameter("599").dataType(DataType.BIGINT) + .build()); + // spotless:off + assertEquals(condition("\n" + + " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_grouped-by-sector\" is not null\n" + + + " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"plmnId\" -> 'mcc' = 599\n") + .toString(), + associationScope3.getCondition().toString()); + // spotless:on + + ScopeLogicalBlock associationScope4 = new ScopeLogicalBlock(ScopeObject.builder(SECTOR).topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("grouped-nrCellDu", + "plmnId", "mcc")).leaf("mcca").queryFunction(QueryFunction.EQ).parameter("599").dataType( + DataType.BIGINT).build()); + // spotless:off + assertEquals(condition("\n" + + " ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_grouped-by-sector\" is not null\n" + + + " and ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"plmnId\" -> 'mcc' -> 'mcca' = 599\n") + .toString(), + associationScope4.getCondition().toString()); // spotless:on } @Test void testConditions_entityAssociation_throws() { - ScopeLogicalBlock scopeObject1 = new ScopeLogicalBlock(ScopeObject.builder("CloudNativeApplication").container( + ScopeLogicalBlock associationScope1 = 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); + assertThrows(TiesPathException.class, associationScope1::getCondition); + + // Equals Condition with missing datatype + ScopeLogicalBlock associationScope3 = new ScopeLogicalBlock(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)").build()); + assertThrows(TiesPathException.class, associationScope3::getCondition); + + // Contains Condition with missing datatype + ScopeLogicalBlock associationScope4 = new ScopeLogicalBlock(ScopeObject.builder(NRCELLDU).topologyObjectType( + TopologyObjectType.ENTITY).container(ContainerType.ASSOCIATION).innerContainer(List.of("grouped-by-sector")) + .leaf("geoColumn").queryFunction(QueryFunction.CONTAINS).parameter("point(39.4019881 67.9419888)").build()); + assertThrows(TiesPathException.class, associationScope4::getCondition); + + // Equals Condition for Attributes on Relation + ScopeLogicalBlock associationScope5 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").topologyObjectType(TopologyObjectType.RELATION).container( + ContainerType.ASSOCIATION).innerContainer(List.of("serving-antennaModule")).leaf("field") + .queryFunction(QueryFunction.EQ).parameter("am1").build()); + assertThrows(TiesPathException.class, associationScope5::getCondition); + + // Contains Condition for Attributes on Relation + ScopeLogicalBlock associationScope6 = new ScopeLogicalBlock(ScopeObject.builder( + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").topologyObjectType(TopologyObjectType.RELATION).container( + ContainerType.ASSOCIATION).innerContainer(List.of("serving-antennaModule")).leaf("field") + .queryFunction(QueryFunction.CONTAINS).parameter("am1").build()); + assertThrows(TiesPathException.class, associationScope6::getCondition); } @Test @@ -1021,16 +1280,13 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_classifiers\"::text like '%odu-function-model:Ru%')\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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -1047,16 +1303,13 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // 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" + + " (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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -1074,16 +1327,13 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"CD_sourceIds\"::text like '%urn:cmHandle:%')\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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -1102,16 +1352,13 @@ class DtoToJooqTest { LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); - AndOrLogicalBlock alb = new AndLogicalBlock(); - alb.setChildren(List.of(slb1, slb2)); - - Condition actualCondition = alb.getCondition(); // spotless:off assertEquals(condition( "\n" + - " (ties_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU\"::text like '%urn:cmHandle:%')\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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2)).toString()); // spotless:on } @@ -1133,19 +1380,32 @@ class DtoToJooqTest { LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - AndOrLogicalBlock alb1 = new AndLogicalBlock(); - AndOrLogicalBlock alb2 = new AndLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - alb2.setChildren(List.of(alb1, slb3)); - - Condition actualCondition = alb2.getCondition(); // 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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2, slb3)).toString()); + } + + @Test + void testConditions_entityMetadata() { + ScopeObject scopeObject1 = ScopeObject.builder(ODU_FUNCTION) + .topologyObjectType(TopologyObjectType.ENTITY) + .container(ContainerType.METADATA).leaf("reliabilityIndicator") + .queryFunction(QueryFunction.EQ).parameter( + "OK") + .dataType(DataType.PRIMITIVE).build(); + + LogicalBlock slb1 = new ScopeLogicalBlock(scopeObject1); + + // spotless:off + assertEquals(condition( + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"metadata\" -> 'reliabilityIndicator' = '\"OK\"'") + .toString(), slb1.getCondition().toString()); // spotless:on } @@ -1167,19 +1427,15 @@ class DtoToJooqTest { LogicalBlock slb2 = new ScopeLogicalBlock(scopeObject2); LogicalBlock slb3 = new ScopeLogicalBlock(scopeObject3); - AndOrLogicalBlock alb1 = new AndLogicalBlock(); - AndOrLogicalBlock alb2 = new AndLogicalBlock(); - alb1.setChildren(List.of(slb1, slb2)); - alb2.setChildren(List.of(alb1, slb3)); - - Condition actualCondition = alb2.getCondition(); // 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" + + " 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") - .toString(), actualCondition.toString()); + .toString(), getTestAndCondition(List.of(slb1, slb2, slb3)).toString()); // spotless:on } @@ -1209,4 +1465,12 @@ class DtoToJooqTest { Assertions.assertEquals(new HashSet(Arrays.asList(pair2)), innerFilterCriteria2.builder().scope(slb2).build() .getJoinCondition()); } + + Condition getTestAndCondition(List logicalBlocks) { + return AndLogicalBlock.fromLogicalBlockList(logicalBlocks).getCondition(); + } + + Condition getTestOrCondition(List logicalBlocks) { + return OrLogicalBlock.fromLogicalBlockList(logicalBlocks).getCondition(); + } } 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/tiespath/innerlanguage/ScopeLogicalBlockTest.java index 8bb8034..6231a38 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/tiespath/innerlanguage/ScopeLogicalBlockTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertThrows; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.jooq.Table; @@ -89,6 +90,10 @@ class ScopeLogicalBlockTest { 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(); + ScopeLogicalBlock scopeLogicalBlock = new ScopeLogicalBlock(scopeObject); ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(scopeObject1); ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(scopeObject2); @@ -97,6 +102,7 @@ class ScopeLogicalBlockTest { ScopeLogicalBlock scopeLogicalBlock5 = new ScopeLogicalBlock(scopeObject5); 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\"")); Assertions.assertEquals(resultTables, scopeLogicalBlock.getTables()); @@ -124,6 +130,10 @@ class ScopeLogicalBlockTest { Assertions.assertEquals(resultTables, scopeLogicalBlock6.getTables()); resultTables.clear(); + resultTables.add(table("ties_data.\"o-ran-smo-teiv-ran_NRCellDU\"")); + Assertions.assertEquals(resultTables, scopeLogicalBlock8.getTables()); + resultTables.clear(); + Assertions.assertThrows(TiesException.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/tiespath/innerlanguage/SelectBlockTest.java index 6bc764e..0bd3046 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/tiespath/innerlanguage/SelectBlockTest.java @@ -66,8 +66,9 @@ public class SelectBlockTest { 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.gNBDUId"), - BIGINT)), filterCriteria.getSelects()); + "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()); } @Test @@ -79,13 +80,15 @@ public class SelectBlockTest { .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\".\"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, field( - "ties_data.\"ODUFunction\".\"gNBDUId\"").as( - "o-ran-smo-teiv-ran:ODUFunction.attr.gNBDUId"), BIGINT)), filterCriteria - .getSelects()); + 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)), + filterCriteria.getSelects()); } @Test @@ -102,6 +105,20 @@ public class SelectBlockTest { CONTAINER)), filterCriteria.getSelects()); } + @Test + void metadataInEntity() { + List targets = new ArrayList<>(); + InnerFilterCriteria filterCriteria = new InnerFilterCriteria(targets, null); + + 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"), + CONTAINER)), filterCriteria.getSelects()); + } + @Test void classifiersInEntity() { List targets = new ArrayList<>(); 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/tiespath/refiner/BasePathRefinementTest.java index f27dc01..c541590 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/tiespath/refiner/BasePathRefinementTest.java @@ -109,6 +109,37 @@ class BasePathRefinementTest { Assertions.assertEquals(expectedFilterCriteria, filterCriteria); } + @Test + void testRefinementOrchestrationMetadata() { + LogicalBlock logicalBlock = scopeResolver.process(null, "/metadata[@reliabilityIndicator='OK']"); + List targets = targetResolver.resolve(null, "/OCUCPFunction/sourceIds"); + 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); + expectedScopeObject.setContainer(ContainerType.METADATA); + expectedScopeObject.setLeaf("reliabilityIndicator"); + 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); + } + @Test void processTopologyObjectsWithContainerTypeNull() { FilterCriteria filterCriteria = FilterCriteria.builder("RAN").build(); 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/tiespath/resolver/ScopeResolverTest.java index 72badc0..6c91c23 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/tiespath/resolver/ScopeResolverTest.java @@ -78,6 +78,81 @@ class ScopeResolverTest { Assertions.assertEquals(logicalBlock3, resolverLB); } + @Test + void resolveScopeWithCoveredByGeoLocationCondition() { + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").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()); + + final LogicalBlock resolverLB = scopeResolver.resolve(null, + "/attributes[coveredBy(@geo-location, 'POLYGON (12.3426 45.24568, 13.3426 45.24568, 12.3426 44.24568, 13.3426 44.24568)')]"); + Assertions.assertEquals(expected, resolverLB); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInteger() { + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").parameter("'POINT (12.3426 45.24568)', 500").resolverDataType(ResolverDataType.STRING) + .queryFunction(QueryFunction.WITHIN_METERS).build()); + + final LogicalBlock resolverLB = scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)', 500)]"); + Assertions.assertEquals(expected, resolverLB); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithDouble() { + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").parameter("'POINT (12.3426 45.24568)', 500.34e1").resolverDataType( + ResolverDataType.STRING).queryFunction(QueryFunction.WITHIN_METERS).build()); + + final LogicalBlock resolverLB = scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)', 500.34e1)]"); + Assertions.assertEquals(expected, resolverLB); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithDecimal() { + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("*").container(ContainerType.ATTRIBUTES) + .leaf("geo-location").parameter("'POINT (12.3426 45.24568)', 500.34").resolverDataType( + ResolverDataType.STRING).queryFunction(QueryFunction.WITHIN_METERS).build()); + + final LogicalBlock resolverLB = scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)', 500.34)]"); + Assertions.assertEquals(expected, resolverLB); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidNumber() { + assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)', 50asd0)]")); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar1() { + assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, 'POINT (12.3426 45.24568)' 500)]")); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar2() { + assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + "/attributes[withinMeters(@geo-location, ,'POINT (12.3426 45.24568)', 500)]")); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar3() { + assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + "/attributes[withinMeters('POINT (12.3426 45.24568)', 500)]")); + } + + @Test + void resolveScopeWithWithinMetersGeoLocationConditionWithInvalidGrammar4() { + assertThrows(TiesPathException.class, () -> scopeResolver.resolve(null, + "/attributes[withinMeters('POINT (12.3426 45.24568)', )]")); + } + @Test void resolveScopeWithMultipleTokensWithDifferentContainers() { ScopeLogicalBlock scopeLogicalBlock1 = new ScopeLogicalBlock(ScopeObject.builder("GNBDUFunction").container( @@ -281,4 +356,16 @@ class ScopeResolverTest { .getDetails()); } + @Test + void testAssociation() { + ScopeLogicalBlock expected = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability").container(null) + .queryFunction(QueryFunction.CONTAINS).parameter( + "AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A") + .resolverDataType(ResolverDataType.STRING).innerContainer(List.of("serving-antennaModule")).leaf("id") + .build()); + final LogicalBlock resolvedScope = scopeResolver.resolve("AntennaCapability", + "/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]"); + Assertions.assertEquals(expected, resolvedScope); + } + } 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 new file mode 100644 index 0000000..3c934d0 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java @@ -0,0 +1,65 @@ +/* + * ============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; + +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 java.util.List; + +import javax.sql.DataSource; + +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.jooq.impl.DSL; +import org.junit.jupiter.api.BeforeAll; +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.test.context.ActiveProfiles; + +import com.fasterxml.jackson.databind.ObjectMapper; + +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; + +@AutoConfigureMockMvc +@SpringBootTest +@ActiveProfiles({ "test", "groups" }) +public abstract class TopologyGroupsApiBase extends TopologyApiBase { + public static final String TIES_GROUPS = "ties_groups"; + + @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.loadModels(); + TestPostgresqlContainer.loadSampleGroupsData(); + PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); + postgresSchemaLoader.loadSchemaRegistry(); + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreatorTest.java b/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreatorTest.java new file mode 100644 index 0000000..6ddd34d --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/creator/DynamicGroupCreatorTest.java @@ -0,0 +1,64 @@ +/* + * ============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.api.impl.creator; + +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.oran.smo.teiv.api.model.OranTeivCreateGroupPayload; +import org.oran.smo.teiv.api.model.OranTeivDynamic; +import org.oran.smo.teiv.api.model.OranTeivGetEntitiesByDomain; +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.impl.GroupsRepositoryImpl; + +@ExtendWith(MockitoExtension.class) +class DynamicGroupCreatorTest { + @InjectMocks + DynamicGroupCreator dynamicGroupCreator; + + @Mock + GroupsRepositoryImpl groupsRepository; + @Mock + ObjectMapper objectMapper; + + @Test + void createGroupThrowsJsonException() throws JsonProcessingException { + //given + final OranTeivCreateGroupPayload dynamicGroupPayload = OranTeivDynamic.builder().name("testGroup").type("dynamic") + .criteria(OranTeivGetEntitiesByDomain.builder().queryType("getEntitiesByDomain").domain("RAN").build()) + .build(); + //when + when(objectMapper.writeValueAsString(any())).thenThrow(new JsonProcessingException("Error") { + }); + //then + assertThrows(GroupsException.class, () -> dynamicGroupCreator.create(dynamicGroupPayload)); + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolverTest.java b/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolverTest.java new file mode 100644 index 0000000..e66abad --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/groups/api/impl/resolver/DynamicGroupResolverTest.java @@ -0,0 +1,68 @@ +/* + * ============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.api.impl.resolver; + +import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE; +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.oran.smo.teiv.api.model.OranTeivCriteria; +import org.oran.smo.teiv.exposure.utils.RequestDetails; +import org.oran.smo.teiv.groups.rest.controller.GroupsException; +import org.oran.smo.teiv.groups.spi.GroupNotFoundException; +import org.oran.smo.teiv.groups.spi.GroupsRepository; + +@ExtendWith(MockitoExtension.class) +class DynamicGroupResolverTest { + @InjectMocks + DynamicGroupResolver dynamicGroupResolver; + + @Mock + GroupsRepository groupsRepository; + @Mock + ObjectMapper objectMapper; + @Mock + CriteriaResolverRegistry criteriaResolverRegistry; + + @Test + void testResolveDynamicGroupsThrowsException() throws GroupNotFoundException, JsonProcessingException { + //given + when(groupsRepository.getCriteriaByGroupId(anyString())).thenReturn("{}"); + when(objectMapper.readValue(anyString(), eq(OranTeivCriteria.class))).thenThrow(new JsonProcessingException( + "Error") { + }); + //then + assertThrows(GroupsException.criteriaDeserializationException(anyString()).getClass(), () -> dynamicGroupResolver + .resolve("testGroup", RequestDetails.builder().basePath(String.format(MEMBERS_HREF_TEMPLATE, "testGroup")) + .build())); + } +} 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 c6d9b22..e684279 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 @@ -40,6 +40,7 @@ import java.util.Map; import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Result; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -77,7 +78,7 @@ import jakarta.annotation.PostConstruct; @SpringBootTest @ActiveProfiles({ "test", "ingestion" }) class IngestionOperationValidatorTest { - public static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); + private static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); @Autowired private TiesDbOperations tiesDbOperations; @@ -104,8 +105,14 @@ class IngestionOperationValidatorTest { private TiesDbServiceForValidation spiedDbServiceForValidation; + @BeforeAll + static void beforeAll() { + TestPostgresqlContainer.loadIngestionTestData(); + TestPostgresqlContainer.loadValidationTestData(); + } + @PostConstruct - public void beforeAll() throws UnsupportedOperationException, SchemaLoaderException { + public void postConstruct() throws UnsupportedOperationException, SchemaLoaderException { PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(writeDataDslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); when(validatorFactory.createValidator(any())).thenAnswer(i -> { @@ -116,8 +123,7 @@ class IngestionOperationValidatorTest { @BeforeEach public void deleteAll() { - writeDataDslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach( - t -> writeDataDslContext.truncate(t).cascade().execute()); + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), writeDataDslContext); if (spiedDbServiceForValidation != null) { reset(spiedDbServiceForValidation); } @@ -125,36 +131,36 @@ class IngestionOperationValidatorTest { @Test void maximumCardinalityViolationOneToOne_aSideMax() throws InvalidFieldInYangDataException { - //MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM is a 0..1 to 1 relationship + //ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU is a 0..1 to 1 relationship List entities = generateEntities(MAXIMUM_CARDINALITY_CASE.ONE_ONE); List relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-oam-to-cloud", - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "rel_1", "ManagedElement_1", "CloudNativeSystem_1", List + relationships.add(new Relationship("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "rel_1", "ManagedElement_1", "NRCellDU_1", List .of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-oam-to-cloud", - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "rel_2", "ManagedElement_2", "CloudNativeSystem_1", List + relationships.add(new Relationship("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "rel_2", "ManagedElement_2", "NRCellDU_1", List .of())); ParsedCloudEventData parsedCloudEventData = new ParsedCloudEventData(entities, relationships); - //It's expected to fail, because the CloudNativeSystem_1 entity would be connected to 2 ManagedElement instances + //It's expected to fail, because the NRCellDU_1 entity would be connected to 2 ManagedElement instances assertThrows(MaximumCardinalityViolationException.class, () -> tiesDbOperations - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); //The whole transaction is rolled back. Neither the entities nor the relationships are persisted. - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); - assertEmptyTable("ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); + assertEmptyTable("ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\""); + assertEmptyTable("ties_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( - parsedCloudEventData2).size()); + parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation).acquireEntityInstanceExclusiveLock( - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", "CloudNativeSystem_1"); + "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"", "NRCellDU_1"); - //Try to insert an extra relationship. It's expected to fail, because the CloudNativeSystem_1 entity already has the maximum number of relationships. + //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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3, "testSource")); } @Test @@ -162,39 +168,39 @@ class IngestionOperationValidatorTest { // TESTENTITYA_USES_TESTENTITYB is a 0..1 to 0..2 relationship List entities = generateEntities(MAXIMUM_CARDINALITY_CASE.ONE_CONST); List relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_USES_TESTENTITYB", "rel_1", - "TestEntityA_1", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_USES_TESTENTITYB", "rel_2", - "TestEntityA_1", "TestEntityB_2", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_USES_TESTENTITYB", "rel_3", - "TestEntityA_1", "TestEntityB_3", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran_", "TESTENTITYA_USES_TESTENTITYB", "rel_1", "TestEntityA_1", + "TestEntityB_1", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_USES_TESTENTITYB", "rel_2", "TestEntityA_1", + "TestEntityB_2", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_USES_TESTENTITYB", "rel_3", "TestEntityA_1", + "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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityA\"", "TestEntityA_1"); + "ties_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-logical_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\""); + assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran_TestEntityA\""); + assertEmptyTable("ties_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( - parsedCloudEventData2).size()); + parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation, times(2)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityA\"", "TestEntityA_1"); + "ties_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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData3, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityA\"", "TestEntityA_1"); + "ties_data.\"o-ran-smo-teiv-ran_TestEntityA\"", "TestEntityA_1"); } @Test @@ -202,46 +208,46 @@ class IngestionOperationValidatorTest { // TESTENTITYA_PROVIDES_TESTENTITYB is a 0..2 to 0..3 relationship List entities = generateEntities(MAXIMUM_CARDINALITY_CASE.CONST_CONST); List relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_1", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_1", "TestEntityA_1", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_2", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_2", "TestEntityA_1", "TestEntityB_2", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_3", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_3", "TestEntityA_1", "TestEntityB_3", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_4", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_4", "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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_1"); + "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityA\"", "TestEntityA_1"); + "ties_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-logical_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\""); - assertEmptyTable("ties_data.\"73936e503f137d82d1422c0f08c66c7ff8b90209\""); + 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\""); //Test the other side's cardinality as well relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_1", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_1", "TestEntityA_1", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_2", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_2", "TestEntityA_2", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_3", + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_PROVIDES_TESTENTITYB", "rel_3", "TestEntityA_3", "TestEntityB_1", List.of())); 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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData2)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData2, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_1"); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\""); - assertEmptyTable("ties_data.\"73936e503f137d82d1422c0f08c66c7ff8b90209\""); + "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\""); } @Test @@ -249,43 +255,43 @@ class IngestionOperationValidatorTest { // TESTENTITYA_GROUPS_TESTENTITYB is a 0..2 to 0..n relationship List entities = generateEntities(MAXIMUM_CARDINALITY_CASE.CONST_INFINITE); List relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_1", - "TestEntityA_1", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_2", - "TestEntityA_2", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_3", - "TestEntityA_3", "TestEntityB_1", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_1", "TestEntityA_1", + "TestEntityB_1", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_2", "TestEntityA_2", + "TestEntityB_1", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_3", "TestEntityA_3", + "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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "testSource")); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_1"); + "ties_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-logical_TestEntityA\""); - assertEmptyTable("ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\""); - assertEmptyTable("ties_data.\"70003c8082751e1832e7bc5c0d83db6d22c4fcdc\""); + 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\""); //Test the other side's cardinality - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_2", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_3", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_2", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_3", Map.of(), List.of())); relationships = new ArrayList<>(); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_1", - "TestEntityA_1", "TestEntityB_1", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_2", - "TestEntityA_1", "TestEntityB_2", List.of())); - relationships.add(new Relationship("o-ran-smo-teiv-ran-logical", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_3", - "TestEntityA_1", "TestEntityB_3", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_1", "TestEntityA_1", + "TestEntityB_1", List.of())); + relationships.add(new Relationship("o-ran-smo-teiv-ran", "TESTENTITYA_GROUPS_TESTENTITYB", "rel_2", "TestEntityA_1", + "TestEntityB_2", List.of())); + 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( - parsedCloudEventData2).size()); + parsedCloudEventData2, "testSource").size()); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_1"); + "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_1"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_2"); + "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_2"); verify(spiedDbServiceForValidation, times(1)).acquireEntityInstanceExclusiveLock( - "ties_data.\"o-ran-smo-teiv-ran-logical_TestEntityB\"", "TestEntityB_3"); + "ties_data.\"o-ran-smo-teiv-ran_TestEntityB\"", "TestEntityB_3"); verify(spiedDbServiceForValidation, times(3)).executeValidationQuery(any(), any(), any(), any(Long.class)); verifyNoMoreInteractions(spiedDbServiceForValidation); } @@ -340,23 +346,27 @@ class IngestionOperationValidatorTest { List entities = new ArrayList<>(); switch (cardinalityCase) { case ONE_ONE: - entities.add(new Entity("o-ran-smo-teiv-ran-oam", "ManagedElement", "ManagedElement_1", Map.of("fdn", - "fdn1"), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-oam", "ManagedElement", "ManagedElement_2", Map.of("fdn", - "fdn2"), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-cloud", "CloudNativeSystem", "CloudNativeSystem_1", Map.of( - "name", "name1"), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-cloud", "CloudNativeSystem", "CloudNativeSystem_2", Map.of( - "name", "name2"), List.of())); + entities.add(new Entity("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt", "ManagedElement_1", Map.of(), + List.of())); + entities.add(new Entity("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt", "ManagedElement_2", Map.of(), + List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", + "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "NRCellDU_1", Map.of(), List + .of())); + entities.add(new Entity("o-ran-smo-teiv-ran", + "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", "NRCellDU_2", Map.of(), List + .of())); break; default: - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityA", "TestEntityA_1", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityA", "TestEntityA_2", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityA", "TestEntityA_3", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_1", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_2", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_3", Map.of(), List.of())); - entities.add(new Entity("o-ran-smo-teiv-ran-logical", "TestEntityB", "TestEntityB_4", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityA", "TestEntityA_1", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityA", "TestEntityA_2", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityA", "TestEntityA_3", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_1", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_2", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_3", Map.of(), List.of())); + entities.add(new Entity("o-ran-smo-teiv-ran", "TestEntityB", "TestEntityB_4", Map.of(), List.of())); break; } return entities; 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 d375fdc..214dfab 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 @@ -20,13 +20,16 @@ */ package org.oran.smo.teiv.listener; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.HashMap; @@ -35,14 +38,17 @@ import java.util.Map; 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.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +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 io.cloudevents.CloudEvent; @@ -54,33 +60,43 @@ import org.oran.smo.teiv.service.TiesDbService; 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; -import org.oran.smo.teiv.startup.SchemaHandler; import org.oran.smo.teiv.utils.CloudEventTestUtil; -@SpringBootTest -@ActiveProfiles({ "test", "ingestion" }) +@ExtendWith(MockitoExtension.class) class CreateTopologyProcessorTest { - @Autowired + private CreateTopologyProcessor createTopologyProcessor; - @MockBean + @Mock private CloudEventParser cloudEventParser; - @MockBean - private TiesDbService tiesDbService; - @MockBean - private SchemaHandler schemaHandler; - @Autowired + @Mock private CustomMetrics metrics; + @Mock + private TiesDbService tiesDbService; + + @Mock + private IngestionAuditLogger auditLogger; + + private TiesDbOperations tiesDbOperations; + @BeforeAll - static void setUp() throws SchemaLoaderException { + static void setUpAll() throws SchemaLoaderException { + // Load mock schema for testing SchemaLoader mockSchemaLoader = new MockSchemaLoader(); mockSchemaLoader.loadSchemaRegistry(); } + @BeforeEach + void setUp() { + tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator()); + createTopologyProcessor = new CreateTopologyProcessor(cloudEventParser, metrics, tiesDbOperations, auditLogger); + } + @Test - void testCreateODUFunctionEntity1() { + void testCreateEntity() { CloudEvent event = CloudEventTestUtil.getCloudEvent("create", "{}"); String entityType = "ODUFunction"; Map yangParserOutputMapBSide = new HashMap<>(); @@ -92,76 +108,70 @@ class CreateTopologyProcessorTest { doThrow(new RuntimeException("test error")).when(tiesDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> createTopologyProcessor.process(event, anyString())); - Mockito.verify(tiesDbService, times(1)).execute(anyList()); + verify(tiesDbService, times(1)).execute(anyList()); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + anyString()); } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testInvalidAttribute() { CloudEvent event = CloudEventTestUtil.getCloudEvent("create", "{}"); - String entityType = "NFDeployment"; + String entityType = "ManagedElement"; Map yangParserOutputMap = new HashMap<>(); yangParserOutputMap.put("invalidfield", "value1"); Entity entity = new Entity("", entityType, "id1", yangParserOutputMap, List.of()); ParsedCloudEventData parsedData = new ParsedCloudEventData(List.of(entity), List.of()); - when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(parsedData); + when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); createTopologyProcessor.process(event, anyString()); verifyNoInteractions(tiesDbService); - assertEquals(1, metrics.getNumSuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedDeleteCloudEvents().count()); - assertEquals(0, metrics.getCloudEventCreatePersistTime().count()); - assertEquals(0, metrics.getCloudEventMergePersistTime().count()); - assertEquals(0, metrics.getCloudEventDeletePersistTime().count()); - assertEquals(1, metrics.getCloudEventCreateParseTime().count()); - assertEquals(0, metrics.getCloudEventMergeParseTime().count()); - assertEquals(0, metrics.getCloudEventDeleteParseTime().count()); - - assertEquals(0, metrics.getNumUnsuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedDeleteCloudEvents().count()); + verify(metrics, times(1)).incrementNumSuccessfullyParsedCreateCloudEvents(); + verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedCreateCloudEvents(); + verify(metrics, times(1)).recordCloudEventCreateParseTime(anyLong()); + + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + anyString()); } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testInvalidGeoLocationAttribute() { CloudEvent event = CloudEventTestUtil.getCloudEvent("create", "{}"); - String entityType = "PhysicalNetworkAppliance"; + String entityType = "Sector"; Map yangParserOutputMap = new HashMap<>(); yangParserOutputMap.put("geo-location", 0); Entity entity = new Entity("", entityType, "id1", yangParserOutputMap, List.of()); ParsedCloudEventData parsedData = new ParsedCloudEventData(List.of(entity), List.of()); - when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(parsedData); + when(cloudEventParser.getCloudEventData(any())).thenReturn(parsedData); + + createTopologyProcessor.process(event, anyString()); + verifyNoInteractions(tiesDbService); + + verify(metrics, times(1)).incrementNumSuccessfullyParsedCreateCloudEvents(); + verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedCreateCloudEvents(); + verify(metrics, times(1)).recordCloudEventCreateParseTime(anyLong()); + + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + anyString()); + } + + @Test + void testNullParsedCloudEventData() { + CloudEvent event = CloudEventTestUtil.getCloudEvent("create", "{}"); + when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); createTopologyProcessor.process(event, anyString()); verifyNoInteractions(tiesDbService); + verify(metrics, times(1)).incrementNumUnsuccessfullyParsedCreateCloudEvents(); + + verifyNoMoreInteractions(metrics); - assertEquals(1, metrics.getNumSuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedDeleteCloudEvents().count()); - assertEquals(0, metrics.getCloudEventCreatePersistTime().count()); - assertEquals(0, metrics.getCloudEventMergePersistTime().count()); - assertEquals(0, metrics.getCloudEventDeletePersistTime().count()); - assertEquals(1, metrics.getCloudEventCreateParseTime().count()); - assertEquals(0, metrics.getCloudEventMergeParseTime().count()); - assertEquals(0, metrics.getCloudEventDeleteParseTime().count()); - - assertEquals(0, metrics.getNumUnsuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedDeleteCloudEvents().count()); + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(), + anyString()); } } 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 6e14176..5890773 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 @@ -23,8 +23,12 @@ package org.oran.smo.teiv.listener; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.HashMap; @@ -33,12 +37,18 @@ import java.util.Map; 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.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.oran.smo.teiv.CustomMetrics; +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 io.cloudevents.CloudEvent; @@ -49,43 +59,74 @@ import org.oran.smo.teiv.service.TiesDbService; 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; -import org.oran.smo.teiv.startup.SchemaHandler; import org.oran.smo.teiv.utils.CloudEventTestUtil; -@SpringBootTest -@ActiveProfiles({ "test", "ingestion" }) +@ExtendWith(MockitoExtension.class) class DeleteTopologyProcessorTest { - @Autowired private DeleteTopologyProcessor deleteTopologyProcessor; - @MockBean + @Mock private CloudEventParser cloudEventParser; - @MockBean + + @Mock + private CustomMetrics metrics; + + @Mock private TiesDbService tiesDbService; - @MockBean - private SchemaHandler schemaHandler; + + @Mock + private IngestionAuditLogger auditLogger; + + private TiesDbOperations tiesDbOperations; @BeforeAll - static void setUp() throws SchemaLoaderException { + static void setUpAll() throws SchemaLoaderException { + // Load mock schema for testing SchemaLoader mockSchemaLoader = new MockSchemaLoader(); mockSchemaLoader.loadSchemaRegistry(); } + @BeforeEach + void setUp() { + tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator()); + deleteTopologyProcessor = new DeleteTopologyProcessor(cloudEventParser, tiesDbService, tiesDbOperations, metrics, + auditLogger); + } + @Test - void testDeleteCloudNativeApplicationEntity1() { + void testDeleteEntity() { CloudEvent event = CloudEventTestUtil.getCloudEvent("delete", "{}"); - String entityType = "NFDeployment"; + String entityType = "ManagedElement"; Map yangParserOutputMapBSide = new HashMap<>(); - Entity entity = new Entity("", entityType, "cloud_id_1", yangParserOutputMapBSide, List.of()); + Entity entity = new Entity("", entityType, "id_1", yangParserOutputMapBSide, List.of()); 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("Discard event by expected test behavior")).when(tiesDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> deleteTopologyProcessor.process(event, anyString())); - Mockito.verify(tiesDbService, times(1)).execute(anyList()); + verify(tiesDbService, times(1)).execute(anyList()); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), + anyString()); + } + + @Test + void testNullParsedCloudEventData() { + CloudEvent event = CloudEventTestUtil.getCloudEvent("delete", "{}"); + when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); + + deleteTopologyProcessor.process(event, anyString()); + verifyNoInteractions(tiesDbService); + + verify(metrics, times(1)).incrementNumUnsuccessfullyParsedDeleteCloudEvents(); + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(), + anyString()); } } 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 8d6c475..283e835 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 @@ -20,13 +20,16 @@ */ package org.oran.smo.teiv.listener; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.HashMap; @@ -35,14 +38,17 @@ import java.util.Map; 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.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +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 io.cloudevents.CloudEvent; @@ -54,34 +60,43 @@ import org.oran.smo.teiv.service.TiesDbService; 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; -import org.oran.smo.teiv.startup.SchemaHandler; import org.oran.smo.teiv.utils.CloudEventTestUtil; -@SpringBootTest -@ActiveProfiles({ "test", "ingestion" }) +@ExtendWith(MockitoExtension.class) class MergeTopologyProcessorTest { - @Autowired private MergeTopologyProcessor mergeTopologyProcessor; - @MockBean + @Mock private CloudEventParser cloudEventParser; - @MockBean - private TiesDbService tiesDbService; - @MockBean - private SchemaHandler schemaHandler; - @Autowired + @Mock private CustomMetrics metrics; + @Mock + private TiesDbService tiesDbService; + + @Mock + private IngestionAuditLogger auditLogger; + + private TiesDbOperations tiesDbOperations; + @BeforeAll - static void setUp() throws SchemaLoaderException { + static void setUpAll() throws SchemaLoaderException { + // Load mock schema for testing SchemaLoader mockSchemaLoader = new MockSchemaLoader(); mockSchemaLoader.loadSchemaRegistry(); } + @BeforeEach + void setUp() { + tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), + new RelationshipMergeValidator()); + mergeTopologyProcessor = new MergeTopologyProcessor(cloudEventParser, metrics, tiesDbOperations, auditLogger); + } + @Test - void testMergeGNBDUFunctionEntity1() { + void testMergeEntity() { CloudEvent event = CloudEventTestUtil.getCloudEvent("merge", "{}"); String entityType = "ODUFunction"; Map yangParserOutputMapBSide = new HashMap<>(); @@ -90,17 +105,19 @@ class MergeTopologyProcessorTest { 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("Discard event by expected test behavior")).when(tiesDbService).execute(anyList()); Assertions.assertDoesNotThrow(() -> mergeTopologyProcessor.process(event, anyString())); - Mockito.verify(tiesDbService, times(1)).execute(anyList()); + verify(tiesDbService, times(1)).execute(anyList()); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + anyString()); } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testInvalidAttribute() { CloudEvent event = CloudEventTestUtil.getCloudEvent("merge", "{}"); - String entityType = "NFDeployment"; + String entityType = "ManagedElement"; Map yangParserOutputMap = new HashMap<>(); yangParserOutputMap.put("invalidfield", "value1"); Entity entity = new Entity("", entityType, "id1", yangParserOutputMap, List.of()); @@ -110,32 +127,20 @@ class MergeTopologyProcessorTest { mergeTopologyProcessor.process(event, anyString()); verifyNoInteractions(tiesDbService); - assertEquals(0, metrics.getNumSuccessfullyParsedCreateCloudEvents().count()); - assertEquals(1, metrics.getNumSuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedDeleteCloudEvents().count()); - assertEquals(0, metrics.getCloudEventCreatePersistTime().count()); - assertEquals(0, metrics.getCloudEventMergePersistTime().count()); - assertEquals(0, metrics.getCloudEventDeletePersistTime().count()); - assertEquals(0, metrics.getCloudEventCreateParseTime().count()); - assertEquals(1, metrics.getCloudEventMergeParseTime().count()); - assertEquals(0, metrics.getCloudEventDeleteParseTime().count()); - - assertEquals(0, metrics.getNumUnsuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedDeleteCloudEvents().count()); + verify(metrics, times(1)).incrementNumSuccessfullyParsedMergeCloudEvents(); + verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedMergeCloudEvents(); + verify(metrics, times(1)).recordCloudEventMergeParseTime(anyLong()); + + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + anyString()); } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testInvalidGeoLocationAttribute() { CloudEvent event = CloudEventTestUtil.getCloudEvent("merge", "{}"); - String entityType = "PhysicalNetworkAppliance"; + String entityType = "Sector"; Map yangParserOutputMap = new HashMap<>(); yangParserOutputMap.put("geo-location", 0); Entity entity = new Entity("", entityType, "id1", yangParserOutputMap, List.of()); @@ -145,24 +150,27 @@ class MergeTopologyProcessorTest { mergeTopologyProcessor.process(event, anyString()); verifyNoInteractions(tiesDbService); - assertEquals(0, metrics.getNumSuccessfullyParsedCreateCloudEvents().count()); - assertEquals(1, metrics.getNumSuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedDeleteCloudEvents().count()); - assertEquals(0, metrics.getCloudEventCreatePersistTime().count()); - assertEquals(0, metrics.getCloudEventMergePersistTime().count()); - assertEquals(0, metrics.getCloudEventDeletePersistTime().count()); - assertEquals(0, metrics.getCloudEventCreateParseTime().count()); - assertEquals(1, metrics.getCloudEventMergeParseTime().count()); - assertEquals(0, metrics.getCloudEventDeleteParseTime().count()); - - assertEquals(0, metrics.getNumUnsuccessfullyParsedCreateCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedCreateCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyPersistedMergeCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedDeleteCloudEvents().count()); + verify(metrics, times(1)).incrementNumSuccessfullyParsedMergeCloudEvents(); + verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedMergeCloudEvents(); + verify(metrics, times(1)).recordCloudEventMergeParseTime(anyLong()); + + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + anyString()); + } + + @Test + void testNullParsedCloudEventData() { + CloudEvent event = CloudEventTestUtil.getCloudEvent("merge", "{}"); + when(cloudEventParser.getCloudEventData(ArgumentMatchers.any())).thenReturn(null); + + mergeTopologyProcessor.process(event, anyString()); + verifyNoInteractions(tiesDbService); + verify(metrics, times(1)).incrementNumUnsuccessfullyParsedMergeCloudEvents(); + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(), + anyString()); } } 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 2ce5d04..b4c45ea 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 @@ -21,11 +21,11 @@ package org.oran.smo.teiv.listener; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; @@ -33,33 +33,33 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.lang.reflect.Field; -import java.net.URI; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import com.fasterxml.jackson.databind.ObjectMapper; import org.jooq.DSLContext; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; +import org.oran.smo.teiv.listener.audit.ExecutionStatus; +import org.oran.smo.teiv.listener.audit.IngestionAuditLogger; +import org.oran.smo.teiv.service.cloudevent.CloudEventParser; import org.oran.smo.teiv.service.models.OperationResult; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.json.AutoConfigureJson; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; +import org.oran.smo.teiv.utils.CloudEventTestUtil; import io.cloudevents.CloudEvent; -import io.cloudevents.core.builder.CloudEventBuilder; import org.oran.smo.teiv.CustomMetrics; import org.oran.smo.teiv.schema.BidiDbNameMapper; @@ -67,103 +67,104 @@ 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.startup.SchemaHandler; -@SpringBootTest -@AutoConfigureJson -@ActiveProfiles({ "test", "ingestion" }) +@ExtendWith(MockitoExtension.class) class SourceEntityDeleteTopologyProcessorTest { - @Autowired private SourceEntityDeleteTopologyProcessor sourceEntityDeleteTopologyProcessor; - @Autowired - CustomMetrics metrics; - @MockBean + + @Mock + private CloudEventParser cloudEventParser; + + @Mock + private CustomMetrics metrics; + + @Mock private TiesDbService tiesDbService; - @MockBean + + @Mock private TiesDbOperations tiesDbOperations; - @MockBean - private SchemaHandler schemaHandler; + + @Mock + private IngestionAuditLogger auditLogger; + + private static final String EVENT_TYPE = "topology-inventory-ingestion.source-entity-delete"; + + @BeforeEach + void setUp() { + sourceEntityDeleteTopologyProcessor = new SourceEntityDeleteTopologyProcessor(tiesDbService, new ObjectMapper(), + metrics, tiesDbOperations, auditLogger); + } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testSourceEntityDeleteWithInvalidEventData() { - //given + // given try (MockedStatic mockedSchemaRegistry = Mockito.mockStatic(SchemaRegistry.class)) { - CloudEvent event = CloudEventBuilder.v1().withId("test-id").withType("ran-logical.source-entity-delete") - .withSource(URI.create("http://localhost:8080/test-source")).withDataContentType("application/json") - .withDataSchema(URI.create("http://localhost:8080/schema/v1/source-entity-delete")).withData( - "{\"type\":\"cmHandle\",\"invalid\":\"abc\"}".getBytes(StandardCharsets.UTF_8)).build(); - //when + CloudEvent event = CloudEventTestUtil.getCloudEvent(EVENT_TYPE, "{\"type\":\"cmHandle\",\"invalid\":\"abc\"}"); + // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); - //then + // then mockedSchemaRegistry.verifyNoInteractions(); verifyNoInteractions(tiesDbService); + verify(metrics, times(1)).incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents(); + verifyNoMoreInteractions(metrics); - assertEquals(0, metrics.getNumSuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getCloudEventSourceEntityDeleteParseTime().count()); - assertEquals(0, metrics.getCloudEventSourceEntityDeletePersistTime().count()); + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + anyString(), anyString()); } } @Test void testSourceEntityDeleteWithUnsupportedEntityType() { - //given + // given try (MockedStatic mockedSchemaRegistry = Mockito.mockStatic(SchemaRegistry.class)) { - CloudEvent event = CloudEventBuilder.v1().withId("test-id").withType("ran-logical.source-entity-delete") - .withSource(URI.create("http://localhost:8080/test-source")).withDataContentType("application/json") - .withDataSchema(URI.create("http://localhost:8080/schema/v1/source-entity-delete")).withData( - "{\"type\":\"unsupported-type\",\"value\":\"abc\"}".getBytes(StandardCharsets.UTF_8)).build(); - //when + CloudEvent event = CloudEventTestUtil.getCloudEvent(EVENT_TYPE, + "{\"type\":\"unsupported-type\",\"value\":\"abc\"}"); + // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); - //then + // then mockedSchemaRegistry.verifyNoInteractions(); verifyNoInteractions(tiesDbService); + verify(metrics, times(1)).incrementNumReceivedCloudEventNotSupported(); + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + anyString(), anyString()); } } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testSourceEntityDeleteUponRuntimeExceptionDuringDeletion() { - //given + // given try (MockedStatic mockedSchemaRegistry = Mockito.mockStatic(SchemaRegistry.class)) { EntityType entityType = mock(EntityType.class); - CloudEvent event = CloudEventBuilder.v1().withId("test-id").withType("ran-logical.source-entity-delete") - .withSource(URI.create("http://localhost:8080/test-source")).withDataContentType("application/json") - .withDataSchema(URI.create("http://localhost:8080/schema/v1/source-entity-delete")).withData( - "{\"type\":\"cmHandle\",\"value\":\"abc\"}".getBytes(StandardCharsets.UTF_8)).build(); + 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()); - //when + // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); - //then + // then mockedSchemaRegistry.verify(SchemaRegistry::getEntityTypes, times(1)); verify(tiesDbService, times(1)).execute(anyList()); - assertEquals(1, metrics.getNumSuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumSuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(1, metrics.getNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(1, metrics.getCloudEventSourceEntityDeleteParseTime().count()); - assertTrue(metrics.getCloudEventSourceEntityDeleteParseTime().totalTime(TimeUnit.NANOSECONDS) > 0); - assertEquals(0, metrics.getCloudEventSourceEntityDeletePersistTime().count()); + verify(metrics, times(1)).incrementNumSuccessfullyParsedSourceEntityDeleteCloudEvents(); + verify(metrics, times(1)).incrementNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents(); + verify(metrics, times(1)).recordCloudEventSourceEntityDeleteParseTime(anyLong()); + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class), + anyString(), any()); } } @Test - @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) void testSourceEntityDelete() throws NoSuchFieldException { - //given + // given try (MockedStatic mockedSchemaRegistry = Mockito.mockStatic(SchemaRegistry.class)) { DSLContext stream = mock(DSLContext.class); - CloudEvent event = CloudEventBuilder.v1().withId("test-id").withType("ran-logical.source-entity-delete") - .withSource(URI.create("http://localhost:8080/test-source")).withDataContentType("application/json") - .withDataSchema(URI.create("http://localhost:8080/schema/v1/source-entity-delete")).withData( - "{\"type\":\"cmHandle\",\"value\":\"395221E080CCF0FD1924103B15873814\"}".getBytes( - StandardCharsets.UTF_8)).build(); + CloudEvent event = CloudEventTestUtil.getCloudEvent(EVENT_TYPE, + "{\"type\":\"cmHandle\",\"value\":\"395221E080CCF0FD1924103B15873814\"}"); Map mockNameMap = new HashMap<>(); mockNameMap.put("GNBDUFunction", "GNBDUFunction"); @@ -187,20 +188,24 @@ class SourceEntityDeleteTopologyProcessorTest { return null; } }).when(tiesDbService).execute(anyList()); - //when + // when assertDoesNotThrow(() -> sourceEntityDeleteTopologyProcessor.process(event, "messageKey")); - //then + // 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()); - assertEquals(1, metrics.getNumSuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents().count()); - assertEquals(1, metrics.getNumSuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(0, metrics.getNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents().count()); - assertEquals(1, metrics.getCloudEventSourceEntityDeleteParseTime().count()); - assertEquals(1, metrics.getCloudEventSourceEntityDeletePersistTime().count()); + verify(metrics, times(1)).incrementNumSuccessfullyParsedSourceEntityDeleteCloudEvents(); + verify(metrics, times(1)).incrementNumSuccessfullyPersistedSourceEntityDeleteCloudEvents(); + verify(metrics, times(1)).recordCloudEventSourceEntityDeleteParseTime(anyLong()); + verify(metrics, times(1)).recordCloudEventSourceEntityDeletePersistTime(anyLong()); + + verifyNoMoreInteractions(metrics); + + verify(auditLogger).auditLog(eq(ExecutionStatus.SUCCESS), eq("source-entity-delete"), any(CloudEvent.class), + anyString(), any()); + verifyNoMoreInteractions(metrics); } catch (IllegalAccessException e) { throw new RuntimeException(e); } 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 8ebc1d4..6692c52 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 @@ -30,11 +30,13 @@ import java.util.Map; import org.oran.smo.teiv.exposure.spi.Module; import static org.oran.smo.teiv.schema.DataType.BIGINT; +import static org.oran.smo.teiv.schema.DataType.BYTEA; import static org.oran.smo.teiv.schema.DataType.CONTAINER; 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; public class MockSchemaLoader extends SchemaLoader { @@ -92,8 +94,14 @@ public class MockSchemaLoader extends SchemaLoader { String storedAt = l.get(0); String name = l.get(1); String moduleReferenceName = l.get(2); + String attributeNames = l.get(3).replaceAll("[\\[\\]\"\\s]", ""); + List attributeNamesList = new ArrayList<>(); + if (!attributeNames.isEmpty()) { + attributeNamesList = List.of(attributeNames.split(",")); + } entityTypes.add(EntityType.builder().name(name).tableName(storedAt).module(SchemaRegistry.getModuleByName( - moduleReferenceName)).fields(extractDataFieldsFromSqlFile(storedAt)).build()); + moduleReferenceName)).fields(extractDataFieldsFromSqlFile(storedAt)).attributeNames(attributeNamesList) + .build()); }); SchemaRegistry.initializeEntityTypes(entityTypes); @@ -124,7 +132,7 @@ public class MockSchemaLoader extends SchemaLoader { bSideAssociationName, bSideMinCardinality, bSideMaxCardinality)).bSide(SchemaRegistry .getEntityTypeByName(bSideMOType)).connectsSameEntity(connectSameEntity) .relationshipStorageLocation(relationshipDataLocation).tableName(storedAt).module(SchemaRegistry - .getModuleByName(moduleReferenceName)).build()); + .getModuleByName(moduleReferenceName)).attributeNames(List.of()).build()); }); SchemaRegistry.initializeRelationTypes(relationTypes); @@ -139,7 +147,7 @@ public class MockSchemaLoader extends SchemaLoader { List> modelInfo = new ArrayList<>(); try { BufferedReader reader = new BufferedReader(new FileReader( - "src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql")); + "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)) { @@ -160,7 +168,7 @@ public class MockSchemaLoader extends SchemaLoader { Map dataFields = new HashMap<>(); try { BufferedReader reader = new BufferedReader(new FileReader( - "src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql")); + "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 + "\"")) { @@ -168,16 +176,15 @@ public class MockSchemaLoader extends SchemaLoader { List l = List.of(line.trim().replace("\t\t\t", "\t").replaceAll("[\",]", "").split("\t")); String fieldName = l.get(0); String dataType = l.get(1); - switch (dataType) { - case "TEXT" -> dataFields.put(fieldName, PRIMITIVE); - case "INTEGER" -> dataFields.put(fieldName, INTEGER); - case "BIGINT" -> dataFields.put(fieldName, BIGINT); - case "DECIMAL" -> dataFields.put(fieldName, DECIMAL); - case "jsonb" -> dataFields.put(fieldName, CONTAINER); - case "geography" -> dataFields.put(fieldName, GEOGRAPHIC); - } + extractFieldName(dataFields, fieldName, dataType); } } + if (line.startsWith("ALTER TABLE ties_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(";", ""); + extractFieldName(dataFields, fieldName, dataType); + } } reader.close(); } catch (IOException e) { @@ -185,4 +192,17 @@ public class MockSchemaLoader extends SchemaLoader { } return dataFields; } + + private void extractFieldName(Map dataFields, String fieldName, String dataType) { + switch (dataType) { + case "TEXT" -> dataFields.put(fieldName, PRIMITIVE); + case "INTEGER" -> dataFields.put(fieldName, INTEGER); + case "BIGINT" -> dataFields.put(fieldName, BIGINT); + 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 7b50e0a..6140f25 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 @@ -196,8 +196,9 @@ class SchemaRegistryTest { "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")), new HashSet<>( - oduFunction.getAllFieldsWithId())); + "o-ran-smo-teiv-ran:ODUFunction.decorators"), field("dUpLMNId").as( + "o-ran-smo-teiv-ran:ODUFunction.attr.dUpLMNId")), + new HashSet<>(oduFunction.getAllFieldsWithId())); } @Test @@ -226,7 +227,8 @@ class SchemaRegistryTest { "NFDEPLOYMENT_SERVES_ODUFUNCTION", "OCUCPFUNCTION_PROVIDES_NRCELLCU", "NFDEPLOYMENT_SERVES_OCUCPFUNCTION", "NFDEPLOYMENT_SERVES_OCUUPFUNCTION", "NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION", "NODECLUSTER_LOCATED_AT_OCLOUDSITE", "OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER", - "NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE", "CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); + "NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE", "CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT", + "ANTENNAMODULE_SERVES_NRCELLDU"); //when List relationNames = SchemaRegistry.getRelationNames(); //then @@ -240,12 +242,12 @@ class SchemaRegistryTest { Association expectedASideAssociation = new Association("managed-ocucpFunction", 1, 1); Association expectedBSideAssociation = new Association("managed-by-managedElement", 0, 9223372036854775807L); //when - RelationType managedElementManagesGnbcucpfunction = SchemaRegistry.getRelationTypeByName( + RelationType managedElementManagesOcucpfunction = SchemaRegistry.getRelationTypeByName( "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); //then - assertEquals(expectedASideAssociation.toString(), managedElementManagesGnbcucpfunction.getASideAssociation() + assertEquals(expectedASideAssociation.toString(), managedElementManagesOcucpfunction.getASideAssociation() .toString()); - assertEquals(expectedBSideAssociation.toString(), managedElementManagesGnbcucpfunction.getBSideAssociation() + assertEquals(expectedBSideAssociation.toString(), managedElementManagesOcucpfunction.getBSideAssociation() .toString()); } @@ -255,12 +257,12 @@ class SchemaRegistryTest { Association expectedASideAssociation = new Association("managed-ocucpFunction", 1, 1); Association expectedBSideAssociation = new Association("managed-by-managedElement", 0, 9223372036854775807L); //when - RelationType managedElementManagesGnbcucpfunction = SchemaRegistry.getRelationTypeByModuleAndName( + RelationType managedElementManagesOcucpfunction = SchemaRegistry.getRelationTypeByModuleAndName( "o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); //then - assertEquals(expectedASideAssociation.toString(), managedElementManagesGnbcucpfunction.getASideAssociation() + assertEquals(expectedASideAssociation.toString(), managedElementManagesOcucpfunction.getASideAssociation() .toString()); - assertEquals(expectedBSideAssociation.toString(), managedElementManagesGnbcucpfunction.getBSideAssociation() + assertEquals(expectedBSideAssociation.toString(), managedElementManagesOcucpfunction.getBSideAssociation() .toString()); final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry @@ -278,10 +280,10 @@ class SchemaRegistryTest { "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); //then assertEquals(1, relationTypes.size()); - RelationType managedElementManagesGnbcucpfunction = relationTypes.get(0); - assertEquals(expectedASideAssociation.toString(), managedElementManagesGnbcucpfunction.getASideAssociation() + RelationType managedElementManagesOcucpfunction = relationTypes.get(0); + assertEquals(expectedASideAssociation.toString(), managedElementManagesOcucpfunction.getASideAssociation() .toString()); - assertEquals(expectedBSideAssociation.toString(), managedElementManagesGnbcucpfunction.getBSideAssociation() + assertEquals(expectedBSideAssociation.toString(), managedElementManagesOcucpfunction.getBSideAssociation() .toString()); final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry @@ -299,10 +301,14 @@ class SchemaRegistryTest { "SECTOR_GROUPS_ANTENNAMODULE")); expectedRelationsList.add(SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment", "ANTENNAMODULE_INSTALLED_AT_SITE")); + expectedRelationsList.add(SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_NRCELLDU")); + expectedRelationsList.add(SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_NRCELLDU")); //when List relationTypes = SchemaRegistry.getRelationTypesByEntityName("AntennaModule"); //then - assertEquals(3, relationTypes.size()); + assertEquals(4, relationTypes.size()); assertTrue(relationTypes.containsAll(expectedRelationsList)); } @@ -368,6 +374,15 @@ class SchemaRegistryTest { assertEquals("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU", relationType.getDecoratorsColumnName()); } + @Test + void testGetMetadataColumnNameForRelationType() throws SchemaRegistryException { + //when + RelationType relationType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-ran", + "ODUFUNCTION_PROVIDES_NRCELLDU"); + //then + assertEquals("REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU", relationType.getMetadataColumnName()); + } + @Test void testGetIdColumnNameRelationTest() throws SchemaRegistryException { //given 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 7537ed5..be981a0 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 @@ -25,10 +25,14 @@ 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 java.io.File; import java.time.Duration; import java.util.ArrayList; +import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,6 +55,7 @@ import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Result; 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.oran.smo.teiv.CustomMetrics; @@ -62,6 +67,7 @@ import org.oran.smo.teiv.service.kafka.KafkaTopicService; import org.oran.smo.teiv.startup.AppInit; import org.oran.smo.teiv.utils.CloudEventTestUtil; 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.core.DefaultKafkaProducerFactory; @@ -73,17 +79,23 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.TestExecutionListeners; @EmbeddedKafka -@SpringBootTest(properties = { - "kafka.server.bootstrap-server-host:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[0]}", - "kafka.server.bootstrap-server-port:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[1]}", - "kafka.availability.retryIntervalMs:10", "kafka.topic.replicas:1", - "kafka.topology-ingestion.consumer.concurrency:2" }) @ActiveProfiles({ "test", "ingestion" }) +@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) public class EndToEndDbTest { private static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); + private AppInit appInit; + + static Producer producer; + + 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/"; + @Autowired private DependentServiceAvailabilityKafka dependentServiceAvailabilityKafka; @@ -99,8 +111,6 @@ public class EndToEndDbTest { @Autowired private CustomMetrics customMetrics; - private AppInit appInit; - @Autowired private KafkaConfig kafkaConfig; @@ -110,11 +120,6 @@ public class EndToEndDbTest { @Autowired private DSLContext writeDataDslContext; - static Producer producer; - - 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/"; - @DynamicPropertySource static void setProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.read.jdbc-url", () -> postgresqlContainer.getJdbcUrl()); @@ -125,10 +130,15 @@ public class EndToEndDbTest { registry.add("spring.datasource.write.password", () -> postgresqlContainer.getPassword()); } + @BeforeAll + static void beforeAll() { + TestPostgresqlContainer.loadData(); + TestPostgresqlContainer.loadIngestionTestData(); + } + @BeforeEach - void setUp() { - writeDataDslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach( - t -> writeDataDslContext.truncate(t).cascade().execute()); + void setupEach() { + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), writeDataDslContext); appInit = new AppInit(dependentServiceAvailabilityKafka, kafkaTopicService, listenerStarter); appInit.startUpHandler(); producer = new DefaultKafkaProducerFactory<>(new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker)), @@ -146,6 +156,8 @@ public class EndToEndDbTest { 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"; final String CREATE_SECOND_CASE_PATH = TEST_EVENT_FOLDER + "ce-create-second-case.json"; + 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 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"; @@ -154,6 +166,8 @@ public class EndToEndDbTest { final String EXP_CREATE_ONE_TO_ONE_PATH = EXPECTED_RESULTS_FOLDER + "exp-create-one-to-one.json"; final String EXP_CREATE_MANY_TO_MANY_PATH = EXPECTED_RESULTS_FOLDER + "exp-create-many-to-many.json"; final String EXP_CREATE_SECOND_CASE_PATH = EXPECTED_RESULTS_FOLDER + "exp-create-second-case.json"; + 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_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"; @@ -162,55 +176,76 @@ public class EndToEndDbTest { validateReceivedCloudEventMetrics(0, 0, 0, 0); sendEventFromFile(CREATE_ONE_TO_ONE_PATH); - validateWithTimeout(999999, () -> { + validateWithTimeout(20, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_ONE_TO_ONE_PATH); assertDbContainsExpectedValues(expected); validateReceivedCloudEventMetrics(1, 0, 0, 0); }); sendEventFromFile(CREATE_MANY_TO_MANY_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_MANY_TO_MANY_PATH); assertDbContainsExpectedValues(expected); validateReceivedCloudEventMetrics(2, 0, 0, 0); }); + sendEventFromFile(CREATE_GEOLOCATION_PATH); + validateWithTimeout(20, () -> { + EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_GEOLOCATION_PATH); + assertDbContainsExpectedValues(expected); + validateReceivedCloudEventMetrics(3, 0, 0, 0); + }); + sendEventFromFile(MERGE_ONE_TO_MANY_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_MERGE_ONE_TO_MANY_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(2, 1, 0, 0); + validateReceivedCloudEventMetrics(3, 1, 0, 0); }); sendEventFromFile(CREATE_SECOND_CASE_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_SECOND_CASE_PATH); assertDbContainsExpectedValues(expected); - validateReceivedCloudEventMetrics(3, 1, 0, 0); + validateReceivedCloudEventMetrics(4, 1, 0, 0); }); - sendEventFromFile(DELETE_MANY_TO_MANY_PATH); + sendEventFromFile(CREATE_INFERRED_ENTITIES); validateWithTimeout(20, () -> { + EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_INFERRED_ENTITIES); + assertDbContainsExpectedValues(expected); + validateReceivedCloudEventMetrics(5, 1, 0, 0); + }); + + sendEventFromFile(CREATE_GEOLOCATION_PATH); + validateWithTimeout(20, () -> { + EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_GEOLOCATION_PATH); + assertDbContainsExpectedValues(expected); + validateReceivedCloudEventMetrics(6, 1, 0, 0); + }); + + sendEventFromFile(DELETE_MANY_TO_MANY_PATH); + validateWithTimeout(15, () -> { EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_MANY_TO_MANY_PATH); assertDbNotContainsExpectedValues(notExpected); - validateReceivedCloudEventMetrics(3, 1, 1, 0); + validateReceivedCloudEventMetrics(6, 1, 1, 0); }); sendEventFromFile(DELETE_ONE_TO_ONE_PATH); - validateWithTimeout(20, () -> { + 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(3, 1, 2, 0); + validateReceivedCloudEventMetrics(6, 1, 2, 0); }); sendEventFromFile(DELETE_CMHANDLE_PATH); - validateWithTimeout(20, () -> { + validateWithTimeout(15, () -> { EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_CMHANDLE_PATH); - assertDbNotContainsExpectedValues(notExpected); - validateReceivedCloudEventMetrics(3, 1, 2, 1); + assertDbContainsExpectedValues(notExpected); + validateReceivedCloudEventMetrics(6, 1, 2, 1); }); } @@ -272,25 +307,46 @@ public class EndToEndDbTest { private void assertDbContainsExpectedValues(EndToEndExpectedResults expectedResults) { expectedResults.getTables().forEach(tableName -> expectedResults.getTableData(tableName).forEach( - attributes -> assertDatabaseContainsValues(tableName, attributes))); + expectedAttributes -> assertDatabaseContainsValues(tableName, expectedAttributes))); } private void assertDbNotContainsExpectedValues(EndToEndExpectedResults expectedResults) { - expectedResults.getTables().forEach(tableName -> expectedResults.getTableEntryIds(tableName).forEach( - ids -> assertDatabaseDoesNotContainRecord(tableName, ids))); + expectedResults.getTables().forEach(tableName -> { + expectedResults.getTableEntryIds(tableName).forEach(ids -> assertDatabaseDoesNotContainRecord(tableName, ids)); + }); } 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(attr -> { - if (attr.getValue() != null) { - return Objects.equals(attr.getValue().toString(), row.get(attr.getKey()).toString()); - } - return row.get(attr.getKey()) == null; - })); - assertTrue(containsExpectedData, String.format( - "Database table \"%s\" does not contain expected data, but it should.", table)); + boolean containsExpectedData = results.stream().anyMatch(row -> attributes.entrySet().stream().allMatch( + expectedField -> { + if (expectedField.getValue() != null) { + if (row.get(expectedField.getKey()) == null) { + 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; + + })); + assertTrue(containsExpectedData, getAsserDbValuesFailureMessage(table, attributes, results)); + } + + private String bytesToHex(byte[] hashBytes) { + return Base64.getEncoder().encodeToString(hashBytes); + } + + private String getAsserDbValuesFailureMessage(String table, Map attributes, Result results) { + 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); } private void assertDatabaseDoesNotContainRecord(final String table, final String id) { 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 3d93422..bcdc135 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 @@ -34,7 +34,8 @@ import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; -import org.apache.kafka.clients.admin.AdminClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.ListTopicsOptions; import org.apache.kafka.clients.admin.ListTopicsResult; import org.apache.kafka.clients.admin.MockAdminClient; @@ -49,6 +50,7 @@ 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; @@ -61,11 +63,18 @@ 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 -@SpringBootTest @ActiveProfiles({ "test", "ingestion" }) +@SpringBootTest +@TestExecutionListeners(listeners = KafkaTestExecutionListener.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) class KafkaTopicServiceTest { + @Value("${spring.embedded.kafka.brokers}") + @Getter + private String embeddedKafkaServer; + @Autowired private KafkaAdmin kafkaAdmin; @@ -75,24 +84,20 @@ class KafkaTopicServiceTest { @MockBean private SchemaHandler schemaHandler; - @Value("${spring.embedded.kafka.brokers}") - @Getter - private String embeddedKafkaServer; - @BeforeEach - public void setup() { + public void setupEach() { Supplier brokers = () -> getEmbeddedKafkaServer(); kafkaAdmin.setBootstrapServersSupplier(brokers); } @AfterEach - protected void tearDown() { - AdminClient adminClient = AdminClient.create(kafkaAdmin.getConfigurationProperties()); + protected void cleanupEach() { + Admin adminClient = Admin.create(kafkaAdmin.getConfigurationProperties()); ListTopicsResult listTopicsResult = adminClient.listTopics(new ListTopicsOptions().timeoutMs(1000)); try { adminClient.deleteTopics(listTopicsResult.names().get()); } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + log.info("Error deleting topics", e.getMessage()); } } @@ -133,8 +138,8 @@ class KafkaTopicServiceTest { Node controller = new Node(0, "localhost", 8121); List brokers = Arrays.asList(controller, new Node(1, "localhost", 8122), new Node(2, "localhost", 8123)); - AdminClient mockedAdminClient = new MockAdminClient(brokers, controller); - AdminClient spiedAdminClient = Mockito.spy(mockedAdminClient); + Admin mockedAdminClient = new MockAdminClient(brokers, controller); + Admin spiedAdminClient = Mockito.spy(mockedAdminClient); final NewTopic newTopic = new NewTopic("test_topic", 1, (short) 1); mockedAdminClient.createTopics(List.of(newTopic)); @@ -144,8 +149,8 @@ class KafkaTopicServiceTest { doReturn(kafkaFutures).when(topicListResult).names(); doThrow(ExecutionException.class).when(kafkaFutures).get(); - MockedStatic mockedStaticAdminClient = Mockito.mockStatic(AdminClient.class); - mockedStaticAdminClient.when(() -> AdminClient.create(kafkaAdmin.getConfigurationProperties()).listTopics().names()) + MockedStatic mockedStaticAdminClient = Mockito.mockStatic(Admin.class); + mockedStaticAdminClient.when(() -> Admin.create(kafkaAdmin.getConfigurationProperties()).listTopics().names()) .thenReturn(spiedAdminClient); KafkaTopicService spiedTopicService = Mockito.spy(kafkaTopicService); diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java index 8485db9..7011a9a 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbOperationResultsTest.java @@ -20,6 +20,8 @@ */ package org.oran.smo.teiv.service; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.oran.smo.teiv.utils.TiesConstants.TIES_DATA_SCHEMA; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,6 +39,7 @@ import java.util.Optional; import javax.sql.DataSource; +import com.fasterxml.jackson.core.JsonProcessingException; import org.jooq.DSLContext; import org.jooq.JSONB; import org.jooq.Record; @@ -46,6 +49,8 @@ import org.jooq.impl.DSL; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.oran.smo.teiv.schema.SchemaRegistryException; import org.oran.smo.teiv.service.models.OperationResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -81,13 +86,14 @@ import org.oran.smo.teiv.utils.JooqTypeConverter; @SpringBootTest @ActiveProfiles({ "test", "ingestion" }) class TiesDbOperationResultsTest { - public static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); + private static TestPostgresqlContainer postgresqlContainer = TestPostgresqlContainer.getInstance(); private static TiesDbService tiesDbService; private static TiesDbOperations tiesDbOperations; 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"; @Autowired CloudEventParser cloudEventParser; @@ -103,52 +109,50 @@ class TiesDbOperationResultsTest { tiesDbService = new TiesDbService(dslContext, dslContext, deadlockRetryPolicy); tiesDbOperations = new TiesDbOperations(tiesDbService, new IngestionOperationValidatorFactory(), new RelationshipMergeValidator()); + TestPostgresqlContainer.loadIngestionTestData(); PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper()); postgresSchemaLoader.loadSchemaRegistry(); } @BeforeEach public void deleteAll() { - dslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach(t -> dslContext - .truncate(t).cascade().execute()); + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), dslContext); } @Test void testMergeEntityRelationship() { 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 - .executeEntityAndRelationshipMergeOperations(parsedCloudEventData)); + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1")); assertEquals(3, mergeResult.size()); assertEquals("ManagedElement_1", mergeResult.get(0).getId()); assertEquals("ManagedElement", mergeResult.get(0).getType()); assertEquals(Map.of(), mergeResult.get(0).getAttributes()); - assertEquals("ENodeBFunction_1", mergeResult.get(1).getId()); - assertEquals("ENodeBFunction", mergeResult.get(1).getType()); + assertEquals("ORUFunction_1", mergeResult.get(1).getId()); + assertEquals("ORUFunction", mergeResult.get(1).getType()); assertEquals(Map.of(), mergeResult.get(1).getAttributes()); assertEquals("relation_1", mergeResult.get(2).getId()); - assertEquals("MANAGEDELEMENT_MANAGES_ENODEBFUNCTION", mergeResult.get(2).getType()); + assertEquals("MANAGEDELEMENT_MANAGES_ORUFUNCTION", mergeResult.get(2).getType()); assertEquals("ManagedElement_1", mergeResult.get(2).getASide()); - assertEquals("ENodeBFunction_1", mergeResult.get(2).getBSide()); + assertEquals("ORUFunction_1", mergeResult.get(2).getBSide()); } @Test - void testDeleteEntityById() { + void testDeleteEntityById() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "managed_element_entity_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, + updatedTimeColumnName); // Delete operation - expected to succeed List deleteResultMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("ManagedElement"), "managed_element_entity_id1"); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "managed_element_entity_id1"); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); assertTrue(deleteResultMatch.contains(OperationResult.createEntityOperationResult("managed_element_entity_id1", @@ -157,215 +161,221 @@ class TiesDbOperationResultsTest { // Delete operation with the same EIID - expected to fail List deleteResultNoMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("ManagedElement"), "managed_element_entity_id1"); + .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"); } @Test - void testDeleteOneToOneByRelationId() { + void testDeleteOneToOneByRelationId() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); - managedElementEntity.put("id", "managed_element_entity_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - managedElementEntity.put("REL_FK_deployed-as-cloudNativeSystem", "cloud_native_system_entity_id1"); - managedElementEntity.put("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "relation_eiid1"); - - Map cloudNativeSystemEntity = new HashMap<>(); - cloudNativeSystemEntity.put("id", "cloud_native_system_entity_id1"); - - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity); - - cloudNativeSystemEntity.put("name", "CloudNativeSystem"); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity); + managedElementEntity.put("id", "me-id1"); + tiesDbOperations.merge(dslContext, "ties_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\"", managedElementEntity, + updatedTimeColumnName); + + Map nrCellDuEntity = new HashMap<>(); + nrCellDuEntity.put("id", "nrcelldu-id1"); + nrCellDuEntity.put("020335B0F627C169E24167748C38FE756FB34AE2", 1); + tiesDbOperations.merge(dslContext, "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"", nrCellDuEntity, + updatedTimeColumnName); + + Map meToNrcellduRelation = new HashMap<>(); + meToNrcellduRelation.put("id", "me-id1"); + meToNrcellduRelation.put("REL_FK_used-nrCellDu", "nrcelldu-id1"); + 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); // Delete operation for aSide - expected to succeed Optional deleteASideResultMatch = tiesDbOperations.deleteRelationFromEntityTableByRelationId( - dslContext, "relation_eiid1", SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); + dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); assertTrue(deleteASideResultMatch.isPresent(), "Delete operation should return a present Optional"); - assertEquals(OperationResult.createRelationshipOperationResult("relation_eiid1", - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM"), deleteASideResultMatch.get(), - "The delete operation result should be present for: 'relation_eiid1'"); + assertEquals(OperationResult.createRelationshipOperationResult("eiid1", + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU"), deleteASideResultMatch.get(), + "The delete operation result should be present for: 'eiid1'"); // Delete operation with the same EIID - expected to fail Optional deleteResultNoMatch = tiesDbOperations.deleteRelationFromEntityTableByRelationId( - dslContext, "relation_eiid1", SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); + 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 rows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); - Result rowsOnBSide = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals("managed_element_entity_id1", rows.get(0).get("id")); - assertEquals("fdn1", rows.get(0).get("fdn")); - assertEquals("cloud_native_system_entity_id1", rowsOnBSide.get(0).get("id")); - assertEquals("CloudNativeSystem", rowsOnBSide.get(0).get("name")); - assertNull(rows.get(0).get("REL_FK_deployed-as-cloudNativeSystem")); - assertNull(rows.get(0).get("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - assertNull(rowsOnBSide.get(0).get("REL_FK_deployed-managedElement")); - assertEquals(JooqTypeConverter.toJsonb(List.of()), rows.get(0).get( - "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); + Result nrcellduRows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "ties_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\""); + Result managedElementRows = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, + "ties_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")); + assertNull(managedElementRows.get(0).get("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")); + assertEquals(JooqTypeConverter.toJsonb(List.of()), managedElementRows.get(0).get( + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4")); } @Test - void testDeleteOneToManyByManySideEntityId() { - Map managedElement1 = new HashMap<>(); - managedElement1.put("id", "managed_element_entity_id1"); - managedElement1.put("fdn", "fdn1"); - managedElement1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - - Map cna1 = new HashMap<>(); - cna1.put("id", "cna_entity_id1"); - cna1.put("name", "CloudNativeApplication"); - cna1.put("REL_FK_realised-managedElement", "managed_element_entity_id1"); - cna1.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_eiid1"); - - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElement1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna1); + 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); + + 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( + "fdn1", "cmHandleId1"))); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\"", meToEnodeBFuncRelation, + updatedTimeColumnName); // Delete operation with existing relationship List deleteResultMatch = tiesDbOperations.deleteRelationshipByManySideEntityId(dslContext, - "cna_entity_id1", "id", SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")); + "oru-id1", "id", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); - assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("relation_eiid1", - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")), - "The list should contain the delete operation result with id: 'relation_eiid1'"); + assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("eiid1", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")), + "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, - "cna_entity_id1", "id", SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")); + "oru-id1", "id", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); } @Test - void testDeleteOneToManyByOneSideEntityId() { - Map managedElement1 = new HashMap<>(); - managedElement1.put("id", "managed_element_entity_id1"); - managedElement1.put("fdn", "fdn1"); - managedElement1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - - Map cna1 = new HashMap<>(); - cna1.put("id", "cna_entity_id1"); - cna1.put("name", "CloudNativeApplication"); - cna1.put("REL_FK_realised-managedElement", "managed_element_entity_id1"); - cna1.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_eiid1"); - - Map cna2 = new HashMap<>(); - cna2.put("id", "cna_entity_id2"); - cna2.put("name", "CloudNativeApplication"); - cna2.put("REL_FK_realised-managedElement", "managed_element_entity_id1"); - cna2.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_eiid2"); - - Map cna3 = new HashMap<>(); - cna3.put("id", "cna_entity_id3"); - cna3.put("name", "CloudNativeApplication"); - cna3.put("REL_FK_realised-managedElement", "managed_element_entity_id1"); - cna3.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_eiid3"); - - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElement1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna2); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna3); - - // Delete operation for managed_element_entity_id1 + 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); + + // Delete operation for me-id1 List deleteResultMatch = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("ManagedElement"), "managed_element_entity_id1"); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list"); // Check if all expected IDs are present in the deletion result assertEquals(4, deleteResultMatch.size(), "Delete operation should match expected size"); - assertTrue(deleteResultMatch.contains(OperationResult.createEntityOperationResult("managed_element_entity_id1", - "ManagedElement")), - "The list should contain the delete operation result with id: 'managed_element_entity_id1'"); - - assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("relation_eiid1", - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")), - "The list should contain the delete operation result with id: 'relation_eiid1'"); - assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("relation_eiid2", - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")), - "The list should contain the delete operation result with id: 'relation_eiid2'"); - assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("relation_eiid3", - "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")), - "The list should contain the delete operation result with id: 'relation_eiid3'"); + assertTrue(deleteResultMatch.contains(OperationResult.createEntityOperationResult("me-id1", "ManagedElement")), + "The list should contain the delete operation result with id: 'me-id1'"); + + assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("eiid1", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")), + "The list should contain the delete operation result with id: 'eiid1'"); + assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("eiid2", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")), + "The list should contain the delete operation result with id: 'eiid2'"); + assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("eiid3", + "MANAGEDELEMENT_MANAGES_ORUFUNCTION")), + "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.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\""); + "ties_data.\"o-ran-smo-teiv-ran_ORUFunction\""); assertEquals(3, rows.size()); for (Record row : rows) { - assertNull(row.get("REL_FK_realised-managedElement"), - "REL_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION should be null"); - assertNull(row.get("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION"), - "REL_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION_EIID should be null"); + assertNull(row.get("REL_FK_managed-by-managedElement"), + "REL_MANAGEDELEMENT_MANAGES_ORUFUNCTION should be null"); + assertNull(row.get("REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION"), + "REL_MANAGEDELEMENT_MANAGES_ORUFUNCTION_EIID should be null"); } } @Test - void testDeleteManyToManyByRelationshipId() { - Map gnbcucp1 = new HashMap<>(); - gnbcucp1.put("id", "gnbcucp_id1"); - gnbcucp1.put("fdn", "fdn1"); - gnbcucp1.put("gNBCUName", "gNBCUName"); - gnbcucp1.put("gNBId", 1); - gnbcucp1.put("gNBIdLength", 1); - gnbcucp1.put("pLMNId", JSONB.jsonb("{\"name\":\"pLMNId1\"}")); - gnbcucp1.put("cmId", JSONB.jsonb("{\"name\":\"cmId1\"}")); - - Map cna1 = new HashMap<>(); - cna1.put("id", "cloud_native_id1"); - cna1.put("name", "CloudNativeApplication"); - - Map cna2 = new HashMap<>(); - cna2.put("id", "cloud_native_id2"); - cna2.put("name", "CloudNativeApplication"); + void testDeleteManyToManyByRelationshipId() throws SchemaRegistryException { + Map antennaModule1 = new HashMap<>(); + antennaModule1.put("id", "antennamodule_id1"); + antennaModule1.put("positionWithinSector", "center"); + + Map antennaCapability1 = new HashMap<>(); + antennaCapability1.put("id", "antennacapability_id1"); + antennaCapability1.put("geranFqBands", JSONB.jsonb("{\"name\":\"geranFqBands1\"}")); + + Map antennaCapability2 = new HashMap<>(); + antennaCapability2.put("id", "antennacapability_id2"); + antennaCapability2.put("geranFqBands", JSONB.jsonb("{\"name\":\"geranFqBands2\"}")); Map rel1 = new HashMap<>(); rel1.put("id", "rel_id1"); - rel1.put("aSide_GNBCUCPFunction", "gnbcucp_id1"); - rel1.put("bSide_CloudNativeApplication", "cloud_native_id1"); + rel1.put("aSide_AntennaModule", "antennamodule_id1"); + rel1.put("bSide_AntennaCapability", "antennacapability_id1"); Map rel2 = new HashMap<>(); rel2.put("id", "rel_id2"); - rel2.put("aSide_GNBCUCPFunction", "gnbcucp_id1"); - rel2.put("bSide_CloudNativeApplication", "cloud_native_id2"); - - tiesDbOperations.merge(dslContext, "ties_data.\"c4a425179d3089b5288fdf059079d0ea26977f0f\"", gnbcucp1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna2); - tiesDbOperations.merge(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"", rel1); - tiesDbOperations.merge(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"", rel2); + 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.\"c4a425179d3089b5288fdf059079d0ea26977f0f\""); + "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(1, row1.size()); Result row2 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\""); + "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(2, row2.size()); Result row3 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\""); + "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(2, row3.size()); - RelationType relType = SchemaRegistry.getRelationTypeByName("GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION"); + 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, relType, "rel_id1"); assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); - assertEquals(OperationResult.createRelationshipOperationResult("rel_id1", - "GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION"), deleteResultMatch.get(), - "Deleted relationship ID should match 'rel_id1'"); + assertEquals(OperationResult.createRelationshipOperationResult("rel_id1", "ANTENNAMODULE_SERVES_ANTENNACAPABILITY"), + deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) Optional deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByRelationId(dslContext, @@ -374,79 +384,76 @@ class TiesDbOperationResultsTest { } @Test - void testDeleteManyToManyByEntityId() { - Map gnbcucp1 = new HashMap<>(); - gnbcucp1.put("id", "gnbcucp_id1"); - gnbcucp1.put("fdn", "fdn1"); - gnbcucp1.put("gNBCUName", "gNBCUName"); - gnbcucp1.put("gNBId", 1); - gnbcucp1.put("gNBIdLength", 1); - gnbcucp1.put("pLMNId", JSONB.jsonb("{\"name\":\"pLMNId1\"}")); - gnbcucp1.put("cmId", JSONB.jsonb("{\"name\":\"cmId1\"}")); - - Map cna1 = new HashMap<>(); - cna1.put("id", "cloud_native_id1"); - cna1.put("name", "CloudNativeApplication"); - - Map cna2 = new HashMap<>(); - cna2.put("id", "cloud_native_id2"); - cna2.put("name", "CloudNativeApplication"); + void testDeleteManyToManyByEntityId() throws SchemaRegistryException { + Map antennaModule1 = new HashMap<>(); + antennaModule1.put("id", "antennamodule_id1"); + antennaModule1.put("positionWithinSector", "center"); + + Map antennaCapability1 = new HashMap<>(); + antennaCapability1.put("id", "antennacapability_id1"); + antennaCapability1.put("geranFqBands", JSONB.jsonb("{\"name\":\"geranFqBands1\"}")); + + Map antennaCapability2 = new HashMap<>(); + antennaCapability2.put("id", "antennacapability_id2"); + antennaCapability2.put("geranFqBands", JSONB.jsonb("{\"name\":\"geranFqBands2\"}")); Map rel1 = new HashMap<>(); rel1.put("id", "rel_id1"); - rel1.put("aSide_GNBCUCPFunction", "gnbcucp_id1"); - rel1.put("bSide_CloudNativeApplication", "cloud_native_id1"); + rel1.put("aSide_AntennaModule", "antennamodule_id1"); + rel1.put("bSide_AntennaCapability", "antennacapability_id1"); Map rel2 = new HashMap<>(); rel2.put("id", "rel_id2"); - rel2.put("aSide_GNBCUCPFunction", "gnbcucp_id1"); - rel2.put("bSide_CloudNativeApplication", "cloud_native_id2"); - - tiesDbOperations.merge(dslContext, "ties_data.\"c4a425179d3089b5288fdf059079d0ea26977f0f\"", gnbcucp1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna1); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cna2); - tiesDbOperations.merge(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"", rel1); - tiesDbOperations.merge(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"", rel2); + 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.\"c4a425179d3089b5288fdf059079d0ea26977f0f\"").size(), "Expected one GNBCUCPFunction record"); + "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"").size(), "Expected one AntennaModule record"); assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"").size(), - "Expected two CloudNativeApplication records"); + "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"").size(), "Expected two AntennaCapability records"); assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"").size(), - "Expected two GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION relations"); + "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"").size(), + "Expected two ANTENNAMODULE_SERVES_ANTENNACAPABILITY relations"); - RelationType relType = SchemaRegistry.getRelationTypeByName("GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION"); + 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, - "gnbcucp_id1", "aSide_GNBCUCPFunction", "bSide_CloudNativeApplication"); - + "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("rel_id1", - "GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION")), + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY")), "The list should contain the delete operation result with id: 'rel_id1'"); assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("rel_id2", - "GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION")), + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY")), "The list should contain the delete operation result with id: 'rel_id2'"); // Test deletion of relations by the same entity ID again (expected to find no // relations to delete) List deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, - "gnbcucp_id1", "aSide_GNBCUCPFunction", "bSide_CloudNativeApplication"); + "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); } @Test - void testDeleteRelConnectingSameEntityByRelationshipId() { + void testDeleteRelConnectingSameEntityByRelationshipId() throws SchemaRegistryException { Map antennaModule1 = new HashMap<>(); antennaModule1.put("id", "module_id1"); antennaModule1.put("mechanicalAntennaTilt", 400); - antennaModule1.put("fdn", "fdn_1"); - antennaModule1.put("cmId", JSONB.jsonb("{\"name\":\"cmId1\"}")); antennaModule1.put("antennaModelNumber", "['123-abc']"); antennaModule1.put("totalTilt", 10); antennaModule1.put("mechanicalAntennaBearing", 123); @@ -456,8 +463,6 @@ class TiesDbOperationResultsTest { Map antennaModule2 = new HashMap<>(); antennaModule2.put("id", "module_id2"); antennaModule2.put("mechanicalAntennaTilt", 401); - antennaModule2.put("fdn", "fdn_2"); - antennaModule2.put("cmId", JSONB.jsonb("{\"name\":\"cmId2\"}")); antennaModule2.put("antennaModelNumber", "['456-abc']"); antennaModule2.put("totalTilt", 11); antennaModule2.put("mechanicalAntennaBearing", 456); @@ -466,27 +471,32 @@ class TiesDbOperationResultsTest { Map rel1 = new HashMap<>(); rel1.put("id", "rel_id1"); - rel1.put("aSide_AntennaModule", "module_id1"); - rel1.put("bSide_AntennaModule", "module_id2"); + rel1.put("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "module_id1"); + rel1.put("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E", "module_id2"); Map rel2 = new HashMap<>(); rel2.put("id", "rel_id2"); - rel2.put("bSide_AntennaModule", "module_id2"); - rel2.put("aSide_AntennaModule", "module_id1"); - - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule1); - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule2); - tiesDbOperations.merge(dslContext, "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\"", rel1); - tiesDbOperations.merge(dslContext, "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\"", rel2); + 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.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\""); + "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\""); assertEquals(2, row1.size()); Result row2 = TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\""); + "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\""); assertEquals(2, row2.size()); - RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByName("ANTENNAMODULE_REALISED_BY_ANTENNAMODULE"); + 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, @@ -494,7 +504,7 @@ class TiesDbOperationResultsTest { assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional"); assertEquals(OperationResult.createRelationshipOperationResult("rel_id1", - "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE"), deleteResultMatch.get(), + "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE"), deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'"); // Test deletion of the same relationship ID again (expected failure) @@ -505,12 +515,10 @@ class TiesDbOperationResultsTest { } @Test - void testDeleteRelConnectingSameEntityByEntityId() { + void testDeleteRelConnectingSameEntityByEntityId() throws SchemaRegistryException { Map antennaModule1 = new HashMap<>(); antennaModule1.put("id", "module_id1"); antennaModule1.put("mechanicalAntennaTilt", 400); - antennaModule1.put("fdn", "fdn_1"); - antennaModule1.put("cmId", JSONB.jsonb("{\"name\":\"cmId1\"}")); antennaModule1.put("antennaModelNumber", "['123-abc']"); antennaModule1.put("totalTilt", 10); antennaModule1.put("mechanicalAntennaBearing", 123); @@ -520,8 +528,6 @@ class TiesDbOperationResultsTest { Map antennaModule2 = new HashMap<>(); antennaModule2.put("id", "module_id2"); antennaModule2.put("mechanicalAntennaTilt", 401); - antennaModule2.put("fdn", "fdn_2"); - antennaModule2.put("cmId", JSONB.jsonb("{\"name\":\"cmId2\"}")); antennaModule2.put("antennaModelNumber", "['456-abc']"); antennaModule2.put("totalTilt", 11); antennaModule2.put("mechanicalAntennaBearing", 456); @@ -530,43 +536,50 @@ class TiesDbOperationResultsTest { Map rel1 = new HashMap<>(); rel1.put("id", "rel_id1"); - rel1.put("aSide_AntennaModule", "module_id1"); - rel1.put("bSide_AntennaModule", "module_id2"); + rel1.put("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "module_id1"); + rel1.put("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E", "module_id2"); Map rel2 = new HashMap<>(); rel2.put("id", "rel_id2"); - rel2.put("bSide_AntennaModule", "module_id2"); - rel2.put("aSide_AntennaModule", "module_id1"); - - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule1); - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule2); - tiesDbOperations.merge(dslContext, "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\"", rel1); - tiesDbOperations.merge(dslContext, "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\"", rel2); + 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.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"").size(), "Expected two AntennaModule records"); + "ties_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"").size(), "Expected two AntennaModule records"); assertEquals(2, TiesDbServiceContainerizedTest.selectAllRowsFromTable(dslContext, - "ties_data.\"5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6\"").size(), + "ties_data.\"53089669D370B15C78B7E8376D434921D1C94240\"").size(), "Expected two ANTENNAMODULE_REALISED_BY_ANTENNAMODULE relations"); - RelationType relType = SchemaRegistry.getRelationTypeByName("ANTENNAMODULE_REALISED_BY_ANTENNAMODULE"); + 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, - "module_id1", "aSide_AntennaModule", "bSide_AntennaModule"); + "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"); assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted"); assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("rel_id1", - "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE")), + "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE")), "The list should contain the delete operation result with id: 'rel_id1'"); assertTrue(deleteResultMatch.contains(OperationResult.createRelationshipOperationResult("rel_id2", - "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE")), + "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE")), "The list should contain the delete operation result with id: 'rel_id2'"); // Test deletion of relations by the same entity ID again (expected to find no // relations to delete) List deleteResultNoMatch = tiesDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType, - "module_id1", "aSide_AntennaModule", "bSide_AntennaModule"); + "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"); assertTrue(deleteResultNoMatch.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); @@ -580,170 +593,174 @@ class TiesDbOperationResultsTest { // Merge entities and relationship ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(40, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(25, mergeResult.size()); } @Test - void testDeleteASideEntityWithLongNames() throws InvalidFieldInYangDataException { + void testDeleteASideEntityWithLongNames() throws InvalidFieldInYangDataException, SchemaRegistryException { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json"); // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(40, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(25, mergeResult.size()); // Entity with One_To_One relationship List deleteEntityResult1 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"), - "ManagedElement_2"); + .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 - .getEntityTypeByName("GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), - "GNBDUFunction_2"); + .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 - .getEntityTypeByName("CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), - "CloudNativeApplication_3"); + .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 - .getEntityTypeByName("GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), - "GNBDUFunction_1"); - assertEquals(7, deleteEntityResult4.size()); + .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 - .getEntityTypeByName("AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), - "AntennaModule_1"); + .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 - .getEntityTypeByName("AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), - "AntennaModule_5"); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_1"); assertEquals(2, deleteEntityResult6.size()); } @Test - void testDeleteBSideEntityWithLongNames() throws InvalidFieldInYangDataException { + void testDeleteBSideEntityWithLongNames() throws InvalidFieldInYangDataException, SchemaRegistryException { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json"); // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(40, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(25, mergeResult.size()); // Entity with One_To_One relationship List deleteEntityResult1 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"), - "CloudNativeSystem_1"); + .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 - .getEntityTypeByName("NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_3"); + .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 - .getEntityTypeByName("Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "Namespace_1"); - assertEquals(3, deleteEntityResult3.size()); + .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 - .getEntityTypeByName("CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), - "CloudNativeApplication_2"); + .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 - .getEntityTypeByName("AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), - "AntennaModule_2"); + .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 - .getEntityTypeByName("AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), - "AntennaModule_6"); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", + "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_2"); assertEquals(2, deleteEntityResult6.size()); - // Again delete CloudNativeApplication(id=CloudNativeApplication_2) should + // Again delete AntennaCapability(id=AntennaCapability_id1) should // return empty result list List deleteEntityResult7 = tiesDbOperations.deleteEntity(dslContext, SchemaRegistry - .getEntityTypeByName("CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), - "CloudNativeApplication_2"); + .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", + "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1"); assertTrue(deleteEntityResult7.isEmpty(), "Delete operation should return an empty list for already deleted/non existing ID"); } @Test - void testDeleteRelationshipWithLongNames() throws InvalidFieldInYangDataException { + void testDeleteRelationshipWithLongNames() throws InvalidFieldInYangDataException, SchemaRegistryException { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( "src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json"); // Merge topology data ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(40, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(25, mergeResult.size()); // One_To_One Relationship - Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-ran-oam-to-cloud", - "MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM", - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_relation_3", "ManagedElement_3", "CloudNativeSystem_3", List - .of()); - RelationType oneToOneRelationType = SchemaRegistry.getRelationTypeByName(oneToOneRelationship.getType()); + Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran", + "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "ManagedElement_USES_NRCELLDU_relation_1", + "ManagedElement_3", "NRCellDU_2", List.of()); + RelationType oneToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToOneRelationship.getModule(), + oneToOneRelationship.getType()); Optional deleteOneToOneRelationshipResult = tiesDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, oneToOneRelationship.getId(), oneToOneRelationType); assertTrue(deleteOneToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // One_To_Many Relationship - Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU", - "GNBDUFUNCTION_PROVIDES_NRCELLDU_relation_2", "GNBDUFunction_1", "NRCellDU_2", List.of()); - RelationType oneToManyRelationType = SchemaRegistry.getRelationTypeByName(oneToManyRelationship.getType()); + Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN", + "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", "ManagedElement_1", "ODUFunction_1", List.of()); + RelationType oneToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToManyRelationship + .getModule(), oneToManyRelationship.getType()); Optional deleteOneToManyRelationshipResult = tiesDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, oneToManyRelationship.getId(), oneToManyRelationType); assertTrue(deleteOneToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // Many_To_One Relationship - Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran-cloud", - "CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE", - "CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE_relation_3", "CloudNativeApplication_3", "Namespace_3", List + Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran", + "LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY", + "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1", "LTESectorCarrier_id1", "AntennaCapability_id2", List .of()); - RelationType manyToOneRelationType = SchemaRegistry.getRelationTypeByName(manyToOneRelationship.getType()); + RelationType manyToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToOneRelationship + .getModule(), manyToOneRelationship.getType()); Optional deleteManyToOneRelationshipResult = tiesDbOperations .deleteRelationFromEntityTableByRelationId(dslContext, manyToOneRelationship.getId(), manyToOneRelationType); assertTrue(deleteManyToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // Many_To_Many Relationship - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical-to-cloud", - "GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN", - "GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_relation_1", "GNBDUFunction_1", - "CloudNativeApplication_1", List.of()); - RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByName(manyToManyRelationship.getType()); + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", "AntennaModule_7", "AntennaCapability_id1", List.of()); + RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToManyRelationship + .getModule(), manyToManyRelationship.getType()); Optional deleteManyToManyRelationshipResult = tiesDbOperations .deleteManyToManyRelationByRelationId(dslContext, manyToManyRelationType, manyToManyRelationship.getId()); assertTrue(deleteManyToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional"); // One_To_One Relationship ConnectingSameEntity - Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-ran-equipment", - "ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE", - "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "AntennaModule_5", "AntennaModule_6", List.of()); - RelationType connectingSameEntityType = SchemaRegistry.getRelationTypeByName( - connectingSameEntityOneToOneRelationship.getType()); + Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-equipment", + "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE", + "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "AntennaModule_1", "AntennaModule_2", List.of()); + RelationType connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName( + connectingSameEntityOneToOneRelationship.getModule(), connectingSameEntityOneToOneRelationship.getType()); Optional deleteConnectingSameEntityOneToOneRelationshipResult = tiesDbOperations .deleteManyToManyRelationByRelationId(dslContext, connectingSameEntityType, connectingSameEntityOneToOneRelationship.getId()); @@ -751,11 +768,11 @@ class TiesDbOperationResultsTest { "Delete operation should return a present Optional"); // One_To_Many Relationship ConnectingSameEntity - Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-ran-equipment", - "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE", - "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "AntennaModule_1", "AntennaModule_2", List.of()); - connectingSameEntityType = SchemaRegistry.getRelationTypeByName(connectingSameEntityOneToManyRelationship - .getType()); + Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-equipment", + "ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE", + "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "AntennaModule_5", "AntennaModule_6", List.of()); + connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName(connectingSameEntityOneToManyRelationship + .getModule(), connectingSameEntityOneToManyRelationship.getType()); Optional deleteConnectingSameEntityOneToManyRelationshipResult = tiesDbOperations .deleteManyToManyRelationByRelationId(dslContext, connectingSameEntityType, connectingSameEntityOneToManyRelationship.getId()); @@ -775,11 +792,13 @@ class TiesDbOperationResultsTest { antennaModule2.put("CD_sourceIds", JSONB.jsonb( "[\"urn:3gpp:dn:fdn\"," + "\"urn:cmHandle:395221E080CCF0FD1924103B15873815\"]")); - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule1); - tiesDbOperations.merge(dslContext, "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", antennaModule2); + 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); List ids = tiesDbOperations.selectByCmHandleFormSourceIds(dslContext, - "ties_data.\"f8caf5ebe876c3001d67efe06e4d83abf0babe31\"", "395221E080CCF0FD1924103B15873814"); + "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\"", "395221E080CCF0FD1924103B15873814"); assertEquals(List.of("module_id1"), ids); } @@ -789,16 +808,16 @@ class TiesDbOperationResultsTest { "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(12, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(6, mergeResult.size()); - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_2", "GNBCUUP_1", "CloudNativeApplication_3", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", "relation_2", "AntennaModule_1", "AntennaCapability_1", new ArrayList<>()); final ParsedCloudEventData finalParsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of( manyToManyRelationship)); assertThrows(TiesException.class, () -> tiesDbOperations.executeEntityAndRelationshipMergeOperations( - finalParsedCloudEventData)); + finalParsedCloudEventData, "dmi-plugin:nm-1")); } @Test @@ -807,16 +826,16 @@ class TiesDbOperationResultsTest { "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(12, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(6, mergeResult.size()); - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_2", "GNBCUUP_1", "CloudNativeApplication_2", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", "relation_2", "AntennaModule_2", "AntennaCapability_2", new ArrayList<>()); final ParsedCloudEventData finalParsedCloudEventData = new ParsedCloudEventData(new ArrayList<>(), List.of( manyToManyRelationship)); List result = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - finalParsedCloudEventData); + finalParsedCloudEventData, "dmi-plugin:nm-1"); assertEquals(1, result.size()); } @@ -827,14 +846,15 @@ class TiesDbOperationResultsTest { "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(12, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(6, mergeResult.size()); - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_4", "GNBCUUP_3", "CloudNativeApplication_4", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "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 = tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, + "dmi-plugin:nm-1"); assertEquals(3, result.size()); } @@ -845,14 +865,15 @@ class TiesDbOperationResultsTest { "src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json"); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); List mergeResult = tiesDbOperations.executeEntityAndRelationshipMergeOperations( - parsedCloudEventData); - assertEquals(12, mergeResult.size()); + parsedCloudEventData, "dmi-plugin:nm-1"); + assertEquals(6, mergeResult.size()); - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_4", "GNBCUUP_1", "CloudNativeApplication_4", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "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 = tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, + "dmi-plugin:nm-1"); assertEquals(2, result.size()); @@ -876,33 +897,48 @@ class TiesDbOperationResultsTest { } - @Test // Same relationship data is received twice. - void testMergeWithSameData() throws MaximumCardinalityViolationException, InvalidFieldInYangDataException { - - List manyToOneResult = mergeSingleTestEvent( - VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one.json"); - List oneToManyResult = mergeSingleTestEvent( - VALIDATE_ONE_TO_MANY_DIR + "ce-create-one-to-many.json"); - List oneToOneResult = mergeSingleTestEvent(VALIDATE_ONE_TO_ONE_DIR + "ce-create-one-to-one.json"); - - assertEquals(3, manyToOneResult.size()); - assertEquals(3, oneToManyResult.size()); - assertEquals(3, oneToOneResult.size()); + @Test + void testMergeWithAttributeNull() throws MaximumCardinalityViolationException, InvalidFieldInYangDataException { + List manyToOneCreateResult = mergeSingleTestEvent( + VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one9.json"); + + 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")); + + assertEquals("NRSectorCarrier_1", manyToOneCreateResult.get(1).getId()); + assertEquals("NRSectorCarrier", manyToOneCreateResult.get(1).getType()); + Map lteSectorAttributes = manyToOneCreateResult.get(1).getAttributes(); + assertTrue(lteSectorAttributes.containsKey("arfcnDL")); + assertEquals(64L, lteSectorAttributes.get("arfcnDL")); + + assertEquals("Relation_ManyToOne_1", manyToOneCreateResult.get(2).getId()); + assertEquals("ODUFUNCTION_PROVIDES_NRSECTORCARRIER", manyToOneCreateResult.get(2).getType()); + assertEquals("ODU_1", manyToOneCreateResult.get(2).getASide()); + assertEquals("NRSectorCarrier_1", manyToOneCreateResult.get(2).getBSide()); - manyToOneResult = mergeSingleTestEvent(VALIDATE_MANY_TO_ONE_DIR + "ce-create-many-to-one.json"); - oneToManyResult = mergeSingleTestEvent(VALIDATE_ONE_TO_MANY_DIR + "ce-create-one-to-many.json"); - oneToOneResult = mergeSingleTestEvent(VALIDATE_ONE_TO_ONE_DIR + "ce-create-one-to-one.json"); + CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile( + VALIDATE_MANY_TO_ONE_DIR + "ce-merge-many-to-one-null-attribute.json"); - // If an entity already exists with the given id and there's no attribute to - // merge in the json, then the entity is not updated. - // If it's not updated, then it shouldn't be in the OperationResult list - assertEquals(2, manyToOneResult.size()); - assertEquals(1, oneToManyResult.size()); - assertEquals(1, oneToOneResult.size()); + ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + List mergeResult = assertDoesNotThrow(() -> tiesDbOperations + .executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1")); - assertDbContainsOperationResults(manyToOneResult); - assertDbContainsOperationResults(oneToManyResult); - assertDbContainsOperationResults(oneToOneResult); + 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")); + + assertEquals("NRSectorCarrier_1", mergeResult.get(1).getId()); + assertEquals("NRSectorCarrier", mergeResult.get(1).getType()); + lteSectorAttributes = mergeResult.get(1).getAttributes(); + assertTrue(lteSectorAttributes.containsKey("arfcnDL")); + assertNull(lteSectorAttributes.get("arfcnDL")); } @Test // Existing but free endpoints and an existing relationship ID is received. @@ -1072,16 +1108,17 @@ class TiesDbOperationResultsTest { } @Test - void testRelationRelatedMethodsWhenRelationshipIsStoredInSeparateTable() { + void testRelationRelatedMethodsWhenRelationshipIsStoredInSeparateTable() throws SchemaRegistryException { - Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-ran-logical", - "GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION", "relation_4", "GNBCUUP_1", "CloudNativeApplication_4", + Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran", + "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", "relation_4", "ANTENNAMODULE_1", "ANTENNACAPABILITY_4", new ArrayList<>()); assertNull(manyToManyRelationship.getStoringSideEntityId()); assertNull(manyToManyRelationship.getNotStoringSideEntityId()); - RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByName(manyToManyRelationship.getType()); + RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToManyRelationship + .getModule(), manyToManyRelationship.getType()); assertNull(manyToManyRelationType.getNotStoringSideTableName()); assertNull(manyToManyRelationType.getNotStoringSideEntityIdColumnNameInStoringSideTable()); @@ -1091,29 +1128,52 @@ class TiesDbOperationResultsTest { } @Test - void testRelationRelatedMethodsWhenRelationshipIsStoredOnBSide() { + void testRelationRelatedMethodsWhenRelationshipIsStoredOnBSide() throws SchemaRegistryException { - Relationship relationship = new Relationship("o-ran-smo-teiv-ran-logical", "GNBDUFUNCTION_PROVIDES_NRCELLDU", - "relation_2", "GNBDUFunction_1", "NRCellDU_5", new ArrayList<>()); + Relationship relationship = new Relationship("o-ran-smo-teiv-ran", "ODUFUNCTION_PROVIDES_NRCELLDU", "relation_2", + "ODUFunction_1", "NRCellDU_5", new ArrayList<>()); assertEquals("NRCellDU_5", relationship.getStoringSideEntityId()); - assertEquals("GNBDUFunction_1", relationship.getNotStoringSideEntityId()); + assertEquals("ODUFunction_1", relationship.getNotStoringSideEntityId()); - RelationType relationType = SchemaRegistry.getRelationTypeByName(relationship.getType()); + RelationType relationType = SchemaRegistry.getRelationTypeByModuleAndName(relationship.getModule(), relationship + .getType()); - assertEquals("ties_data.\"o-ran-smo-teiv-ran-logical_GNBDUFunction\"", relationType.getNotStoringSideTableName()); - assertEquals("REL_FK_provided-by-gnbduFunction", relationType + assertEquals("ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", relationType.getNotStoringSideTableName()); + assertEquals("REL_FK_provided-by-oduFunction", relationType .getNotStoringSideEntityIdColumnNameInStoringSideTable()); - assertEquals("NRCellDU", relationType.getStoringSideEntityType()); - assertEquals("GNBDUFunction", relationType.getNotStoringSideEntityType()); + assertEquals("NRCellDU", relationType.getStoringSideEntityType().getName()); + assertEquals("ODUFunction", relationType.getNotStoringSideEntityType().getName()); + + } + + // testing exceptions loadModules() in PostgresSchemaLoader.java for Sonarqube code coverage + @Test + void testLoadModulesThrowsException() throws JsonProcessingException { + ObjectMapper objectMapper = Mockito.mock(ObjectMapper.class); + PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, objectMapper); + + Mockito.when(objectMapper.readValue(anyString(), eq(List.class))).thenThrow(JsonProcessingException.class); + + assertThrows(SchemaLoaderException.class, postgresSchemaLoader::loadModules); + } + + // testing exceptions in loadEntityTypes() in PostgresSchemaLoader.java for Sonarqube code coverage + @Test + void testLoadEntityTypesThrowsException() throws JsonProcessingException { + ObjectMapper objectMapper = Mockito.mock(ObjectMapper.class); + PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, objectMapper); + + Mockito.when(objectMapper.readValue(anyString(), eq(List.class))).thenThrow(JsonProcessingException.class); + assertThrows(SchemaLoaderException.class, postgresSchemaLoader::loadEntityTypes); } private List mergeSingleTestEvent(String path) throws MaximumCardinalityViolationException, InvalidFieldInYangDataException { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEventFromJsonFile(path); ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - return tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData); + return tiesDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, "dmi-plugin:nm-1"); } private void assertDbContainsOperationResults(List results) { diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java index a1866b9..cd68e60 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/TiesDbServiceContainerizedTest.java @@ -53,6 +53,7 @@ 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.SchemaRegistryException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; @@ -71,7 +72,7 @@ import org.oran.smo.teiv.utils.schema.Geography; @Configuration @SpringBootTest class TiesDbServiceContainerizedTest { - public static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); + private static TestPostgresqlContainer postgreSQLContainer = TestPostgresqlContainer.getInstance(); @Autowired private TiesDbService tiesDbService; @@ -86,6 +87,8 @@ 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()); @@ -99,30 +102,33 @@ class TiesDbServiceContainerizedTest { @BeforeEach public void deleteAll() { - dslContext.meta().filterSchemas(s -> s.getName().equals(TIES_DATA_SCHEMA)).getTables().forEach(t -> dslContext - .truncate(t).cascade().execute()); + TestPostgresqlContainer.truncateSchemas(List.of(TIES_DATA_SCHEMA), dslContext); } @Test void testMergeManagedElement() { Map map1 = new HashMap<>(); map1.put("id", "id1"); - map1.put("fdn", "fdn1"); - map1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map1); + 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-ran-oam_ManagedElement\""); + Result rows = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals("{\"reliabilityIndicator\":\"OK\"}", rows.get(0).get("metadata").toString()); + map1.remove("metadata"); for (Entry e : map1.entrySet()) { assertEquals(e.getValue(), rows.get(0).get(e.getKey())); } Map map2 = new HashMap<>(); map2.put("id", "id1"); - map2.put("fdn", "fdn2"); - map2.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann2\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map2); + 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-ran-oam_ManagedElement\""); + Result rows2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals("{}", rows2.get(0).get("metadata").toString()); + map2.remove("metadata"); for (Entry e : map2.entrySet()) { assertEquals(e.getValue(), rows2.get(0).get(e.getKey())); } @@ -130,44 +136,57 @@ class TiesDbServiceContainerizedTest { @Test void testMergeSector() throws IOException { - Map map = new HashMap<>(); - map.put("id", "id1"); - map.put("sectorId", 7); - map.put("geo-location", new Geography("{\"latitude\": 47.497913,\"longitude\": 19.040236}")); - map.put("azimuth", 7.3); - tiesDbOperations.merge(dslContext, "ties_data.\"22174a23af5d5a96143c83ddfa78654df0acb697\"", map); + Map mapWithGeoLocation = new HashMap<>(); + mapWithGeoLocation.put("id", "id1"); + mapWithGeoLocation.put("sectorId", 7); + mapWithGeoLocation.put("geo-location", new Geography("{\"latitude\": 47.497913,\"longitude\": 19.040236}")); + mapWithGeoLocation.put("azimuth", 7.3); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_Sector\"", mapWithGeoLocation, + updatedTimeColumnName); + + Map mapWithGeoLocationAndHeight = new HashMap<>(); + mapWithGeoLocationAndHeight.put("id", "id2"); + mapWithGeoLocationAndHeight.put("sectorId", 8); + mapWithGeoLocationAndHeight.put("geo-location", new Geography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236,\"height\": 111.1}")); + mapWithGeoLocationAndHeight.put("azimuth", 8.3); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_Sector\"", mapWithGeoLocationAndHeight, + updatedTimeColumnName); Result rows = dslContext.select(field("id"), field("\"sectorId\"").as("sectorId"), field( - "ST_AsText(\"geo-location\")"), field("azimuth")).from(table( - "ties_data.\"22174a23af5d5a96143c83ddfa78654df0acb697\"")).fetch(); + "ST_AsText(\"geo-location\")"), field("azimuth")).from(table("ties_data.\"o-ran-smo-teiv-ran_Sector\"")) + .fetch(); assertEquals("id1", rows.get(0).get("id")); assertEquals(7L, rows.get(0).get("sectorId")); - assertEquals("POINT(47.497913 19.040236)", rows.get(0).get("ST_AsText(\"geo-location\")")); assertEquals(0, new BigDecimal("7.3").compareTo((BigDecimal) rows.get(0).get("azimuth"))); + + assertEquals("id2", rows.get(1).get("id")); + assertEquals(8L, rows.get(1).get("sectorId")); + assertEquals("POINT Z (47.497913 19.040236 111.1)", rows.get(1).get("ST_AsText(\"geo-location\")")); + assertEquals(0, new BigDecimal("8.3").compareTo((BigDecimal) rows.get(1).get("azimuth"))); } @Test - void testDeleteFromManagedElement() { + void testDeleteFromManagedElement() throws SchemaRegistryException { Map map1 = new HashMap<>(); map1.put("id", "id1"); - map1.put("fdn", "fdn1"); - map1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map1); + map1.put("CD_sourceIds", JSONB.jsonb("[\"sourceId1\",\"sourceId2\"]")); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map1, updatedTimeColumnName); Map map2 = new HashMap<>(); map2.put("id", "id2"); - map2.put("fdn", "fdn2"); - map2.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann2\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map2); + map2.put("CD_sourceIds", JSONB.jsonb("[\"sourceId3\",\"sourceId4\"]")); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map2, updatedTimeColumnName); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(2, row1.size()); - tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByName("ManagedElement"), "id1"); + tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + "ManagedElement"), "id1"); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, row2.size()); } @@ -176,42 +195,47 @@ class TiesDbServiceContainerizedTest { List> dbOperations = new ArrayList<>(); Map map1 = new HashMap<>(); map1.put("id", "id1"); - map1.put("fdn", "fdn1"); - map1.put("gNBCUName", "gNBCUName"); - map1.put("gNBId", 1); - map1.put("gNBIdLength", 1); - map1.put("pLMNId", JSONB.jsonb("{\"name\":\"pLMNId1\"}")); - map1.put("cmId", JSONB.jsonb("{\"name\":\"cmId1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"c4a425179d3089b5288fdf059079d0ea26977f0f\"", map1); + 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); Map map2 = new HashMap<>(); map2.put("id", "id1"); - map2.put("name", "CloudNativeApplication"); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", map2); + map2.put("eUtranFqBands", JSONB.jsonb("[\"eUtranFqBands1\",\"eUtranFqBands2\"]")); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\"", map2, + updatedTimeColumnName); Map map3 = new HashMap<>(); map3.put("id", "id1"); - map3.put("aSide_GNBCUCPFunction", "id1"); - map3.put("bSide_CloudNativeApplication", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\"", map3); + map3.put("aSide_AntennaModule", "id1"); + map3.put("bSide_AntennaCapability", "id1"); + tiesDbOperations.merge(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", map3, + updatedTimeColumnName); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"c4a425179d3089b5288fdf059079d0ea26977f0f\""); + Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(1, row1.size()); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\""); + Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(1, row2.size()); - Result row3 = selectAllRowsFromTable(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\""); + Result row3 = selectAllRowsFromTable(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(1, row3.size()); - dbOperations.add(dslContext -> tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByName( - "GNBCUCPFunction"), "id1")); + dbOperations.add(dslContext -> { + try { + tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-equipment", "AntennaModule"), "id1"); + } catch (SchemaRegistryException e) { + throw new RuntimeException(e); + } + }); assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); - Result row4 = selectAllRowsFromTable(dslContext, "ties_data.\"c4a425179d3089b5288fdf059079d0ea26977f0f\""); + Result row4 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-equipment_AntennaModule\""); assertEquals(0, row4.size()); - Result row5 = selectAllRowsFromTable(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\""); + Result row5 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_AntennaCapability\""); assertEquals(1, row5.size()); - Result row6 = selectAllRowsFromTable(dslContext, "ties_data.\"7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7\""); + Result row6 = selectAllRowsFromTable(dslContext, "ties_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\""); assertEquals(0, row6.size()); } @@ -221,330 +245,349 @@ class TiesDbServiceContainerizedTest { List> dbOperations = new ArrayList<>(); Map map1 = new HashMap<>(); map1.put("id", "id1"); - map1.put("fdn", "fdn1"); - map1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map1); + map1.put("gNBId", 1); + map1.put("dUpLMNId", JSONB.jsonb("{\"mcc\":\"dUpLMNId1\"}")); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", map1, updatedTimeColumnName); Map map2 = new HashMap<>(); map2.put("id", "id1"); - map2.put("name", "CloudNativeSystem"); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", map2); + map2.put("CD_sourceIds", JSONB.jsonb("[\"sourceId1\",\"sourceId2\"]")); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", map2, updatedTimeColumnName); Map map3 = new HashMap<>(); map3.put("id", "id1"); - map3.put("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "relId"); - map3.put("REL_FK_deployed-as-cloudNativeSystem", "id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", map3); + 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); - Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); + Result row2 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, row2.size()); - Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + Result row1 = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(1, row1.size()); - dbOperations.add(dslContext -> tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByName( - "CloudNativeSystem"), "id1")); + dbOperations.add(dslContext -> { + try { + tiesDbOperations.deleteEntity(dslContext, SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", + "ManagedElement"), "id1"); + } catch (SchemaRegistryException e) { + throw new RuntimeException(e); + } + }); assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); - Result meRecords = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); - assertEquals("id1", meRecords.get(0).get("id")); - assertEquals("fdn1", meRecords.get(0).get("fdn")); - assertNull(meRecords.get(0).get("REL_FK_deployed-as-cloudNativeSystem")); - assertNull(meRecords.get(0).get("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - Result cnsRecords = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(0, cnsRecords.size()); + Result oduFuctionRecords = selectAllRowsFromTable(dslContext, + "ties_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\""); + assertEquals(0, managedElementRecords.size()); } @Test void testMergeOneToManyRelationship() { + 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); + Map managedElementEntity1 = new HashMap<>(); - managedElementEntity1.put("id", "managedelement_id1"); - managedElementEntity1.put("fdn", "managedelement_fdn1"); - managedElementEntity1.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity1); - - Map cloudNativeAppEntity = new HashMap<>(); - cloudNativeAppEntity.put("id", "cna-1"); - cloudNativeAppEntity.put("name", "CloudNativeApp1"); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cloudNativeAppEntity); - - Map meToCnaRelationship = new HashMap<>(); - meToCnaRelationship.put("id", "cna-1"); - meToCnaRelationship.put("REL_FK_realised-managedElement", "managedelement_id1"); - meToCnaRelationship.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "rel_id1"); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", meToCnaRelationship); - - Result rowsBeforeMerge = dslContext.select(field("id"), field("name"), field( - "\"REL_FK_realised-managedElement\"").as("REL_FK_realised-managedElement"), field( - "\"REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION\"").as( - "REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")).from(table( - "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"")).fetch(); - assertEquals("cna-1", rowsBeforeMerge.get(0).get("id")); - assertEquals("CloudNativeApp1", rowsBeforeMerge.get(0).get("name")); - assertEquals("managedelement_id1", rowsBeforeMerge.get(0).get("REL_FK_realised-managedElement")); - assertEquals("rel_id1", rowsBeforeMerge.get(0).get("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")); - - Map cloudNativeAppEntity2 = new HashMap<>(); - cloudNativeAppEntity2.put("id", "cna-2"); - cloudNativeAppEntity2.put("name", "CloudNativeApp2"); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", cloudNativeAppEntity2); - - Map modifiedMeToCnaRelationship = new HashMap<>(); - modifiedMeToCnaRelationship.put("id", "cna-2"); - modifiedMeToCnaRelationship.put("REL_FK_realised-managedElement", "managedelement_id1"); - modifiedMeToCnaRelationship.put("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "rel_id2"); - tiesDbOperations.merge(dslContext, "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"", - modifiedMeToCnaRelationship); - - Result rowsAfterMerge = dslContext.select(field("id"), field("name"), field("\"REL_FK_realised-managedElement\"") - .as("REL_FK_realised-managedElement"), field("\"REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION\"") - .as("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")).from(table( - "ties_data.\"e01fcb87ad2c34ce66c34420255e25aaca270e5e\"")).fetch(); - - assertEquals("cna-1", rowsAfterMerge.get(0).get("id")); - assertEquals("CloudNativeApp1", rowsAfterMerge.get(0).get("name")); - assertEquals("managedelement_id1", rowsAfterMerge.get(1).get("REL_FK_realised-managedElement")); - assertEquals("rel_id1", rowsAfterMerge.get(0).get("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")); - assertEquals("cna-2", rowsAfterMerge.get(1).get("id")); - assertEquals("CloudNativeApp2", rowsAfterMerge.get(1).get("name")); - assertEquals("managedelement_id1", rowsAfterMerge.get(1).get("REL_FK_realised-managedElement")); - assertEquals("rel_id2", rowsAfterMerge.get(1).get("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION")); + 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); + + 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); + + Result rowsBeforeMerge = selectAllRowsFromTable(dslContext, "ties_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")); + assertEquals("rel_id1", rowsBeforeMerge.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + + 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); + + 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); + + Result rowsAfterMerge = selectAllRowsFromTable(dslContext, "ties_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")); + assertEquals("rel_id1", rowsBeforeMerge.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + assertEquals("id2", rowsAfterMerge.get(1).get("id")); + assertEquals(2L, rowsAfterMerge.get(1).get("gNBId")); + assertEquals("id1", rowsAfterMerge.get(1).get("REL_FK_managed-by-managedElement")); + assertEquals("rel_id2", rowsAfterMerge.get(1).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); } @Test - void testDeleteOneToManyRelationship() { + void testDeleteOneToManyRelationship() throws SchemaRegistryException { Map managedElementEntity = new HashMap<>(); managedElementEntity.put("id", "me-id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity); - - Map enodeBFunctionEntity = new HashMap<>(); - enodeBFunctionEntity.put("id", "enodeb-id1"); - enodeBFunctionEntity.put("eNBId", 1L); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-logical_ENodeBFunction\"", enodeBFunctionEntity); - - Map meToEnodeBFuncRelation = new HashMap<>(); - meToEnodeBFuncRelation.put("id", "enodeb-id1"); - meToEnodeBFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); - meToEnodeBFuncRelation.put("REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION", "eiid1"); - meToEnodeBFuncRelation.put("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION", JooqTypeConverter.toJsonb(List - .of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-logical_ENodeBFunction\"", - meToEnodeBFuncRelation); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, + updatedTimeColumnName); + + 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); + + Map meToOduFuncRelation = new HashMap<>(); + meToOduFuncRelation.put("id", "odu-id1"); + meToOduFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); + 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); tiesDbOperations.deleteRelationFromEntityTableByRelationId(dslContext, "eiid1", SchemaRegistry - .getRelationTypeByName("MANAGEDELEMENT_MANAGES_ENODEBFUNCTION")); + .getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", "MANAGEDELEMENT_MANAGES_ODUFUNCTION")); - Result rows = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran-logical_ENodeBFunction\""); - assertEquals("enodeb-id1", rows.get(0).get("id")); - assertEquals(1L, rows.get(0).get("eNBId")); - //assertNull(rows.get(0).get("REL_FK_managed-by-managedElement")); - assertNull(rows.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION")); + Result rows = selectAllRowsFromTable(dslContext, "ties_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")); assertEquals(JooqTypeConverter.toJsonb(List.of()), rows.get(0).get( - "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION")); + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); } @Test void testTransactionalMergeSucceeds() { List> dbOperations = new ArrayList<>(); - Map cloudNativeSystemEntity = new HashMap<>(); - cloudNativeSystemEntity.put("id", "cloudnative_id1"); - cloudNativeSystemEntity.put("name", "CloudNativeSystem"); + Map managedElementEntity = new HashMap<>(); + managedElementEntity.put("id", "me-id1"); dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", cloudNativeSystemEntity)); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, updatedTimeColumnName)); - Map managedElementEntity = new HashMap<>(); - managedElementEntity.put("id", "managed_element_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); + 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-oam_ManagedElement\"", managedElementEntity)); - - Map meTocnsRelationship = new HashMap<>(); - meTocnsRelationship.put("id", "managed_element_id1"); - meTocnsRelationship.put("REL_FK_deployed-as-cloudNativeSystem", "cloudnative_id1"); - meTocnsRelationship.put("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "eiid1"); - meTocnsRelationship.put("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", JooqTypeConverter.toJsonb( - List.of("fdn1", "cmHandleId1"))); + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, updatedTimeColumnName)); + + Map meToOduFuncRelation = new HashMap<>(); + meToOduFuncRelation.put("id", "odu-id1"); + meToOduFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); + 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-oam_ManagedElement\"", meTocnsRelationship)); + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", meToOduFuncRelation, updatedTimeColumnName)); assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); - Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); - assertEquals(1, rowsFromManagedElementTable.size()); - assertEquals("cloudnative_id1", rowsFromManagedElementTable.get(0).get("REL_FK_deployed-as-cloudNativeSystem")); - assertEquals("eiid1", rowsFromManagedElementTable.get(0).get( - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromManagedElementTable.get(0).get( - "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - - Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(1, rowsFromCloudNativeSystem.size()); + Result rowsFromOduFuctionTable = selectAllRowsFromTable(dslContext, + "ties_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")); + assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromOduFuctionTable.get(0).get( + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + + Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals(1, rowsFromManagedElement.size()); } @Test void testTransactionalMergeRollsBackAfterRelationshipError() { List> dbOperations = new ArrayList<>(); Map managedElementEntity = new HashMap<>(); - managedElementEntity.put("id", "managed_element_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); + managedElementEntity.put("id", "me-id1"); dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity)); - - Map cloudNativeSystemEntity = new HashMap<>(); - cloudNativeSystemEntity.put("id", "cloudnative_id1"); - cloudNativeSystemEntity.put("name", "CloudNativeSystem"); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, updatedTimeColumnName)); + Map oduFuctionEntity = new HashMap<>(); + oduFuctionEntity.put("id", "odu-id1"); + oduFuctionEntity.put("gNBId", 1); dbOperations.add(wrDSLContext -> tiesDbOperations.merge(wrDSLContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", cloudNativeSystemEntity)); + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", oduFuctionEntity, updatedTimeColumnName)); // Create a faulty relationship map to trigger the rollback Map faultyCloudNativeSystemRelationship = new HashMap<>(); - faultyCloudNativeSystemRelationship.put("id", "cloudnative_id1"); - faultyCloudNativeSystemRelationship.put("REL_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_BAAAD", - "managed_element_id1"); - faultyCloudNativeSystemRelationship.put("REL_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_EIID", "eiid1"); + 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.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", faultyCloudNativeSystemRelationship)); + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\"", faultyCloudNativeSystemRelationship, + updatedTimeColumnName)); assertThrows(TiesException.class, () -> tiesDbService.execute(dbOperations)); Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(0, rowsFromManagedElementTable.size()); Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); + "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); assertEquals(0, rowsFromCloudNativeSystem.size()); } @Test void testTransactionalDeleteSucceeds() { List> dbOperations = new ArrayList<>(); - Map cloudNativeSystemEntity = new HashMap<>(); - cloudNativeSystemEntity.put("id", "cloudnative_id1"); - cloudNativeSystemEntity.put("name", "CloudNativeSystem"); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity); - Map managedElementEntity = new HashMap<>(); - managedElementEntity.put("id", "managed_element_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity); - - Map meToCnsRelationship = new HashMap<>(); - meToCnsRelationship.put("id", "managed_element_id1"); - meToCnsRelationship.put("REL_FK_deployed-as-cloudNativeSystem", "cloudnative_id1"); - meToCnsRelationship.put("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "eiid1"); - meToCnsRelationship.put("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", JooqTypeConverter.toJsonb( - List.of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", meToCnsRelationship); - - Result rowsFromCloudNativeSystemBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(1, rowsFromCloudNativeSystemBeforeDelete.size()); + managedElementEntity.put("id", "me-id1"); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, + updatedTimeColumnName); + + 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); + + Map meToOduFuncRelation = new HashMap<>(); + meToOduFuncRelation.put("id", "odu-id1"); + meToOduFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); + 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); + + Result rowsFromOduFuctionBeforeDelete = selectAllRowsFromTable(dslContext, + "ties_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")); + assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromOduFuctionBeforeDelete.get(0).get( + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); Result rowsFromManagedElementBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElementBeforeDelete.size()); - assertEquals("cloudnative_id1", rowsFromManagedElementBeforeDelete.get(0).get( - "REL_FK_deployed-as-cloudNativeSystem")); - assertEquals("eiid1", rowsFromManagedElementBeforeDelete.get(0).get( - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromManagedElementBeforeDelete.get(0) - .get("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - dbOperations.add(wrDSLContext -> tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByName( - "ManagedElement"), "managed_element_id1")); + dbOperations.add(wrDSLContext -> { + try { + tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-ran", "ODUFunction"), "odu-id1"); + } catch (SchemaRegistryException e) { + e.printStackTrace(); + } + }); dbOperations.add(wrDSLContext -> { - tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByName("CloudNativeSystem"), - "cloudnative_id1"); + try { + tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); + } catch (SchemaRegistryException e) { + e.printStackTrace(); + } }); - dbOperations.add(wrDSLContext -> tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, - "managed_element_id1", SchemaRegistry.getRelationTypeByName( - "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM"))); + dbOperations.add(wrDSLContext -> { + try { + tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", SchemaRegistry + .getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran", + "MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + } catch (SchemaRegistryException e) { + e.printStackTrace(); + } + }); assertDoesNotThrow(() -> tiesDbService.execute(dbOperations)); Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(0, rowsFromManagedElementTable.size()); - Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(0, rowsFromCloudNativeSystem.size()); + Result rowsOduFuction = selectAllRowsFromTable(dslContext, "ties_data.\"o-ran-smo-teiv-ran_ODUFunction\""); + assertEquals(0, rowsOduFuction.size()); } @Test void testTransactionalDeleteRollbackAfterRelationshipError() { List> dbOperations = new ArrayList<>(); - Map cloudNativeSystemEntity = new HashMap<>(); - cloudNativeSystemEntity.put("id", "cloudnative_id1"); - cloudNativeSystemEntity.put("name", "CloudNativeSystem"); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity); - Map managedElementEntity = new HashMap<>(); - managedElementEntity.put("id", "managed_element_id1"); - managedElementEntity.put("fdn", "fdn1"); - managedElementEntity.put("cmId", JSONB.jsonb("{\"name\":\"Hellmann1\"}")); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", managedElementEntity); - - Map cloudNativeSystemRelationship = new HashMap<>(); - cloudNativeSystemRelationship.put("id", "managed_element_id1"); - cloudNativeSystemRelationship.put("REL_FK_deployed-as-cloudNativeSystem", "cloudnative_id1"); - cloudNativeSystemRelationship.put("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", "eiid1"); - cloudNativeSystemRelationship.put("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM", JooqTypeConverter - .toJsonb(List.of("fdn1", "cmHandleId1"))); - tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\"", - cloudNativeSystemRelationship); - - Result rowsFromCloudNativeSystemBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(1, rowsFromCloudNativeSystemBeforeDelete.size()); + managedElementEntity.put("id", "me-id1"); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity, + updatedTimeColumnName); + + 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); + + Map meToOduFuncRelation = new HashMap<>(); + meToOduFuncRelation.put("id", "odu-id1"); + meToOduFuncRelation.put("REL_FK_managed-by-managedElement", "me-id1"); + 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); Result rowsFromManagedElementBeforeDelete = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); assertEquals(1, rowsFromManagedElementBeforeDelete.size()); - assertEquals("cloudnative_id1", rowsFromManagedElementBeforeDelete.get(0).get( - "REL_FK_deployed-as-cloudNativeSystem")); - assertEquals("eiid1", rowsFromManagedElementBeforeDelete.get(0).get( - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromManagedElementBeforeDelete.get(0) - .get("REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - - dbOperations.add(wrDSLContext -> tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByName( - "ManagedElement"), "managed_element_id1")); - dbOperations.add(wrDSLContext -> tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByName( - "CloudNativeSystem"), "cloudnative_id1")); + + Result rowsFromOduFuctionBeforeDelete = selectAllRowsFromTable(dslContext, + "ties_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")); + assertEquals("eiid1", rowsFromOduFuctionBeforeDelete.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromOduFuctionBeforeDelete.get(0).get( + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + + dbOperations.add(wrDSLContext -> { + try { + tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-oam", "ManagedElement"), "me-id1"); + } catch (SchemaRegistryException e) { + e.printStackTrace(); + } + }); + dbOperations.add(wrDSLContext -> { + try { + tiesDbOperations.deleteEntity(wrDSLContext, SchemaRegistry.getEntityTypeByModuleAndName( + "o-ran-smo-teiv-ran", "ODUFunction"), "odu-id1"); + } catch (SchemaRegistryException e) { + e.printStackTrace(); + } + }); // Add a faulty relationship delete to trigger the rollback - dbOperations.add(wrDSLContext -> tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", - SchemaRegistry.getRelationTypeByName("rel_managedelement_deployed_as_cloudnativesystem_eiid"))); + dbOperations.add(wrDSLContext -> { + tiesDbOperations.deleteRelationFromEntityTableByRelationId(wrDSLContext, "eiid1", null); + }); assertThrows(TiesException.class, () -> tiesDbService.execute(dbOperations)); - Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(1, rowsFromCloudNativeSystem.size()); - Result rowsFromManagedElementTable = selectAllRowsFromTable(dslContext, - "ties_data.\"o-ran-smo-teiv-ran-oam_ManagedElement\""); - assertEquals(1, rowsFromManagedElementTable.size()); - assertEquals("cloudnative_id1", rowsFromManagedElementTable.get(0).get("REL_FK_deployed-as-cloudNativeSystem")); - assertEquals("eiid1", rowsFromManagedElementTable.get(0).get( - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); - assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromManagedElementTable.get(0).get( - "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM")); + Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals(1, rowsFromManagedElement.size()); + + Result rowsFromOduFuction = selectAllRowsFromTable(dslContext, + "ties_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")); + assertEquals("eiid1", rowsFromOduFuction.get(0).get("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); + assertEquals(JooqTypeConverter.toJsonb(List.of("fdn1", "cmHandleId1")), rowsFromOduFuction.get(0).get( + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION")); } @Test @@ -552,49 +595,45 @@ class TiesDbServiceContainerizedTest { List> dbOperations1 = new ArrayList<>(); List> dbOperations2 = new ArrayList<>(); - Map cloudNativeSystemEntity1 = new HashMap<>(); - cloudNativeSystemEntity1.put("id", "id1"); - cloudNativeSystemEntity1.put("name", "CloudNativeSystem"); + Map managedElementEntity1 = new HashMap<>(); + managedElementEntity1.put("id", "id1"); - Map cloudNativeSystemEntity2 = new HashMap<>(); - cloudNativeSystemEntity2.put("id", "id2"); - cloudNativeSystemEntity2.put("name", "CloudNativeSystem"); + Map managedElementEntity2 = new HashMap<>(); + managedElementEntity2.put("id", "id2"); - Map cloudNativeSystemEntity3 = new HashMap<>(); - cloudNativeSystemEntity3.put("id", "id3"); - cloudNativeSystemEntity3.put("name", "CloudNativeSystem"); + Map managedElementEntity3 = new HashMap<>(); + managedElementEntity3.put("id", "id3"); - Map cloudNativeSystemEntity4 = new HashMap<>(); - cloudNativeSystemEntity4.put("id", "id4"); - cloudNativeSystemEntity4.put("name", "CloudNativeSystem"); + Map managedElementEntity4 = new HashMap<>(); + managedElementEntity4.put("id", "id4"); final CountDownLatch firstTransactionCompletedMergeEntity1 = new CountDownLatch(1); final CountDownLatch secondTransactionCompletedMergeEntity2 = new CountDownLatch(1); dbOperations1.add(dslContext -> { - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity1); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity1, + updatedTimeColumnName); firstTransactionCompletedMergeEntity1.countDown(); try { secondTransactionCompletedMergeEntity2.await(); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity2); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity3); + 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); } catch (InterruptedException e) { throw new RuntimeException(e); } }); - //Try to add the same rows in another transaction in another order. + // Try to add the same rows in another transaction in another order. dbOperations2.add(dslContext -> { try { - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity2); + tiesDbOperations.merge(dslContext, "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\"", managedElementEntity2, + updatedTimeColumnName); secondTransactionCompletedMergeEntity2.countDown(); firstTransactionCompletedMergeEntity1.await(); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity1); - tiesDbOperations.merge(dslContext, "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\"", - cloudNativeSystemEntity4); + 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); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -606,9 +645,9 @@ class TiesDbServiceContainerizedTest { t2.start(); t1.join(); t2.join(); - Result rowsFromCloudNativeSystem = selectAllRowsFromTable(dslContext, - "ties_data.\"163276fa439cdfccabb80f7acacb6fa638e8d314\""); - assertEquals(4, rowsFromCloudNativeSystem.size()); + Result rowsFromManagedElement = selectAllRowsFromTable(dslContext, + "ties_data.\"o-ran-smo-teiv-oam_ManagedElement\""); + assertEquals(4, rowsFromManagedElement.size()); } @Test @@ -625,14 +664,17 @@ class TiesDbServiceContainerizedTest { } /** - * The out of the box binding for geography is available in the commercial jOOQ distribution only. Because of this, - * a select * from tableName; query fails if the table has a column with geography type. Even if the value in that + * The out of the box binding for geography is available in the commercial jOOQ + * distribution only. Because of this, + * a select * from tableName; query fails if the table has a column with + * geography type. Even if the value in that * column is null. * * @param readDataDslContext * @param tableName * For example: ties_data."AntennaModule" - * @return the fetched rows. Values of geography type are represented as String values. + * @return the fetched rows. Values of geography type are represented as String + * values. */ public static Result selectAllRowsFromTable(DSLContext readDataDslContext, final String tableName) { String unqualifiedName = tableName.split("\\.")[1].split("\"")[1]; diff --git a/teiv/src/test/java/org/oran/smo/teiv/service/cloudevent/CloudEventParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/service/cloudevent/CloudEventParserTest.java index e2d83c5..8226c26 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/service/cloudevent/CloudEventParserTest.java +++ b/teiv/src/test/java/org/oran/smo/teiv/service/cloudevent/CloudEventParserTest.java @@ -20,47 +20,57 @@ */ package org.oran.smo.teiv.service.cloudevent; -import java.io.IOException; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; + +import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.cloudevents.CloudEvent; -import org.junit.jupiter.api.BeforeEach; -import org.oran.smo.teiv.exception.YangModelException; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.exception.YangException; 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.startup.SchemaHandler; -import io.cloudevents.CloudEvent; -import org.junit.jupiter.api.Assertions; - -import static org.junit.Assert.assertNull; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - +import org.oran.smo.teiv.schema.SchemaRegistry; +import org.oran.smo.teiv.schema.SchemaRegistryException; 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.CloudEventTestUtil; +import org.oran.smo.teiv.utils.yangparser.IngestionYangParser; +import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.boot.test.mock.mockito.MockBean; - -@SpringBootTest +@ExtendWith(MockitoExtension.class) class CloudEventParserTest { + private static CloudEventParser cloudEventParser; - @Autowired - private CloudEventParser cloudEventParser; + @Mock + private static CustomMetrics customMetrics; - @MockBean - private SchemaHandler schemaHandler; - - @BeforeEach - public void setup() throws SchemaLoaderException, YangModelException, IOException { + @BeforeAll + public static void setup() throws SchemaLoaderException, YangException { SchemaLoader mockSchemaLoader = new MockSchemaLoader(); mockSchemaLoader.loadSchemaRegistry(); + IngestionYangParser.loadModels(); + cloudEventParser = new CloudEventParser(customMetrics, new ObjectMapper()); + ReflectionTestUtils.setField(cloudEventParser, "isYangValidationEnabled", true); } @Test @@ -68,20 +78,22 @@ class CloudEventParserTest { final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-with-data.json"); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "NRCellDU", "entityId_1", 6, Map.of( - "cellLocalId", 4589L, "nRPCI", 12L, "nRTAC", 310L, "primitiveArray", "[1, 2, 3]", "singleList", "12", - "jsonObjectArray", "[{\"test2\":\"49\",\"test1\":\"128\"}, {\"test2\":\"50\",\"test1\":\"129\"}]")); + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "NRCellDU", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", + Map.of("cellLocalId", 4589L, "nRPCI", 12L, "nRTAC", 310L), List.of("source1", "source2")); + + validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "NRCellDU", "entityId_3", Map.of( + "cellLocalId", 45891L, "nRPCI", 121L, "nRTAC", 3101L), List.of("source3")); - validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "NRCellDU", "entityId_3", 6, Map.of( - "cellLocalId", 45891L, "nRPCI", 121L, "nRTAC", 3101L, "primitiveArray", "[1, 2, 3]", "singleList", "121", - "jsonObjectArray", "[{\"test2\":\"491\",\"test1\":\"1281\"}, {\"test2\":\"501\",\"test1\":\"1291\"}]")); + validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "NRSectorCarrier", "entityId_2", Map + .of("arfcnDL", 4590L), List.of("source1", "source2")); - validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "NRSectorCarrier", "entityId_2", 4, - Map.of("arfcnDL", 4590L, "testDouble", 32.5, "testBoolean", true, "cmId", - "{\"option1\":\"test_option1\",\"option2\":\"test_option2\"}")); + validateEntity(parsedCloudEventData.getEntities().get(3), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_4", Map.of( + "nCI", 123L, "nRTAC", 32L, "cellLocalId", 456L, "plmnId", "{\"mcc\":\"209\",\"mnc\":\"751\"}"), List.of( + "source1", "source2")); final List relationships = parsedCloudEventData.getRelationships(); - Assertions.assertEquals(4, relationships.size()); + assertEquals(4, relationships.size()); Relationship relationship = parsedCloudEventData.getRelationships().get(0); assertEquals("o-ran-smo-teiv-ran", relationship.getModule()); @@ -91,7 +103,7 @@ class CloudEventParserTest { "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", relationship.getASide()); assertEquals("entityId_2", relationship.getBSide()); - assertEquals(null, relationship.getSourceIds()); + assertEquals(List.of("source1", "source2"), relationship.getSourceIds()); relationship = parsedCloudEventData.getRelationships().get(1); assertEquals("o-ran-smo-teiv-ran", relationship.getModule()); @@ -118,7 +130,54 @@ class CloudEventParserTest { assertEquals("relationshipId4", relationship.getId()); assertEquals("entityId_5", relationship.getASide()); assertEquals("entityId_3", relationship.getBSide()); - assertEquals(List.of("source21"), relationship.getSourceIds()); + assertEquals(List.of("source21", "source22"), relationship.getSourceIds()); + } + + @Test + void testParseCloudEventDataWithComplexAttributes() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-complex-attributes.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + // Can parse complex attributes like "plmnId" into a json string + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_1", Map.of( + "nCI", 123L, "nRTAC", 32L, "cellLocalId", 456L, "plmnId", "{\"mcc\":\"209\",\"mnc\":\"751\"}"), List.of( + "source1", "source2")); + + // If the "plmnId" is not specified, then it's not added as an attribute + validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_2", Map.of( + "nCI", 123L, "nRTAC", 32L), List.of("source1", "source2")); + + validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_3", Map.of( + "nCI", 123L, "nRTAC", 32L, "cellLocalId", 456L, "plmnId", "{\"mcc\":\"209\",\"mnc\":\"752\"}"), List.of( + "source1", "source2")); + + assertEquals(0, parsedCloudEventData.getRelationships().size()); + } + + @Test + void testParseCloudEventDataWithNullAttribute() { + final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-null-attribute.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + final Map expectedAttributes = new HashMap<>(); + expectedAttributes.put("gNBDUId", null); + expectedAttributes.put("dUpLMNId", "{}"); + + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "ODUFunction", "entityId_1", + expectedAttributes, List.of("source1", "source2")); + } + + @Test + void testParseCloudEventDataCannotGetAttributesFromSchemaRegistry() { + final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-null-attribute.json"); + try (MockedStatic utilities = Mockito.mockStatic(SchemaRegistry.class)) { + utilities.when(() -> SchemaRegistry.getEntityTypeByModuleAndName(any(), any())).thenThrow( + SchemaRegistryException.class); + + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "ODUFunction", "entityId_1", Map + .of(), List.of("source1", "source2")); + } } @Test @@ -128,29 +187,101 @@ class CloudEventParserTest { // Parse an array of 3 elements validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "AntennaCapability", "entityId_0", - Map.of("eUtranFqBands", "[a, b, c]"), null); + Map.of("eUtranFqBands", "[\"a\",\"b\",\"c\"]"), List.of("source1", "source2")); // Parse an array of 2 elements validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "AntennaCapability", "entityId_1", - Map.of("eUtranFqBands", "[a, b]"), null); + Map.of("eUtranFqBands", "[\"a\",\"b\"]"), List.of("source1", "source2")); // Parse an array of 1 element validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "AntennaCapability", "entityId_2", - Map.of("geranFqBands", "a"), null); + Map.of("geranFqBands", "[\"a\"]"), List.of("source1", "source2")); // Parse an empty array validateEntity(parsedCloudEventData.getEntities().get(3), "o-ran-smo-teiv-ran", "AntennaCapability", "entityId_3", - Map.of("eUtranFqBands", "q"), null); + Map.of("eUtranFqBands", "[\"q\"]"), List.of("source1", "source2")); + + assertEquals(0, parsedCloudEventData.getRelationships().size()); + } + + @Test + void testParseIngestionDataWith64BitNumbersAsJsonString() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-string.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + // Validate that the int64 attribute represented as a json string is parsed into + // a java Long. + validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_1", Map.of( + "nCI", 123L, "nRTAC", 32L), List.of("source1", "source2")); + + // Validate that a uint64 is parsed into a java Long. The value is greater than + // Long.MAX_VALUE, so it's stored as a negative signed long. + // The db column is BIGINT, which is a signed int64, so we have to store the + // values greater than Long.MAX_VALUE as a negative value. + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "Sector", "entityId_2", Map.of( + "sectorId", -8223372036854775809L), List.of("source1", "source2")); + + // Validate that a decimal64 is parsed into a java BigDecimal. A java double + // could store only a subset of the possible yang decimal64 values. + validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "Sector", "entityId_3", Map.of( + "sectorId", 5L, "azimuth", BigDecimal.valueOf(Long.MIN_VALUE, 6)), List.of("source1", "source2")); - Assertions.assertEquals(0, parsedCloudEventData.getRelationships().size()); + assertEquals(0, parsedCloudEventData.getRelationships().size()); + } + + @Test + void testParseIngestionDataWith64BitNumbersAsJsonNumbers() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-json-numbers.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + validateEntity(parsedCloudEventData.getEntities().get(2), "o-ran-smo-teiv-ran", "NRCellCU", "entityId_1", Map.of( + "nCI", 123L, "nRTAC", 32L), List.of("source1", "source2")); + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "Sector", "entityId_2", Map.of( + "sectorId", -8223372036854775809L), List.of("source1", "source2")); + + // The value in the json is not representable with a double with the same + // precision. So we lose the last 3 digits. That's why the RFC7951 recommends to + // encode decimal64 as json string. + validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-ran", "Sector", "entityId_3", Map.of( + "sectorId", 5L, "azimuth", new BigDecimal("-9223372036854.775")), List.of("source1", "source2")); + + assertEquals(0, parsedCloudEventData.getRelationships().size()); + } + + @Test + void testParseIngestionDataWithGeoLocation() { + final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-geo-location.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-equipment", "Site", "Site1", Map.of( + "name", "geo-location1", "geo-location", "{\"latitude\":12.78232,\"longitude\":56.7455}"), List.of( + "urn:3gpp:dn:fdn1", "urn:cmHandle:1234")); + + validateEntity(parsedCloudEventData.getEntities().get(1), "o-ran-smo-teiv-equipment", "Site", "Site2", Map.of( + "name", "geo-location2", "geo-location", + "{\"latitude\":12.78232,\"longitude\":56.7455,\"height\":123.1234}"), List.of("urn:3gpp:dn:fdn2", + "urn:cmHandle:2234")); + } + + @Test + void testDeleteParseCloudEventData() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-delete-entity-id.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "NRCellDU", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", + Map.of(), null); } @Test void testEmptyCloudEventData() { final CloudEvent cloudEvent = CloudEventTestUtil.getCloudEvent("create", "{}"); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); - Assertions.assertTrue(parsedCloudEventData.getEntities().isEmpty()); - Assertions.assertTrue(parsedCloudEventData.getRelationships().isEmpty()); + assertTrue(parsedCloudEventData.getEntities().isEmpty()); + assertTrue(parsedCloudEventData.getRelationships().isEmpty()); } @Test @@ -158,8 +289,8 @@ class CloudEventParserTest { final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-one-entity.json"); final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); validateEntity(parsedCloudEventData.getEntities().get(0), "o-ran-smo-teiv-ran", "NRCellDU", "entityId_1", Map.of( - "cellLocalId", 4589L, "nRPCI", 12L, "nRTAC", 310L), null); - Assertions.assertTrue(parsedCloudEventData.getRelationships().isEmpty()); + "cellLocalId", 4589L, "nRPCI", 12L, "nRTAC", 310L), List.of("source1", "source2")); + assertTrue(parsedCloudEventData.getRelationships().isEmpty()); } @Test @@ -176,19 +307,6 @@ class CloudEventParserTest { assertEquals(new ParsedCloudEventData(List.of(), List.of()), parsedCloudEventData); } - @Test - void testInvalidYangDataInEvent() { - final CloudEvent arrayEntitiesCloudEvent = CloudEventTestUtil.getCloudEvent("create", - "{\"entities\":[{\"some_entity_field\": 54321}]}"); - ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(arrayEntitiesCloudEvent); - assertNull(parsedCloudEventData); - - final CloudEvent arrayRelationshipsCloudEvent = CloudEventTestUtil.getCloudEvent("create", - "{\"relationships\":[{\"some_relationship_field\": 54321}]}"); - parsedCloudEventData = cloudEventParser.getCloudEventData(arrayRelationshipsCloudEvent); - assertNull(parsedCloudEventData); - } - @Test void testRelationshipsIsNotAValidYangData() { CloudEvent cloudEvent = CloudEventTestUtil.getCloudEvent("create", "{\"relationships\":[{\"a_field\": 123}]}"); @@ -247,6 +365,26 @@ class CloudEventParserTest { assertNull(parsedCloudEventData); } + @Test + void testRelationshipMissingSourceIds() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-relationship-missing-source-ids.json"); + + ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + assertNull(parsedCloudEventData); + } + + @Test + void testRelationshipWithOneSourceId() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-relationship-with-one-source-id.json"); + + ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + assertNull(parsedCloudEventData); + } + @Test void testRelationshipInvalidType() { final CloudEvent cloudEvent = cloudEventFromJson( @@ -277,6 +415,15 @@ class CloudEventParserTest { assertNull(parsedCloudEventData); } + @Test + void testParseCloudEventDataWithInvalidEntityId() { + final CloudEvent cloudEvent = cloudEventFromJson( + "src/test/resources/cloudeventdata/common/ce-with-invalid-entity-id.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + assertNull(parsedCloudEventData); + } + @Test void testParseCloudEventDataWithInvalidRelationshipId() { final CloudEvent cloudEvent = cloudEventFromJson( @@ -304,6 +451,27 @@ class CloudEventParserTest { assertNull(parsedCloudEventData); } + @Test + void testParseCloudEventDataWithDeprecatedFormat() { + final CloudEvent cloudEvent = cloudEventFromJson("src/test/resources/cloudeventdata/common/ce-deprecated.json"); + final ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + + assertNull(parsedCloudEventData); + } + + @Test + void testParseNullCloudEvent() { + ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(null); + assertNull(parsedCloudEventData); + } + + @Test + void testParseInvalidCloudEvent() { + CloudEvent cloudEvent = CloudEventTestUtil.getCloudEvent("create", "{\"entities\":[{\"a_field\"# 123}]}"); + ParsedCloudEventData parsedCloudEventData = cloudEventParser.getCloudEventData(cloudEvent); + assertNull(parsedCloudEventData); + } + private void validateEntity(final Entity entity, String expectedModuleReference, String expectedEntityName, String expectedId, Map expectedAttributes, List expectedSourceIds) { assertEquals(expectedModuleReference, entity.getModule()); @@ -313,25 +481,16 @@ class CloudEventParserTest { assertEquals(expectedAttributes.size(), attributes.size()); for (Map.Entry entry : expectedAttributes.entrySet()) { assertTrue(attributes.containsKey(entry.getKey())); - assertEquals(entry.getValue().getClass(), attributes.get(entry.getKey()).getClass()); - assertEquals(entry.getValue(), attributes.get(entry.getKey())); + if (Objects.nonNull(entry.getValue())) { + assertEquals(entry.getValue().getClass(), attributes.get(entry.getKey()).getClass()); + assertEquals(entry.getValue(), attributes.get(entry.getKey())); + } else { + assertNull(attributes.get(entry.getKey())); + } } assertEquals(expectedSourceIds, entity.getSourceIds()); } - private void validateEntity(final Entity entity, String expectedModuleReference, String expectedEntityName, - String expectedId, int expectedAttributeCount, Map expectedAttributes) { - assertEquals(expectedModuleReference, entity.getModule()); - assertEquals(expectedEntityName, entity.getType()); - assertEquals(expectedId, entity.getId()); - final Map attributes = entity.getAttributes(); - assertEquals(expectedAttributeCount, attributes.size()); - for (Map.Entry entry : expectedAttributes.entrySet()) { - assertTrue(attributes.containsKey(entry.getKey())); - assertEquals(entry.getValue(), attributes.get(entry.getKey())); - } - } - private CloudEvent cloudEventFromJson(String path) { return assertDoesNotThrow(() -> CloudEventTestUtil.getCloudEventFromJsonFile(path), "Reading CloudEvent from JSON resulted in error."); diff --git a/teiv/src/test/java/org/oran/smo/teiv/startup/SchemaCleanUpHandlerTest.java b/teiv/src/test/java/org/oran/smo/teiv/startup/SchemaCleanUpHandlerTest.java new file mode 100644 index 0000000..ae7d413 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/startup/SchemaCleanUpHandlerTest.java @@ -0,0 +1,62 @@ +/* + * ============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.startup; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import org.oran.smo.teiv.exposure.spi.ModelRepository; +import org.oran.smo.teiv.exposure.spi.Module; +import org.oran.smo.teiv.service.SchemaCleanUpService; + +import static org.mockito.Mockito.*; + +import java.util.List; + +class SchemaCleanUpHandlerTest { + + @Mock + private ModelRepository modelRepository; + + @Mock + private SchemaCleanUpService schemaCleanUpService; + + @InjectMocks + private SchemaCleanUpHandler schemaCleanUpHandler; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testCleanUpSchema() { + Module module = Module.builder().name("TestModule").build(); + when(modelRepository.getDeletingModulesOnStartup()).thenReturn(List.of(module)); + + schemaCleanUpHandler.cleanUpSchema(); + + verify(schemaCleanUpService).cleanUpModule("TestModule"); + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java b/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java index f9723b4..69749e7 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java @@ -40,9 +40,9 @@ public class CloudEventTestUtil { public static CloudEvent getCloudEvent(final String type, final String data) { return CloudEventBuilder.v1().withId("1.0").withSource(URI.create("http://localhost:8080/local-source")) .withDataContentType("application/yang-data+json").withDataSchema(URI.create( - "http://localhost:8080/schema/v1/hello-world")).withExtension("correlationid", - "test-correlation-id").withType("ran-logical-topology." + type).withData("application/json", - URI.create("http://localhost/schema"), data.getBytes()).build(); + "topology-inventory-ingestion:events:" + type + ":1.0.0")).withExtension("correlationid", + "test-correlation-id").withType("topology-inventory-ingestion." + type).withData( + "application/json", URI.create("http://localhost/schema"), data.getBytes()).build(); } public static CloudEvent getCloudEventFromJsonFile(final String path) { 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 new file mode 100644 index 0000000..2a0457c --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java @@ -0,0 +1,124 @@ +/* + * ============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 static org.oran.smo.teiv.utils.TiesConstants.CLASSIFIERS; +import static org.oran.smo.teiv.utils.TiesConstants.DECORATORS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; +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.YangException; +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.utils.yangparser.ExposureYangParser; + +@ExtendWith(MockitoExtension.class) +@TestInstance(Lifecycle.PER_CLASS) +class ExposureYangParserTest { + @InjectMocks + ExposureYangParser exposureYangParser; + + @BeforeAll + public void initSchema() throws SchemaLoaderException, YangException { + SchemaLoader mockSchemaLoader = new MockSchemaLoader(); + mockSchemaLoader.loadSchemaRegistry(); + ExposureYangParser.loadAndValidateModels(); + } + + @Test + void testValidateCorrectSchema() throws YangException { + MultipartFile correctFile = 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 model:classifiers;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") + .getBytes()); + Map expected = new HashMap<>(); + expected.put("moduleName", "module-rapp-module1"); + expected.put("revision", "2024-05-08"); + expected.put(CLASSIFIERS, List.of("geo-classifier", "urban", "rural")); + expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT")); + + Map actual = ExposureYangParser.validateSchemasYang(correctFile); + assertEquals(expected, actual); + } + + @Test + void testValidateSchemaWithEmptyClassifiers() throws YangException { + MultipartFile correctFile = 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" + "}") + .getBytes()); + Map expected = new HashMap<>(); + expected.put("moduleName", "module-rapp-module1"); + expected.put("revision", "2024-05-08"); + expected.put(CLASSIFIERS, Collections.emptyList()); + expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT")); + + Map actual = ExposureYangParser.validateSchemasYang(correctFile); + assertEquals(expected, actual); + } + + @Test + void testValidateSchemaWithEmptyDecorators() throws YangException { + MultipartFile correctFile = 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" + "\tidentity geo-classifier {\n" + "\t\tbase model:classifiers;\n" + "\t}\n" + " \n" + " identity urban {\n" + " base geo-classifier;\n" + " }\n" + "\t\n" + "\tidentity rural {\n" + " base geo-classifier;\n" + " }\n" + "\n" + "}") + .getBytes()); + Map expected = new HashMap<>(); + expected.put("moduleName", "module-rapp-module1"); + expected.put("revision", "2024-05-08"); + expected.put(CLASSIFIERS, List.of("geo-classifier", "urban", "rural")); + expected.put(DECORATORS, Collections.emptyMap()); + + Map actual = ExposureYangParser.validateSchemasYang(correctFile); + assertEquals(expected, actual); + } + + @Test + void testValidateSchemaWithWrongClassifiers() { + 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)); + } + + @Test + void testValidateSchemaWithWrongDecorators() { + 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)); + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java b/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java new file mode 100644 index 0000000..5b8e951 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java @@ -0,0 +1,220 @@ +/* + * ============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 static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import lombok.extern.slf4j.Slf4j; + +import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; +import org.oran.smo.yangtools.parser.data.instance.AbstractStructureInstance; +import org.oran.smo.yangtools.parser.data.instance.RootInstance; +import org.oran.smo.yangtools.parser.model.YangModel; +import org.oran.smo.teiv.CustomMetrics; +import org.oran.smo.teiv.exception.YangException; +import org.oran.smo.teiv.exception.YangSchemaException; +import org.oran.smo.teiv.exception.YangValidationException; +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.yangparser.IngestionYangParser; +import org.oran.smo.teiv.utils.yangparser.YangModelLoader; + +@Slf4j +@ExtendWith(MockitoExtension.class) +@TestInstance(Lifecycle.PER_CLASS) +class IngestionYangParserTest { + @Mock + private CustomMetrics customMetrics; + + @BeforeAll + public void initSchema() throws SchemaLoaderException, YangException { + SchemaLoader mockSchemaLoader = new MockSchemaLoader(); + mockSchemaLoader.loadSchemaRegistry(); + IngestionYangParser.loadModels(); + } + + @Test + void parseMultipleTypesOfEntities() throws YangException { + RootInstance rootInstance = parseAndValidateFromFile("src/test/resources/yang/parser/multiple-entity.json", + customMetrics); + assertEquals(3, rootInstance.getStructureChildren().size()); + + AbstractStructureInstance OCUCPFunction = rootInstance.getStructureChildren().get(0); + assertEquals("OCUCPFunction", OCUCPFunction.getName()); + assertEquals("ocucp_1", OCUCPFunction.getContentChildren().get(0).getValue()); + assertEquals(12L, OCUCPFunction.getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals("str", OCUCPFunction.getStructureChildren().get(0).getContentChildren().get(1).getValue()); + List sourceIdsYang = OCUCPFunction.getContentChildren().get(0).getParent().getDataDomNode() + .getChildren().stream().filter(child -> child.getName().equals("sourceIds")).toList(); + List sourceIds = sourceIdsYang.stream().map(YangDataDomNode::getStringValue).toList(); + assertEquals(List.of("fdn_ocucp_1", "cmHandle_ocucp_1"), sourceIds); + + AbstractStructureInstance ODUFunction = rootInstance.getStructureChildren().get(1); + assertEquals("odu_21", ODUFunction.getContentChildren().get(0).getValue()); + assertEquals(1L, ODUFunction.getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals(21L, ODUFunction.getStructureChildren().get(0).getContentChildren().get(1).getValue()); + assertEquals("021", ODUFunction.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren() + .get(0).getValue()); + assertEquals("210", ODUFunction.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren() + .get(1).getValue()); + sourceIdsYang = ODUFunction.getContentChildren().get(0).getParent().getDataDomNode().getChildren().stream().filter( + child -> child.getName().equals("sourceIds")).toList(); + sourceIds = sourceIdsYang.stream().map(YangDataDomNode::getStringValue).toList(); + assertEquals(List.of("fdn_odu_21", "cmHandle_odu_21"), sourceIds); + + ODUFunction = rootInstance.getStructureChildren().get(2); + assertEquals("odu_22", ODUFunction.getContentChildren().get(0).getValue()); + assertEquals(2L, ODUFunction.getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals(22L, ODUFunction.getStructureChildren().get(0).getContentChildren().get(1).getValue()); + assertEquals("022", ODUFunction.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren() + .get(0).getValue()); + assertEquals("220", ODUFunction.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren() + .get(1).getValue()); + sourceIdsYang = ODUFunction.getContentChildren().get(0).getParent().getDataDomNode().getChildren().stream().filter( + child -> child.getName().equals("sourceIds")).toList(); + sourceIds = sourceIdsYang.stream().map(YangDataDomNode::getStringValue).toList(); + assertEquals(List.of("fdn_odu_22", "cmHandle_odu_22"), sourceIds); + } + + @Test + void testGeolocationEntity() { + RootInstance rootInstance = assertDoesNotThrow(() -> parseAndValidateFromFile( + "src/test/resources/yang/parser/geolocation.json", customMetrics)); + assertEquals(2, rootInstance.getStructureChildren().size()); + + // GeoLocation with latitude and longitude + assertEquals("id1", rootInstance.getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals("6", rootInstance.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren().get( + 0).getValue()); + assertEquals(12.78232, rootInstance.getStructureChildren().get(0).getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals(56.7455, rootInstance.getStructureChildren().get(0).getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(1).getValue()); + + // GeoLocation with latitude, longitude and height + assertEquals("id2", rootInstance.getStructureChildren().get(1).getContentChildren().get(0).getValue()); + assertEquals("7", rootInstance.getStructureChildren().get(1).getStructureChildren().get(0).getContentChildren().get( + 0).getValue()); + assertEquals(22.78232, rootInstance.getStructureChildren().get(1).getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals(66.7455, rootInstance.getStructureChildren().get(1).getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(1).getValue()); + assertEquals(123.1234, rootInstance.getStructureChildren().get(1).getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(2).getValue()); + } + + @Test + void testWrongEntityAttributes() { + RootInstance rootInstance = assertDoesNotThrow(() -> parseAndValidateFromFile( + "src/test/resources/yang/parser/wrong-attributes.json", customMetrics)); + assertEquals("OCUCPName_1", rootInstance.getStructureChildren().get(0).getContentChildren().get(0).getValue()); + assertEquals(12L, rootInstance.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren().get( + 0).getValue()); + assertEquals("str", rootInstance.getStructureChildren().get(0).getStructureChildren().get(0).getContentChildren() + .get(1).getValue()); + assertThrows(IndexOutOfBoundsException.class, () -> rootInstance.getStructureChildren().get(0) + .getStructureChildren().get(0).getContentChildren().get(2).getValue()); + } + + @Test + void testSourceIdsWithoutList() throws YangException { + RootInstance rootInstance = parseAndValidateFromFile("src/test/resources/yang/parser/source-ids-without-list.json", + customMetrics); + assertEquals(1, rootInstance.getStructureChildren().size()); + + AbstractStructureInstance ODUFunction = rootInstance.getStructureChildren().get(0); + List sourceIdsYang = ODUFunction.getContentChildren().get(0).getParent().getDataDomNode() + .getChildren().stream().filter(child -> child.getName().equals("sourceIds")).toList(); + List sourceIds = sourceIdsYang.stream().map(YangDataDomNode::getStringValue).toList(); + assertEquals(List.of("fdn_odu_21"), sourceIds); + } + + @Test + void testParseAndValidateFromFileWithUnknownPath() { + assertThrows(YangException.class, () -> parseAndValidateFromFile("invalidPath.abc", customMetrics)); + } + + @Test + void testEmptyYangModelException() throws IOException, YangException { + assertThrows(YangSchemaException.class, () -> mockLoadModels(List.of(), List.of())); + IngestionYangParser.loadModels(); + } + + @Test + void testModulesAreNullException() throws IOException, YangException { + try (MockedStatic mockedSchema = Mockito.mockStatic(SchemaRegistry.class)) { + mockedSchema.when(SchemaRegistry::getModuleRegistry).thenReturn(null); + assertThrows(YangSchemaException.class, () -> IngestionYangParser.loadModels()); + } + IngestionYangParser.loadModels(); + } + + private void mockLoadModels(List importList, List implementList) throws YangException { + List models = YangModelLoader.createYangModels(importList, implementList); + try (MockedStatic mockedLoader = Mockito.mockStatic(YangModelLoader.class)) { + mockedLoader.when(YangModelLoader::loadModulesFromSchemaRegistry).thenReturn(models); + mockedLoader.when(() -> YangModelLoader.createParserExecutionContext(any(), any(), any())).thenCallRealMethod(); + mockedLoader.when(() -> YangModelLoader.parseModelsIntoContext(any(), any())).thenCallRealMethod(); + IngestionYangParser.loadModels(); + } + } + + private String loadYangModelFromTestFile(String resourcePath) throws IOException { + return new String(Files.readAllBytes(Paths.get(resourcePath)), StandardCharsets.UTF_8); + } + + private void assertFindingType(YangValidationException exception, String findingType) { + assertEquals(1, exception.errorMessages.size()); + assertFindingsContainType(exception, findingType); + } + + private void assertFindingsContainType(YangValidationException exception, String findingType) { + assertTrue(exception.errorMessages.stream().anyMatch(finding -> findingType.equals(finding.getFindingType()))); + } + + private static RootInstance parseAndValidateFromFile(final String path, CustomMetrics customMetrics) + throws YangException { + String data = YangModelLoader.executeIOOperation(() -> Files.readString(Paths.get(path), StandardCharsets.UTF_8)); + return IngestionYangParser.parseData(data, true, customMetrics); + } +} 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 new file mode 100644 index 0000000..25cab7e --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/JooqTypeConverterTest.java @@ -0,0 +1,106 @@ +/* + * ============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 static org.oran.smo.teiv.utils.JooqTypeConverter.toGeography; +import static org.oran.smo.teiv.utils.JooqTypeConverter.toJsonb; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.List; +import java.util.Map; + +import org.jooq.JSONB; +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.utils.schema.Geography; + +class JooqTypeConverterTest { + + @Test + void testToJsonb() { + assertEquals(JSONB.jsonb("{}"), toJsonb("{}")); + assertEquals(JSONB.jsonb("{\"key\":\"value\"}"), toJsonb("{\"key\":\"value\"}")); + assertEquals(JSONB.jsonb("[]"), toJsonb("[]")); + assertEquals(JSONB.jsonb("[1]"), toJsonb("[1]")); + assertEquals(JSONB.jsonb("[1,2,3]"), toJsonb("[1,2,3]")); + assertEquals(JSONB.jsonb("[\"value1\",\"value2\"]"), toJsonb("[\"value1\",\"value2\"]")); + assertEquals(JSONB.jsonb("[\"leading\",\"whitespaces\"]"), toJsonb(" [\"leading\",\"whitespaces\"]")); + assertEquals(JSONB.jsonb("[\"a_string\"]"), toJsonb("a_string")); + assertEquals(JSONB.jsonb("[\"23\"]"), toJsonb("23")); + assertEquals(JSONB.jsonb("[54]"), toJsonb(54L)); + assertEquals(JSONB.jsonb("[92.13]"), toJsonb(92.13)); + assertEquals(JSONB.jsonb("{\"key\":\"value\"}"), toJsonb("key", "value")); + assertEquals(JSONB.jsonb("{\"key\":\"value\"}"), toJsonb(Map.of("key", "value"))); + assertEquals(JSONB.jsonb("{\"key1\":\"value1\",\"key2\":\"value2\"}"), toJsonb(Map.of("key1", "value1", "key2", + "value2"))); + } + + @Test + void testToGeography() throws InvalidFieldInYangDataException { + assertEquals(new Geography(47.497913, 19.040236), toGeography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236}")); + + assertEquals(new Geography(47.497913, 19.040236, 100.1), toGeography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236, \"height\": 100.1}")); + + assertEquals(new Geography(47.497913, 19.040236, null), toGeography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236}")); + + assertThrows(InvalidFieldInYangDataException.class, () -> toGeography("{invalidjson")); + assertThrows(InvalidFieldInYangDataException.class, () -> toGeography(9)); + } + + @Test + void testJsonbToList() { + final String inputStr = "[\"one\",\"two\",\"three\"]"; + final JSONB input = JSONB.valueOf(inputStr); + final List outputList = JooqTypeConverter.jsonbToList(input); + + final String expectedStr = "[one, two, three]"; + Assertions.assertEquals(expectedStr, outputList.toString()); + } + + @Test + void testJsonbToMap() { + final String inputStr = "{\"key1\":\"value1\", \"key2\": \"value2\"}"; + final JSONB input = JSONB.valueOf(inputStr); + final Map outputMap = JooqTypeConverter.jsonbToMap(input); + + final String expectedStr = "{key1=value1, key2=value2}"; + Assertions.assertEquals(expectedStr, outputMap.toString()); + } + + @Test + void testThrowExceptionJsonbToList() { + final JSONB invalidJson = JSONB.valueOf("[\"one\", \"two]"); + Assertions.assertThrowsExactly(TiesException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); + } + + @Test + void testThrowExceptionJsonbToMap() { + final JSONB invalidJson = JSONB.valueOf("{\"key\": \"valu"); + Assertions.assertThrowsExactly(TiesException.class, () -> JooqTypeConverter.jsonbToList(invalidJson)); + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/KafkaTestExecutionListener.java b/teiv/src/test/java/org/oran/smo/teiv/utils/KafkaTestExecutionListener.java new file mode 100644 index 0000000..dbf6ec6 --- /dev/null +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/KafkaTestExecutionListener.java @@ -0,0 +1,36 @@ +/* + * ============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 org.springframework.kafka.test.EmbeddedKafkaBroker; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.TestExecutionListener; + +public class KafkaTestExecutionListener implements TestExecutionListener { + + @Override + public void afterTestMethod(TestContext testContext) throws Exception { + EmbeddedKafkaBroker broker = testContext.getApplicationContext().getBean(EmbeddedKafkaBroker.class); + if (broker != null) { + broker.destroy(); + } + } +} diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java b/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java index 7079bf5..ec8d61c 100644 --- a/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java +++ b/teiv/src/test/java/org/oran/smo/teiv/utils/TiesTestConstants.java @@ -23,5 +23,8 @@ package org.oran.smo.teiv.utils; public class TiesTestConstants { 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]}"; + public static final String SPRING_BOOT_SERVER_PORT = "kafka.server.bootstrap-server-port:#{environment.getProperty(\"spring.embedded.kafka.brokers\").split(\":\")[1]}"; + public static final String KAFKA_RETRY_INTERVAL_10_MS = "kafka.availability.retryIntervalMs:10"; } 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 ff29bc5..010527c 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 @@ -27,16 +27,45 @@ import java.io.IOException; import org.junit.jupiter.api.Test; -public class GeographyTest { +class GeographyTest { @Test - public void testCreateFromJson() throws IOException { + void test2DGeographyFromJson() throws IOException { assertEquals("POINT(47.497913 19.040236)", new Geography("{\"latitude\": 47.497913,\"longitude\": 19.040236}") .toString()); - assertThrows(IOException.class, () -> new Geography("{\"latitude\": 47.497913}")); + + assertEquals("POINT(47.497913 19.040236)", new Geography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236, \"height\": null}").toString()); + assertEquals("POINT(47.497913 19.040236)", new Geography( "{\"location\":{\"ellipsoid\":{\"latitude\": 47.497913,\"longitude\":19.040236}}}").toString()); + assertEquals("POINT(47.497913 19.040236)", new Geography( "{\"location\":{\"latitude\": 47.497913,\"longitude\":19.040236}}").toString()); } + + @Test + void test3DGeographyFromJson() throws IOException { + assertEquals("POINT Z (47.497913 19.040236 123.9878)", new Geography( + "{\"latitude\": 47.497913,\"longitude\": 19.040236, \"height\": 123.9878}").toString()); + + assertEquals("POINT Z (47.497913 19.040236 123.9878)", new Geography( + "{\"location\":{\"ellipsoid\":{\"latitude\": 47.497913,\"longitude\":19.040236 , \"height\": 123.9878}}}") + .toString()); + + assertEquals("POINT Z (47.497913 19.040236 123.9878)", new Geography( + "{\"location\":{\"latitude\": 47.497913,\"longitude\":19.040236, \"height\": 123.9878}}}").toString()); + } + + @Test + void testGeographyExpectionFromJson() { + assertThrows(IOException.class, () -> new Geography("{\"latitude\": 47.497913}")); + assertThrows(IOException.class, () -> new Geography("{\"latitude\": 47.497913, \"longitude\": null}")); + + assertThrows(IOException.class, () -> new Geography("{\"longitude\": 19.040236}")); + assertThrows(IOException.class, () -> new Geography("{\"latitude\": null, \"longitude\": 19.040236}")); + + assertThrows(IOException.class, () -> new Geography("{\"latitude\": 47.497913 \"height\": 19.040236}")); + assertThrows(IOException.class, () -> new Geography("{\"longitude\": 19.040236 \"height\": 19.040236}")); + } } diff --git a/teiv/src/test/resources/application.yaml b/teiv/src/test/resources/application.yaml index a1f8f94..79e8c7d 100644 --- a/teiv/src/test/resources/application.yaml +++ b/teiv/src/test/resources/application.yaml @@ -59,6 +59,7 @@ logging.level.state.change: "ERROR" spring.datasource.read.maximum-pool-size: 2 spring.datasource.write.maximum-pool-size: 2 spring.caching.consumer-data-ttl-ms: 60000 +spring.freemarker.check-template-location: false consumer-data.batch-size: 50 @@ -97,4 +98,13 @@ database: retry-policies: deadlock: retry-attempts: 3 - retry-backoff-ms: 200 \ No newline at end of file + retry-backoff-ms: 200 + +groups: + static: + provided-members-ids: + max-limit: 15 + insert-max-limit: 10 + +yang-data-validation: + ingestion-events: false \ No newline at end of file diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-json-numbers.json b/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-json-numbers.json new file mode 100644 index 0000000..ea38ed5 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-json-numbers.json @@ -0,0 +1,51 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "entityId_1", + "attributes": { + "nCI": 123, + "nRTAC": 32 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ], + "o-ran-smo-teiv-ran:Sector": [ + { + "id": "entityId_2", + "attributes": { + "sectorId": 10223372036854775807 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "entityId_3", + "attributes": { + "sectorId": "5", + "azimuth": -9223372036854.775808 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-string.json b/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-string.json new file mode 100644 index 0000000..2bde874 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-64bit-numbers-as-string.json @@ -0,0 +1,51 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "entityId_1", + "attributes": { + "nCI": "123", + "nRTAC": 32 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ], + "o-ran-smo-teiv-ran:Sector": [ + { + "id": "entityId_2", + "attributes": { + "sectorId": "10223372036854775807" + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "entityId_3", + "attributes": { + "sectorId": "5", + "azimuth": "-9223372036854.775808" + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-arrays.json b/teiv/src/test/resources/cloudeventdata/common/ce-arrays.json index de0237f..97861f3 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-arrays.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-arrays.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { @@ -18,7 +18,11 @@ "b", "c" ] - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "entityId_1", @@ -27,7 +31,11 @@ "a", "b" ] - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "entityId_2", @@ -35,7 +43,11 @@ "geranFqBands": [ "a" ] - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "entityId_3", @@ -44,7 +56,11 @@ "q" ], "nRFqBands": [] - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-complex-attributes.json b/teiv/src/test/resources/cloudeventdata/common/ce-complex-attributes.json new file mode 100644 index 0000000..6339f29 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-complex-attributes.json @@ -0,0 +1,60 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "entityId_1", + "attributes": { + "nCI": 123, + "nRTAC": 32, + "cellLocalId": 456, + "plmnId": { + "mcc": "209", + "mnc": "751" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "entityId_2", + "attributes": { + "nCI": 123, + "nRTAC": 32 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "entityId_3", + "attributes": { + "nCI": 123, + "nRTAC": 32, + "cellLocalId": 456, + "plmnId": { + "mcc": "209", + "mnc": "752" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-data-only.json b/teiv/src/test/resources/cloudeventdata/common/ce-data-only.json new file mode 100644 index 0000000..a7f6453 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-data-only.json @@ -0,0 +1,104 @@ +{ + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "entityId_1", + "attributes": { + "cellLocalId": 4589, + "nRPCI": 12, + "nRTAC": 310, + "primitiveArray": [ + 1, + 2, + 3 + ], + "singleList": [ + "12" + ], + "jsonObjectArray": [ + { + "test1": "128", + "test2": "49" + }, + { + "test1": "129", + "test2": "50" + } + ] + } + }, + { + "id": "entityId_3", + "attributes": { + "cellLocalId": 45891, + "nRPCI": 121, + "nRTAC": 3101, + "primitiveArray": [ + 1, + 2, + 3 + ], + "singleList": [ + "121" + ], + "jsonObjectArray": [ + { + "test1": "1281", + "test2": "491" + }, + { + "test1": "1291", + "test2": "501" + } + ] + } + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSectorCarrier": [ + { + "id": "entityId_2", + "attributes": { + "arfcnDL": 4590, + "testDouble": 32.5, + "testBoolean": true, + "cmId": { + "option1": "test_option1", + "option2": "test_option2" + } + } + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ + { + "id": "relationshipId", + "aSide": "entityId_1", + "bSide": "entityId_2" + }, + { + "id": "relationshipId2", + "aSide": "entityId_3", + "bSide": "entityId_4" + } + ], + "o-ran-smo-teiv-ran:ODUFunctionRealisedByCloudNativeApplication": [ + { + "id": "relationshipId3", + "aSide": "entityId_5", + "bSide": "entityId_6" + }, + { + "id": "relationshipId4", + "aSide": "entityId_5", + "bSide": "entityId_7" + } + ] + } + ] +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-delete-entity-id.json b/teiv/src/test/resources/cloudeventdata/common/ce-delete-entity-id.json new file mode 100644 index 0000000..2ab1686 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-delete-entity-id.json @@ -0,0 +1,23 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.delete", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07" + }, + { + "id": "entityId_3" + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-deprecated.json b/teiv/src/test/resources/cloudeventdata/common/ce-deprecated.json new file mode 100644 index 0000000..bee4054 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-deprecated.json @@ -0,0 +1,85 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "AntennaModule_1", + "attributes": { + "positionWithinSector": "center" + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "AntennaModule_2", + "attributes": { + "positionWithinSector": "center2" + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ], + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "AntennaCapability_1", + "attributes": { + "geranFqBands": [ + "1", + "2" + ] + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "AntennaCapability_2", + "attributes": { + "geranFqBands": [ + "2", + "3" + ] + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + "relationships": { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "relation_1", + "aSide": "AntennaModule_1", + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_2", + "aSide": "AntennaModule_2", + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-geo-location.json b/teiv/src/test/resources/cloudeventdata/common/ce-geo-location.json new file mode 100644 index 0000000..a9fc5b1 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-geo-location.json @@ -0,0 +1,46 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f1113", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-equipment:Site": [ + { + "id": "Site1", + "sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:1234" + ], + "attributes": { + "name": "geo-location1", + "geo-location": { + "latitude": 12.78232, + "longitude": 56.7455 + } + } + }, + { + "id": "Site2", + "sourceIds": [ + "urn:3gpp:dn:fdn2", + "urn:cmHandle:2234" + ], + "attributes": { + "name": "geo-location2", + "geo-location": { + "latitude": 12.78232, + "longitude": 56.7455, + "height": 123.1234 + } + } + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json b/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json index b5a6593..ef4d22e 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json @@ -2,19 +2,23 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran:GNBCUCPFunction": [ + "o-ran-smo-teiv-ran:OCUCPFunction": [ { "id": "id1", "attributes": { "gNBId": -1.0 - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json b/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json new file mode 100644 index 0000000..db70c93 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-null-attribute.json @@ -0,0 +1,31 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "ran-logical-topology.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "entityId_1", + "attributes": { + "gNBDUId": null, + "dUpLMNId": { + "hello": "209", + "bello": "751" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-one-entity.json b/teiv/src/test/resources/cloudeventdata/common/ce-one-entity.json index 68b6cb3..14b2887 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-one-entity.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-one-entity.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { @@ -16,7 +16,11 @@ "cellLocalId": 4589, "nRPCI": 12, "nRTAC": 310 - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module-type-pair.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module-type-pair.json index 86042ea..a09c80b 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module-type-pair.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module-type-pair.json @@ -2,24 +2,32 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRCELLDU_USES_NRSECTORCARRIER": [ + "o-ran-smo-teiv-rel-oam-ran:NRCELLDU_USES_NRSECTORCARRIER": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "NRCELLDU_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_2", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "NRCELLDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module.json index 7ff15ea..9a783ad 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-module.json @@ -2,24 +2,32 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-tedsaiv-resadl-oasdam-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_2", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-type.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-type.json index a23cf1c..7dcce3f 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-type.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-invalid-type.json @@ -2,24 +2,32 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORSES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORSES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_2", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-a-side.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-a-side.json index a51d004..51332f0 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-a-side.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-a-side.json @@ -2,23 +2,31 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_2", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-b-side.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-b-side.json index aa53179..05e1a7b 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-b-side.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-b-side.json @@ -2,23 +2,31 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_2", - "aSide": "NRSectorCarrier_1" + "aSide": "NRSectorCarrier_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-both-sides.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-both-sides.json index 5e5eae1..9f06ca1 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-both-sides.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-both-sides.json @@ -2,22 +2,30 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { - "id": "relation_3" + "id": "relation_3", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-id.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-id.json index ceba2c1..2105a5e 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-id.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-id.json @@ -2,23 +2,31 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-source-ids.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-source-ids.json new file mode 100644 index 0000000..3fd51b3 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-missing-source-ids.json @@ -0,0 +1,31 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "relationships": [ + { + "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ + { + "id": "relationshipId1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", + "bSide": "entityId_2" + }, + { + "id": "relationshipId2", + "aSide": "entityId_3", + "bSide": "entityId_4", + "sourceIds": [ + "source10", + "source20" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-relationship-with-one-source-id.json b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-with-one-source-id.json new file mode 100644 index 0000000..c496508 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-relationship-with-one-source-id.json @@ -0,0 +1,25 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "relationships": [ + { + "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ + { + "id": "relationshipId2", + "aSide": "entityId_3", + "bSide": "entityId_4", + "sourceIds": [ + "source10" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-data.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-data.json index 0894f92..a32d52e 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-with-data.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-data.json @@ -2,65 +2,36 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { "o-ran-smo-teiv-ran:NRCellDU": [ { - "id": "entityId_1", + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", "attributes": { "cellLocalId": 4589, "nRPCI": 12, - "nRTAC": 310, - "primitiveArray": [ - 1, - 2, - 3 - ], - "singleList": [ - "12" - ], - "jsonObjectArray": [ - { - "test1": "128", - "test2": "49" - }, - { - "test1": "129", - "test2": "50" - } - ] - } + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "entityId_3", "attributes": { "cellLocalId": 45891, "nRPCI": 121, - "nRTAC": 3101, - "primitiveArray": [ - 1, - 2, - 3 - ], - "singleList": [ - "121" - ], - "jsonObjectArray": [ - { - "test1": "1281", - "test2": "491" - }, - { - "test1": "1291", - "test2": "501" - } - ] - } + "nRTAC": 3101 + }, + "sourceIds": [ + "source3" + ] } ] }, @@ -69,14 +40,32 @@ { "id": "entityId_2", "attributes": { - "arfcnDL": 4590, - "testDouble": 32.5, - "testBoolean": true, - "cmId": { - "option1": "test_option1", - "option2": "test_option2" + "arfcnDL": 4590 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "entityId_4", + "attributes": { + "nCI": 123, + "nRTAC": 32, + "cellLocalId": 456, + "plmnId": { + "mnc": "751", + "mcc": "209" } - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } @@ -87,7 +76,11 @@ { "id": "relationshipId", "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", - "bSide": "entityId_2" + "bSide": "entityId_2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId2", @@ -105,14 +98,19 @@ { "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=89FE9A4ED8451D779865C389900E247B13E360B0A4175EBA80AA9B384BFA4C688F17865AFD934085B0235BCA66128F2E6D4CE6953EAAB2EDEBD94B3683C1A064", "aSide": "entityId_5", - "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07" + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004,ManagedElement=me04,ODUFunction=odu04,NRCellDU=NR-Cell-07", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId4", "aSide": "entityId_5", "bSide": "entityId_3", "sourceIds": [ - "source21" + "source21", + "source22" ] } ] diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-entity-id.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-entity-id.json new file mode 100644 index 0000000..867e18f --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-entity-id.json @@ -0,0 +1,100 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "invalid_entityId>_1", + "attributes": { + "cellLocalId": 4589, + "nRPCI": 12, + "nRTAC": 310, + "primitiveArray": [ + 1, + 2, + 3 + ], + "singleList": [ + "12" + ], + "jsonObjectArray": [ + { + "test1": "128", + "test2": "49" + }, + { + "test1": "129", + "test2": "50" + } + ] + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "entityId_2", + "attributes": { + "nCI": 123, + "nRTAC": 32 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "relationshipId_3", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_4", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_5", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_6", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids.json index 2d3a410..8b50c32 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { @@ -45,28 +45,44 @@ "attributes": { "nCI": 123, "nRTAC": 32 - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU": [ + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { "id": "invalid_relationshipId<3", "aSide": "entityId_5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_5", "aSide": "entityId?5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_6", "aSide": "entityId_5", - "bSide": "entityId[1]" + "bSide": "entityId[1]", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids2.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids2.json index 0b0a0b4..9420ca9 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids2.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids2.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { @@ -45,28 +45,44 @@ "attributes": { "nCI": 123, "nRTAC": 32 - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU": [ + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { "id": "relationshipId_3", "aSide": "entityId_5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_5", "aSide": "invalid_entityId?5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_6", "aSide": "entityId_5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids3.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids3.json index 13df9ff..dc92907 100644 --- a/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids3.json +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-invalid-relationship-ids3.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { @@ -45,28 +45,44 @@ "attributes": { "nCI": 123, "nRTAC": 32 - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU": [ + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { "id": "relationshipId_3", "aSide": "entityId_5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_5", "aSide": "entityId_5", - "bSide": "entityId_1" + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relationshipId_6", "aSide": "entityId_5", - "bSide": "invalid_entityId[1]" + "bSide": "invalid_entityId[1]", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/common/ce-with-no-source-ids.json b/teiv/src/test/resources/cloudeventdata/common/ce-with-no-source-ids.json new file mode 100644 index 0000000..fd584b0 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/common/ce-with-no-source-ids.json @@ -0,0 +1,96 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "invalid_entityId_1", + "attributes": { + "cellLocalId": 4589, + "nRPCI": 12, + "nRTAC": 310, + "primitiveArray": [ + 1, + 2, + 3 + ], + "singleList": [ + "12" + ], + "jsonObjectArray": [ + { + "test1": "128", + "test2": "49" + }, + { + "test1": "129", + "test2": "50" + } + ] + } + }, + { + "id": "entityId_2", + "attributes": { + "nCI": 123, + "nRTAC": 32 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "relationshipId_3", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_4", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_5", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relationshipId_6", + "aSide": "entityId_5", + "bSide": "entityId_1", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} 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 new file mode 100644 index 0000000..08ae504 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-attribute-null.json @@ -0,0 +1,26 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "ran-logical-topology.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:ORUFunction": [ + { + "id": "ORUF_1", + "attributes": { + "oruId": null + }, + "sourceIds": [ + "2" + ] + } + ] + } + ] + } +} 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 new file mode 100644 index 0000000..9f4c8dd --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location-null.json @@ -0,0 +1,28 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f1113", + "source": "dmi-plugin:nm-1", + "type": "ran-logical-topology.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "data": { + "entities": [ + { + "o-ran-smo-teiv-equipment:Site": [ + { + "id": "Site1", + "sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:1234" + ], + "attributes": { + "name": "geo-location1", + "geo-location": null + } + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location.json index a8eaaae..a9fc5b1 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-geo-location.json @@ -2,16 +2,16 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f1113", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:CloudSite": [ + "o-ran-smo-teiv-equipment:Site": [ { - "id": "CloudSite1", + "id": "Site1", "sourceIds": [ "urn:3gpp:dn:fdn1", "urn:cmHandle:1234" @@ -19,10 +19,23 @@ "attributes": { "name": "geo-location1", "geo-location": { - "location": { - "latitude": 12.78232, - "longitude": 56.7455 - } + "latitude": 12.78232, + "longitude": 56.7455 + } + } + }, + { + "id": "Site2", + "sourceIds": [ + "urn:3gpp:dn:fdn2", + "urn:cmHandle:2234" + ], + "attributes": { + "name": "geo-location2", + "geo-location": { + "latitude": 12.78232, + "longitude": 56.7455, + "height": 123.1234 } } } 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 new file mode 100644 index 0000000..b1e407c --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json @@ -0,0 +1,183 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "AntennaModule_3", + "attributes": { + "positionWithinSector": "center3" + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "AntennaCapability_3", + "attributes": { + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "ODU_2", + "attributes": { + "dUpLMNId": { + "mcc": "111", + "mnc": "211" + }, + "gNBDUId": 13, + "gNBId": 12345, + "gNBIdLength": 5 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "NRCellDU_4", + "attributes": { + "cellLocalId": 470 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + { + "id": "ManagedElement_61", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ + { + "id": "NRCellDU_41", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ + { + "id": "relation_one_to_one_missing_bSide", + "aSide": "ManagedElement_61", + "bSide": "NRCellDU_51", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_one_to_one_missing_aSide", + "aSide": "ManagedElement_81", + "bSide": "NRCellDU_41", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "relation_one_to_many_bSide_missing", + "aSide": "ODU_2", + "bSide": "NRCellDU_5", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_one_to_many_aSide_missing", + "aSide": "ODU_3", + "bSide": "NRCellDU_4", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "relation_many_to_many_aSide_missing", + "aSide": "AntennaModule_123", + "bSide": "AntennaCapability_3", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_many_to_many_bSide_missing", + "aSide": "AntennaModule_3", + "bSide": "AntennaCapability_123", + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_many_to_many_both_sides_missing", + "aSide": "AntennaModule_11", + "bSide": "AntennaCapability_22", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json index 64e35a4..8610767 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json @@ -1,134 +1,88 @@ { "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", - "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "source": "test-ran-topology-adapter", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:CloudNativeApplication": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { - "id": "CloudNativeApplication_1", + "id": "AntennaModule_1", "attributes": { - "name": "Test_CloudNativeApplication_1" - } + "positionWithinSector": "center" + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "CloudNativeApplication_2", + "id": "AntennaModule_2", "attributes": { - "name": "Test_CloudNativeApplication_2" - } - }, - { - "id": "CloudNativeApplication_3", - "attributes": { - "name": "Test_CloudNativeApplication_3" - } + "positionWithinSector": "center2" + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-logical:GNBDUFunction": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { - "id": "GNBDU_1", + "id": "AntennaCapability_1", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" - }, - "gNBDUId": 111, - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:GNBCUUPFunction": [ - { - "id": "GNBCUUP_1", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUUPFunction=1", - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUUPFunction]/o-ran-smo-GNBCUUP:GNBCUUPFunction[@id=1]" - } - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:GNBCUCPFunction": [ + }, + "sourceIds": [ + "source1", + "source2" + ] + }, { - "id": "GNBCUCP_1", + "id": "AntennaCapability_2", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUCPFunction=1", - "gNBCUName": "Test_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUCPFunction]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ { "id": "relation_1", - "aSide": "GNBDU_1", - "bSide": "CloudNativeApplication_1" + "aSide": "AntennaModule_1", + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] }, - { - "id": "relation_4", - "aSide": "GNBDU_1", - "bSide": "CloudNativeApplication_2" - } - ] - }, - { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ { "id": "relation_2", - "aSide": "GNBCUUP_1", - "bSide": "CloudNativeApplication_2" - }, - { - "id": "relation_5", - "aSide": "GNBCUUP_1", - "bSide": "CloudNativeApplication_3" - } - ] - }, - { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ - { - "id": "relation_3", - "aSide": "GNBCUCP_1", - "bSide": "CloudNativeApplication_3" - }, - { - "id": "relation_6", - "aSide": "GNBCUCP_1", - "bSide": "CloudNativeApplication_1" + "aSide": "AntennaModule_2", + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-one.json index 65fe5ed..24f64e1 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-one.json @@ -2,72 +2,50 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:NodeCluster": [ - { - "id": "NodeCluster_1", - "attributes": { - - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:AntennaCapability": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { "id": "AntennaCapability_1", - "attributes": { - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873820", - "resourceIdentifier": "/o-ran-smo-ComTop:NodeCluster[@id=2]" - } - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:NRSectorCarrier": [ - { - "id": "NRSectorCarrier_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } - ] - }, - { - "o-ran-smo-teiv-ran-cloud:CloudSite": [ + ], + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { - "id": "CloudSite_1", + "id": "NRSectorCarrier_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-cloud:NODECLUSTER_LOCATED_AT_CLOUDSITE": [ - { - "id": "relation_1", - "aSide": "NodeCluster_1", - "bSide": "CloudSite_1" - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { - "id": "relation_10", + "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json index ed4c895..b954484 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1", "attributes": { @@ -23,9 +23,9 @@ ] }, { - "o-ran-smo-teiv-ran-logical:ENodeBFunction": [ + "o-ran-smo-teiv-ran:ORUFunction": [ { - "id": "ENodeBFunction_1", + "id": "ORUFunction_1", "attributes": { }, @@ -39,11 +39,11 @@ ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_ENODEBFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ORUFUNCTION": [ { "id": "relation_1", "aSide": "ManagedElement_1", - "bSide": "ENodeBFunction_1", + "bSide": "ORUFunction_1", "sourceIds": [ "fdn_1", "cmHandleId_1" diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json new file mode 100644 index 0000000..1869e10 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json @@ -0,0 +1,87 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f1113", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "ManagedElement_1", + "attributes": { + + }, + "sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:12345" + ] + }, + { + "id": "ManagedElement_2", + "attributes": { + + }, + "sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:12345" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:ORUFunction": [ + { + "id": "ORUFunction_1", + "attributes": { + + }, + "sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:12345" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "ODU_1", + "attributes": { + "dUpLMNId": { + "mcc": 110, + "mnc": 210 + }, + "gNBDUId": 111, + "gNBId": 123, + "gNBIdLength": 32 + }, + "sourceIds": [ + "urn:3gpp:dn:/SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR01gNodeBRadio00001/ManagedElement=NR01gNodeBRadio00001/ODUFunction=1", + "urn:cmHandle:/395221E080CCF0FD1924103B15873814" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ORUFUNCTION": [ + { + "id": "relation_1", + "aSide": "ManagedElement_1", + "bSide": "ORUFunction_1", + "sourceIds": [ + "fdn_1", + "cmHandleId_1", + "fdn_2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json index defebbb..8854622 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json @@ -2,57 +2,81 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_2", + "id": "ManagedElement_21", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "ManagedElement_3", + "id": "ManagedElement_41", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeSystem_2", + "id": "NRCellDU_21", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "CloudNativeSystem_3", + "id": "NRCellDU_31", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "relation_11", - "aSide": "ManagedElement_2", - "bSide": "CloudNativeSystem_2" + "aSide": "ManagedElement_21", + "bSide": "NRCellDU_21", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relation_12", - "aSide": "ManagedElement_3", - "bSide": "CloudNativeSystem_3" + "aSide": "ManagedElement_41", + "bSide": "NRCellDU_31", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json index 32d571f..1f61d05 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json @@ -2,82 +2,105 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0100", "source": "dmi-plugin:nm-1", - "type": "ran-equipment-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-equipment:AntennaModule": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { "id": "AntennaModule_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ + "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ { "id": "AntennaModule_3", "attributes": { - "fdn": "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=21" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_4", "attributes": { - "fdn": "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=22" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "AntennaModule_5", + "id": "AntennaModule_51", "attributes": { - "fdn": "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=31" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "AntennaModule_6", + "id": "AntennaModule_61", "attributes": { - "fdn": "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=32" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULE_REALISED_BY_ANTENNAMODULE": [ - { - "id": "many_to_many_relation_1", - "aSide": "AntennaModule_1", - "bSide": "AntennaModule_2" - } - ] - }, - { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_many_relation_1", "aSide": "AntennaModule_3", - "bSide": "AntennaModule_4" + "bSide": "AntennaModule_4", + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_one_relation_1", - "aSide": "AntennaModule_5", - "bSide": "AntennaModule_6" + "aSide": "AntennaModule_51", + "bSide": "AntennaModule_61", + "sourceIds": [ + "source1", + "source2" + ] } ] } 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 09f4494..bcdffb3 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 @@ -1,7 +1,7 @@ { "specversion": "1.0", - "id": "26504e8e-838e-11ee-b962-0242ac120002", - "source": "dmi-plugin:nm-3", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", "type": "ran-logical-topology.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", @@ -9,81 +9,54 @@ "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:CloudNativeApplication": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { - "id": "CNA_SED_1", + "id": "AntennaModule_3", "attributes": { - "name": "CNA_1" - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:GNBDUFunction": [ - { - "id": "GNBDU_SED_1", + "positionWithinSector": "center" + }, "sourceIds": [ - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBDUFunction=1", - "urn:cmHandle:395221E080CCF0FD1929103B15999999" - ], + "source1", + "source2" + ] + }, + { + "id": "AntennaModule_4", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBDUFunction=1", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" - }, - "gNBDUId": 111, - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1929103B15999999", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00009]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } + "positionWithinSector": "center2" + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-logical:GNBCUCPFunction": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { - "id": "GNBCUCP_SED_1", + "id": "AntennaCapability_3", "sourceIds": [ - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBCUCPFunction=1", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBCUCPFunction=1", - "gNBCUName": "Test_sed_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1929103B15999999", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00009]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } } }, { - "id": "GNBCUCP_SED_2", + "id": "AntennaCapability_4", "sourceIds": [ - "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBCUCPFunction=2", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", "urn:cmHandle:395221E080CCF0FD1929103B15999999" ], "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBCUCPFunction=2", - "gNBCUName": "Test_sed_gNBCU2", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1929103B15999999", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00009]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=2]" + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } } } @@ -92,20 +65,24 @@ ], "relationships": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ { - "id": "relation_sed_1", - "aSide": "GNBDU_SED_1", - "bSide": "CNA_SED_1" - } - ] - }, - { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ + "id": "relation_3", + "aSide": "AntennaModule_3", + "bSide": "AntennaCapability_3", + "sourceIds": [ + "source1", + "source2" + ] + }, { - "id": "relation_sed_2", - "aSide": "GNBCUCP_SED_1", - "bSide": "CNA_SED_1" + "id": "relation_4", + "aSide": "AntennaModule_4", + "bSide": "AntennaCapability_4", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-managed-element.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-managed-element.json index 8d460bb..b6a527a 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-managed-element.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-managed-element.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-many.json index de99897..fa46cfb 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-many.json @@ -2,30 +2,30 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:CloudNativeApplication": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { - "id": "CloudNativeApplication_3" + "id": "AntennaModule_1" } ] }, { - "o-ran-smo-teiv-ran-logical:GNBCUCPFunction": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { - "id": "GNBCUCP_1" + "id": "AntennaCapability_1" } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION": [ + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ { "id": "relation_1" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-one.json index ba43673..617ec0d 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-many-to-one.json @@ -2,32 +2,30 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:NodeCluster": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { - "id": "NodeCluster_1" + "id": "AntennaCapability_1" } - ] - }, - { - "o-ran-smo-teiv-ran-cloud:CloudSite": [ + ], + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { - "id": "CloudSite_1" + "id": "NRSectorCarrier_1" } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-cloud:NODECLUSTER_LOCATED_AT_CLOUDSITE": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { - "id": "relation_1" + "id": "Relation_ManyToOne_1" } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-many.json index 3a0f983..7abce9a 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-many.json @@ -2,30 +2,30 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1" } ] }, { - "o-ran-smo-teiv-ran-logical:ENodeBFunction": [ + "o-ran-smo-teiv-ran:ORUFunction": [ { - "id": "ENodeBFunction_1" + "id": "ORUFunction_1" } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_ENODEBFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ORUFUNCTION": [ { "id": "relation_1" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json index 54ac71d..dc1b118 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json @@ -2,23 +2,23 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_2" + "id": "ManagedElement_21" } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "relation_12" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json index 9d481a4..74985ee 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0103", "source": "dmi-plugin:nm-1", - "type": "ran-equipment-topology.delete", + "type": "topology-inventory-ingestion.delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:delete:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-equipment:AntennaModule": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { "id": "AntennaModule_1" }, @@ -21,14 +21,14 @@ ], "relationships": [ { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_many_relation_1" } ] }, { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "one_to_one_relation_1" } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json index 0447e9d..c454317 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json @@ -2,360 +2,323 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0002", "source": "dmi-plugin:nm-1", - "type": "ties.merge", + "type": "topology-inventory-ingestion.merge", "time": "2023-10-25T13:30:12Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology-yang", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ - { - "id": "Namespace_1", - "attributes": { - "name": "Namespace_1" - } - }, - { - "id": "Namespace_2", - "attributes": { - "name": "Namespace_2" - } - } - ] - }, - { - "o-ran-smo-teiv-ran-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { "id": "ManagedElement_1", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001", - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]" - } - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "ManagedElement_2", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00002,ManagedElement=NR01gNodeBRadio00002", - "cmId": { - "cmHandle": "F0FD1924103B15873814395221E080CC", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00002]" - } - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "ManagedElement_3", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00003,ManagedElement=NR01gNodeBRadio00003", - "cmId": { - "cmHandle": "B15873F0FD192410381439E080CC5221", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00003]" - } - } - } - ] - }, - { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm": [ - { - "id": "CloudNativeSystem_1", - "attributes": { - "name": "Test_CloudNativeSystem_1" - } - }, - { - "id": "CloudNativeSystem_2", - "attributes": { - "name": "Test_CloudNativeSystem_2" - } - }, - { - "id": "CloudNativeSystem_3", - "attributes": { - "name": "Test_CloudNativeSystem_3" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-cloud:CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [ - { - "id": "CloudNativeApplication_1", - "attributes": { - "name": "Test_CloudNativeApplication_1" - } - }, + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeApplication_2", + "id": "NRCellDU_1", "attributes": { - "name": "Test_CloudNativeApplication_2" - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "CloudNativeApplication_3", + "id": "NRCellDU_2", "attributes": { - "name": "Test_CloudNativeApplication_3" - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-logical:GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [ + "o-ran-smo-teiv-ran:ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [ { - "id": "GNBDUFunction_1", + "id": "ODUFunction_1", "attributes": { - "fdnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1", "dUpLMNId": { "mcc": "110", "mnc": "210" }, "gNBDUId": 12, "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } + "gNBIdLength": 4 + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "GNBDUFunction_2", + "id": "ODUFunction_2", "attributes": { - "fdnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=2", "dUpLMNId": { "mcc": "110", "mnc": "210" }, "gNBDUId": 12, "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=2]" - } - } - } - ] - }, - { - "o-ran-smo-teiv-ran-logical:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ - { - "id": "NRCellDU_1", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1,NRCellDU=1", - "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, - "nCI": 1, - "nRPCI": 12, - "nRTAC": 310, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]/o-ran-smo-NRCellDU:NRCellDU[@id=1]" - } - } - }, - { - "id": "NRCellDU_2", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1,NRCellDU=2", - "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 45891, - "nCI": 2, - "nRPCI": 121, - "nRTAC": 3101, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]/o-ran-smo-NRCellDU:NRCellDU[@id=2]" - } - } - }, - { - "id": "NRCellDU_3", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1,NRCellDU=3", - "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 469, - "nCI": 3, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]/o-ran-smo-NRCellDU:NRCellDU[@id=3]" - } - } - }, - { - "id": "NRCellDU_4", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=2,NRCellDU=4", - "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 469, - "nCI": 4, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=2]/o-ran-smo-NRCellDU:NRCellDU[@id=4]" - } - } + "gNBIdLength": 4 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ + "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [ { "id": "AntennaModule_1", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=11" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_2", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=12" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_3", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=21" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_4", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=22" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_5", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=31" - } + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "AntennaModule_6", "attributes": { - "fdn": "SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=32" - } - } - ] - } - ], - "relationships": [ - { - "o-ran-smo-teiv-ran-cloud:CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE": [ - { - "id": "CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE_relation_1", - "aSide": "CloudNativeApplication_1", - "bSide": "Namespace_1" + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE_relation_2", - "aSide": "CloudNativeApplication_2", - "bSide": "Namespace_1" - }, - { - "id": "CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE_relation_3", - "aSide": "CloudNativeApplication_3", - "bSide": "Namespace_2" + "id": "AntennaModule_7", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM": [ - { - "id": "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_relation_1", - "aSide": "ManagedElement_1", - "bSide": "CloudNativeSystem_1" - }, + "o-ran-smo-teiv-ran:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy": [ { - "id": "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_relation_2", - "aSide": "ManagedElement_2", - "bSide": "CloudNativeSystem_2" + "id": "AntennaCapability_id1", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] }, { - "id": "MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM_relation_3", - "aSide": "ManagedElement_3", - "bSide": "CloudNativeSystem_3" + "id": "AntennaCapability_id2", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN": [ + "o-ran-smo-teiv-ran:LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr": [ { - "id": "MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION_relation_1", - "aSide": "ManagedElement_1", - "bSide": "CloudNativeApplication_1" + "id": "LTESectorCarrier_id1", + "attributes": { + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] - }, + } + ], + "relationships": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN": [ { - "id": "GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_relation_1", - "aSide": "GNBDUFunction_1", - "bSide": "CloudNativeApplication_1" - }, - { - "id": "GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_relation_2", - "aSide": "GNBDUFunction_1", - "bSide": "CloudNativeApplication_2" + "id": "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", + "aSide": "ManagedElement_1", + "bSide": "ODUFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN": [ - { - "id": "MANAGEDELEMENT_MANAGES_GNBDUFUNCTION_relation_1", - "aSide": "ManagedElement_1", - "bSide": "GNBDUFunction_1" + "o-ran-smo-teiv-ran:ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [ + { + "id": "ODUFUNCTION_PROVIDES_NRCELLDU_relation_1", + "aSide": "ODUFunction_2", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-logical:GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [ - { - "id": "GNBDUFUNCTION_PROVIDES_NRCELLDU_relation_1", - "aSide": "GNBDUFunction_1", - "bSide": "NRCellDU_1" - }, - { - "id": "GNBDUFUNCTION_PROVIDES_NRCELLDU_relation_2", - "aSide": "GNBDUFunction_1", - "bSide": "NRCellDU_2" - }, + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { - "id": "GNBDUFUNCTION_PROVIDES_NRCELLDU_relation_3", - "aSide": "GNBDUFunction_1", - "bSide": "NRCellDU_3" - }, - { - "id": "GNBDUFUNCTION_PROVIDES_NRCELLDU_relation_4", - "aSide": "GNBDUFunction_2", - "bSide": "NRCellDU_4" + "id": "ManagedElement_USES_NRCELLDU_relation_1", + "aSide": "ManagedElement_3", + "bSide": "NRCellDU_2", + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "aSide": "AntennaModule_1", - "bSide": "AntennaModule_2" + "bSide": "AntennaModule_2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_2", "aSide": "AntennaModule_3", - "bSide": "AntennaModule_4" + "bSide": "AntennaModule_4", + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [ { "id": "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "aSide": "AntennaModule_5", - "bSide": "AntennaModule_6" + "bSide": "AntennaModule_6", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY": [ + { + "id": "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", + "aSide": "AntennaModule_7", + "bSide": "AntennaCapability_id1", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY": [ + { + "id": "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1", + "aSide": "LTESectorCarrier_id1", + "bSide": "AntennaCapability_id2", + "sourceIds": [ + "source1", + "source2" + ] } ] } 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 new file mode 100644 index 0000000..87e8e9e --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json @@ -0,0 +1,91 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.merge", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "AntennaModule_1", + "attributes": { + "positionWithinSector": "left" + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "AntennaModule_2", + "attributes": { + "positionWithinSector": "left2" + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "AntennaCapability_1", + "attributes": { + "geranFqBands": { + "attribute_1": "2", + "attribute_2": "3" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "AntennaCapability_2", + "attributes": { + "geranFqBands": { + "attribute_1": "23", + "attribute_2": "23" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "relation_1", + "aSide": "AntennaModule_1", + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source12", + "source22" + ] + }, + { + "id": "relation_2", + "aSide": "AntennaModule_2", + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source12", + "source22" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many-deprecated-structure.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many-deprecated-structure.json deleted file mode 100644 index b4d75c5..0000000 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many-deprecated-structure.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "specversion": "1.0", - "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0002", - "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.merge", - "time": "2023-10-25T13:30:12Z", - "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", - "data": { - "entities": { - "o-ran-smo-teiv-ran:GNBDUFunction": [ - { - "id": "GNBDU_1", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction[@id=1]", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" - }, - "gNBDUId": 12, - "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } - } - ], - "o-ran-smo-teiv-ran:NRCellDU": [ - { - "id": "NRCellDU_1", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=1", - "cellLocalId": 4589, - "nCI": 1, - "nRPCI": 12, - "nRTAC": 310, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_1]/o-ran-smo-NRCellDU:NRCellDU[@id=1]" - } - } - }, - { - "id": "NRCellDU_2", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=2", - "cellLocalId": 45891, - "nCI": 2, - "nRPCI": 121, - "nRTAC": 3101, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_2]/o-ran-smo-NRCellDU:NRCellDU[@id=2]" - } - } - }, - { - "id": "NRCellDU_3", - "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=3", - "cellLocalId": 469, - "nCI": 3, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_3]/o-ran-smo-NRCellDU:NRCellDU[@id=3]" - } - } - } - ] - }, - "relationships": { - "o-ran-smo-teiv-ran:GNBDUFUNCTION_PROVIDES_NRCELLDU": [ - { - "id": "relation_7", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_1" - }, - { - "id": "relation_8", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_2" - }, - { - "id": "relation_9", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_3" - } - ] - } - } -} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json index 0ca2788..71dbe0c 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json @@ -2,97 +2,97 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0002", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.merge", + "type": "topology-inventory-ingestion.merge", "time": "2023-10-25T13:30:12Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:GNBDUFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "GNBDU_1", + "id": "ODU_1", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction[@id=1]", "dUpLMNId": { "mcc": "110", "mnc": "210" }, "gNBDUId": 12, "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } + "gNBIdLength": 4 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-logical:NRCellDU": [ + "o-ran-smo-teiv-ran:NRCellDU": [ { "id": "NRCellDU_1", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=1", "cellLocalId": 4589, - "nCI": 1, - "nRPCI": 12, - "nRTAC": 310, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_1]/o-ran-smo-NRCellDU:NRCellDU[@id=1]" - } - } + "nCI": 2 + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "NRCellDU_2", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=2", - "cellLocalId": 45891, - "nCI": 2, - "nRPCI": 121, - "nRTAC": 3101, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_2]/o-ran-smo-NRCellDU:NRCellDU[@id=2]" - } - } + "cellLocalId": 45891 + }, + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "NRCellDU_3", "attributes": { - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=3", - "cellLocalId": 469, - "nCI": 3, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_3]/o-ran-smo-NRCellDU:NRCellDU[@id=3]" - } - } + "cellLocalId": 469 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:GNBDUFUNCTION_PROVIDES_NRCELLDU": [ + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ { "id": "relation_7", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_1" + "aSide": "ODU_1", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relation_8", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_2" + "aSide": "ODU_1", + "bSide": "NRCellDU_2", + "sourceIds": [ + "source1", + "source2" + ] }, { "id": "relation_9", - "aSide": "GNBDU_1", - "bSide": "NRCellDU_3" + "aSide": "ODU_1", + "bSide": "NRCellDU_3", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json index df8a16c..54608bf 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f1113", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.merge", + "type": "topology-inventory-ingestion.merge", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElement": [ { "id": "ManagedElement_1", "attributes": { @@ -33,9 +33,9 @@ ] }, { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:ORUFunction": [ { - "id": "CloudNativeSystem_1", + "id": "ORUFunction_1", "attributes": { }, @@ -47,9 +47,9 @@ ] }, { - "o-ran-smo-teiv-ran-logical:GNBDUFunction": [ + "o-ran-smo-teiv-ran:ODUFunction": [ { - "id": "GNBDU_1", + "id": "ODU_1", "attributes": { "dUpLMNId": { "mcc": 110, @@ -60,7 +60,7 @@ "gNBIdLength": 3 }, "sourceIds": [ - "urn:3gpp:dn:/SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR01gNodeBRadio00001/ManagedElement=NR01gNodeBRadio00001/GNBDUFunction=1", + "urn:3gpp:dn:/SubNetwork=Europe/SubNetwork=Ireland/MeContext=NR01gNodeBRadio00001/ManagedElement=NR01gNodeBRadio00001/ODUFunction=1", "urn:cmHandle:/395221E080CCF0FD1924103B15873814" ] } @@ -69,11 +69,11 @@ ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ORUFUNCTION": [ { "id": "relation_1", "aSide": "ManagedElement_1", - "bSide": "CloudNativeSystem_1", + "bSide": "ORUFunction_1", "sourceIds": [ "fdn_1", "cmHandleId_1" diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-reliability.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-reliability.json new file mode 100644 index 0000000..d97523c --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-reliability.json @@ -0,0 +1,118 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.merge", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:merge:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "myReliabilityCell_1", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_2", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_3", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_4", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_5", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_6", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_7", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_8", + "attributes": { + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "myReliabilityCell_9", + "attributes": { + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle.json index 6f5ce38..86cde29 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "063b0da2-8396-11ee-b962-0242ac120002", "source": "dmi-plugin:nm-3", - "type": "ran-logical-topology.source-entity-delete", + "type": "topology-inventory-ingestion.source-entity-delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/source-entity-delete", + "dataschema": "topology-inventory-ingestion:events:source-entity-delete:1.0.0", "data": { "type": "cmHandle", "value": "395221E080CCF0FD1929103B15999999" diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle2.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle2.json index 81dd6e0..846be8e 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle2.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-source-entity-delete-cm-handle2.json @@ -2,10 +2,10 @@ "specversion": "1.0", "id": "063b0da2-8396-11ee-b962-0242ac120002", "source": "dmi-plugin:nm-3", - "type": "ran-logical-topology.source-entity-delete", + "type": "topology-inventory-ingestion.source-entity-delete", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/source-entity-delete", + "dataschema": "topology-inventory-ingestion:events:source-entity-delete:1.0.0", "data": { "type": "cmHandle", "value": "395221E080CCF0FD1924103B15873820" diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/ce-unknown-type.json b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-unknown-type.json new file mode 100644 index 0000000..64d662f --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/ce-unknown-type.json @@ -0,0 +1,25 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.type", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:type:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "entityId_1", + "attributes": { + "cellLocalId": 4589, + "nRPCI": 12, + "nRTAC": 310 + } + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-geo-location.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-geo-location.json new file mode 100644 index 0000000..c11b149 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-geo-location.json @@ -0,0 +1,22 @@ +{ + "o-ran-smo-teiv-equipment_Site": [ + { + "id": "Site1", + "name": "geo-location1", + "ST_AsText(\"geo-location\")": "POINT(12.78232 56.7455)", + "CD_sourceIds": [ + "urn:3gpp:dn:fdn1", + "urn:cmHandle:1234" + ] + }, + { + "id": "Site2", + "name": "geo-location2", + "ST_AsText(\"geo-location\")": "POINT Z (12.78232 56.7455 123.1234)", + "CD_sourceIds": [ + "urn:3gpp:dn:fdn2", + "urn:cmHandle:2234" + ] + } + ] +} 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 new file mode 100644 index 0000000..6d65d4c --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json @@ -0,0 +1,146 @@ +{ + "84E676149362F50C55FE1E004B98D4891916BBF3": [ + { + "id": "NRCellDU_41" + }, + { + "id": "NRCellDU_51", + "CD_sourceIds": [ + "relation_one_to_one_missing_bSide" + ] + } + ], + "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + { + "id": "ManagedElement_61", + "REL_FK_used-nrCellDu": "NRCellDU_51", + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_one_to_one_missing_bSide", + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4": [ + "source1", + "source2" + ] + }, + { + "id": "ManagedElement_81", + "REL_FK_used-nrCellDu": "NRCellDU_41", + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_one_to_one_missing_aSide", + "CD_sourceIds": [ + "relation_one_to_one_missing_aSide" + ], + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4": [ + "source1", + "source2" + ] + } + ], + "o-ran-smo-teiv-ran_NRCellDU": [ + { + "id": "NRCellDU_4", + "cellLocalId": 470, + "REL_FK_provided-by-oduFunction": "ODU_3", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_one_to_many_aSide_missing", + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [ + "source1", + "source2" + ] + }, + { + "id": "NRCellDU_5", + "REL_FK_provided-by-oduFunction": "ODU_2", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_one_to_many_bSide_missing", + "CD_sourceIds": [ + "relation_one_to_many_bSide_missing" + ], + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [ + "source1", + "source2" + ] + } + ], + "o-ran-smo-teiv-ran_ODUFunction": [ + { + "id": "ODU_2", + "dUpLMNId": { + "mcc": "111", + "mnc": "211" + }, + "gNBDUId": 13, + "gNBId": 12345, + "gNBIdLength": 5 + }, + { + "id": "ODU_3", + "CD_sourceIds": [ + "relation_one_to_many_aSide_missing" + ] + } + ], + "o-ran-smo-teiv-equipment_AntennaModule": [ + { + "id": "AntennaModule_3", + "positionWithinSector": "center3" + }, + { + "id": "AntennaModule_123", + "CD_sourceIds": [ + "relation_many_to_many_aSide_missing" + ] + }, + { + "id": "AntennaModule_11", + "CD_sourceIds": [ + "relation_many_to_many_both_sides_missing" + ] + } + ], + "o-ran-smo-teiv-ran_AntennaCapability": [ + { + "id": "AntennaCapability_3", + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" + } + }, + { + "id": "AntennaCapability_123", + "CD_sourceIds": [ + "relation_many_to_many_bSide_missing" + ] + }, + { + "id": "AntennaCapability_22", + "CD_sourceIds": [ + "relation_many_to_many_both_sides_missing" + ] + } + ], + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ + { + "id": "relation_many_to_many_aSide_missing", + "aSide_AntennaModule": "AntennaModule_123", + "bSide_AntennaCapability": "AntennaCapability_3", + "CD_sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_many_to_many_bSide_missing", + "aSide_AntennaModule": "AntennaModule_3", + "bSide_AntennaCapability": "AntennaCapability_123", + "CD_sourceIds": [ + "source1", + "source2" + ] + }, + { + "id": "relation_many_to_many_both_sides_missing", + "aSide_AntennaModule": "AntennaModule_11", + "bSide_AntennaCapability": "AntennaCapability_22", + "CD_sourceIds": [ + "source1", + "source2" + ] + } + ] +} 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 78dfb9a..825c7d2 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 @@ -1,98 +1,40 @@ { - "e01fcb87ad2c34ce66c34420255e25aaca270e5e": [ + "o-ran-smo-teiv-equipment_AntennaModule": [ { - "id": "CloudNativeApplication_1", - "name": "Test_CloudNativeApplication_1" + "id": "AntennaModule_1", + "positionWithinSector": "center" }, { - "id": "CloudNativeApplication_2", - "name": "Test_CloudNativeApplication_2" - }, - { - "id": "CloudNativeApplication_3", - "name": "Test_CloudNativeApplication_3" - } - ], - "o-ran-smo-teiv-ran-logical_GNBDUFunction": [ - { - "id": "GNBDU_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction=1", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" - }, - "gNBDUId": 111, - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } + "id": "AntennaModule_2", + "positionWithinSector": "center2" } ], - "8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb": [ + "o-ran-smo-teiv-ran_AntennaCapability": [ { - "id": "GNBCUUP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUUPFunction=1", - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUUPFunction]/o-ran-smo-GNBCUUP:GNBCUUPFunction[@id=1]" + "id": "AntennaCapability_1", + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } - } - ], - "c4a425179d3089b5288fdf059079d0ea26977f0f": [ + }, { - "id": "GNBCUCP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUCPFunction=1", - "gNBCUName": "Test_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUCPFunction]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" + "id": "AntennaCapability_2", + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" } } ], - "10484f157f490eb5b27e40dbfaf4d5f2be17c57c": [ + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ { "id": "relation_1", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" + "aSide_AntennaModule": "AntennaModule_1", + "bSide_AntennaCapability": "AntennaCapability_1" }, - { - "id": "relation_4", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - } - ], - "70a4a84bca01ea022ab24d8cb82422c572922675": [ { "id": "relation_2", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - }, - { - "id": "relation_5", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" - } - ], - "7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7": [ - { - "id": "relation_3", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" - }, - { - "id": "relation_6", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" + "aSide_AntennaModule": "AntennaModule_2", + "bSide_AntennaCapability": "AntennaCapability_2" } ] } 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 dd9ccd1..e224b7a 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 @@ -1,22 +1,22 @@ { - "163276fa439cdfccabb80f7acacb6fa638e8d314": [ + "84E676149362F50C55FE1E004B98D4891916BBF3": [ { - "id": "CloudNativeSystem_2" + "id": "NRCellDU_21" }, { - "id": "CloudNativeSystem_3" + "id": "NRCellDU_31" } ], - "o-ran-smo-teiv-ran-oam_ManagedElement": [ + "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ { - "id": "ManagedElement_2", - "REL_FK_deployed-as-cloudNativeSystem": "CloudNativeSystem_2", - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": "relation_11" + "id": "ManagedElement_21", + "REL_FK_used-nrCellDu": "NRCellDU_21", + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_11" }, { - "id": "ManagedElement_3", - "REL_FK_deployed-as-cloudNativeSystem": "CloudNativeSystem_3", - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": "relation_12" + "id": "ManagedElement_41", + "REL_FK_used-nrCellDu": "NRCellDU_31", + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_12" } ] } 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 23c9633..6465d9a 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 @@ -1,185 +1,52 @@ { - "e01fcb87ad2c34ce66c34420255e25aaca270e5e": [ + "o-ran-smo-teiv-equipment_AntennaModule": [ { - "id": "CloudNativeApplication_1", - "name": "Test_CloudNativeApplication_1" + "id": "AntennaModule_3", + "positionWithinSector": "center" }, { - "id": "CloudNativeApplication_2", - "name": "Test_CloudNativeApplication_2" - }, - { - "id": "CloudNativeApplication_3", - "name": "Test_CloudNativeApplication_3" - }, - { - "id": "CNA_SED_1", - "name": "CNA_1" + "id": "AntennaModule_4", + "positionWithinSector": "center2" } ], - "o-ran-smo-teiv-ran-logical_GNBDUFunction": [ - { - "id": "GNBDU_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction[@id=1]", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" + "o-ran-smo-teiv-ran_AntennaCapability": [ + { + "id": "AntennaCapability_3", + "CD_sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", + "urn:cmHandle:395221E080CCF0FD1929103B15999999" + ], + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" }, - "gNBDUId": 12, - "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - }, - { - "id": "GNBDU_SED_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBDUFunction=1", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" + "eUtranFqBands": null, + "nRFqBands": null + }, + { + "id": "AntennaCapability_4", + "CD_sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1", + "urn:cmHandle:395221E080CCF0FD1929103B15999999" + ], + "geranFqBands": { + "attribute_1": "1", + "attribute_2": "2" }, - "gNBDUId": 111, - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1929103B15999999", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00009]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } - ], - "8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb": [ - { - "id": "GNBCUUP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUUPFunction=1", - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUUPFunction]/o-ran-smo-GNBCUUP:GNBCUUPFunction[@id=1]" - } - } - ], - "c4a425179d3089b5288fdf059079d0ea26977f0f": [ - { - "id": "GNBCUCP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUCPFunction=1", - "gNBCUName": "Test_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUCPFunction]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" - } - }, - { - "id": "GNBCUCP_SED_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,GNBCUCPFunction=1", - "gNBCUName": "Test_sed_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1929103B15999999", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00009]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" - } - } - ], - "o-ran-smo-teiv-ran-logical_NRCellDU": [ - { - "id": "NRCellDU_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=1", - "cellLocalId": 4589, - "nCI": 1, - "nRPCI": 12, - "nRTAC": 310, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_1]/o-ran-smo-NRCellDU:NRCellDU[@id=1]" - } - }, - { - "id": "NRCellDU_2", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=2", - "cellLocalId": 45891, - "nCI": 2, - "nRPCI": 121, - "nRTAC": 3101, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_2]/o-ran-smo-NRCellDU:NRCellDU[@id=2]" - } - }, - { - "id": "NRCellDU_3", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=3", - "cellLocalId": 469, - "nCI": 3, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_3]/o-ran-smo-NRCellDU:NRCellDU[@id=3]" - } - }, - { - "id": "NRCellDU_1", - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_7" - }, - { - "id": "NRCellDU_2", - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_8" - }, - { - "id": "NRCellDU_3", - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_9" + "eUtranFqBands": null, + "nRFqBands": null } ], - "10484f157f490eb5b27e40dbfaf4d5f2be17c57c": [ - { - "id": "relation_1", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" - }, - { - "id": "relation_4", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - } - ], - "70a4a84bca01ea022ab24d8cb82422c572922675": [ - { - "id": "relation_2", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - }, - { - "id": "relation_5", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" - } - ], - "7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7": [ + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ { "id": "relation_3", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" + "aSide_AntennaModule": "AntennaModule_3", + "bSide_AntennaCapability": "AntennaCapability_3" }, { - "id": "relation_6", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" + "id": "relation_4", + "aSide_AntennaModule": "AntennaModule_4", + "bSide_AntennaCapability": "AntennaCapability_4" } ] } 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 ea66a96..a6f34f9 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 @@ -1,19 +1,18 @@ { - "163276fa439cdfccabb80f7acacb6fa638e8d314": [ + "84E676149362F50C55FE1E004B98D4891916BBF3": [ { - "id": "CloudNativeSystem_2", - "REL_FK_deployed-managedElement": null + "id": "NRCellDU_21" }, { - "id": "CloudNativeSystem_3", - "REL_FK_deployed-managedElement": null + "id": "NRCellDU_31" } ], - "o-ran-smo-teiv-ran-oam_ManagedElement": [ + "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ { - "id": "ManagedElement_3", - "REL_FK_deployed-as-cloudNativeSystem": null, - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": null + "id": "ManagedElement_41", + "REL_FK_used-nrCellDu": null, + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": null, + "REL_metadata_780D8ABEAC14A0B2ET73FC4EB093C446F7CD3E56": null } ] } 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 ef104e4..38e8e77 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 @@ -1,142 +1,37 @@ { - "e01fcb87ad2c34ce66c34420255e25aaca270e5e": [ - { - "id": "CloudNativeApplication_1", - "name": "Test_CloudNativeApplication_1" - }, - { - "id": "CloudNativeApplication_2", - "name": "Test_CloudNativeApplication_2" - }, - { - "id": "CloudNativeApplication_3", - "name": "Test_CloudNativeApplication_3" - } - ], - "o-ran-smo-teiv-ran-logical_GNBDUFunction": [ - { - "id": "GNBDU_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00001,ManagedElement=NR01gNodeBRadio00001,GNBDUFunction[@id=1]", - "dUpLMNId": { - "mcc": "110", - "mnc": "210" - }, - "gNBDUId": 12, - "gNBId": 1234, - "gNBIdLength": 4, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NR01gNodeBRadio00001]/o-ran-smo-GNBDU:GNBDUFunction[@id=1]" - } - } - ], - "8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb": [ - { - "id": "GNBCUUP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUUPFunction=1", - "gNBId": 123, - "gNBIdLength": 3, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUUPFunction]/o-ran-smo-GNBCUUP:GNBCUUPFunction[@id=1]" - } - } - ], - "c4a425179d3089b5288fdf059079d0ea26977f0f": [ - { - "id": "GNBCUCP_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,GNBCUCPFunction=1", - "gNBCUName": "Test_gNBCU", - "gNBId": 123, - "gNBIdLength": 3, - "pLMNId": { - "mcc": "110", - "mnc": "210" - }, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=GNBCUCPFunction]/o-ran-smo-GNBCUCP:GNBCUCPFunction[@id=1]" - } - } - ], - "o-ran-smo-teiv-ran-logical_NRCellDU": [ + "o-ran-smo-teiv-ran_NRCellDU": [ { "id": "NRCellDU_1", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=1", "cellLocalId": 4589, - "nCI": 1, - "nRPCI": 12, - "nRTAC": 310, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_1]/o-ran-smo-NRCellDU:NRCellDU[@id=1]" - }, - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_7" + "nCI": 2, + "nRPCI": null, + "nRTAC": null, + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_7" }, { "id": "NRCellDU_2", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=2", "cellLocalId": 45891, - "nCI": 2, - "nRPCI": 121, - "nRTAC": 3101, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_2]/o-ran-smo-NRCellDU:NRCellDU[@id=2]" - }, - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_8" + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_8" }, { "id": "NRCellDU_3", - "fdn": "SubNetwork=Europe,SubNetwork=Ireland,NRCellDU=3", "cellLocalId": 469, - "nCI": 3, - "nRPCI": 15, - "nRTAC": 301, - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873814", - "resourceIdentifier": "/o-ran-smo-ComTop:ManagedElement[@id=NRCellDU_3]/o-ran-smo-NRCellDU:NRCellDU[@id=3]" - }, - "REL_FK_provided-by-gnbduFunction": "GNBDU_1", - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU": "relation_9" - } - ], - "10484f157f490eb5b27e40dbfaf4d5f2be17c57c": [ - { - "id": "relation_1", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" - }, - { - "id": "relation_4", - "aSide_GNBDUFunction": "GNBDU_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - } - ], - "70a4a84bca01ea022ab24d8cb82422c572922675": [ - { - "id": "relation_2", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_2" - }, - { - "id": "relation_5", - "aSide_GNBCUUPFunction": "GNBCUUP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" + "REL_FK_provided-by-oduFunction": "ODU_1", + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_9" } ], - "7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7": [ - { - "id": "relation_3", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_3" - }, + "o-ran-smo-teiv-ran_ODUFunction": [ { - "id": "relation_6", - "aSide_GNBCUCPFunction": "GNBCUCP_1", - "bSide_CloudNativeApplication": "CloudNativeApplication_1" + "id": "ODU_1", + "dUpLMNId": { + "mcc": "110", + "mnc": "210" + }, + "gNBDUId": 12, + "gNBId": 1234, + "gNBIdLength": 4 } ] } 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 new file mode 100644 index 0000000..60b5b68 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-reliability.json @@ -0,0 +1,76 @@ +{ + "o-ran-smo-teiv-ran_NRCellDU": [ + { + "id": "myReliabilityCell_1", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_2", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_3", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_4", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_5", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_6", + "cellLocalId": null, + "nCI": null, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_7", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_8", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + }, + { + "id": "myReliabilityCell_9", + "cellLocalId": 51, + "nCI": 61, + "nRPCI": 701, + "nRTAC": 401, + "RI_nRTAC": "OK" + } + ] +} diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-many-to-many.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-many-to-many.json index 731edaf..5c7f45e 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-many-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-many-to-many.json @@ -1,18 +1,11 @@ { - "e01fcb87ad2c34ce66c34420255e25aaca270e5e": [ - "CloudNativeApplication_3" + "o-ran-smo-teiv-equipment_AntennaModule": [ + "AntennaModule_1" ], - "c4a425179d3089b5288fdf059079d0ea26977f0f": [ - "GNBCUCP_1" + "o-ran-smo-teiv-ran_AntennaCapability": [ + "AntennaCapability_1" ], - "10484f157f490eb5b27e40dbfaf4d5f2be17c57c": [ + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ "relation_1" - ], - "70a4a84bca01ea022ab24d8cb82422c572922675": [ - "relation_5" - ], - "7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7": [ - "relation_3", - "relation_6" ] } diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json index b1d9a08..dcfc153 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json @@ -1,10 +1,6 @@ { - "163276fa439cdfccabb80f7acacb6fa638e8d314": [ - "relation_11", - "relation_12" - ], - "o-ran-smo-teiv-ran-oam_ManagedElement": [ - "ManagedElement_2", + "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [ + "ManagedElement_21", "relation_11", "relation_12" ] diff --git a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-source-entity-delete-cm-handle.json b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-source-entity-delete-cm-handle.json index b6d5349..bd51f36 100644 --- a/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-source-entity-delete-cm-handle.json +++ b/teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-source-entity-delete-cm-handle.json @@ -1,15 +1,10 @@ { - "o-ran-smo-teiv-ran-logical_GNBDUFunction": [ - "GNBDU_SED_1" + "o-ran-smo-teiv-ran_AntennaCapability": [ + "AntennaCapability_3", + "AntennaCapability_4" ], - "c4a425179d3089b5288fdf059079d0ea26977f0f": [ - "GNBCUCP_SED_1", - "GNBCUCP_SED_2" - ], - "7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7": [ - "relation_sed_1" - ], - "10484f157f490eb5b27e40dbfaf4d5f2be17c57c": [ - "relation_sed_2" + "CFC235E0404703D1E4454647DF8AAE2C193DB402": [ + "relation_3", + "relation_4" ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type.json b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type.json new file mode 100644 index 0000000..248aec4 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type.json @@ -0,0 +1,27 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "gNBCUCP_1", + "attributes": { + "gNBId": false + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type2.json b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type2.json new file mode 100644 index 0000000..28575f9 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type2.json @@ -0,0 +1,28 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "gNBCUCP_2", + "attributes": { + "gNBCUName": 1, + "gNBId": 12 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type3.json b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type3.json new file mode 100644 index 0000000..68c3d50 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/attributes/ce-wrong-attribute-type3.json @@ -0,0 +1,28 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "gNBCUCP_3", + "attributes": { + "gNBCUName": true, + "gNBId": "13" + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/validation/attributes/int-as-string.json b/teiv/src/test/resources/cloudeventdata/validation/attributes/int-as-string.json new file mode 100644 index 0000000..ebe3bf0 --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/attributes/int-as-string.json @@ -0,0 +1,30 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0001", + "source": "dmi-plugin:nm-1", + "type": "topology-inventory-ingestion.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "id1", + "attributes": { + "plmnId": { + "mcc": 599, + "mnc": 699 + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation.json index b3e8e85..86506d5 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-equipment:AntennaModule": [ + "o-ran-smo-teiv-equipment:AntennaModule": [ { "id": "AntennaModule_1", "attributes": { @@ -19,12 +19,14 @@ "longitude": 56.7455 } } - } + }, + "sourceIds": [ + "source1", + "source2" + ] } - ] - }, - { - "o-ran-smo-teiv-ran-equipment:Site": [ + ], + "o-ran-smo-teiv-equipment:Site": [ { "id": "Site_1", "attributes": { @@ -34,18 +36,26 @@ "longitude": 56.7455 } } - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULE_INSTALLED_AT_SITE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULE_INSTALLED_AT_SITE": [ { "id": "Relation_ManyToOne_1", "aSide": "AntennaModule_1", - "bSide": "Site_1" + "bSide": "Site_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation2.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation2.json index 48d6056..e188d0d 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation2.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one-geolocation2.json @@ -2,14 +2,14 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-equipment:Site": [ + "o-ran-smo-teiv-equipment:Site": [ { "id": "Site_2", "attributes": { @@ -19,18 +19,26 @@ "longitude": 56.7455 } } - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-equipment:ANTENNAMODULE_INSTALLED_AT_SITE": [ + "o-ran-smo-teiv-equipment:ANTENNAMODULE_INSTALLED_AT_SITE": [ { "id": "Relation_ManyToOne_2", "aSide": "AntennaModule_1", - "bSide": "Site_2" + "bSide": "Site_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one.json index 5491c10..08642cf 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one.json @@ -2,29 +2,32 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:AntennaCapability": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { "id": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ], "attributes": { - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873820", - "resourceIdentifier": "/o-ran-smo-ComTop:NodeCluster[@id=2]" - } + } } - ] - }, - { - "o-ran-smo-teiv-ran-logical:NRSectorCarrier": [ + ], + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { "id": "NRSectorCarrier_1", + "sourceIds": [ + "source1", + "source2" + ], "attributes": { } @@ -34,11 +37,15 @@ ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one2.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one2.json index 51805ba..87d00f5 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one2.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one2.json @@ -2,43 +2,50 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:AntennaCapability": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { "id": "AntennaCapability_2", "attributes": { - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873820", - "resourceIdentifier": "/o-ran-smo-ComTop:NodeCluster[@id=2]" - } - } + + }, + "sourceIds": [ + "source1", + "source2" + ] } - ] - }, - { - "o-ran-smo-teiv-ran-logical:NRSectorCarrier": [ + ], + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { "id": "NRSectorCarrier_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_2" + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one3.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one3.json index c7086e3..8ee3e18 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one3.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one3.json @@ -2,33 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:AntennaCapability": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { "id": "AntennaCapability_2", "attributes": { - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873820", - "resourceIdentifier": "/o-ran-smo-ComTop:NodeCluster[@id=2]" - } - } + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_2", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_2" + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one4.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one4.json index 97f2f56..c40a940 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one4.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one4.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { - "id": "Relation_ManyToOne_1", - "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_2" + "id": "Relation_OneToMany_1", + "aSide": "ManagedElement_1", + "bSide": "OCUCPFunction_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one5.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one5.json index 8c0e59d..6efc4fb 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one5.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one5.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:NRSectorCarrier": [ + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { "id": "NRSectorCarrier_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one6.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one6.json index 7cdb75b..98b61da 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one6.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one6.json @@ -2,33 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:AntennaCapability": [ + "o-ran-smo-teiv-ran:AntennaCapability": [ { "id": "AntennaCapability_1", "attributes": { - "cmId": { - "cmHandle": "395221E080CCF0FD1924103B15873820", - "resourceIdentifier": "/o-ran-smo-ComTop:NodeCluster[@id=2]" - } - } + + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one7.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one7.json index 120c210..bbf76e3 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one7.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one7.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_1", - "bSide": "AntennaCapability_1" + "bSide": "AntennaCapability_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one8.json b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one8.json index 6e8f736..e727582 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one8.json +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one8.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical:NRSectorCarrier": [ + "o-ran-smo-teiv-ran:NRSectorCarrier": [ { "id": "NRSectorCarrier_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-logical:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ { "id": "Relation_ManyToOne_1", "aSide": "NRSectorCarrier_2", - "bSide": "AntennaCapability_2" + "bSide": "AntennaCapability_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } 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 new file mode 100644 index 0000000..c07909b --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-create-many-to-one9.json @@ -0,0 +1,59 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", + "source": "dmi-plugin:nm-1", + "type": "ran-logical-topology.create", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "ODU_1", + "attributes": { + "dUpLMNId": { + "mcc": "209", + "mnc": "751" + } + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSectorCarrier": [ + { + "id": "NRSectorCarrier_1", + "attributes": { + "arfcnDL": 64 + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ + { + "id": "Relation_ManyToOne_1", + "aSide": "ODU_1", + "bSide": "NRSectorCarrier_1", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} 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 new file mode 100644 index 0000000..072f5ce --- /dev/null +++ b/teiv/src/test/resources/cloudeventdata/validation/many-to-one/ce-merge-many-to-one-null-attribute.json @@ -0,0 +1,56 @@ +{ + "specversion": "1.0", + "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", + "source": "dmi-plugin:nm-1", + "type": "ran-logical-topology.merge", + "time": "2023-10-25T13:30:01Z", + "datacontenttype": "application/json", + "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "data": { + "entities": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "ODU_1", + "attributes": { + "dUpLMNId": null + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSectorCarrier": [ + { + "id": "NRSectorCarrier_1", + "attributes": { + "arfcnDL": null + }, + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ], + "relationships": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ + { + "id": "Relation_ManyToOne_1", + "aSide": "ODU_1", + "bSide": "NRSectorCarrier_1", + "sourceIds": [ + "source1", + "source2" + ] + } + ] + } + ] + } +} diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many.json index 382accd..cacbaa6 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many.json @@ -2,40 +2,50 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-tiev-oam:ManagedElement": [ { "id": "ManagedElement_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } - ] - }, - { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFunction": [ + ], + "o-ran-smo-teiv-ran:OCUCPFunction": [ { - "id": "GNBCUCPFunction_1", + "id": "OCUCPFunction_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_1", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many2.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many2.json index aeea79d..6130d2a 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many2.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many2.json @@ -2,40 +2,50 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-tiev-oam:ManagedElement": [ { "id": "ManagedElement_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } - ] - }, - { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFunction": [ + ], + "o-ran-smo-teiv-ran:OCUCPFunction": [ { - "id": "GNBCUCPFunction_2", + "id": "OCUCPFunction_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_2", - "bSide": "GNBCUCPFunction_2" + "bSide": "OCUCPFunction_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many3.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many3.json index 1466991..70864db 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many3.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many3.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-tiev-oam:ManagedElement": [ { "id": "ManagedElement_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_2", "aSide": "ManagedElement_2", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many4.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many4.json index e2d8b5c..1e92b26 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many4.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many4.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_2", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many5.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many5.json index 9355350..c10db0b 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many5.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many5.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFunction": [ + "o-ran-smo-teiv-ran:OCUCPFunction": [ { - "id": "GNBCUCPFunction_1", + "id": "OCUCPFunction_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_1", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many6.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many6.json index e78cdc7..e974a88 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many6.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many6.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-tiev-oam:ManagedElement": [ { "id": "ManagedElement_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_1", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many7.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many7.json index f7aa901..c655386 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many7.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many7.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_1", - "bSide": "GNBCUCPFunction_1" + "bSide": "OCUCPFunction_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many8.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many8.json index cc1cb2b..ceedb09 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many8.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-many/ce-create-one-to-many8.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-logical-to-cloud:GNBCUCPFunction": [ + "o-ran-smo-teiv-ran:OCUCPFunction": [ { - "id": "GNBCUCPFunction_2", + "id": "OCUCPFunction_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-logical:MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION": [ + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION": [ { "id": "Relation_OneToMany_1", "aSide": "ManagedElement_2", - "bSide": "GNBCUCPFunction_2" + "bSide": "OCUCPFunction_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json index 941dc32..049e2aa 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json @@ -2,40 +2,55 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_O2O_1", + "id": "ManagedElement_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeSystem_1", + "id": "NRCellDU_1", "attributes": { - - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_1", - "bSide": "CloudNativeSystem_1" + "aSide": "ManagedElement_1", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json index 6939d96..b4173e8 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json @@ -2,40 +2,55 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_O2O_2", + "id": "ManagedElement_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] }, { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeSystem_2", + "id": "NRCellDU_2", "attributes": { - - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_2", - "bSide": "CloudNativeSystem_2" + "aSide": "ManagedElement_2", + "bSide": "NRCellDU_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json index 59467dc..e1d2134 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_O2O_2", + "id": "ManagedElement_2", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_2", - "aSide": "ManagedElement_O2O_2", - "bSide": "CloudNativeSystem_1" + "aSide": "ManagedElement_2", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json index b3e9240..fc00d41 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_2", - "bSide": "CloudNativeSystem_1" + "aSide": "ManagedElement_2", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json index ec056f0..ea4fe25 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json @@ -2,30 +2,41 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeSystem_1", + "id": "NRCellDU_1", "attributes": { - - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_1", - "bSide": "CloudNativeSystem_1" + "aSide": "ManagedElement_1", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json index e39deda..126787f 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json @@ -2,30 +2,38 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-oam:ManagedElement": [ + "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [ { - "id": "ManagedElement_O2O_1", + "id": "ManagedElement_1", "attributes": { - } + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", "aSide": "ManagedElement_1", - "bSide": "CloudNativeSystem_1" + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json index 4d65e2b..3bd21b3 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json @@ -2,18 +2,22 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_1", - "bSide": "CloudNativeSystem_1" + "aSide": "ManagedElement_1", + "bSide": "NRCellDU_1", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json index 202c60d..c71198c 100644 --- a/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json +++ b/teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json @@ -2,30 +2,41 @@ "specversion": "1.0", "id": "a30e63c9-d29e-46ff-b99a-b63ed83f0003", "source": "dmi-plugin:nm-1", - "type": "ran-logical-topology.create", + "type": "topology-inventory-ingestion.create", "time": "2023-10-25T13:30:01Z", "datacontenttype": "application/json", - "dataschema": "https://ties:8080/schemas/v1/r1-topology", + "dataschema": "topology-inventory-ingestion:events:create:1.0.0", "data": { "entities": [ { - "o-ran-smo-teiv-ran-cloud:CloudNativeSystem": [ + "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [ { - "id": "CloudNativeSystem_2", + "id": "NRCellDU_2", "attributes": { - - } + "cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd": 4589, + "nCI": 1, + "nRPCI": 12, + "nRTAC": 310 + }, + "sourceIds": [ + "source1", + "source2" + ] } ] } ], "relationships": [ { - "o-ran-smo-teiv-ran-oam-to-cloud:MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM": [ + "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [ { "id": "Relation_OneToOne_1", - "aSide": "ManagedElement_O2O_2", - "bSide": "CloudNativeSystem_2" + "aSide": "ManagedElement_2", + "bSide": "NRCellDU_2", + "sourceIds": [ + "source1", + "source2" + ] } ] } diff --git a/teiv/src/test/resources/contracts/data/02_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/data/02_getTopologyByEntityTypeName.groovy index e4d51c6..720820e 100644 --- a/teiv/src/test/resources/contracts/data/02_getTopologyByEntityTypeName.groovy +++ b/teiv/src/test/resources/contracts/data/02_getTopologyByEntityTypeName.groovy @@ -451,6 +451,32 @@ import org.springframework.cloud.contract.spec.Contract } ] }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A", + "sourceIds": [ + "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" + ] + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123", + "sourceIds": [ + "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" + ] + } + ] + }, { "o-ran-smo-teiv-equipment:AntennaModule": [ { @@ -463,6 +489,19 @@ import org.springframework.cloud.contract.spec.Contract ] } ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45", + "sourceIds": [ + "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" + ] + } + ] } ], "self": { @@ -480,11 +519,11 @@ import org.springframework.cloud.contract.spec.Contract "last": { "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" }, - "totalCount": 2 + "totalCount": 5 }''') bodyMatchers { jsonPath('$.items', byType { - occurrence(2) + occurrence(5) }) jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) @@ -496,6 +535,21 @@ import org.springframework.cloud.contract.spec.Contract jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) } } }, @@ -1373,7 +1427,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "BAD_REQUEST", "message": "Invalid query condition", - "details": "Invalid geographic format." + "details": "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)" }''') } }, @@ -1391,7 +1445,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "BAD_REQUEST", "message": "Invalid query condition", - "details": "A point should have 2 coordinates (longitude and latitude)." + "details": "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)" }''') } }, @@ -1409,7 +1463,7 @@ import org.springframework.cloud.contract.spec.Contract body('''{ "status": "BAD_REQUEST", "message": "Invalid query condition", - "details": "Invalid coordinate: ABC" + "details": "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)" }''') } }, diff --git a/teiv/src/test/resources/contracts/data/05_getRelationshipTypes.groovy b/teiv/src/test/resources/contracts/data/05_getRelationshipTypes.groovy index 4d8f440..606efbb 100644 --- a/teiv/src/test/resources/contracts/data/05_getRelationshipTypes.groovy +++ b/teiv/src/test/resources/contracts/data/05_getRelationshipTypes.groovy @@ -174,6 +174,12 @@ import org.springframework.cloud.contract.spec.Contract "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships" } }, + { + "name": "ANTENNAMODULE_SERVES_NRCELLDU", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_NRCELLDU/relationships" + } + }, { "name": "NRCELLDU_USES_NRSECTORCARRIER", "relationships": { @@ -232,7 +238,7 @@ import org.springframework.cloud.contract.spec.Contract "last": { "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" }, - "totalCount": 9 + "totalCount": 10 }''') } }, @@ -330,6 +336,12 @@ import org.springframework.cloud.contract.spec.Contract "href": "/domains/TEIV/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships" } }, + { + "name": "ANTENNAMODULE_SERVES_NRCELLDU", + "relationships": { + "href": "/domains/TEIV/relationship-types/ANTENNAMODULE_SERVES_NRCELLDU/relationships" + } + }, { "name": "CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT", "relationships": { @@ -508,7 +520,7 @@ import org.springframework.cloud.contract.spec.Contract "last": { "href": "/domains/TEIV/relationship-types?offset=0&limit=500" }, - "totalCount": 29 + "totalCount": 30 }''') } }, diff --git a/teiv/src/test/resources/contracts/data/08_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/data/08_getEntitiesByDomain.groovy index 0b4c1d2..dfe49ef 100644 --- a/teiv/src/test/resources/contracts/data/08_getEntitiesByDomain.groovy +++ b/teiv/src/test/resources/contracts/data/08_getEntitiesByDomain.groovy @@ -165,6 +165,20 @@ import org.springframework.cloud.contract.spec.Contract } ] }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123" + } + ] + }, { "o-ran-smo-teiv-equipment:AntennaModule": [ { @@ -172,6 +186,13 @@ import org.springframework.cloud.contract.spec.Contract } ] }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45" + } + ] + }, { "o-ran-smo-teiv-ran:OCUUPFunction": [ { @@ -237,21 +258,24 @@ import org.springframework.cloud.contract.spec.Contract "last": { "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" }, - "totalCount": 9 + "totalCount": 12 }''') bodyMatchers { jsonPath('$.items', byType { - occurrence(9) + occurrence(12) }) - jsonPath('$.items[2].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) - jsonPath('$.items[3].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) - jsonPath('$.items[4].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) jsonPath('$.items[5].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) jsonPath('$.items[6].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) jsonPath('$.items[7].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) jsonPath('$.items[8].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[9].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[10].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[11].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) } } }, 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 new file mode 100644 index 0000000..1d0142d --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/classifiers/00_getClassifiers_getTopologyByEntityTypeName.groovy @@ -0,0 +1,324 @@ +/* + * ============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 contracts.classifiers + +import org.springframework.cloud.contract.spec.Contract + +[ + 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?targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "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=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + 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(OR)" + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Weekend" + ], + "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=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural'] | /classifiers[@item='test-app-module:Indoor']" + }, + "totalCount": 4 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(4) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[2]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with classifiers in scopeFilter.(AND)" + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/classifiers&scopeFilter=/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": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "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=/classifiers&scopeFilter=/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=/classifiers&scopeFilter=/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=/classifiers&scopeFilter=/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=/classifiers&scopeFilter=/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=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + 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.(Contains)" + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "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=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'app-module:Rural')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].classifiers[2]', 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 new file mode 100644 index 0000000..3e6dccc --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy @@ -0,0 +1,250 @@ +/* + * ============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 contracts.classifier + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get classifiers using getRelationshipsByType - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural']&targetFilter=/classifiers" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural']&targetFilter=/classifiers" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural']&targetFilter=/classifiers" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural']&targetFilter=/classifiers" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural']&targetFilter=/classifiers" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get classifiers using getRelationshipsByType - EQUALS(AND)" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/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-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']&targetFilter=/classifiers" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']&targetFilter=/classifiers" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']&targetFilter=/classifiers" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']&targetFilter=/classifiers" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[@item='test-app-module:Rural' and @item='test-app-module:Weekend']&targetFilter=/classifiers" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get classifiers using getRelationshipsByType - CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'ural')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", + "classifiers": [ + "module-x:Indoor", + "module-y:Rural", + "module-z:Weekend" + ], + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[contains(@item,'ural')]&targetFilter=/classifiers" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[contains(@item,'ural')]&targetFilter=/classifiers" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[contains(@item,'ural')]&targetFilter=/classifiers" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[contains(@item,'ural')]&targetFilter=/classifiers" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/classifiers[contains(@item,'ural')]&targetFilter=/classifiers" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get classifiers using getRelationshipsByType - CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'NOT_EXISTING')]" + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Invalid classifiers", + "details": "The provided classifiers are invalid [NOT_EXISTING]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, +] 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 new file mode 100644 index 0000000..caf7be9 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/classifiers/02_getClassifiers_getEntitiesByDomain.groovy @@ -0,0 +1,163 @@ +/* + * ============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 contracts.classifier + +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=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/ODUFunction/classifiers&scopeFilter=/ODUFunction/classifiers[@item='test-app-module:Rural']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + 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 classifiers using getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "classifiers": [ + "test-app-module:Rural" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=93" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Rural", + "test-app-module:Weekend" + ], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[@item='test-app-module:Rural']" + }, + "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:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].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 new file mode 100644 index 0000000..bf9bb1a --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/classifiers/03_postClassifiers_merge.groovy @@ -0,0 +1,129 @@ +/* + * ============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 contracts.classifier + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "NOT FOUND - 404: Merge classifiers with wrong entity 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" + ], + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "merge" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + 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 NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid classifiers to entities and relationships (add)." + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": [ + "test-app-module:Weekday" + ], + "entityIds": [ + "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512" + ], + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + } +] 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 new file mode 100644 index 0000000..606c5bb --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy @@ -0,0 +1,237 @@ +/* + * ============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 contracts.classifier + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "NOT FOUND - 404: Delete classifiers with wrong entity 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" + ], + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "delete" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []"}''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Delete 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": "delete" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]"}''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "BAD REQUEST - 400: Delete classifiers from non-existing schema." + request { + method POST() + url "/topology-inventory/v1alpha11/classifiers" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "classifiers": [ + "test-app-module-wrong:Rural", + "test-app-module:Weekend" + ], + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: test-app-module-wrong"}''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid classifiers, no topology object given." + 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" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid classifiers on entities." + 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": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid classifiers on relationships." + 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:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA", + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid classifiers on entities and relationships." + 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": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA", + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy new file mode 100644 index 0000000..b7e37a8 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy @@ -0,0 +1,276 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all the available topology domains." + request { + method GET() + url "/topology-inventory/v1alpha11/domains" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "CLOUD", + "entityTypes": { + "href": "/domains/CLOUD/entity-types" + }, + "relationshipTypes": { + "href": "/domains/CLOUD/relationship-types" + } + }, + { + "name": "EQUIPMENT", + "entityTypes": { + "href": "/domains/EQUIPMENT/entity-types" + }, + "relationshipTypes": { + "href": "/domains/EQUIPMENT/relationship-types" + } + }, + { + "name": "OAM", + "entityTypes": { + "href": "/domains/OAM/entity-types" + }, + "relationshipTypes": { + "href": "/domains/OAM/relationship-types" + } + }, + { + "name": "RAN", + "entityTypes": { + "href": "/domains/RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/RAN/relationship-types" + } + }, + { + "name": "REL_CLOUD_RAN", + "entityTypes": { + "href": "/domains/REL_CLOUD_RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/REL_CLOUD_RAN/relationship-types" + } + }, + { + "name": "REL_EQUIPMENT_RAN", + "entityTypes": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types" + } + }, + { + "name": "REL_OAM_CLOUD", + "entityTypes": { + "href": "/domains/REL_OAM_CLOUD/entity-types" + }, + "relationshipTypes": { + "href": "/domains/REL_OAM_CLOUD/relationship-types" + } + }, + { + "name": "REL_OAM_RAN", + "entityTypes": { + "href": "/domains/REL_OAM_RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/REL_OAM_RAN/relationship-types" + } + }, + { + "name": "TEIV", + "entityTypes": { + "href": "/domains/TEIV/entity-types" + }, + "relationshipTypes": { + "href": "/domains/TEIV/relationship-types" + } + }, + { + "name": "TEST", + "entityTypes": { + "href": "/domains/TEST/entity-types" + }, + "relationshipTypes": { + "href": "/domains/TEST/relationship-types" + } + } + ], + "self": { + "href": "/domains?offset=0&limit=500" + }, + "first": { + "href": "/domains?offset=0&limit=500" + }, + "prev": { + "href": "/domains?offset=0&limit=500" + }, + "next": { + "href": "/domains?offset=0&limit=500" + }, + "last": { + "href": "/domains?offset=0&limit=500" + }, + "totalCount": 10 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(10) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entityTypes.href', byEquality()) + jsonPath('$.items[0].relationshipTypes.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].entityTypes.href', byEquality()) + jsonPath('$.items[1].relationshipTypes.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].entityTypes.href', byEquality()) + jsonPath('$.items[2].relationshipTypes.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].entityTypes.href', byEquality()) + jsonPath('$.items[3].relationshipTypes.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].entityTypes.href', byEquality()) + jsonPath('$.items[4].relationshipTypes.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].entityTypes.href', byEquality()) + jsonPath('$.items[5].relationshipTypes.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].entityTypes.href', byEquality()) + jsonPath('$.items[6].relationshipTypes.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].entityTypes.href', byEquality()) + jsonPath('$.items[7].relationshipTypes.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].entityTypes.href', byEquality()) + jsonPath('$.items[8].relationshipTypes.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].entityTypes.href', byEquality()) + jsonPath('$.items[9].relationshipTypes.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology domains with offset as 2 and limit as 3." + request { + method GET() + url "/topology-inventory/v1alpha11/domains?offset=2&limit=3" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "OAM", + "entityTypes": { + "href": "/domains/OAM/entity-types" + }, + "relationshipTypes": { + "href": "/domains/OAM/relationship-types" + } + }, + { + "name": "RAN", + "entityTypes": { + "href": "/domains/RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/RAN/relationship-types" + } + }, + { + "name": "REL_CLOUD_RAN", + "entityTypes": { + "href": "/domains/REL_CLOUD_RAN/entity-types" + }, + "relationshipTypes": { + "href": "/domains/REL_CLOUD_RAN/relationship-types" + } + } + ], + "self": { + "href": "/domains?offset=2&limit=3" + }, + "first": { + "href": "/domains?offset=0&limit=3" + }, + "prev": { + "href": "/domains?offset=0&limit=3" + }, + "next": { + "href": "/domains?offset=5&limit=3" + }, + "last": { + "href": "/domains?offset=8&limit=3" + }, + "totalCount": 10 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entityTypes.href', byEquality()) + jsonPath('$.items[0].relationshipTypes.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].entityTypes.href', byEquality()) + jsonPath('$.items[1].relationshipTypes.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].entityTypes.href', byEquality()) + jsonPath('$.items[2].relationshipTypes.href', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Get all the available topology domains with invalid offset (greater than total count)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains?offset=100" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 9" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy new file mode 100644 index 0000000..1369576 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy @@ -0,0 +1,550 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all the available topology entity types in OAM domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/OAM/entity-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "ManagedElement", + "entities": { + "href": "/domains/OAM/entity-types/ManagedElement/entities" + } + } + ], + "self": { + "href": "/domains/OAM/entity-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/OAM/entity-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/OAM/entity-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/OAM/entity-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/OAM/entity-types?offset=0&limit=500" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entities.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology entity types in REL_OAM_RAN domain (includes OAM and RAN domains)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/entity-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "AntennaCapability", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/AntennaCapability/entities" + } + }, + { + "name": "ManagedElement", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/ManagedElement/entities" + } + }, + { + "name": "NRCellCU", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/NRCellCU/entities" + } + }, + { + "name": "NRCellDU", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/NRCellDU/entities" + } + }, + { + "name": "NRSectorCarrier", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/NRSectorCarrier/entities" + } + }, + { + "name": "NearRTRICFunction", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/NearRTRICFunction/entities" + } + }, + { + "name": "OCUCPFunction", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/OCUCPFunction/entities" + } + }, + { + "name": "OCUUPFunction", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/OCUUPFunction/entities" + } + }, + { + "name": "ODUFunction", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/ODUFunction/entities" + } + }, + { + "name": "ORUFunction", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/ORUFunction/entities" + } + }, + { + "name": "Sector", + "entities": { + "href": "/domains/REL_OAM_RAN/entity-types/Sector/entities" + } + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/entity-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_OAM_RAN/entity-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/entity-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_OAM_RAN/entity-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_OAM_RAN/entity-types?offset=0&limit=500" + }, + "totalCount": 11 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(11) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entities.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].entities.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].entities.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].entities.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].entities.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].entities.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].entities.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].entities.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].entities.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].entities.href', byEquality()) + jsonPath('$.items[10].name', byEquality()) + jsonPath('$.items[10].entities.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology entity types in RAN domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "AntennaCapability", + "entities": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities" + } + }, + { + "name": "NRCellCU", + "entities": { + "href": "/domains/RAN/entity-types/NRCellCU/entities" + } + }, + { + "name": "NRCellDU", + "entities": { + "href": "/domains/RAN/entity-types/NRCellDU/entities" + } + }, + { + "name": "NRSectorCarrier", + "entities": { + "href": "/domains/RAN/entity-types/NRSectorCarrier/entities" + } + }, + { + "name": "NearRTRICFunction", + "entities": { + "href": "/domains/RAN/entity-types/NearRTRICFunction/entities" + } + }, + { + "name": "OCUCPFunction", + "entities": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities" + } + }, + { + "name": "OCUUPFunction", + "entities": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities" + } + }, + { + "name": "ODUFunction", + "entities": { + "href": "/domains/RAN/entity-types/ODUFunction/entities" + } + }, + { + "name": "ORUFunction", + "entities": { + "href": "/domains/RAN/entity-types/ORUFunction/entities" + } + }, + { + "name": "Sector", + "entities": { + "href": "/domains/RAN/entity-types/Sector/entities" + } + } + ], + "self": { + "href": "/domains/RAN/entity-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/entity-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/entity-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/entity-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/entity-types?offset=0&limit=500" + }, + "totalCount": 10 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(10) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entities.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].entities.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].entities.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].entities.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].entities.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].entities.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].entities.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].entities.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].entities.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].entities.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology entity types in TEIV domain (includes all the supported topology domains)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEIV/entity-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "AntennaCapability", + "entities": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities" + } + }, + { + "name": "AntennaModule", + "entities": { + "href": "/domains/TEIV/entity-types/AntennaModule/entities" + } + }, + { + "name": "CloudifiedNF", + "entities": { + "href": "/domains/TEIV/entity-types/CloudifiedNF/entities" + } + }, + { + "name": "EntityTypeA", + "entities": { + "href": "/domains/TEIV/entity-types/EntityTypeA/entities" + } + }, + { + "name": "EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters", + "entities": { + "href": "/domains/TEIV/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities" + } + }, + { + "name": "ManagedElement", + "entities": { + "href": "/domains/TEIV/entity-types/ManagedElement/entities" + } + }, + { + "name": "NFDeployment", + "entities": { + "href": "/domains/TEIV/entity-types/NFDeployment/entities" + } + }, + { + "name": "NRCellCU", + "entities": { + "href": "/domains/TEIV/entity-types/NRCellCU/entities" + } + }, + { + "name": "NRCellDU", + "entities": { + "href": "/domains/TEIV/entity-types/NRCellDU/entities" + } + }, + { + "name": "NRSectorCarrier", + "entities": { + "href": "/domains/TEIV/entity-types/NRSectorCarrier/entities" + } + }, + { + "name": "NearRTRICFunction", + "entities": { + "href": "/domains/TEIV/entity-types/NearRTRICFunction/entities" + } + }, + { + "name": "NodeCluster", + "entities": { + "href": "/domains/TEIV/entity-types/NodeCluster/entities" + } + }, + { + "name": "OCUCPFunction", + "entities": { + "href": "/domains/TEIV/entity-types/OCUCPFunction/entities" + } + }, + { + "name": "OCUUPFunction", + "entities": { + "href": "/domains/TEIV/entity-types/OCUUPFunction/entities" + } + }, + { + "name": "OCloudNamespace", + "entities": { + "href": "/domains/TEIV/entity-types/OCloudNamespace/entities" + } + }, + { + "name": "OCloudSite", + "entities": { + "href": "/domains/TEIV/entity-types/OCloudSite/entities" + } + }, + { + "name": "ODUFunction", + "entities": { + "href": "/domains/TEIV/entity-types/ODUFunction/entities" + } + }, + { + "name": "ORUFunction", + "entities": { + "href": "/domains/TEIV/entity-types/ORUFunction/entities" + } + }, + { + "name": "Sector", + "entities": { + "href": "/domains/TEIV/entity-types/Sector/entities" + } + }, + { + "name": "Site", + "entities": { + "href": "/domains/TEIV/entity-types/Site/entities" + } + } + ], + "self": { + "href": "/domains/TEIV/entity-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/TEIV/entity-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/TEIV/entity-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/TEIV/entity-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/TEIV/entity-types?offset=0&limit=500" + }, + "totalCount": 20 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(20) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].entities.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].entities.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].entities.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].entities.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].entities.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].entities.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].entities.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].entities.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].entities.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].entities.href', byEquality()) + jsonPath('$.items[10].name', byEquality()) + jsonPath('$.items[10].entities.href', byEquality()) + jsonPath('$.items[11].name', byEquality()) + jsonPath('$.items[11].entities.href', byEquality()) + jsonPath('$.items[12].name', byEquality()) + jsonPath('$.items[12].entities.href', byEquality()) + jsonPath('$.items[13].name', byEquality()) + jsonPath('$.items[13].entities.href', byEquality()) + jsonPath('$.items[14].name', byEquality()) + jsonPath('$.items[14].entities.href', byEquality()) + jsonPath('$.items[15].name', byEquality()) + jsonPath('$.items[15].entities.href', byEquality()) + jsonPath('$.items[16].name', byEquality()) + jsonPath('$.items[16].entities.href', byEquality()) + jsonPath('$.items[17].name', byEquality()) + jsonPath('$.items[17].entities.href', byEquality()) + jsonPath('$.items[18].name', byEquality()) + jsonPath('$.items[18].entities.href', byEquality()) + jsonPath('$.items[19].name', byEquality()) + jsonPath('$.items[19].entities.href', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Get all the available topology entity types with invalid domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/INVALID/entity-types" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown domain", + "details": "Unknown domain: INVALID, known domains: [CLOUD, EQUIPMENT, OAM, RAN, REL_CLOUD_RAN, REL_EQUIPMENT_RAN, REL_OAM_CLOUD, REL_OAM_RAN, TEIV, TEST]" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all the available topology entity types in TEIV domain with invalid offset (greater than total count)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEIV/entity-types?offset=100" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 19" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy new file mode 100644 index 0000000..ccb367d --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy @@ -0,0 +1,2008 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all topology entities of type NRCellDU." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities" + } + 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=500" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500" + }, + "totalCount": 6 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(6) + }) + 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()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with offset as 1 and limit as 4." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=1&limit=4" + } + 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=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=19,ODUFunction=19" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=1&limit=4" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=4" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=4" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=5&limit=4" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=5&limit=4" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(4) + }) + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type NRCellDU with scopeFilter." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=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/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=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 NRCellDU which matches given ID (exact ID match). Alternate to GET entity by ID." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=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=2" + } + ] + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "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 NRCellDU which contain 'ManagedElement=9,ODUFunction=9' in ID (partial ID match)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + } + 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/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=500&scopeFilter=/NRCellDU[contains(@id, 'ManagedElement=9,ODUFunction=9')]" + }, + "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 all topology entities of type AntennaCapability which has serving-antennaModule association with ID that contains 'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A'" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEIV/entity-types/AntennaCapability/entities?scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + } + 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=9,NodeSupport=1,SectorEquipmentFunction=1" + } + ] + } + ], + "self": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + }, + "first": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + }, + "prev": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + }, + "next": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + }, + "last": { + "href": "/domains/TEIV/entity-types/AntennaCapability/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule[contains(@id,'AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A')]" + }, + "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 all topology entities of type ODUFunction which has provided-nrCellDu association with ID that contains 'NRCellDU=1'." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + } + 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=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/provided-nrCellDu[contains(@id,'NRCellDU=1')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type AntennaModule with targetFilter=/sourceIds" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?targetFilter=/sourceIds" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "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" + ] + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A", + "sourceIds": [ + "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" + ] + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123", + "sourceIds": [ + "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" + ] + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "sourceIds": [ + "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" + ] + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45", + "sourceIds": [ + "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" + ] + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds" + }, + "totalCount": 5 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(5) + }) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', 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/EQUIPMENT/entity-types/AntennaModule/entities?scopeFilter=/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']&targetFilter=/sourceIds" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "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" + ] + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/sourceIds[@item = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1']" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/sourceIds&scopeFilter=/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-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[1]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[2]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].sourceIds[3]', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get empty items array when no entity exists of given filter criteria." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=898989]" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities by a long named entity type." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=1&targetFilter=/attributes" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters": [ + { + "attributes": { + "attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters": 9223372036854775807, + "attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters": [ + "1000", + "2000" + ], + "attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters": 1.1, + "attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters": -9223372036854775807, + "attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters": 2147483647, + "attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters": { + "mcc": "01", + "mnc": "234" + }, + "attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters": "someStringValue" + }, + "id": "LongEntityType1" + } + ] + } + ], + "self": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=1&targetFilter=/attributes" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=1&targetFilter=/attributes" + }, + "prev": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=0&limit=1&targetFilter=/attributes" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=1&limit=1&targetFilter=/attributes" + }, + "last": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities?offset=2&limit=1&targetFilter=/attributes" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].id', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters[0]', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters[1]', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters.mcc', byEquality()) + jsonPath('$.items[0].test-built-in-module:EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[0].attributes.attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters.mnc', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type NRCellDU with scopeFilter on association." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']&targetFilter=/attributes(nCI)" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "attributes": { + "nCI": 1 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "attributes": { + "nCI": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "attributes": { + "nCI": 3 + }, + "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&targetFilter=/attributes(nCI)&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&targetFilter=/attributes(nCI)&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&targetFilter=/attributes(nCI)&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&targetFilter=/attributes(nCI)&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities?offset=0&limit=100&targetFilter=/attributes(nCI)&scopeFilter=/provided-by-oduFunction[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9']" + }, + "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.nCI', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].attributes.nCI', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:NRCellDU[0].attributes.nCI', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with scopeFilter on sourceIds and gNBId with AND condition." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']&targetFilter=/attributes;/sourceIds" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "82" + }, + "gNBId": 10, + "gNBDUId": null, + "gNBIdLength": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + ] + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes;/sourceIds&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes;/sourceIds&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes;/sourceIds&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes;/sourceIds&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/attributes;/sourceIds&scopeFilter=/attributes[@gNBId=10]; /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type ODUFunction with scopeFilter with AND an OR conditions." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]&targetFilter=/ODUFunction" + } + 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" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/ODUFunction&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/ODUFunction&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/ODUFunction&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/ODUFunction&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/ODUFunction&scopeFilter=/attributes[@gNBId=10 or @gNBId=13]; /attributes[@gNBIdLength = 2]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + 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 ODUFunction with scopeFilter with AND an OR conditions." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']&targetFilter=/id" + } + 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=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/id&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/id&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/id&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/id&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/id&scopeFilter=/attributes[@gNBId = 9 and @gNBIdLength = 1] | /sourceIds[@item = 'urn:cmHandle:72FDA73D085F138FECC974CB91F1450E']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + 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" + 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']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "83" + } + } + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "86" + } + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "first": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "prev": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "next": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "last": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "totalCount": 2 + }''') + bodyMatchers { + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type OCUCPFunction 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']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10", + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "83" + } + } + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16", + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "86" + } + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "first": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "prev": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "next": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "last": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[@mcc='456']" + }, + "totalCount": 2 + }''') + bodyMatchers { + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type OCUCPFunction 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')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUCPFunction=13", + "attributes": { + "pLMNId": { + "mcc": "789", + "mnc": "84" + } + } + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUCPFunction=19", + "attributes": { + "pLMNId": { + "mcc": "789", + "mnc": "87" + } + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + }, + "first": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + }, + "next": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + }, + "last": { + "href": "/domains/RAN/entity-types/OCUCPFunction/entities?offset=0&limit=500&targetFilter=/attributes(pLMNId)&scopeFilter=/attributes/pLMNId[contains(@mcc,'78')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type AntennaCapability with scopeFilter on complex attribute STRING array - EXACT MATCH - VALUE EXISTS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + } + 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", + "attributes": { + "eUtranFqBands": [ + "123", + "456", + "789" + ] + } + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "attributes": { + "eUtranFqBands": [ + "123", + "456", + "789" + ] + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item='456']" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type AntennaCapability with scopeFilter on complex attribute INTEGER array - EXACT MATCH - VALUE NOT EXISTS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[@item=456]" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all topology entities of type AntennaCapability with scopeFilter on complex attribute STRING array - PARTIAL MATCH - VALUE EXISTS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + } + 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", + "attributes": { + "eUtranFqBands": [ + "123", + "456", + "789" + ] + } + } + ] + }, + { + "o-ran-smo-teiv-ran:AntennaCapability": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "attributes": { + "eUtranFqBands": [ + "123", + "456", + "789" + ] + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'45')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality()) + } + } + }, + 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 { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + }, + "first": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + }, + "next": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + }, + "last": { + "href": "/domains/RAN/entity-types/AntennaCapability/entities?offset=0&limit=500&targetFilter=/attributes(eUtranFqBands)&scopeFilter=/attributes/eUtranFqBands[contains(@item,'999')]" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities of type AntennaModule with scopeFilter on geographic attribute" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "attributes": { + "geo-location": "POINT(39.4019881 67.9419888)" + } + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 67.9419888)']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaModule with scopeFilter on geographic attribute with negative coordinates' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123", + "attributes": { + "geo-location": "POINT(-49.4019881 -68.9419888)" + } + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(-49.4019881 -68.9419888)']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaModule with scopeFilter on geographic attribute with height and negative coordinates' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45", + "attributes": { + "geo-location": "POINT Z (-47.497913 -19.040236 -111.1)" + } + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (-47.497913 -19.040236 -111.1)']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, + Contract.make { + description "ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute - invalid format" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = '(39.4019881 67.9419888)']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "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)" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute - 1 coordinate" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881)']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "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)" + }''') + } + }, + Contract.make { + description 'ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute with height - 1 coordinate' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT Z (39.4019881)']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "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)" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute - invalid coordinate" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&targetFilter=/attributes(geo-location)&scopeFilter=/attributes[@geo-location = 'POINT(39.4019881 ABC)']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "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)" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all topology entities for an entity type that is not in the domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/NRCellDU/entities" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown entity type", + "details": "Entity type NRCellDU is not part of the domain EQUIPMENT, known entity types: [AntennaModule, Site]" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all topology entities for wrong entity type name." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU1/entities" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown entity type", + "details": "Entity type NRCellDU1 is not part of the model, known entity types: [AntennaCapability, AntennaModule, CloudifiedNF, EntityTypeA, EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters, ManagedElement, NFDeployment, NRCellCU, NRCellDU, NRSectorCarrier, NearRTRICFunction, NodeCluster, OCUCPFunction, OCUUPFunction, OCloudNamespace, OCloudSite, ODUFunction, ORUFunction, Sector, Site]" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all topology entities with invalid scopeFilter (attribute not prefixed with @)" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/OCUCPFunction/entities?scopeFilter=/attributes[contains(gNBCUName,'Cucp-1')]" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "no viable alternative at input '[contains(gNBCUName' at line 1:21" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all topology entities of type OCUUPFunction with invalid offset (greater than total count)." + request { + method GET() + url "topology-inventory/v1alpha11/domains/RAN/entity-types/OCUUPFunction/entities?offset=10000" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 6" + }''') + } + }, + Contract.make { + description 'SUCCESS - 200: Get Entities of type ODUFunction with scopeFilter on metadata for reliabilityIndicator - OK' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/metadata[@reliabilityIndicator='OK']" + } + 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=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get Entities of type ODUFunction with targetFilter on metadata and scopeFilter on metadata for reliabilityIndicator - OK' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "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']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + 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 of type ODUFunction with targetFilter on metadata and scopeFilter on metadata for reliabilityIndicator - RESTORED' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "reliabilityIndicator": "RESTORED" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "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[@reliabilityIndicator='RESTORED']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + 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.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.reliabilityIndicator', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description 'BAD REQUEST - 400: Get Entities of type ODUFunction using Invalid Operator - CONTAINS' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/metadata[contains(@reliabilityIndicator,'OK')]" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid query condition", + "details": "Unknown or unexpected query function" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'BAD REQUEST - 400: Get Entities of type ODUFunction by passing invalid reliabilityIndicator - INVALID' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/metadata[@reliabilityIndicator='INVALID']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Invalid parameter type provided for scopeFilter" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'BAD REQUEST - 400: Get Entities of type ODUFunction by passing invalid metadata - reliabilityYIndicator' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/metadata[@reliabilityYIndicator='OK']" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid metadata content", + "details": "reliabilityYIndicator is not a valid metadata" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'BAD REQUEST - 400: Get Entities of type ODUFunction by passing invalid data type - INTEGER' + request { + method GET() + url '/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?scopeFilter=/metadata[@reliabilityIndicator=1]' + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Grammar error", + "details": "Invalid data type provided for scopeFilter" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaModule within 500 meters radius' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "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=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, + Contract.make { + description 'SUCCESS - 200: Get entities of type AntennaModule inside the specified Polygon' + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/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-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "first": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "next": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "last": { + "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy new file mode 100644 index 0000000..7d588ee --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy @@ -0,0 +1,106 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get topology for ManagedElement entity with id 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9' in OAM domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9" + } + response { + status OK() + headers { + contentType('application/yang.data+json') + } + body('''{ + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "decorators": {}, + "classifiers": [], + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616" + ] + } + ] + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get topology for ODUFunction entity with id 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9' with REL_EQUIPMENT_RAN (domain including other domains)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + response { + status OK() + headers { + contentType('application/yang.data+json') + } + body('''{ + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "ORAN" + }, + "classifiers": [ + "test-app-module:Indoor", + "test-app-module:Weekend" + ], + "attributes": { + "gNBDUId": null, + "gNBId": 9, + "gNBIdLength": 1 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616" + ] + } + ] + }''') + } + }, + Contract.make { + description "ERROR - 400: Get topology for ODUFunction entity with non existing id 'non-existing-id'." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/entity-types/ODUFunction/entities/non-existing-id" + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource is not found" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy new file mode 100644 index 0000000..eeb0947 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy @@ -0,0 +1,746 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all relationships for entity type NRCellDU with ID urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "id": "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=7B9425BBD6977FEA6C180F6078CFBAEBE65400223B29E0EFA4F38424FAD66C690806778909177ECF1457CAC18E5BCF6FA4F24E3ECE524C89DE68108708D6D876" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "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", + "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].bSide', 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-ran:SECTOR_GROUPS_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for entity type NRCellDU with ID urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 & targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU" + }, + "totalCount": 1 +}''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for entity type NRCellDU with ID urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1 & targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "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", + "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1/relationships?offset=0&limit=100&targetFilter=/ODUFUNCTION_PROVIDES_NRCELLDU;/SECTOR_GROUPS_NRCELLDU" + }, + "totalCount": 2 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for entity type ODUFunction with ID urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1. & scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9/relationships?offset=0&limit=100&scopeFilter=/provided-nrCellDu[@id = 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "totalCount": 1 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for entity type NRCellDU with ID urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3 with limit as 2." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?limit=2" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", + "id": "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=950ED4540349F9859CEA9E47884A28CD567BDD2505A3C5335C8851A7AADF2AF65542157BB42D607EE3847E4223D76DE88B90762D0590E48693822FD6DCAE60CD" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=714C1B73945C298CAA03FE0D800053CDD1C571BBF375DC647B9F23FDA861CEB369832A3593BB1AA4B8A7245AD187ED24ADDF6FB147130827CDC17BA8370C4838" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=0&limit=2" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=0&limit=2" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=0&limit=2" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=2&limit=2" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=2&limit=2" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER[0].bSide', 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()) + } + } + }, + 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)" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType1", + "aSide": "EntityType1", + "id": "RelId_OneToOne_EntityType1_LongEntityType1" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType1", + "aSide": "EntityType2", + "id": "Rel_ManyToOne_EntityType2_LongEntityType1" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType1", + "aSide": "EntityType1", + "id": "Rel_ManyToMany_EntityType1_LongEntityType1" + } + ] + } + ], + "self": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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)" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "EntityType2", + "id": "Rel_OneToMany_EntityType2_LongEntityType2" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType3", + "aSide": "LongEntityType2", + "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + } + ] + } + ], + "self": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType2/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType1/relationships?scopeFilter=/sourceIds[@item = 'urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616']&targetFilter=/sourceIds" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "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']" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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']" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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']" + }, + "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" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/LongEntityType3/relationships?scopeFilter=/classifiers[@item='test-app-module:Weekend']&targetFilter=/classifiers" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType3", + "aSide": "LongEntityType2", + "id": "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']" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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']" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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']" + }, + "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" + 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" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType3", + "aSide": "LongEntityType2", + "id": "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')]" + }, + "first": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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')]" + }, + "next": { + "href": "/domains/TEST/entity-types/EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters/entities/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')]" + }, + "totalCount": 2 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Return items as empty for a entity with no relationship" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91/relationships?offset=0&limit=500" + }, + "totalCount": 0 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for an entity id where there exists no relationships for the entity type in the given domain" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/entity-types/OCUUPFunction/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9/relationships?offset=0&limit=500" + }, + "totalCount": 0 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all relationships for an entity id where there exists no relationships in the given domain" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + }, + "first": { + "href": "/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + }, + "prev": { + "href": "/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + }, + "next": { + "href": "/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + }, + "last": { + "href": "/domains/OAM/entity-types/ManagedElement/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9/relationships?offset=0&limit=100" + }, + "totalCount": 0 + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all relationships for NRCellDU entity with invalid offset (greater than total count)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/NRCellDU/entities/urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3/relationships?offset=1000" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 2" + }''') + } + }, + Contract.make { + 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" + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource is not found" + }''') + } + }, + Contract.make { + description "SUCCESS - 200 Get all relationships with entityId for ODUFunction using metadata" + 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[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "metadata": { + "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[@reliabilityIndicator='OK']" + }, + "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[@reliabilityIndicator='OK']" + }, + "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[@reliabilityIndicator='OK']" + }, + "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[@reliabilityIndicator='OK']" + }, + "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[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy new file mode 100644 index 0000000..606efbb --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy @@ -0,0 +1,545 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all the available topology relationships types in REL_OAM_RAN domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_OCUCPFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_OCUUPFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_ODUFUNCTION", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_ORUFUNCTION", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships" + } + }, + { + "name": "NRCELLDU_USES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "NRSECTORCARRIER_USES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "OCUCPFUNCTION_PROVIDES_NRCELLCU", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/OCUCPFUNCTION_PROVIDES_NRCELLCU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRCELLDU", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/ODUFUNCTION_PROVIDES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "SECTOR_GROUPS_NRCELLDU", + "relationships": { + "href": "/domains/REL_OAM_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships" + } + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types?offset=0&limit=500" + }, + "totalCount": 11 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(11) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].relationships.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].relationships.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].relationships.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].relationships.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].relationships.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].relationships.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].relationships.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].relationships.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].relationships.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].relationships.href', byEquality()) + jsonPath('$.items[10].name', byEquality()) + jsonPath('$.items[10].relationships.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology relationship types in REL_EQUIPMENT_RAN domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/relationship-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "ANTENNAMODULE_INSTALLED_AT_SITE", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_INSTALLED_AT_SITE/relationships" + } + }, + { + "name": "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "ANTENNAMODULE_SERVES_NRCELLDU", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_NRCELLDU/relationships" + } + }, + { + "name": "NRCELLDU_USES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "NRSECTORCARRIER_USES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "OCUCPFUNCTION_PROVIDES_NRCELLCU", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/OCUCPFUNCTION_PROVIDES_NRCELLCU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRCELLDU", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ODUFUNCTION_PROVIDES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "SECTOR_GROUPS_ANTENNAMODULE", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_ANTENNAMODULE/relationships" + } + }, + { + "name": "SECTOR_GROUPS_NRCELLDU", + "relationships": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships" + } + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types?offset=0&limit=500" + }, + "totalCount": 10 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology relationship types in RAN domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/relationship-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "NRCELLDU_USES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/RAN/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "NRSECTORCARRIER_USES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "OCUCPFUNCTION_PROVIDES_NRCELLCU", + "relationships": { + "href": "/domains/RAN/relationship-types/OCUCPFUNCTION_PROVIDES_NRCELLCU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRCELLDU", + "relationships": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "SECTOR_GROUPS_NRCELLDU", + "relationships": { + "href": "/domains/RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships" + } + } + ], + "self": { + "href": "/domains/RAN/relationship-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/relationship-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/relationship-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/relationship-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/relationship-types?offset=0&limit=500" + }, + "totalCount": 6 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get all the available topology relationship types in TEIV." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEIV/relationship-types" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "ANTENNAMODULE_INSTALLED_AT_SITE", + "relationships": { + "href": "/domains/TEIV/relationship-types/ANTENNAMODULE_INSTALLED_AT_SITE/relationships" + } + }, + { + "name": "ANTENNAMODULE_SERVES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/TEIV/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "ANTENNAMODULE_SERVES_NRCELLDU", + "relationships": { + "href": "/domains/TEIV/relationship-types/ANTENNAMODULE_SERVES_NRCELLDU/relationships" + } + }, + { + "name": "CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT", + "relationships": { + "href": "/domains/TEIV/relationship-types/CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT/relationships" + } + }, + { + "name": "ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS", + "relationships": { + "href": "/domains/TEIV/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + }, + { + "name": "ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS", + "relationships": { + "href": "/domains/TEIV/relationship-types/ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + }, + { + "name": "ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS", + "relationships": { + "href": "/domains/TEIV/relationship-types/ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + }, + { + "name": "ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS", + "relationships": { + "href": "/domains/TEIV/relationship-types/ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + }, + { + "name": "ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS", + "relationships": { + "href": "/domains/TEIV/relationship-types/ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + }, + { + "name": "MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_OCUCPFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_OCUUPFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_ODUFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_ORUFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships" + } + }, + { + "name": "NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE", + "relationships": { + "href": "/domains/TEIV/relationship-types/NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE/relationships" + } + }, + { + "name": "NFDEPLOYMENT_SERVES_OCUCPFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/NFDEPLOYMENT_SERVES_OCUCPFUNCTION/relationships" + } + }, + { + "name": "MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION/relationships" + } + }, + { + "name": "NFDEPLOYMENT_SERVES_OCUCPFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/NFDEPLOYMENT_SERVES_OCUCPFUNCTION/relationships" + } + }, + { + "name": "NFDEPLOYMENT_SERVES_OCUUPFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/NFDEPLOYMENT_SERVES_OCUUPFUNCTION/relationships" + } + }, + { + "name": "NFDEPLOYMENT_SERVES_ODUFUNCTION", + "relationships": { + "href": "/domains/TEIV/relationship-types/NFDEPLOYMENT_SERVES_ODUFUNCTION/relationships" + } + }, + { + "name": "NODECLUSTER_LOCATED_AT_OCLOUDSITE", + "relationships": { + "href": "/domains/TEIV/relationship-types/NODECLUSTER_LOCATED_AT_OCLOUDSITE/relationships" + } + }, + { + "name": "NRCELLDU_USES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/TEIV/relationship-types/NRCELLDU_USES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "NRSECTORCARRIER_USES_ANTENNACAPABILITY", + "relationships": { + "href": "/domains/TEIV/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships" + } + }, + { + "name": "OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER", + "relationships": { + "href": "/domains/TEIV/relationship-types/OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER/relationships" + } + }, + { + "name": "OCUCPFUNCTION_PROVIDES_NRCELLCU", + "relationships": { + "href": "/domains/TEIV/relationship-types/OCUCPFUNCTION_PROVIDES_NRCELLCU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRCELLDU", + "relationships": { + "href": "/domains/TEIV/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" + } + }, + { + "name": "ODUFUNCTION_PROVIDES_NRSECTORCARRIER", + "relationships": { + "href": "/domains/TEIV/relationship-types/ODUFUNCTION_PROVIDES_NRSECTORCARRIER/relationships" + } + }, + { + "name": "SECTOR_GROUPS_ANTENNAMODULE", + "relationships": { + "href": "/domains/TEIV/relationship-types/SECTOR_GROUPS_ANTENNAMODULE/relationships" + } + }, + { + "name": "SECTOR_GROUPS_NRCELLDU", + "relationships": { + "href": "/domains/TEIV/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships" + } + } + ], + "self": { + "href": "/domains/TEIV/relationship-types?offset=0&limit=500" + }, + "first": { + "href": "/domains/TEIV/relationship-types?offset=0&limit=500" + }, + "prev": { + "href": "/domains/TEIV/relationship-types?offset=0&limit=500" + }, + "next": { + "href": "/domains/TEIV/relationship-types?offset=0&limit=500" + }, + "last": { + "href": "/domains/TEIV/relationship-types?offset=0&limit=500" + }, + "totalCount": 30 + }''') + } + }, + Contract.make { + description "ERROR - 400: Get all the available topology relationship types in invalid domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/INVALID/relationship-types" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown domain", + "details": "Unknown domain: INVALID, known domains: [CLOUD, EQUIPMENT, OAM, RAN, REL_CLOUD_RAN, REL_EQUIPMENT_RAN, REL_OAM_CLOUD, REL_OAM_RAN, TEIV, TEST]" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy new file mode 100644 index 0000000..7cfc7ba --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy @@ -0,0 +1,807 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get topology relationships of type MANAGEDELEMENT_MANAGES_ODUFUNCTION(OneToMany)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "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" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B426" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=ADD4A82DFBAF0409FA9D3C929A09314088627B447C733429D4EE7AAE2FFAEE4894F90826B6814B63431EC07140783C7861E463C5AF8330E29469D704675EAB43" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(7) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', 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()) + jsonPath('$.items[3].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type NRSECTORCARRIER_USES_ANTENNACAPABILITY(ManyToOne)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1", + "id": "urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=11EDFC31E2BE240D3CB15DB1A3FA3B78C828524BC8FCA3365A615129A61A627C21DA8EBF6DD788CDBDEC668344D1F79A371749083D6AE04DDDD57CB4FA8C3ECB" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3", + "id": "urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=1B891FCC4F5479BC71127ED2EB43EA26AC3452F8C47792786373442C10BBC408FE5B779BF1CF732C81220803342F4FB969E348F9C5CEEDEC78F9764E186C633F" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSECTORCARRIER_USES_ANTENNACAPABILITY": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2", + "id": "urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=27DF07D016FE349EC565DE2FB09303EE7D8700346624046F79D8DAC176E7FA221E918E3030758B51931C430919E14FD7D16720460F6E1585000C72874A1641DA" + } + ] + } + ], + "self": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/relationship-types/NRSECTORCARRIER_USES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "totalCount": 3 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type ANTENNAMODULE_SERVES_ANTENNACAPABILITY(ManyToMany)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,NodeSupport=1,SectorEquipmentFunction=1", + "aSide": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=8940999E2069725B463052BC35572FDB888C7B734459EE78A01B9F91E2607D87356425BC8EFF0B1C9057D852A4D3F9E1B09479D32FEE68C65EF2821B65F7BD80" + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,NodeSupport=1,SectorEquipmentFunction=1", + "aSide": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65" + } + ] + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/ANTENNAMODULE_SERVES_ANTENNACAPABILITY/relationships?offset=0&limit=500" + }, + "totalCount": 2 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type MANAGEDELEMENT_MANAGES_ODUFUNCTION with offset=1 and limit=1." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=1&limit=1" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "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/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=1&limit=1" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=1" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=1" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=2&limit=1" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=6&limit=1" + }, + "totalCount": 7 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS where used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters id is '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']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + } + ] + } + ], + "self": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + }, + "first": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + }, + "prev": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + }, + "next": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType1']" + }, + "last": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='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'." + 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']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "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']" + }, + "first": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + }, + "prev": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + }, + "next": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + }, + "last": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=100&scopeFilter=/used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters[@id='LongEntityType2']" + }, + "totalCount": 1 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type SECTOR_GROUPS_NRCELLDU where grouped-nrCellDu id is 'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1'." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "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", + "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" + } + ] + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/grouped-nrCellDu[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships of type SECTOR_GROUPS_NRCELLDU where relation id is 'urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463'." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "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", + "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463" + } + ] + } + ], + "self": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + }, + "first": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + }, + "prev": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + }, + "next": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + }, + "last": { + "href": "/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships?offset=0&limit=100&scopeFilter=/SECTOR_GROUPS_NRCELLDU[@id='urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_NRCELLDU=4BBE73F685A98EF799968ACFE76F376D795F4CC3B56A6B867642048CDF4C1B8E323430EA7C6C38E4031FB891158763CC5459A8704E1A9FBFBD53CE8AD23BF463']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:SECTOR_GROUPS_NRCELLDU[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get topology relationships for same entity long relationship name of type ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType2", + "aSide": "LongEntityType1", + "id": "Rel_OneToOne_SameEntity_LongEntityType1_LongEntityType2" + } + ] + }, + { + "test-built-in-module:ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS": [ + { + "bSide": "LongEntityType3", + "aSide": "LongEntityType2", + "id": "Rel_OneToOne_SameEntity_LongEntityType2_LongEntityType3" + } + ] + } + ], + "self": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/TEST/relationship-types/ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS/relationships?offset=0&limit=500" + }, + "totalCount": 2 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get empty items array when no relationship exists of given type." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ORUFUNCTION": [] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ORUFUNCTION/relationships?offset=0&limit=500" + }, + "totalCount": 0 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get relationship by type checking total count" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=714C1B73945C298CAA03FE0D800053CDD1C571BBF375DC647B9F23FDA861CEB369832A3593BB1AA4B8A7245AD187ED24ADDF6FB147130827CDC17BA8370C4838" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "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": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "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" + } + ] + } + ], + "self": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships?offset=0&limit=500" + }, + "first": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships?offset=0&limit=500" + }, + "prev": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships?offset=0&limit=500" + }, + "next": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships?offset=0&limit=500" + }, + "last": { + "href": "/domains/RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships?offset=0&limit=500" + }, + "totalCount": 5 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(5) + }) + 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].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-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].aSide', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].bSide', byEquality()) + jsonPath('$.totalCount', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Get topology relationships of type MANAGEDELEMENT_MANAGES_ODUFUNCTION with invalid offset (greater than total count)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=1000" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 6" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get topology relationships of type SECTOR_GROUPS_NRCELLDU with wrong domain." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/OAM/relationship-types/SECTOR_GROUPS_NRCELLDU/relationships" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Unknown relationship type", + "details": "Relationship type SECTOR_GROUPS_NRCELLDU is not part of the domain OAM, known relationship types: []" + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get relationship using scope filter on metadata for reliabilityIndicator - OK" + request { + method GET() + url "topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?scopeFilter=/metadata[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "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/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get relationship using scope filter on metadata for reliabilityIndicator - RESTORED" + request { + method GET() + url "topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=ADD4A82DFBAF0409FA9D3C929A09314088627B447C733429D4EE7AAE2FFAEE4894F90826B6814B63431EC07140783C7861E463C5AF8330E29469D704675EAB43" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/metadata[@reliabilityIndicator='RESTORED']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].aSide', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].bSide', byEquality()) + } + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy new file mode 100644 index 0000000..b7a2862 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy @@ -0,0 +1,90 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get relationship with specified id" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_EQUIPMENT_RAN/relationship-types/SECTOR_GROUPS_ANTENNAMODULE/relationships/urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512" + } + response { + status OK() + headers { + contentType('application/yang.data+json') + } + body('''{ + "o-ran-smo-teiv-rel-equipment-ran:SECTOR_GROUPS_ANTENNAMODULE": [ + { + "bSide": "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A", + "aSide": "Sector=2", + "id": "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", + "sourceIds": [] + } + ] + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get relationship with specified id" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/ODUFUNCTION_PROVIDES_NRCELLDU/relationships/urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + response { + status OK() + headers { + contentType('application/yang.data+json') + } + body('''{ + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C", + "sourceIds": [] + } + ] + }''') + } + }, + Contract.make { + description "ERROR - 400: Get relationship with non existing id 'non-existing-id'" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/non-existing-id" + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource is not found" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy new file mode 100644 index 0000000..aeae051 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy @@ -0,0 +1,1034 @@ +/* + * ============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 contracts.data + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with targetFilter=/ODUFunction/attributes(gNBDUId)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": 16 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,ODUFunction=28" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBDUId": null + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/attributes(gNBDUId)" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(7) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byRegex(anInteger()).asInteger()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + jsonPath('$.items[6].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-ran:ODUFunction[0].attributes.gNBDUId', byNull()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in TEIV domain with targetFilter=/AntennaModule;/OCUUPFunction." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + } + 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=72AC3D5E2A5F1C47BD09258A9F7B48E0123E9AD752AC54F7E8D8F9D3A6BC487A89A762A5D12CB9D148BB9E5D53A4F3F981345ACDF7B4CB55D67BC12A13FD5B7A" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=84A3E5D7C916F4B2390DC45F178BE6A9235FD80CB41972E3456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + }, + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=B7F52C914E8D36A0185BC9D47EF230A95C681D7B4F923E0A5D8C741F6B9203E85A4D967B312C8F405E9B7831A6D2C5904F8B3E167A9D204C5B8371F9E6A02D45" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,OCUUPFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,OCUUPFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUUPFunction=16" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,OCUUPFunction=19" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=28,OCUUPFunction=28" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUUPFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + }, + "first": { + "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + }, + "prev": { + "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + }, + "next": { + "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + }, + "last": { + "href": "/domains/TEIV/entities?offset=0&limit=100&targetFilter=/AntennaModule;/OCUUPFunction" + }, + "totalCount": 12 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(12) + }) + jsonPath('$.items[5].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[7].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[8].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[9].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[10].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[11].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-equipment:AntennaModule[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')] or /NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')] and targetFilter=/NRCellDU/sourceIds." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]&targetFilter=/NRCellDU/sourceIds" + } + 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", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU":[ + { + "id":"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", + "sourceIds":[ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", + "urn:cmHandle:C4388D6BB970EC663F88B46CC14F8616" + ] + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/sourceIds&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/sourceIds&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/sourceIds&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/sourceIds&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/sourceIds&scopeFilter=/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]|/NRCellDU/sourceIds[contains(@item,'ManagedElement=9,ODUFunction=9,NRCellDU=2')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].sourceIds[0]', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].sourceIds[1]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].sourceIds[0]', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:NRCellDU[0].sourceIds[1]', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with scopeFilter=/NRCellDU/attributes[@cellLocalId=1] and targetFilter=/NRCellDU/attributes(nCI)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]&targetFilter=/NRCellDU/attributes(nCI)" + } + 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": { + "nCI": 1 + } + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(nCI)&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(nCI)&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(nCI)&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(nCI)&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU/attributes(nCI)&scopeFilter=/NRCellDU/attributes[@cellLocalId=1]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].attributes.nCI', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get topology for an entity with given ID (exact ID match) without knowing entity type." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=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=2" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/id[text()='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2']" + }, + "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 empty items array when no entity exists of given filter criteria." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]&targetFilter=/NRCellDU" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/NRCellDU&scopeFilter=/NRCellDU/attributes[@cellLocalId=8989439]" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10'] and targetFilter=/attributes." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']&targetFilter=/attributes" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "attributes": { + "gNBId": 10, + "pLMNId": { + "mcc": "456", + "mnc": "83" + }, + "gNBIdLength": 2, + "gNBCUName": "ocucp-10" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "attributes": { + "gNBId": 10, + "gNBIdLength": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBId": 10, + "gNBDUId": null, + "gNBIdLength": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with scopeFilter=/managed-by-managedElement; /attributes[@gNBId=10] and targetFilter=/attributes." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']&targetFilter=/attributes" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "attributes": { + "gNBId": 10, + "pLMNId": { + "mcc": "456", + "mnc": "83" + }, + "gNBIdLength": 2, + "gNBCUName": "ocucp-10" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUUPFunction": [ + { + "attributes": { + "gNBId": 10, + "gNBIdLength": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUUPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "attributes": { + "gNBId": 10, + "gNBDUId": null, + "gNBIdLength": 2 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes&scopeFilter=/managed-by-managedElement[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10']" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUUPFunction[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities in RAN domain with scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1] and targetFilter=/attributes(gNBId, pLMNId); /NRCellDU." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU" + } + 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:OCUCPFunction": [ + { + "attributes": { + "pLMNId": { + "mcc": "456", + "mnc": "82" + }, + "gNBId": 9 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,OCUCPFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/attributes(gNBId, pLMNId); /NRCellDU&scopeFilter=/attributes[@gNBIdLength=1]; /NRCellDU/attributes[@nCI=1]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[1].o-ran-smo-teiv-ran:OCUCPFunction[0].id', byEquality()) + jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + } + } + }, + Contract.make { + 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']" + } + 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:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,OCUCPFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,OCUCPFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@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']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@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']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/NRCellDU/attributes[@nCI=1];/OCUCPFunction/attributes/pLMNId[@mcc='456' or @mnc='83']" + }, + "totalCount": 3 + }''') + bodyMatchers { + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entityId by using metadata filter on getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + } + 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=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entityId by using metadata filter on getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/ODUFunction/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get metadata using getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "metadata": { + "reliabilityIndicator": "OK" + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=500&targetFilter=/metadata&scopeFilter=/metadata[@reliabilityIndicator='OK']" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Get entities in RAN domain with invalid offset (greater than total count)." + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?&targetFilter=/NRCellDU;&offset=1000" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 5" + }''') + } + }, + Contract.make { + description "Error - 400: Get entities with wrong syntax items instead of item with scopeFilter=/NRCellDU/sourceIds[contains(@items,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/NRCellDU/sourceIds[contains(@items,'ManagedElement=9,ODUFunction=9,NRCellDU=1')]" + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid parameter error", + "details": "Invalid source id parameter provided for NRCellDU" + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get entities of domain Equipment within 500 meters radius" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "first": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "next": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "last": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get entities of domain Equipment inside the specified Polygon" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/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-equipment:AntennaModule": [ + { + "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7" + } + ] + } + ], + "self": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "first": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "prev": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "next": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "last": { + "href": "/domains/EQUIPMENT/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + } + } + } +] 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 new file mode 100644 index 0000000..df9c264 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/decorators/00_getDecorators_getTopologyByEntityTypeName.groovy @@ -0,0 +1,236 @@ +/* + * ============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 contracts.decorators + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get decorators using getTopologyByEntityTypeName - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 456 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "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=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getTopologyByEntityTypeName - CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 456 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "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=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getTopologyByEntityTypeName - CONTAINS and EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "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=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + }, + "first": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + }, + "prev": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + }, + "next": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + }, + "last": { + "href": "/domains/RAN/entity-types/ODUFunction/entities?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFunction[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 new file mode 100644 index 0000000..c819480 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/decorators/01_getDecorators_getRelationshipsByType.groovy @@ -0,0 +1,236 @@ +/* + * ============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 contracts.decorators + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get decorators using getRelationshipsByType - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 456 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']&targetFilter=/decorators" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']&targetFilter=/decorators" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']&targetFilter=/decorators" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']&targetFilter=/decorators" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[@test-app-module:textdata = 'Stockholm']&targetFilter=/decorators" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].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].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getRelationshipsByType - CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 456 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]&targetFilter=/decorators" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]&targetFilter=/decorators" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]&targetFilter=/decorators" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]&targetFilter=/decorators" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')]&targetFilter=/decorators" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].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].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getRelationshipsByType - CONTAINS and EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/decorators&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=D67357F682531C7B068486313B0FDAC3E719A166229520196FB9CE917E0236754226A5BCBF7BB7240E516D7ED3FEA852855EC3F121DD4BAFEC5646F2A37F57EE" + } + ] + } + ], + "self": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]&targetFilter=/decorators" + }, + "first": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]&targetFilter=/decorators" + }, + "prev": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]&targetFilter=/decorators" + }, + "next": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]&targetFilter=/decorators" + }, + "last": { + "href": "/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&scopeFilter=/decorators[contains(@test-app-module:textdata, 'Stock')] ; /decorators[@test-app-module:intdata = 123]&targetFilter=/decorators" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + } +] 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 new file mode 100644 index 0000000..f4d96c2 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/decorators/02_getDecorators_getEntitiesByDomain.groovy @@ -0,0 +1,236 @@ +/* + * ============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 contracts.decorators + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get decorators using getEntitiesByDomain - EQUALS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Budapest", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getEntitiesByDomain - CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 456 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "totalCount": 3 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(3) + }) + 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()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get decorators using getEntitiesByDomain - EQUALS and CONTAINS" + request { + method GET() + url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=16,ODUFunction=16" + } + ] + } + ], + "self": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "first": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "prev": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "next": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "last": { + "href": "/domains/RAN/entities?offset=0&limit=100&targetFilter=/ODUFunction/decorators&scopeFilter=/ODUFunction/decorators[@test-app-module:intdata=123];/ODUFunction/decorators[contains(@test-app-module:textdata,'Stock')]" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[1].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 new file mode 100644 index 0000000..bc53de9 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/decorators/03_postDecoratorsMerge.groovy @@ -0,0 +1,310 @@ +/* + * ============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 contracts.decorators + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "NOT FOUND - 404: Merge decorators with wrong entity ids." + 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 NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Merge decorators with wrong relationship ids." + 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 NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Merge decorators with wrong entity and relationship ids." + 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" + ], + "relationshipIds": [ + "WRONG_RELATIONSHIP_ID" + ], + "operation": "merge" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + 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]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Merge invalid decorators." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:te": "Budapest", + "test-app-module:intdata": "123" + }, + "entityIds": [ + "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512" + ], + "operation": "merge" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Invalid decorators", + "details": "The provided decorators are invalid {test-app-module:intdata=is_not_compatible, test-app-module:te=is_not_available}" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid decorators, no topology object given." + 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 + }, + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid decorators to entities (add)." + 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": [ + "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid decorators to relationships (add)." + 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", + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=CEEC51BE136D671D2101C09FEDD8A1D95E1E177A4818E9FC0D6E63E610BC8FE26FC9C729A1E58AD43D70472F4CD54403E25CB1E5D2BBA66966625C21435C4A78" + ], + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid decorators to entities and relationships (add)." + 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": [ + "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512" + ], + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge valid decorators to entities and relationships (update)." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Athlone", + "test-app-module:intdata": 456 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + ], + "operation": "merge" + }''') + } + response { + status NO_CONTENT() + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy new file mode 100644 index 0000000..b222e1d --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy @@ -0,0 +1,301 @@ +/* + * ============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 contracts.decorators + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "NOT FOUND - 404: Delete decorators with wrong entity ids." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 1 + }, + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "operation": "delete" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [WRONG_ENTITY_ID] Relationships: []" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Delete decorators with wrong relationship ids." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 2 + }, + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:SECTOR_GROUPS_ANTENNAMODULE=44F4F4FC906E9A7525065E4565246F7469CBD11FC7752C61EA6D74776845900AFF472DCAACA1F66443490B6CE0DD9AC9A5E1467022118599F6B4C6EC63400512", + "WRONG_RELATIONSHIP_ID" + ], + "operation": "delete" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource with the following ids cannot be found. Entities: [] Relationships: [WRONG_RELATIONSHIP_ID]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "NOT FOUND - 404: Delete decorators with wrong entity and relationship ids." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 3 + }, + "entityIds": [ + "WRONG_ENTITY_ID", + "urn:o-ran:smo:teiv:sha512:AntennaModule=308D6602D2FE1C923DF176A0F30688B1810DFA7BC4AD5B8050BF9E27361ECA86E86B47B8582DC28E8CE92EB81822DE248845E87094557A953FD9F15BA508B03A" + ], + "relationshipIds": [ + "WRONG_RELATIONSHIP_ID" + ], + "operation": "delete" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/problem+json') + } + 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]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "BAD REQUEST - 400: Delete decorators from non-existing schema." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module-wrong:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: test-app-module-wrong"}''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 204: Delete invalid decorators, no topology object given." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid decorators, no topology object given." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid decorators on entities." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid decorators on relationships." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA", + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete valid decorators on entities and relationships." + request { + method POST() + url "/topology-inventory/v1alpha11/decorators" + headers { + contentType("application/json") + accept('application/problem+json') + } + body('''{ + "decorators": { + "test-app-module:textdata": "Stockholm", + "test-app-module:intdata": 123 + }, + "entityIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14" + ], + "relationshipIds": [ + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=6F7BFBD3DA2A9A592084C75242210A33C9DCF10CFCD53B761A6ACCD385132921679EC3C16394A4DEEE5883712C9719511388230151BA84FBF209DFCFB639E2EA", + "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=DD9259A1B57FF2BB9DEC77C29DBFA4A5C49960D80622F603809ACA47E786DDD5C7ABD267D554A7C796477A9B2E02E072A8E682E4ED38F331BFB6DC3827CE4DB7" + ], + "operation": "delete" + }''') + } + response { + status NO_CONTENT() + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy new file mode 100644 index 0000000..729b26b --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy @@ -0,0 +1,578 @@ +/* + * ============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 contracts.schemas + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get a list of all schemas" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "_3gpp-common-yang-extensions", + "domain": "", + "revision": "2019-06-23", + "content": { + "href": "/schemas/_3gpp-common-yang-extensions/content" + } + }, + { + "name": "_3gpp-common-yang-types", + "domain": "", + "revision": "2022-07-26", + "content": { + "href": "/schemas/_3gpp-common-yang-types/content" + } + }, + { + "name": "ietf-geo-location", + "domain": "", + "revision": "2022-02-11", + "content": { + "href": "/schemas/ietf-geo-location/content" + } + }, + { + "name": "ietf-inet-types", + "domain": "", + "revision": "2013-07-15", + "content": { + "href": "/schemas/ietf-inet-types/content" + } + }, + { + "name": "ietf-yang-types", + "domain": "", + "revision": "2013-07-15", + "content": { + "href": "/schemas/ietf-yang-types/content" + } + }, + { + "name": "o-ran-smo-teiv-cloud", + "domain": "CLOUD", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-cloud/content" + } + }, + { + "name": "o-ran-smo-teiv-common-yang-extensions", + "domain": "", + "revision": "2024-05-24", + "content": { + "href": "/schemas/o-ran-smo-teiv-common-yang-extensions/content" + } + }, + { + "name": "o-ran-smo-teiv-common-yang-types", + "domain": "", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-common-yang-types/content" + } + }, + { + "name": "o-ran-smo-teiv-equipment", + "domain": "EQUIPMENT", + "revision": "2024-10-21", + "content": { + "href": "/schemas/o-ran-smo-teiv-equipment/content" + } + }, + { + "name": "o-ran-smo-teiv-oam", + "domain": "OAM", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-oam/content" + } + }, + { + "name": "o-ran-smo-teiv-ran", + "domain": "RAN", + "revision": "2024-10-08", + "content": { + "href": "/schemas/o-ran-smo-teiv-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-cloud-ran", + "domain": "REL_CLOUD_RAN", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-cloud-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-equipment-ran", + "domain": "REL_EQUIPMENT_RAN", + "revision": "2024-10-08", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-equipment-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-oam-cloud", + "domain": "REL_OAM_CLOUD", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-oam-cloud/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-oam-ran", + "domain": "REL_OAM_RAN", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-oam-ran/content" + } + }, + { + "name": "test-existing-rapp-module", + "domain": "", + "revision": "2024-05-02", + "content": { + "href": "/schemas/test-existing-rapp-module/content" + } + }, + { + "name": "test-module-for-deletion", + "domain": "", + "revision": "2024-05-02", + "content": { + "href": "/schemas/test-module-for-deletion/content" + } + }, + { + "name":"test-module-in-deleting-state", + "domain":"", + "revision":"2024-05-02", + "content":{ + "href":"/schemas/test-module-in-deleting-state/content" + } + }, + { + "name":"module-rapp-module", + "domain":"", + "revision":"2024-05-01", + "content":{ + "href":"/schemas/module-rapp-module/content" + } + }, + { + "name": "test-built-in-module", + "domain": "TEST", + "revision": "2024-05-24", + "content": { + "href": "/schemas/test-built-in-module/content" + } + }, + { + "name": "test-app-module", + "domain": "", + "revision": "2024-05-24", + "content": { + "href": "/schemas/test-app-module/content" + } + }, + { + "name": "test-app-for-deletion-module", + "domain": "", + "revision": "2024-05-24", + "content": { + "href": "/schemas/test-app-for-deletion-module/content" + } + } + ], + "self": { + "href": "/schemas?offset=0&limit=500" + }, + "first": { + "href": "/schemas?offset=0&limit=500" + }, + "prev": { + "href": "/schemas?offset=0&limit=500" + }, + "next": { + "href": "/schemas?offset=0&limit=500" + }, + "last": { + "href": "/schemas?offset=0&limit=500" + }, + "totalCount": 22 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(22) + }) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].domain', byEquality()) + jsonPath('$.items[0].revision', byEquality()) + jsonPath('$.items[0].content.href', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].domain', byEquality()) + jsonPath('$.items[1].revision', byEquality()) + jsonPath('$.items[1].content.href', byEquality()) + jsonPath('$.items[2].name', byEquality()) + jsonPath('$.items[2].domain', byEquality()) + jsonPath('$.items[2].revision', byEquality()) + jsonPath('$.items[2].content.href', byEquality()) + jsonPath('$.items[3].name', byEquality()) + jsonPath('$.items[3].domain', byEquality()) + jsonPath('$.items[3].revision', byEquality()) + jsonPath('$.items[3].content.href', byEquality()) + jsonPath('$.items[4].name', byEquality()) + jsonPath('$.items[4].domain', byEquality()) + jsonPath('$.items[4].revision', byEquality()) + jsonPath('$.items[4].content.href', byEquality()) + jsonPath('$.items[5].name', byEquality()) + jsonPath('$.items[5].domain', byEquality()) + jsonPath('$.items[5].revision', byEquality()) + jsonPath('$.items[5].content.href', byEquality()) + jsonPath('$.items[6].name', byEquality()) + jsonPath('$.items[6].domain', byEquality()) + jsonPath('$.items[6].revision', byEquality()) + jsonPath('$.items[6].content.href', byEquality()) + jsonPath('$.items[7].name', byEquality()) + jsonPath('$.items[7].domain', byEquality()) + jsonPath('$.items[7].revision', byEquality()) + jsonPath('$.items[7].content.href', byEquality()) + jsonPath('$.items[8].name', byEquality()) + jsonPath('$.items[8].domain', byEquality()) + jsonPath('$.items[8].revision', byEquality()) + jsonPath('$.items[8].content.href', byEquality()) + jsonPath('$.items[9].name', byEquality()) + jsonPath('$.items[9].domain', byEquality()) + jsonPath('$.items[9].revision', byEquality()) + jsonPath('$.items[9].content.href', byEquality()) + jsonPath('$.items[10].name', byEquality()) + jsonPath('$.items[10].domain', byEquality()) + jsonPath('$.items[10].revision', byEquality()) + jsonPath('$.items[10].content.href', byEquality()) + jsonPath('$.items[11].name', byEquality()) + jsonPath('$.items[11].domain', byEquality()) + jsonPath('$.items[11].revision', byEquality()) + jsonPath('$.items[11].content.href', byEquality()) + jsonPath('$.items[12].name', byEquality()) + jsonPath('$.items[12].domain', byEquality()) + jsonPath('$.items[12].revision', byEquality()) + jsonPath('$.items[12].content.href', byEquality()) + jsonPath('$.items[13].name', byEquality()) + jsonPath('$.items[13].domain', byEquality()) + jsonPath('$.items[13].revision', byEquality()) + jsonPath('$.items[13].content.href', byEquality()) + jsonPath('$.items[14].name', byEquality()) + jsonPath('$.items[14].domain', byEquality()) + jsonPath('$.items[14].revision', byEquality()) + jsonPath('$.items[14].content.href', byEquality()) + jsonPath('$.items[16].name', byEquality()) + jsonPath('$.items[16].domain', byEquality()) + jsonPath('$.items[16].revision', byEquality()) + jsonPath('$.items[16].content.href', byEquality()) + jsonPath('$.items[17].name', byEquality()) + jsonPath('$.items[17].domain', byEquality()) + jsonPath('$.items[17].revision', byEquality()) + jsonPath('$.items[17].content.href', byEquality()) + jsonPath('$.items[18].name', byEquality()) + jsonPath('$.items[18].domain', byEquality()) + jsonPath('$.items[18].revision', byEquality()) + jsonPath('$.items[18].content.href', byEquality()) + jsonPath('$.items[19].name', byEquality()) + jsonPath('$.items[19].domain', byEquality()) + jsonPath('$.items[19].revision', byEquality()) + jsonPath('$.items[19].content.href', byEquality()) + jsonPath('$.items[20].name', byEquality()) + jsonPath('$.items[20].domain', byEquality()) + jsonPath('$.items[20].revision', byEquality()) + jsonPath('$.items[20].content.href', byEquality()) + jsonPath('$.items[21].name', byEquality()) + jsonPath('$.items[21].domain', byEquality()) + jsonPath('$.items[21].revision', byEquality()) + jsonPath('$.items[21].content.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get a list of all schemas with offset as 0 and limit as 1." + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?offset=0&limit=1") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "_3gpp-common-yang-extensions", + "domain": "", + "revision": "2019-06-23", + "content": { + "href": "/schemas/_3gpp-common-yang-extensions/content" + } + } + ], + "self": { + "href": "/schemas?offset=0&limit=1" + }, + "first": { + "href": "/schemas?offset=0&limit=1" + }, + "prev": { + "href": "/schemas?offset=0&limit=1" + }, + "next": { + "href": "/schemas?offset=1&limit=1" + }, + "last": { + "href": "/schemas?offset=21&limit=1" + }, + "totalCount": 22 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get a list of all schemas with offset as 3 and limit as 3." + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?offset=3&limit=3") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "ietf-inet-types", + "domain": "", + "revision": "2013-07-15", + "content": { + "href": "/schemas/ietf-inet-types/content" + } + }, + { + "name": "ietf-yang-types", + "domain": "", + "revision": "2013-07-15", + "content": { + "href": "/schemas/ietf-yang-types/content" + } + }, + { + "name": "o-ran-smo-teiv-cloud", + "domain": "CLOUD", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-cloud/content" + } + } + ], + "self": { + "href": "/schemas?offset=3&limit=3" + }, + "first": { + "href": "/schemas?offset=0&limit=3" + }, + "prev": { + "href": "/schemas?offset=0&limit=3" + }, + "next": { + "href": "/schemas?offset=6&limit=3" + }, + "last": { + "href": "/schemas?offset=21&limit=3" + }, + "totalCount": 22 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get a list of all schemas with RAN domain" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?domain=RAN&offset=0&limit=100") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "o-ran-smo-teiv-ran", + "domain": "RAN", + "revision": "2024-10-08", + "content": { + "href": "/schemas/o-ran-smo-teiv-ran/content" + } + } + ], + "self": { + "href": "/schemas?offset=0&limit=100&domain=RAN" + }, + "first": { + "href": "/schemas?offset=0&limit=100&domain=RAN" + }, + "prev": { + "href": "/schemas?offset=0&limit=100&domain=RAN" + }, + "next": { + "href": "/schemas?offset=0&limit=100&domain=RAN" + }, + "last": { + "href": "/schemas?offset=0&limit=100&domain=RAN" + }, + "totalCount": 1 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get a list of all schemas with domain name containing RAN" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?domain=.*RAN.*") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [ + { + "name": "o-ran-smo-teiv-rel-oam-ran", + "domain": "REL_OAM_RAN", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-oam-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-cloud-ran", + "domain": "REL_CLOUD_RAN", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-cloud-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-ran", + "domain": "RAN", + "revision": "2024-10-08", + "content": { + "href": "/schemas/o-ran-smo-teiv-ran/content" + } + }, + { + "name": "o-ran-smo-teiv-rel-equipment-ran", + "domain": "REL_EQUIPMENT_RAN", + "revision": "2024-10-04", + "content": { + "href": "/schemas/o-ran-smo-teiv-rel-equipment-ran/content" + } + } + ], + "self": { + "href": "/schemas?offset=0&limit=500&domain=.*RAN.*" + }, + "first": { + "href": "/schemas?offset=0&limit=500&domain=.*RAN.*" + }, + "prev": { + "href": "/schemas?offset=0&limit=500&domain=.*RAN.*" + }, + "next": { + "href": "/schemas?offset=0&limit=500&domain=.*RAN.*" + }, + "last": { + "href": "/schemas?offset=0&limit=500&domain=.*RAN.*" + }, + "totalCount": 4 + }''') + } + }, + Contract.make { + description "SUCCESS - 200: Get a list of all schemas with invalid domain" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?domain=INVALID") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "items": [], + "self": { + "href": "/schemas?offset=0&limit=500&domain=INVALID" + }, + "first": { + "href": "/schemas?offset=0&limit=500&domain=INVALID" + }, + "prev": { + "href": "/schemas?offset=0&limit=500&domain=INVALID" + }, + "next": { + "href": "/schemas?offset=0&limit=500&domain=INVALID" + }, + "last": { + "href": "/schemas?offset=0&limit=500&domain=INVALID" + }, + "totalCount": 0 + }''') + } + }, + Contract.make { + description "ERROR - 400: Get a list of all schemas with offset greater than totalCount" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas?domain=RAN.*&offset=100") + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid Value", + "details": "Offset cannot be larger than 0" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy new file mode 100644 index 0000000..ab996ad --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy @@ -0,0 +1,251 @@ +/* + * ============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 contracts.schemas + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get schema with name o-ran-smo-teiv-rel-oam-ran" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas/o-ran-smo-teiv-rel-oam-ran/content") + } + response { + status OK() + body("module o-ran-smo-teiv-rel-oam-ran {\n" + + " yang-version 1.1;\n" + + " namespace \"urn:o-ran:smo-teiv-rel-oam-ran\";\n" + + " prefix or-teiv-rel-oamran;\n" + + "\n" + + " import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }\n" + + "\n" + + " import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }\n" + + "\n" + + " import o-ran-smo-teiv-oam { prefix or-teiv-oam; }\n" + + "\n" + + " import o-ran-smo-teiv-ran { prefix or-teiv-ran; }\n" + + "\n" + + " organization \"ORAN\";\n" + + " contact \"The Authors\";\n" + + " description\n" + + " \"RAN O&M to Logical topology model.\n" + + "\n" + + " This model contains the RAN O&M to Logical topology relations\n" + + "\n" + + " Copyright (C) 2024 Ericsson\n" + + " Modifications Copyright (C) 2024 OpenInfra Foundation Europe\n" + + "\n" + + " Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\n" + + " you may not use this file except in compliance with the License.\n" + + " You may obtain a copy of the License at\n" + + "\n" + + " http://www.apache.org/licenses/LICENSE-2.0\n" + + "\n" + + " Unless required by applicable law or agreed to in writing, software\n" + + " distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\n" + + " WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + + " See the License for the specific language governing permissions and\n" + + " limitations under the License.\n" + + "\n" + + " SPDX-License-Identifier: Apache-2.0\";\n" + + "\n" + + " revision \"2024-10-04\" {\n" + + " description \"Added grouping, Origin_Relationship_Mapping_Grp to the topology object.\";\n" + + " or-teiv-yext:label 0.5.0;\n" + + " }\n" + + "\n" + + " revision \"2024-07-15\" {\n" + + " description \"This revision aligns O-RAN Work Group 10 Stage 2 Specification (O-RAN.WG10.TE&IV-CIMI.0-R004.v02.00)\";\n" + + " or-teiv-yext:label 0.4.0;\n" + + " }\n" + + "\n" + + " revision \"2024-05-24\" {\n" + + " description \"Initial revision.\";\n" + + " or-teiv-yext:label 0.3.0;\n" + + " }\n" + + "\n" + + " or-teiv-yext:domain REL_OAM_RAN;\n" + + "\n" + + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ODUFUNCTION { // 1 to 0..n\n" + + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the ODUFunction type.\n" + + " The ManagedElement represents the node that manages the ODUFunction.\n" + + " A ManagedElement instance can manage many ODUFunctions.\n" + + " An ODUFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + + " key id;\n" + + "\n" + + " leaf-list managed-oduFunction {\n" + + " description \"Managed Element manages O-DU Function.\";\n" + + " or-teiv-yext:aSide or-teiv-oam:ManagedElement;\n" + + " type instance-identifier;\n" + + " }\n" + + "\n" + + " leaf managed-by-managedElement {\n" + + " description \"O-DU Function managed by Managed Element.\";\n" + + " or-teiv-yext:bSide or-teiv-ran:ODUFunction;\n" + + " type instance-identifier;\n" + + " mandatory true;\n" + + " }\n" + + " }\n" + + "\n" + + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUCPFUNCTION { // 1 to 0..n\n" + + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the OCUCPFunction type.\n" + + " The ManagedElement represents the node that manages the OCUCPFunction.\n" + + " A ManagedElement instance can manage many OCUCPFunctions.\n" + + " An OCUCPFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + + " key id;\n" + + "\n" + + " leaf-list managed-ocucpFunction {\n" + + " description \"Managed Element manages O-CU-CP Function.\";\n" + + " or-teiv-yext:aSide or-teiv-oam:ManagedElement;\n" + + " type instance-identifier;\n" + + " }\n" + + "\n" + + " leaf managed-by-managedElement {\n" + + " description \"O-CU-CP Function managed by Managed Element.\";\n" + + " or-teiv-yext:bSide or-teiv-ran:OCUCPFunction;\n" + + " type instance-identifier;\n" + + " mandatory true;\n" + + " }\n" + + " }\n" + + "\n" + + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUUPFUNCTION { // 1 to 0..n\n" + + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the OCUUPFunction type.\n" + + " The ManagedElement represents the node that manages the OCUUPFunction.\n" + + " A ManagedElement instance can manage many OCUUPFunctions.\n" + + " An OCUUPFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + + " key id;\n" + + "\n" + + " leaf-list managed-ocuupFunction {\n" + + " description \"Managed Element manages O-CU-UP Function.\";\n" + + " or-teiv-yext:aSide or-teiv-oam:ManagedElement;\n" + + " type instance-identifier;\n" + + " }\n" + + "\n" + + " leaf managed-by-managedElement {\n" + + " description \"O-CU-UP Function managed by Managed Element.\";\n" + + " or-teiv-yext:bSide or-teiv-ran:OCUUPFunction;\n" + + " type instance-identifier;\n" + + " mandatory true;\n" + + " }\n" + + " }\n" + + "\n" + + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ORUFUNCTION { // 1 to 0..n\n" + + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the ORUFunction type.\n" + + " The ManagedElement represents the node that manages the ORUFunction.\n" + + " A ManagedElement instance can manage many ORUFunction.\n" + + " An ORUFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + + " key id;\n" + + "\n" + + " leaf-list managed-oruFunction {\n" + + " description \"Managed Element manages O-RU Function.\";\n" + + " or-teiv-yext:aSide or-teiv-oam:ManagedElement;\n" + + " type instance-identifier;\n" + + " }\n" + + "\n" + + " leaf managed-by-managedElement {\n" + + " description \"O-RU Function managed by Managed Element.\";\n" + + " or-teiv-yext:bSide or-teiv-ran:ORUFunction;\n" + + " type instance-identifier;\n" + + " mandatory true;\n" + + " }\n" + + " }\n" + + "\n" + + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION { // 1 to 0..n\n" + + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the NearRTRICFunction type.\n" + + " The ManagedElement represents the node that manages the NearRTRICFunction.\n" + + " A ManagedElement instance can manage many NearRTRICFunction.\n" + + " An NearRTRICFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + + " key id;\n" + + "\n" + + " leaf-list managed-nearRTRICFunction {\n" + + " description \"Managed Element manages Near RT RIC Function.\";\n" + + " or-teiv-yext:aSide or-teiv-oam:ManagedElement;\n" + + " type instance-identifier;\n" + + " }\n" + + "\n" + + " leaf managed-by-managedElement {\n" + + " description \"Near RT RIC Function managed by Managed Element.\";\n" + + " or-teiv-yext:bSide or-teiv-ran:NearRTRICFunction;\n" + + " type instance-identifier;\n" + + " mandatory true;\n" + + " }\n" + + " }\n" + + "}") + headers { + contentType('text/plain') + } + } + }, + Contract.make { + description "ERROR - 400: Get schema content with invalid name invalid" + request { + method GET() + url("/topology-inventory/v1alpha11/schemas/invalid/content") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: invalid" + }''') + headers { + contentType('application/json') + } + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy new file mode 100644 index 0000000..1823d82 --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy @@ -0,0 +1,1370 @@ +/* + * ============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 contracts.schemas + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 201: Create a new classifiers + decorators schema with name module-rapp-model1" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model1 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model1"; ' + + ' prefix model1; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status CREATED() + } + }, + Contract.make { + description "SUCCESS - 201: Create a new decorators without classifier schema with name module-rapp-model2" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model2 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model2"; ' + + ' prefix model2; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + '}')))) + } + response { + status CREATED() + } + }, + Contract.make { + description "SUCCESS - 201: Create a new classifiers without decorator schema with name module-rapp-model3" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model3 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model3"; ' + + ' prefix model3; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' identity classifierTest1 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status CREATED() + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to wrong inheritance for the classifiers" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model4 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model4"; ' + + ' prefix model4; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base model-test; ' + + ' } ' + + ' ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: Invalid classifier classifierTest1" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to wrong inheritance for the classifiers" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model5 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model5"; ' + + ' prefix model5; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf test1 { ' + + ' type string; ' + + ' } ' + + ' leaf test2 { ' + + ' type boolean; ' + + ' } ' + + ' leaf test3 { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base wrong-classifier; ' + + ' } ' + + ' ' + + ' identity urban { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity rural { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: Invalid classifier geo-classifier" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to schema already exists" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model1 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model1"; ' + + ' prefix model1; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierDuplicate1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierDuplicate1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierDuplicate2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierDuplicate2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Schema already exists" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to schema already exists" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model1 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model1"; ' + + ' prefix model1; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' identity classifierDuplicate2 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierDuplicate2 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Schema already exists" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to invalid file input" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model1 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model1"; ' + + ' prefix model1; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf urban { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Schema already exists" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifiers and decorators schema, exception thrown due to wrong inheritance for the classifier" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model6 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model6"; ' + + ' prefix model6; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base model-test; ' + + ' } ' + + ' ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: Invalid classifier classifierTest1" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with already existing schema name" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module test-app-module { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:test-app-module"; ' + + ' prefix module; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Schema already exists" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with already existing schema name in model schema" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module o-ran-smo-teiv-ran { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:o-ran-smo-teiv-ran"; ' + + ' prefix module; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Module 'o-ran-smo-teiv-ran' multiple times in the input, with both conformance types IMPLEMENT and IMPORT." + }''') + } + }, + Contract.make { + description "ERROR - 400: Invalid file type" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.json')), + contentType: p('application/json'), + content: $(c(regex(nonEmpty())), + p('{"sample1":"test", "sample2":99}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Invalid file" + }''') + } + }, + Contract.make { + description "ERROR - 400: Empty file" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty()))))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Missing content at the beginning of the document." + }''') + } + }, + Contract.make { + description "ERROR - 400: Invalid leaf 1" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-x { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-module-x"; ' + + ' prefix module-x; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix test; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-06-10" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /test:decorators { ' + + ' leaf select*fromocucpfunction { ' + + ' type string; ' + + ' } ' + + ' leaf vendor { ' + + ' type string; ' + + ' } ' + + ' } ' + + ' ' + + ' identity Outdoor { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + ' identity Rural { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + ' identity Weekend { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: 'select*fromocucpfunction' is not a valid YANG identifier." + }''') + } + }, + Contract.make { + description "ERROR - 400: Invalid leaf 2" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-x2 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-module-x2"; ' + + ' prefix module-x2; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix test; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-06-10" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /test:decorators { ' + + ' leaf location { ' + + ' type string; ' + + ' } ' + + ' leaf vendor { ' + + ' type string; ' + + ' } ' + + ' } ' + + ' ' + + ' identity UPDATEties_model.module_referenceSETstatusDELETINGWHEREnameodu-function-model { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + ' identity Rural { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + ' identity Weekend { ' + + ' base test:classifiers; ' + + ' } ' + + ' ' + + '}}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Unexpected content at end of document. Check curly braces balance throughout document." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema without any given decorator or classifier" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model7 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model7"; ' + + ' prefix model7; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base test-classifier; ' + + ' } ' + + ' ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Encountered '{}', which does nothing. Replace with ';' or un-comment the contents." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema without any given decorator or classifier 2" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-module8 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-module8"; ' + + ' prefix module8; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Invalid schema" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema missing leaf type for the decorators" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model9 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model9"; ' + + ' prefix model9; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Encountered '{}', which does nothing. Replace with ';' or un-comment the contents." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with wrong decorator type" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model10 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model10"; ' + + ' prefix model10; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type wrong; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Cannot resolve typedef 'wrong'." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with wrong syntax (missing imports)" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model11 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model11"; ' + + ' prefix model11; ' + + ' ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Invalid schema" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with wrong syntax (missing revision)" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model12 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model12"; ' + + ' prefix model12; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: (Sub-)Module does not have a 'revision' statement." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with wrong syntax (missing yang version, namespace, prefix)" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-model13 { ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + ' identity classifierTest1 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest2 { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Invalid schema" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a new classifier and decorator schema with wrong syntax (prefix is different then the inheritances)" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module module-rapp-module14 { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:module-rapp-model14"; ' + + ' prefix module14; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix testModel; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf test1 { ' + + ' type string; ' + + ' } ' + + ' leaf test2 { ' + + ' type boolean; ' + + ' } ' + + ' leaf test3 { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity urban { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + ' identity rural { ' + + ' base geo-classifier; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid file input", + "details": "Invalid file input: Path to schema node '/model:decorators', part of 'augment' statement, cannot be resolved." + }''') + } + }, + Contract.make { + description "ERROR - 409: Create a new classifiers and decorators schema, exception thrown due to schema exists and is in deleting status" + request { + method POST() + url("/topology-inventory/v1alpha11/schemas") + headers { + contentType(multipartFormData()) + } + multipart( + file: named( + name: $(c(regex(nonEmpty())), p('file.yang')), + contentType: p('application/yang'), + content: $(c(regex(nonEmpty())), + p('module test-app-in-deleting-status { ' + + ' ' + + ' yang-version 1.1; ' + + ' namespace "urn:o-ran:test-app-in-deleting-status"; ' + + ' prefix model1; ' + + ' ' + + ' import o-ran-smo-teiv-common-yang-types { prefix model; } ' + + ' import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' + + ' ' + + ' revision "2024-05-08" { ' + + ' description ' + + ' "Initial revision."; ' + + ' or-teiv-yext:label 0.3.0; ' + + ' } ' + + ' ' + + ' augment /model:decorators { ' + + ' leaf urban { ' + + ' type string; ' + + ' } ' + + ' leaf rural { ' + + ' type boolean; ' + + ' } ' + + ' leaf weekend { ' + + ' type uint32; ' + + ' } ' + + ' } ' + + ' ' + + ' identity geo-classifier { ' + + ' base model:classifiers; ' + + ' } ' + + ' identity classifierTest3 { ' + + ' base model:classifiers; ' + + ' } ' + + ' ' + + '}')))) + } + response { + status CONFLICT() + body('''{ + "status": "CONFLICT", + "message": "Schema in deleting state", + "details": "Schema test-app-in-deleting-status already exists and is in the process of being deleted. This may take some time, please try again later." + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy new file mode 100644 index 0000000..5c486fa --- /dev/null +++ b/teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy @@ -0,0 +1,66 @@ +/* + * ============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 contracts.schemas + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 204: Delete an existing classifier schema - test-app-for-deletion-module" + request { + method DELETE() + url("/topology-inventory/v1alpha11/schemas/test-app-for-deletion-module") + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "ERROR - 400: Delete a schema that does not exists" + request { + method DELETE() + url("/topology-inventory/v1alpha11/schemas/does-not-exist-rapp-module") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: does-not-exist-rapp-module" + }''') + } + }, + Contract.make { + description "ERROR - 400: Delete a schema that is in deleting status" + request { + method DELETE() + url("/topology-inventory/v1alpha11/schemas/test-module-in-deleting-state") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid schema name", + "details": "Invalid schema name: test-module-in-deleting-state" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/00_createGroup.groovy b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy new file mode 100644 index 0000000..699d7fa --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/00_createGroup.groovy @@ -0,0 +1,889 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 201: Create a dynamic getEntitiesByDomain group" + 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": "getEntitiesByDomain", + "domain": "RAN", + "targetFilter": "/NRCellDU/attributes(nCI)", + "scopeFilter": "/NRCellDU/attributes[@cellLocalId=1]" + } + }''') + } + response { + status CREATED() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=759bac4e-b4c0-468e-90c1-1a8b7d09c8d4", + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getEntitiesByDomain", + "domain": "RAN", + "targetFilter": "/NRCellDU/attributes(nCI)", + "scopeFilter": "/NRCellDU/attributes[@cellLocalId=1]" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=759bac4e-b4c0-468e-90c1-1a8b7d09c8d4/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byRegex("[a-zA-Z0-9:=-]{61}")) + jsonPath('$.members.href', byRegex("[a-zA-Z0-9/:=-]{77}")) + } + } + }, + Contract.make { + description "SUCCESS - 201: Create a dynamic getEntitiesByType group" + 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": "getEntitiesByType", + "domain": "RAN", + "entityTypeName": "NRCellDU" + } + }''') + } + response { + status CREATED() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=a9c88001-33e0-4920-ba2c-8ee1a27f9849", + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getEntitiesByType", + "domain": "RAN", + "entityTypeName": "NRCellDU" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=a9c88001-33e0-4920-ba2c-8ee1a27f9849/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byRegex("[a-zA-Z0-9:=-]{61}")) + jsonPath('$.members.href', byRegex("[a-zA-Z0-9/:=-]{77}")) + } + } + }, + Contract.make { + description "SUCCESS - 201: Create a dynamic getRelationshipsForEntityId group" + 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 CREATED() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=bbeb1db4-88dc-47b3-aa07-fdad50145b16", + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsForEntityId", + "domain": "RAN", + "entityTypeName": "NRCellDU", + "entityId": "NRCellDU-1" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=bbeb1db4-88dc-47b3-aa07-fdad50145b16/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byRegex("[a-zA-Z0-9:=-]{61}")) + jsonPath('$.members.href', byRegex("[a-zA-Z0-9/:=-]{77}")) + } + } + }, + Contract.make { + description "SUCCESS - 201: Create a dynamic getRelationshipsByType group" + 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": "RAN", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + } + }''') + } + response { + status CREATED() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=1761d6ea-360a-4947-b608-cc2a8a87ca92", + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsByType", + "domain": "RAN", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=1761d6ea-360a-4947-b608-cc2a8a87ca92/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byRegex("[a-zA-Z0-9:=-]{61}")) + jsonPath('$.members.href', byRegex("[a-zA-Z0-9/:=-]{77}")) + } + } + }, + Contract.make { + description "SUCCESS - 201: Create a static group" + 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:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + }, + { + "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:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=9CD8DCA1FE61CE75" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6C56" + } + ] + } + ] + }''') + } + response { + status CREATED() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=cce97e77-add2-4517-8a4e-d1b289003281", + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": { + "href": "/groups/urn:o-ran:smo:teiv:group=cce97e77-add2-4517-8a4e-d1b289003281/provided-members" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=cce97e77-add2-4517-8a4e-d1b289003281/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byRegex("[a-zA-Z0-9:=-]{61}")) + jsonPath('$.providedMembers.href', byRegex("[a-zA-Z0-9/:=-]{86}")) + jsonPath('$.members.href', byRegex("[a-zA-Z0-9/:=-]{77}")) + } + } + }, + Contract.make { + description "ERROR - 400: Create a dynamic group with no criteria specified" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "dynamic", + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Failed to read request", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + 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": "dynamic-cell-filter-group", + "type": "invalidGroupType", + "criteria": { + "queryType": "getRelationshipsByType", + "domain": "RAN", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Failed to read request", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a dynamic group with invalid query type" + 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": "invalidQueryType", + "domain": "RAN", + "relationshipTypeName": "NRCELLDU_USES_NRSECTORCARRIER" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Failed to read request", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a dynamic group with missing criteria property(entityTypeName) for getEntitiesByType" + 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": "getEntitiesByType", + "domain": "RAN", + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Failed to read request", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with no providedMembers specified" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(empty list)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [ + "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 providedMembers", + "details": "Unable to parse the given providedMembers. List elements are not of the type object." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers" + 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: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 providedMembers", + "details": "Unable to parse the given providedMembers. List elements are not of the type object." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(list contains empty object)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "static-cell-filter-group", + "type": "static", + "providedMembers": [ + {} + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Empty object present in providedMembers." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(list contains empty object)" + 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:NRCellDU": [ + {} + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Empty object present in providedMembers." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(invalid id key)" + 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:NRCellDU": [ + { + "idKey": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid key/value present in {\\"idKey\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(id value is not of type string)" + 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:NRCellDU": [ + { + "id": ["urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"] + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid key/value present in {\\"id\\":[\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"]}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(group id present in providedMembers)" + 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:NRCellDU": [ + { + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Nested topology groups is not supported. Provided members contain topology group id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050" + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers" + 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:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "extraKey": "extraValue" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. More than one key:value present in {\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\",\\"extraKey\\":\\"extraValue\\"}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(more than one topology type in an anonymous object)" + 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:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + } + ], + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. More than one key:value present in {\\"o-ran-smo-teiv-ran:NRCellDU\\":[{\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"}],\\"o-ran-smo-teiv-ran:ODUFunction\\":[{\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1\\"}]}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Create a static group with invalid providedMembers(topology identifiers exceed max limit)" + 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:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=4" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=5" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=5" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=6" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=2" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=3" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=3" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Limit exceeded", + "details": "The total number of topology identifiers in the request is 11. The maximum allowed in a single request is 10." + }''') + } + }, + Contract.make { + description "ERROR - 400: Invalid endpoint" + request { + method POST() + url("/topology-inventory/v1alpha11/ties-groups") + headers { + accept("application/json") + contentType("application/json") + } + body('''{ + "name": "dynamic-cell-filter-group", + "type": "dynamic", + "criteria": { + "queryType": "getEntitiesByDomain", + "domain": "RAN", + "targetFilter": "/NRCellDU/attributes(nCI)", + "scopeFilter": "/NRCellDU/attributes[@cellLocalId=1]" + } + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "No static resource topology-inventory/v1alpha11/ties-groups.", + "details": null + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/01_getGroups.groovy b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy new file mode 100644 index 0000000..16afd33 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/01_getGroups.groovy @@ -0,0 +1,277 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get all groups" + request { + method GET() + url("/topology-inventory/v1alpha11/groups?offset=0&limit=2") + headers { + accept("application/json") + } + } + response { + status OK() + headers { + contentType('application/json') + } + // Note: The totalCount in the response includes the groups created in createGroup contract. + body ('''{ + "items": [ + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050", + "name":"test-dynamic-group-for-rename", + "type":"dynamic", + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members" + } + }, + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440051", + "name":"test-static-group-for-rename", + "type":"static", + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440051/members" + } + }, + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000", + "name":"test-dynamic-group-for-delete", + "type":"dynamic", + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members" + } + } + ], + "self": { + "href": "/groups?offset=0&limit=2" + }, + "first": { + "href": "/groups?offset=0&limit=2" + }, + "prev": { + "href": "/groups?offset=0&limit=2" + }, + "next": { + "href": "/groups?offset=2&limit=2" + }, + "last": { + "href": "/groups?offset=28&limit=2" + }, + "totalCount": 29 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].id', byEquality()) + jsonPath('$.items[1].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all groups by group name filter (static group type)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups?offset=0&limit=2&name=test-group-get-by-name-static-group") + headers { + accept("application/json") + } + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440202", + "name":"test-group-get-by-name-static-group", + "type":"static", + "providedMembers": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440202/provided-members" + }, + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440202/members" + } + }, + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440203", + "name":"test-group-get-by-name-static-group", + "type":"static", + "providedMembers": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440203/provided-members" + }, + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440203/members" + } + } + ], + "self": { + "href": "/groups?offset=0&limit=2&name=test-group-get-by-name-static-group" + }, + "first": { + "href": "/groups?offset=0&limit=2&name=test-group-get-by-name-static-group" + }, + "prev": { + "href": "/groups?offset=0&limit=2&name=test-group-get-by-name-static-group" + }, + "next": { + "href": "/groups?offset=0&limit=2&name=test-group-get-by-name-static-group" + }, + "last": { + "href": "/groups?offset=0&limit=2&name=test-group-get-by-name-static-group" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].id', byEquality()) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].type', byEquality()) + jsonPath('$.items[0].providedMembers.href', byEquality()) + jsonPath('$.items[0].members.href', byEquality()) + jsonPath('$.items[1].id', byEquality()) + jsonPath('$.items[1].name', byEquality()) + jsonPath('$.items[1].type', byEquality()) + jsonPath('$.items[1].providedMembers.href', byEquality()) + jsonPath('$.items[1].members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all groups by group name filter (dynamic group type)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups?offset=0&limit=2&name=test-group-get-entities-by-type") + headers { + accept("application/json") + } + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "id":"urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001", + "name":"test-group-get-entities-by-type", + "type":"dynamic", + "members":{ + "href":"/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members" + } + } + ], + "self": { + "href": "/groups?offset=0&limit=2&name=test-group-get-entities-by-type" + }, + "first": { + "href": "/groups?offset=0&limit=2&name=test-group-get-entities-by-type" + }, + "prev": { + "href": "/groups?offset=0&limit=2&name=test-group-get-entities-by-type" + }, + "next": { + "href": "/groups?offset=0&limit=2&name=test-group-get-entities-by-type" + }, + "last": { + "href": "/groups?offset=0&limit=2&name=test-group-get-entities-by-type" + }, + "totalCount": 1 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(1) + }) + jsonPath('$.items[0].id', byEquality()) + jsonPath('$.items[0].name', byEquality()) + jsonPath('$.items[0].type', byEquality()) + jsonPath('$.items[0].members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get group by name that does not exist" + request { + method GET() + url("/topology-inventory/v1alpha11/groups?offset=0&limit=2&name=non-existing-group") + headers { + accept("application/json") + } + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [], + "self": { + "href": "/groups?offset=0&limit=2&name=non-existing-group" + }, + "first": { + "href": "/groups?offset=0&limit=2&name=non-existing-group" + }, + "prev": { + "href": "/groups?offset=0&limit=2&name=non-existing-group" + }, + "next": { + "href": "/groups?offset=0&limit=2&name=non-existing-group" + }, + "last": { + "href": "/groups?offset=0&limit=2&name=non-existing-group" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "ERROR - 400: Bad request when invalid parameters are sent" + request { + method GET() + url("/topology-inventory/v1alpha11/groups?offset=0&limit=561") + headers { + accept("application/json") + } + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "getAllGroups.limit: must be less than or equal to 500" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy new file mode 100644 index 0000000..1a1cb29 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/02_getGroupById.groovy @@ -0,0 +1,252 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get a dynamic group by id (criteria: getEntitiesByDomain)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000", + "name": "test-dynamic-group-for-delete", + "type": "dynamic", + "criteria": { + "queryType": "getEntitiesByDomain", + "domain": "OAM" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byEquality()) + jsonPath('$.name', byEquality()) + jsonPath('$.type', byEquality()) + jsonPath('$.criteria.queryType', byEquality()) + jsonPath('$.criteria.domain', byEquality()) + jsonPath('$.members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get a dynamic group by id (criteria: getEntitiesByType)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001", + "name": "test-group-get-entities-by-type", + "type": "dynamic", + "criteria": { + "queryType": "getEntitiesByType", + "domain": "RAN", + "entityTypeName": "ODUFunction", + "targetFilter": "/sourceIds" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byEquality()) + jsonPath('$.name', byEquality()) + jsonPath('$.type', byEquality()) + jsonPath('$.criteria.queryType', byEquality()) + jsonPath('$.criteria.domain', byEquality()) + jsonPath('$.criteria.entityTypeName', byEquality()) + jsonPath('$.criteria.targetFilter', byEquality()) + jsonPath('$.members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get a dynamic group by id (criteria: getRelationshipsForEntityId)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002", + "name": "test-group-get-rels-for-entity-id", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsForEntityId", + "domain": "TEIV", + "entityTypeName": "ODUFunction", + "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byEquality()) + jsonPath('$.name', byEquality()) + jsonPath('$.type', byEquality()) + jsonPath('$.criteria.queryType', byEquality()) + jsonPath('$.criteria.domain', byEquality()) + jsonPath('$.criteria.entityTypeName', byEquality()) + jsonPath('$.criteria.entityId', byEquality()) + jsonPath('$.members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get a dynamic group by id (criteria: getRelationshipsByType)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003", + "name": "test-group-get-rels-by-type", + "type": "dynamic", + "criteria": { + "queryType": "getRelationshipsByType", + "domain": "REL_OAM_RAN", + "relationshipTypeName": "MANAGEDELEMENT_MANAGES_ODUFUNCTION" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byEquality()) + jsonPath('$.name', byEquality()) + jsonPath('$.type', byEquality()) + jsonPath('$.criteria.queryType', byEquality()) + jsonPath('$.criteria.domain', byEquality()) + jsonPath('$.criteria.relationshipTypeName', byEquality()) + jsonPath('$.members.href', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get a static group by id" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201") + } + response { + status OK() + headers { + contentType('application/json') + } + body('''{ + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201", + "name": "test-group-get-by-id-static-group", + "type": "static", + "providedMembers": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members" + }, + "members": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members" + } + }''') + bodyMatchers { + jsonPath('$.id', byEquality()) + jsonPath('$.name', byEquality()) + jsonPath('$.type', byEquality()) + jsonPath('$.providedMembers.href', byEquality()) + jsonPath('$.members.href', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Get a group by id (Invalid JSON structure)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440100") + } + response { + status INTERNAL_SERVER_ERROR() + 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]" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Invalid endpoint" + request { + method GET() + url("/topology-inventory/v1alpha11/get-groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201") + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "No static resource topology-inventory/v1alpha11/get-groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201.", + "details": null + }''') + } + }, + Contract.make { + description "ERROR - 404: Get a group by id that does not exists" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=non-existing-group") + } + response { + status NOT_FOUND() + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy new file mode 100644 index 0000000..120e884 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy @@ -0,0 +1,71 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 204: Delete an existing dynamic group" + request { + method DELETE() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440000") + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Delete an existing static group" + request { + method DELETE() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655441000") + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "ERROR - 404: Delete a group that does not exist" + request { + method DELETE() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=non-existing-group") + } + response { + status NOT_FOUND() + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + } + }, + Contract.make { + description "ERROR - 404: Delete an existing group using an invalid endpoint" + request { + method DELETE() + url("/topology-inventory/v1alpha11/groups-delete/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655441000") + } + response { + status BAD_REQUEST() + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/04_putGroup.groovy b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy new file mode 100644 index 0000000..a1ff452 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/04_putGroup.groovy @@ -0,0 +1,113 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 204: Update group name for an dynamic existing group." + request { + method PUT() + url "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/name" + headers { + contentType("application/json") + } + body('''{ + "name": "test-group-new-name" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Update group name for an static existing group, where new name matches the name of another group already in the database." + request { + method PUT() + url "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440051/name" + headers { + contentType("application/json") + } + body('''{ + "name": "test-group-new-name" + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "NOT FOUND - 404: Update group name for a group that doesn't exists." + request { + method PUT() + url "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:non-existing-group/name" + headers { + contentType("application/json") + } + body('''{ + "name": "test-group-new-name" + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 400: Update group name for an existing group with an invalid name." + request { + method PUT() + url "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/name" + headers { + contentType("application/json") + } + body('''{ + "name": "test-group-new-name-which-is-invalid-since-it-is-toooooo-long-than-allowed-group-name-length-that-is-greater-than-hundred-and-fifty-characters-in-length" + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/name" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/05_getMembers.groovy b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy new file mode 100644 index 0000000..28483e6 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/05_getMembers.groovy @@ -0,0 +1,592 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 200: Get the members of a dynamic group with getEntitiesByDomain queryType" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=0&limit=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" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=0&limit=2" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=0&limit=2" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=0&limit=2" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=2&limit=2" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/members?offset=34&limit=2" + }, + "totalCount": 35 + }''') + 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 the members of a dynamic group with getEntitiesByType queryType" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=0&limit=2") + } + 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", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "urn:cmHandle:72FDA73D085F138FECC974CB91F1450E" + ] + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "sourceIds": [ + "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13", + "urn:cmHandle:E5196035D0B49A65B00EAA392B4EE155" + ] + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=0&limit=2" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=0&limit=2" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=0&limit=2" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=2&limit=2" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001/members?offset=6&limit=2" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + 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 the members of a dynamic group with getRelationshipsForEntityId queryType" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=3", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BD87BC547A6731B2905A989EBA493810C74258337C49BBB288F4F55734D28B4E40D9C719EC3564348253905BD93EC78EB7C88F2297FF20778911635E94800F74" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=BE61426CAEA457C85D8B551A1A75BFA157BBCE6F143110661C4C9D406A7AAF22D8522515CE924CFB3A9E54E68588A45D3A51065BD24ADBA62CC0FDA761AEE2FC" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=2", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRSECTORCARRIER=C0E73797DB4599AB9ECACFC1FFE3543C92926070ECFBE77E7C15BA99DAFBB1D69352533D3DE5EB2D3D3CC84DAD51B242CB0FC594FF9E8B73C3B42106B0F9AF46" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=3", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=714C1B73945C298CAA03FE0D800053CDD1C571BBF375DC647B9F23FDA861CEB369832A3593BB1AA4B8A7245AD187ED24ADDF6FB147130827CDC17BA8370C4838" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=2", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B426" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members?offset=0&limit=500" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members?offset=0&limit=500" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members?offset=0&limit=500" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members?offset=0&limit=500" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002/members?offset=0&limit=500" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(7) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRSECTORCARRIER[0].id', byEquality()) + jsonPath('$.items[3].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get the members of a dynamic group with getRelationshipsByType queryType" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=0&limit=2") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "bSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10,ODUFunction=10", + "aSide": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=10", + "id": "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=661A89AD3C2702233CD9E96E97E738C05C35EC5FDF32DC78D149B773726350067315B72448D004C938BCD0263F0C4BCCC8A5F9CDD145B9B740983D1523664328" + } + ] + }, + { + "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION": [ + { + "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": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=0&limit=2" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=0&limit=2" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=0&limit=2" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=2&limit=2" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003/members?offset=6&limit=2" + }, + "totalCount": 7 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + jsonPath('$.items[1].o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get the members of a static group" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10") + } + 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-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-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:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/members?offset=0&limit=10" + }, + "totalCount": 9 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(9) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[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-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY[0].id', byEquality()) + jsonPath('$.items[7].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[8].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get the members of a static group when no providedMembersIds are present in the network" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341/members?offset=0&limit=10" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get the members of a static group when topology type is invalid (invalid module and topology name)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get the members of a static group when topology type is invalid (topologytype consist of three parts)" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351/members?offset=0&limit=10" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "ERROR - 404: Get a static group by id that does not exists" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440361/members?offset=0&limit=10") + } + response { + status NOT_FOUND() + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + } + }, + Contract.make { + description "SUCCESS - 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") + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body ('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested resource is not found" + }''') + } + }, + Contract.make { + description "ERROR - 400: Get the members of a dynamic group with wrong scope filter" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440005/members") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid data in scopeFilter", + "details": "Unable to resolve attributes" + }''') + } + }, + Contract.make { + description "ERROR - 404: Get the members of a group that does not exists" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/non-existing-group/members") + } + response { + status NOT_FOUND() + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy new file mode 100644 index 0000000..6e8ca04 --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy @@ -0,0 +1,435 @@ +/* + * ============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 contracts.groups +import org.springframework.cloud.contract.spec.Contract +[ + Contract.make { + description "SUCCESS - 200: Get all provided members of a static group" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "invalid-module:InvalidTopology": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + }, + { + "invalid-module:InvalidTopology:InvalidString": [ + { + "id": "urn:3gpp:dn:providedMemberId" + } + ] + }, + { + "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=500" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=500" + } + ] + }, + { + "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:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=10&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=10&limit=10" + }, + "totalCount": 14 + }''' ) + bodyMatchers { + jsonPath('$.items', byType { + occurrence(10) + }) + jsonPath('$.items[0].invalid-module:InvalidTopology[0].id', byEquality()) + jsonPath('$.items[1].invalid-module:InvalidTopology:InvalidString[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-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[7].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[8].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[9].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get all provided members of a static group when status is present" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?status=present&offset=0&limit=10") + } + 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-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-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:ODUFunction": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C" + } + ] + }, + { + "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=present" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=present" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=present" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=present" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=present" + }, + "totalCount": 9 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(9) + }) + jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[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-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[4].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality()) + jsonPath('$.items[5].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality()) + jsonPath('$.items[6].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY[0].id', byEquality()) + jsonPath('$.items[7].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + jsonPath('$.items[8].o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get provided members of a static group when status is not-present" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?status=not-present&offset=0&limit=10") + } + 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=500" + } + ] + }, + { + "o-ran-smo-teiv-oam:ManagedElement": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=500" + } + ] + }, + { + "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY": [ + { + "id": "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DEDUMMYID" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=not-present" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=not-present" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=not-present" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=not-present" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=not-present" + }, + "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-oam:ManagedElement[0].id', byEquality()) + jsonPath('$.items[2].o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get provided members of a static group when status is invalid" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?status=invalid&offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [ + { + "invalid-module:InvalidTopology": [ + { + "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9" + } + ] + }, + { + "invalid-module:InvalidTopology:InvalidString": [ + { + "id": "urn:3gpp:dn:providedMemberId" + } + ] + } + ], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=invalid" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=invalid" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=invalid" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=invalid" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?offset=0&limit=10&status=invalid" + }, + "totalCount": 2 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(2) + }) + jsonPath('$.items[0].invalid-module:InvalidTopology[0].id', byEquality()) + jsonPath('$.items[1].invalid-module:InvalidTopology:InvalidString[0].id', byEquality()) + } + } + }, + Contract.make { + description "SUCCESS - 200: Get provided members by groupId that does not have any provided members" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10") + } + response { + status OK() + headers { + contentType('application/json') + } + body ('''{ + "items": [], + "self": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10" + }, + "first": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10" + }, + "prev": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10" + }, + "next": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10" + }, + "last": { + "href": "/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391/provided-members?offset=0&limit=10" + }, + "totalCount": 0 + }''') + bodyMatchers { + jsonPath('$.items', byType { + occurrence(0) + }) + } + } + }, + Contract.make { + description "ERROR - 400: Get the provided members of a static group with wrong status" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201/provided-members?status=absent&offset=0&limit=10") + } + response { + status BAD_REQUEST() + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid status", + "details": "Unsupported status for provided members: absent" + }''') + } + }, + Contract.make { + description "ERROR - 404: Get the provided members of a group that does not exists" + request { + method GET() + url("/topology-inventory/v1alpha11/groups/non-existing-group/provided-members") + } + response { + status NOT_FOUND() + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy new file mode 100644 index 0000000..3bfbaff --- /dev/null +++ b/teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy @@ -0,0 +1,1128 @@ +/* + * ============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 contracts.groups + +import org.springframework.cloud.contract.spec.Contract + +[ + Contract.make { + description "SUCCESS - 204: Merge into provided members in an existing static topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=5" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=6" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge into provided members in an existing static topology group which has no static group data present in db" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440212/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 NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge into provided members in an existing static topology group with new topology type and its associated provided members" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,AntennaModule=1" + }, + { + "id": "urn:3gpp:dn:NRCellDU=1,ODUFunction=1,AntennaModule=2" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Merge duplicate ids (some already present in db) into provided members in an existing static topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Remove from provided members in an existing static topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Remove from provided members in an existing static topology group, where user requests to delete same id multiple times" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=4" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "SUCCESS - 204: Remove from provided members (with duplicates in db) in an existing static topology" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440215/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRSectorCarrier": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=3" + } + ] + } + ] + }''') + } + response { + status NO_CONTENT() + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing dynamic topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Provided members update exception", + "details": "The specified provided members for group cannot be updated as group type is not static" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Merge provided members into static group when merge request is more than allowed in a single POST request" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=1" + } + ] + }, + { + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,OCUCPFunction=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,OCUCPFunction=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,OCUCPFunction=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,OCUCPFunction=4" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellCU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellCU=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellCU=3" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellDU=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellDU=3" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Limit exceeded", + "details": "The total number of topology identifiers in the request is 11. The maximum allowed in a single request is 10." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Merge provided members into static group which contains max number of provided members" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440214/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=2" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=3" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=4" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=5" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=6" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=7" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Limit exceeded", + "details": "Merging topology identifiers in request to the group will result in 17 members. The maximum allowed members in the static group is 15." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Merge provided members into static group which on merge will exceed the max limit assigned to provided members" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440216/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=11" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,AntennaModule=22" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRSectorCarrier": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=11" + } + ] + }, + { + "o-ran-smo-teiv-ran:NRCellCU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,NRCellCU=11" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Limit exceeded", + "details": "Merging topology identifiers in request to the group will result in 16 members. The maximum allowed members in the static group is 15." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 404: Merge provided members into a non existing topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=non-existing-group/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "merge", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Remove non existing topology identifiers from provided members in a static topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=non-existing-id-1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=non-existing-id-2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Provided members update exception", + "details": "The specified provided members topology identifier: [urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=non-existing-id-2, urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=non-existing-id-1] is not part of the group." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing topology group and no static group data" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440213/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Provided members update exception", + "details": "The specified topology entity/relation: o-ran-smo-teiv-ran:NRCellDU is not part of the group." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group where body is empty" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{}''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations" + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group where topology_type provided is not present in static group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:UnKnown": [ + { + "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": "Provided members update exception", + "details": "The specified topology entity/relation: o-ran-smo-teiv-ran:UnKnown is not part of the group." + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid operation type in body" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "invalid", + "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/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Failed to read request", + "instance": "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations" + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with operation type missing in body" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + + body('''{ + "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/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations" + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(empty list)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/problem+json') + } + body('''{ + "type": "about:blank", + "title": "Bad Request", + "status": 400, + "detail": "Invalid request content.", + "instance": "/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations" + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + "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 providedMembers", + "details": "Unable to parse the given providedMembers. List elements are not of the type object." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "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 providedMembers", + "details": "Unable to parse the given providedMembers. List elements are not of the type object." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(list contains empty object)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + {} + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Empty object present in providedMembers." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(list contains empty object)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + {} + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Empty object present in providedMembers." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(invalid id key)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "idKey": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid key/value present in {\\"idKey\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(id value is not of type string)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": ["urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"] + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Invalid key/value present in {\\"id\\":[\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"]}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(group id present in providedMembers)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. Nested topology groups is not supported. Provided members contain topology group id: urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440050" + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", + "extraKey": "extraValue" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. More than one key:value present in {\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\",\\"extraKey\\":\\"extraValue\\"}." + }''') + } + }, + Contract.make { + description "ERROR - 400: Remove from provided members in an existing static topology group with invalid providedMembers(more than one topology type in an anonymous object)" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + } + ], + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "Invalid providedMembers", + "details": "Unable to parse the given providedMembers. More than one key:value present in {\\"o-ran-smo-teiv-ran:NRCellDU\\":[{\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1\\"}],\\"o-ran-smo-teiv-ran:ODUFunction\\":[{\\"id\\":\\"urn:3gpp:dn:ManagedElement=1,ODUFunction=1\\"}]}." + }''') + } + }, + Contract.make { + description "ERROR - 404: Remove provided members from a non existing topology group" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=non-existing-group/provided-members-operations") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status NOT_FOUND() + headers { + contentType('application/json') + } + body('''{ + "status": "NOT_FOUND", + "message": "Resource Not Found", + "details": "The requested group is not found" + }''') + bodyMatchers { + jsonPath('$.status', byEquality()) + jsonPath('$.message', byEquality()) + jsonPath('$.details', byEquality()) + } + } + }, + Contract.make { + description "ERROR - 400: Invalid endpoint" + request { + method POST() + url("/topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-update") + headers { + contentType("application/json") + } + body('''{ + "operation": "remove", + "providedMembers": [ + { + "o-ran-smo-teiv-ran:NRCellDU": [ + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1" + }, + { + "id": "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2" + } + ] + } + ] + }''') + } + response { + status BAD_REQUEST() + headers { + contentType('application/json') + } + body('''{ + "status": "BAD_REQUEST", + "message": "No static resource topology-inventory/v1alpha11/groups/urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211/provided-members-update.", + "details": null + }''') + } + } +] diff --git a/teiv/src/test/resources/contracts/schemas/00_getAllSchemas.groovy b/teiv/src/test/resources/contracts/schemas/00_getAllSchemas.groovy index 2f298a2..729b26b 100644 --- a/teiv/src/test/resources/contracts/schemas/00_getAllSchemas.groovy +++ b/teiv/src/test/resources/contracts/schemas/00_getAllSchemas.groovy @@ -79,7 +79,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-cloud", "domain": "CLOUD", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-cloud/content" } @@ -95,7 +95,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-common-yang-types", "domain": "", - "revision": "2024-05-24", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-common-yang-types/content" } @@ -103,7 +103,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-equipment", "domain": "EQUIPMENT", - "revision": "2024-05-24", + "revision": "2024-10-21", "content": { "href": "/schemas/o-ran-smo-teiv-equipment/content" } @@ -111,7 +111,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-oam", "domain": "OAM", - "revision": "2024-05-24", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-oam/content" } @@ -119,7 +119,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-ran", "domain": "RAN", - "revision": "2024-07-15", + "revision": "2024-10-08", "content": { "href": "/schemas/o-ran-smo-teiv-ran/content" } @@ -127,7 +127,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-cloud-ran", "domain": "REL_CLOUD_RAN", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-cloud-ran/content" } @@ -135,7 +135,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-equipment-ran", "domain": "REL_EQUIPMENT_RAN", - "revision": "2024-05-24", + "revision": "2024-10-08", "content": { "href": "/schemas/o-ran-smo-teiv-rel-equipment-ran/content" } @@ -143,7 +143,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-oam-cloud", "domain": "REL_OAM_CLOUD", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-oam-cloud/content" } @@ -151,7 +151,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-oam-ran", "domain": "REL_OAM_RAN", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-oam-ran/content" } @@ -394,7 +394,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-cloud", "domain": "CLOUD", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-cloud/content" } @@ -435,7 +435,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-ran", "domain": "RAN", - "revision": "2024-07-15", + "revision": "2024-10-08", "content": { "href": "/schemas/o-ran-smo-teiv-ran/content" } @@ -476,7 +476,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-oam-ran", "domain": "REL_OAM_RAN", - "revision": "2024-05-24", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-oam-ran/content" } @@ -484,7 +484,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-cloud-ran", "domain": "REL_CLOUD_RAN", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-cloud-ran/content" } @@ -492,7 +492,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-ran", "domain": "RAN", - "revision": "2024-07-15", + "revision": "2024-10-08", "content": { "href": "/schemas/o-ran-smo-teiv-ran/content" } @@ -500,7 +500,7 @@ import org.springframework.cloud.contract.spec.Contract { "name": "o-ran-smo-teiv-rel-equipment-ran", "domain": "REL_EQUIPMENT_RAN", - "revision": "2024-07-15", + "revision": "2024-10-04", "content": { "href": "/schemas/o-ran-smo-teiv-rel-equipment-ran/content" } diff --git a/teiv/src/test/resources/contracts/schemas/01_getSchemaContent.groovy b/teiv/src/test/resources/contracts/schemas/01_getSchemaContent.groovy index 6b3264b..ab996ad 100644 --- a/teiv/src/test/resources/contracts/schemas/01_getSchemaContent.groovy +++ b/teiv/src/test/resources/contracts/schemas/01_getSchemaContent.groovy @@ -68,9 +68,9 @@ import org.springframework.cloud.contract.spec.Contract "\n" + " SPDX-License-Identifier: Apache-2.0\";\n" + "\n" + - " revision \"2024-05-24\" {\n" + - " description \"Initial revision.\";\n" + - " or-teiv-yext:label 0.3.0;\n" + + " revision \"2024-10-04\" {\n" + + " description \"Added grouping, Origin_Relationship_Mapping_Grp to the topology object.\";\n" + + " or-teiv-yext:label 0.5.0;\n" + " }\n" + "\n" + " revision \"2024-07-15\" {\n" + @@ -78,11 +78,25 @@ import org.springframework.cloud.contract.spec.Contract " or-teiv-yext:label 0.4.0;\n" + " }\n" + "\n" + + " revision \"2024-05-24\" {\n" + + " description \"Initial revision.\";\n" + + " or-teiv-yext:label 0.3.0;\n" + + " }\n" + + "\n" + " or-teiv-yext:domain REL_OAM_RAN;\n" + "\n" + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ODUFUNCTION { // 1 to 0..n\n" + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the ODUFunction type.\n" + + " The ManagedElement represents the node that manages the ODUFunction.\n" + + " A ManagedElement instance can manage many ODUFunctions.\n" + + " An ODUFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + " key id;\n" + "\n" + " leaf-list managed-oduFunction {\n" + @@ -101,7 +115,16 @@ import org.springframework.cloud.contract.spec.Contract "\n" + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUCPFUNCTION { // 1 to 0..n\n" + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the OCUCPFunction type.\n" + + " The ManagedElement represents the node that manages the OCUCPFunction.\n" + + " A ManagedElement instance can manage many OCUCPFunctions.\n" + + " An OCUCPFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + " key id;\n" + "\n" + " leaf-list managed-ocucpFunction {\n" + @@ -120,7 +143,16 @@ import org.springframework.cloud.contract.spec.Contract "\n" + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_OCUUPFUNCTION { // 1 to 0..n\n" + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the OCUUPFunction type.\n" + + " The ManagedElement represents the node that manages the OCUUPFunction.\n" + + " A ManagedElement instance can manage many OCUUPFunctions.\n" + + " An OCUUPFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + " key id;\n" + "\n" + " leaf-list managed-ocuupFunction {\n" + @@ -139,7 +171,16 @@ import org.springframework.cloud.contract.spec.Contract "\n" + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_ORUFUNCTION { // 1 to 0..n\n" + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the ORUFunction type.\n" + + " The ManagedElement represents the node that manages the ORUFunction.\n" + + " A ManagedElement instance can manage many ORUFunction.\n" + + " An ORUFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + " key id;\n" + "\n" + " leaf-list managed-oruFunction {\n" + @@ -158,7 +199,16 @@ import org.springframework.cloud.contract.spec.Contract "\n" + " or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION { // 1 to 0..n\n" + "\n" + + " description\n" + + " \"The aSide of this relationship is an instance of the ManagedElement type.\n" + + " The bSide of this relationship is an instance of the NearRTRICFunction type.\n" + + " The ManagedElement represents the node that manages the NearRTRICFunction.\n" + + " A ManagedElement instance can manage many NearRTRICFunction.\n" + + " An NearRTRICFunction instance must be managed by one ManagedElement.\n" + + " \";\n" + + "\n" + " uses or-teiv-types:Top_Grp_Type;\n" + + " uses or-teiv-types:Origin_Entity_Mapping_Grp;\n" + " key id;\n" + "\n" + " leaf-list managed-nearRTRICFunction {\n" + diff --git a/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql b/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql index 0ada63d..29c3971 100644 --- a/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql +++ b/teiv/src/test/resources/pgsqlschema/00_init-oran-smo-teiv-data-v1.sql @@ -43,22 +43,47 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; --- Update data schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success'); +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA +); -CREATE TABLE IF NOT EXISTS ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ( +SELECT ties_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");' +); + +SELECT ties_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" ( "id" TEXT, "aSide_NFDeployment" TEXT, "bSide_NearRTRICFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -73,7 +98,8 @@ CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" "bSide_AntennaCapability" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -87,7 +113,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -102,7 +129,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED "bSide_OCloudNamespace" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -117,16 +145,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_comprised-by-cloudifiedNF" TEXT, "REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" TEXT, "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, "REL_FK_serviced-managedElement" TEXT, "REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" TEXT, "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, - "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb + "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -153,7 +184,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_A "bSide_OCloudSite" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -167,7 +199,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -182,11 +215,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-on-nodeCluster" TEXT, "REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" TEXT, "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, - "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb + "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -207,7 +242,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudSite" ( "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -220,25 +256,37 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( "id" TEXT, "antennaBeamWidth" jsonb, "antennaModelNumber" TEXT, + "azimuth" DECIMAL, "electricalAntennaTilt" INTEGER, "geo-location" geography, + "horizontalBeamWidth" DECIMAL, "mechanicalAntennaBearing" INTEGER, "mechanicalAntennaTilt" INTEGER, "positionWithinSector" TEXT, "totalTilt" INTEGER, + "verticalBeamWidth" DECIMAL, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_installed-at-site" TEXT, "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" TEXT, "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, + "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -259,13 +307,20 @@ ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" 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 ties_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 '{}'; + CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( "id" TEXT, "geo-location" geography, "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -279,11 +334,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_deployed-as-cloudifiedNF" TEXT, "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb + "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -305,7 +362,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" ( "nRFqBands" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -323,11 +381,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-ocucpFunction" TEXT, "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" TEXT, "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, - "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb + "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -351,16 +411,19 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, "REL_FK_grouped-by-sector" TEXT, "REL_ID_SECTOR_GROUPS_NRCELLDU" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb + "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb, + "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -391,21 +454,25 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_used-by-nrCellDu" TEXT, "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_FK_used-antennaCapability" TEXT, "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_FK_provided-by-oduFunction" TEXT, "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -439,11 +506,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -467,11 +536,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -494,11 +565,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -521,11 +594,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -546,11 +621,13 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, + "metadata" jsonb, "REL_FK_managed-by-managedElement" TEXT, "REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION" TEXT, "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ORUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -572,7 +649,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( "sectorId" BIGINT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -587,7 +665,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUCPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -602,7 +681,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_OCUUPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -617,7 +697,8 @@ CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_ "bSide_ODUFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -884,6 +965,18 @@ SELECT ties_data.create_constraint_if_not_exists( 'ALTER TABLE ties_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( + '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;' +); + +SELECT ties_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");' +); + SELECT ties_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-oam_ManagedElement', 'FK_899B8130A861D1450FC49D3159D8B29C0628A717', @@ -1156,6 +1249,12 @@ CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON tie 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_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_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_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON ties_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_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON ties_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); 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 4748549..025e11e 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 @@ -19,8 +19,11 @@ -- ============LICENSE_END========================================================= -- +BEGIN; + CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; +CREATE EXTENSION IF NOT EXISTS pg_trgm; GRANT USAGE ON SCHEMA topology to :pguser; GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser; @@ -40,1599 +43,1457 @@ CREATE OR REPLACE FUNCTION ties_data.create_constraint_if_not_exists ( RETURNS void AS $$ BEGIN - IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN + 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 EXECUTE constraint_sql; END IF; END; $$ language 'plpgsql'; -CREATE TABLE IF NOT EXISTS ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "name" TEXT, - "REL_FK_C2F5EC33C0760F653CE7263A49C0B697FCA2D542" VARCHAR(511) +CREATE OR REPLACE FUNCTION ties_data.create_enum_type( + schema_name TEXT, type_name TEXT, enum_values TEXT[] +) RETURNS VOID AS $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN + EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', ')); + END IF; +END; +$$ language 'plpgsql'; + +SELECT ties_data.create_enum_type('ties_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']); + +CREATE TABLE IF NOT EXISTS ties_data."responsible_adapter" ( + "id" TEXT, + "hashed_id" BYTEA ); -ALTER TABLE ONLY ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +SELECT ties_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");' +); -CREATE TABLE IF NOT EXISTS ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ( - "id" VARCHAR(511), +SELECT ties_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" ( + "id" TEXT, + "aSide_NFDeployment" TEXT, + "bSide_NearRTRICFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "fdn" TEXT, - "cmId" jsonb, - "REL_FK_26958E3A529C4C8B68A29FDA906F8CD290F66078" VARCHAR(511), - "REL_ID_B7945BFD83380F3E12CF99F2B0F838F364027F92" VARCHAR(511), - "REL_CD_B7945BFD83380F3E12CF99F2B0F838F364027F92" jsonb, - "REL_CD_BF4AAC1A1A910D1182505CABF55BAAE822B2BE59" jsonb, - "REL_CD_AE82DD80D666B52D79A314F8B4EE9B046830D009" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "REL_CD_B7945BFD83380F3E12CF99F2B0F838F364027F92" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "REL_CD_BF4AAC1A1A910D1182505CABF55BAAE822B2BE59" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ALTER COLUMN "REL_CD_AE82DD80D666B52D79A314F8B4EE9B046830D009" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "name" TEXT, - "REL_FK_AB87B417CCD05C332DDD0C60F0C6AB41D38B05E5" VARCHAR(511), - "REL_ID_FC2F6A5A12917357B548C83F4B0C1AD58FA61413" VARCHAR(511), - "REL_CD_CEAD4CCE5250E7D3C64801C8FDDC21F1D87BEC0C" jsonb, - "REL_CD_744530EF4EB1D281D23ADB3DB4CC926DFBE7A60D" jsonb, - "REL_CD_4D1F8113C3096B383582A7A04E68974983B4259E" jsonb, - "REL_FK_8C98B70070BBD11F90F192DDA3ECF6302390E956" VARCHAR(511), - "REL_ID_AFBF10D23507AD3B6408947D2A9AF8465BA7B08C" VARCHAR(511), - "REL_CD_F7E43E0D0F76D6EFED9AB684B84A69E177F591D2" jsonb, - "REL_CD_C4349BB0F0292A3CE7E456E3A4C40C86DD6B15DF" jsonb, - "REL_CD_8AD499BB116F3213C079F643D4B3532035D092D2" jsonb -); - -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_CEAD4CCE5250E7D3C64801C8FDDC21F1D87BEC0C" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_744530EF4EB1D281D23ADB3DB4CC926DFBE7A60D" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_4D1F8113C3096B383582A7A04E68974983B4259E" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_F7E43E0D0F76D6EFED9AB684B84A69E177F591D2" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_C4349BB0F0292A3CE7E456E3A4C40C86DD6B15DF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ALTER COLUMN "REL_CD_8AD499BB116F3213C079F643D4B3532035D092D2" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_AntennaCapability" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "020335B0F627C169E24167748C38FE756FB34AE2" BIGINT, - "nRTAC" BIGINT, - "nRPCI" BIGINT, - "cmId" jsonb, - "fdn" TEXT, - "nCI" BIGINT, - "REL_FK_609963BFEE15FF824280FBE201313C3CDACDDDCE" VARCHAR(511), - "REL_ID_040FC8B06B420BA5708AF4798102D1E65FB4DC61" VARCHAR(511), - "REL_CD_040FC8B06B420BA5708AF4798102D1E65FB4DC61" jsonb, - "REL_CD_66AEF506899F14F936A2F48F9444E2202F5D43F9" jsonb, - "REL_CD_022F8280C0739C614C5F3293E7D8D349A8A10E30" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "REL_CD_040FC8B06B420BA5708AF4798102D1E65FB4DC61" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "REL_CD_66AEF506899F14F936A2F48F9444E2202F5D43F9" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ALTER COLUMN "REL_CD_022F8280C0739C614C5F3293E7D8D349A8A10E30" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ( + "id" TEXT, "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ( + "id" TEXT, + "aSide_NFDeployment" TEXT, + "bSide_OCloudNamespace" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "gNBDUId" BIGINT, - "cmId" jsonb, - "3786A6CA64C9422F9E7FC35B7B039F345BBDDA65" TEXT, - "gNBIdLength" INTEGER, - "dUpLMNId" jsonb, - "gNBId" BIGINT, - "REL_FK_48B14FA5B787C6398AD1DE5EE670AD0D2A2CB36F" VARCHAR(511), - "REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B" VARCHAR(511), - "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" jsonb, - "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" jsonb, - "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ( - "id" VARCHAR(511), - "aSide_B0FD0521695A211BFF76F413A31F28CBA32E57ED" VARCHAR(511), - "bSide_84EF1134719BB6FCF33A94FF770311FC722BCF41" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NFDeployment" ( + "id" TEXT, + "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb, + "REL_FK_comprised-by-cloudifiedNF" TEXT, + "REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" TEXT, + "REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT" jsonb, + "REL_FK_serviced-managedElement" TEXT, + "REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" TEXT, + "REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb, + "REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" jsonb ); -ALTER TABLE ONLY ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ( - "id" VARCHAR(511), - "aSide_AntennaCapability" VARCHAR(511), - "bSide_AntennaModule" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); +ALTER TABLE ONLY ties_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 ties_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 ties_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 ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NFDeployment" ALTER COLUMN "REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ( + "id" TEXT, + "aSide_NodeCluster" TEXT, + "bSide_OCloudSite" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "eUtranFqBands" jsonb, - "fdn" TEXT, - "geranFqBands" jsonb, - "nRFqBands" jsonb, - "cmId" jsonb, - "REL_FK_used-by-lteSectorCarrier" VARCHAR(511) + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ( - "id" VARCHAR(511), - "totalTilt" BIGINT, - "cmId" jsonb, - "antennaBeamWidth" jsonb, - "positionWithinSector" TEXT, - "geo-location" geography, - "mechanicalAntennaBearing" BIGINT, - "fdn" TEXT, - "electricalAntennaTilt" BIGINT, - "mechanicalAntennaTilt" BIGINT, - "antennaModelNumber" TEXT, +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_NodeCluster" ( + "id" TEXT, + "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "REL_FK_grouped-by-sector" VARCHAR(511), - "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" VARCHAR(511), - "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, - "REL_FK_installed-at-site" VARCHAR(511), - "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" VARCHAR(511), - "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, - "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, - "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ( - "id" VARCHAR(511), - "aSide_AntennaModule" VARCHAR(511), - "bSide_AntennaModule" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ( + "id" TEXT, + "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb, + "REL_FK_deployed-on-nodeCluster" TEXT, + "REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" TEXT, + "REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, + "REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb ); -ALTER TABLE ONLY ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ( - "id" VARCHAR(511), - "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" VARCHAR(511), - "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ( - "id" VARCHAR(511), - "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" VARCHAR(511), - "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); +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 ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" ALTER COLUMN "REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "geo-location" geography, "name" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "REL_FK_realised-managedElement" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION" VARCHAR(511), - "REL_CD_8F561B5FB3CF928F2C4046CE1A7C37A8FE06B9A7" jsonb, - "REL_CD_CCEBD4C63B90BD1764CB5A15C282D6CDBDF0B1F2" jsonb, - "REL_CD_21E2495C31F0DBF735976C90F4CD10D1215190E1" jsonb, - "REL_FK_comprised-by-cloudNativeSystem" VARCHAR(511), - "REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION" VARCHAR(511), - "REL_CD_39262797D0119611B8459ECF46754A074711E485" jsonb, - "REL_CD_026A1F92A7D93728916AF3DCC2C013FB79E29D07" jsonb, - "REL_CD_D32E90288E1982363B2BD8DA9D2E90AA16F71575" jsonb, - "REL_FK_deployed-on-namespace" VARCHAR(511), - "REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" VARCHAR(511), - "REL_CD_sourceIds_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" jsonb, - "REL_CD_classifiers_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" jsonb, - "REL_CD_decorators_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" jsonb -); - -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_8F561B5FB3CF928F2C4046CE1A7C37A8FE06B9A7" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_CCEBD4C63B90BD1764CB5A15C282D6CDBDF0B1F2" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_21E2495C31F0DBF735976C90F4CD10D1215190E1" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_39262797D0119611B8459ECF46754A074711E485" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_026A1F92A7D93728916AF3DCC2C013FB79E29D07" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_D32E90288E1982363B2BD8DA9D2E90AA16F71575" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_sourceIds_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_classifiers_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ALTER COLUMN "REL_CD_decorators_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "name" TEXT, - "REL_FK_deployed-managedElement" VARCHAR(511) + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "name" TEXT, - "geo-location" geography -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-cloud_OCloudSite" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ( - "id" VARCHAR(511), - "fdn" TEXT, - "eNBId" BIGINT, - "cmId" jsonb, - "eNodeBPlmnId" jsonb, +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" ( + "id" TEXT, + "antennaBeamWidth" jsonb, + "antennaModelNumber" TEXT, + "azimuth" DECIMAL, + "electricalAntennaTilt" INTEGER, + "geo-location" geography, + "horizontalBeamWidth" DECIMAL, + "mechanicalAntennaBearing" INTEGER, + "mechanicalAntennaTilt" INTEGER, + "positionWithinSector" TEXT, + "totalTilt" INTEGER, + "verticalBeamWidth" DECIMAL, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "REL_FK_managed-by-managedElement" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" VARCHAR(511), - "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb, - "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb, - "REL_FK_realised-by-physicalNetworkAppliance" VARCHAR(511), - "REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE" VARCHAR(511), - "REL_CD_556274C475BA56EE4DEFB691F9037C869223A124" jsonb, - "REL_CD_C6C6D295144A637110DA4E6121BE13F30EFDBEBF" jsonb, - "REL_CD_B369805A0EB24F7C841B0E541A015F85AE2A23B1" jsonb -); - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_556274C475BA56EE4DEFB691F9037C869223A124" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_C6C6D295144A637110DA4E6121BE13F30EFDBEBF" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ALTER COLUMN "REL_CD_B369805A0EB24F7C841B0E541A015F85AE2A23B1" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "earfcn" BIGINT, - "earfcndl" BIGINT, - "duplexType" TEXT, - "fdn" TEXT, - "tac" BIGINT, - "earfcnul" BIGINT, - "cmId" jsonb, - "cellId" BIGINT, - "REL_FK_grouped-by-sector" VARCHAR(511), - "REL_ID_SECTOR_GROUPS_EUTRANCELL" VARCHAR(511), - "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL" jsonb, - "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL" jsonb, - "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL" jsonb, - "REL_FK_provided-by-enodebFunction" VARCHAR(511), - "REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL" VARCHAR(511), - "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb, - "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb, - "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb -); - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '{}'; - - -CREATE TABLE IF NOT EXISTS ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ( - "id" VARCHAR(511), - "aSide_GNBCUCPFunction" VARCHAR(511), - "bSide_CloudNativeApplication" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb + "metadata" jsonb, + "REL_FK_installed-at-site" TEXT, + "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" TEXT, + "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_ANTENNAMODULE" TEXT, + "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" jsonb, + "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb ); -ALTER TABLE ONLY ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "fdn" TEXT, - "pLMNId" jsonb, - "gNBCUName" TEXT, - "gNBId" BIGINT, - "cmId" jsonb, - "gNBIdLength" INTEGER, - "REL_FK_managed-by-managedElement" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" VARCHAR(511), - "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" jsonb, - "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" jsonb -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" 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 ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ( - "id" VARCHAR(511), - "aSide_GNBCUUPFunction" VARCHAR(511), - "bSide_CloudNativeApplication" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb -); +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 ties_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 ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_Site" ( + "id" TEXT, + "geo-location" geography, + "name" TEXT, + "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "gNBId" BIGINT, - "fdn" TEXT, - "cmId" jsonb, - "gNBIdLength" INTEGER, - "REL_FK_managed-by-managedElement" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" VARCHAR(511), - "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" jsonb, - "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 '{}'; -CREATE TABLE IF NOT EXISTS ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ( - "id" VARCHAR(511), - "aSide_GNBDUFunction" VARCHAR(511), - "bSide_CloudNativeApplication" VARCHAR(511), - "CD_sourceIds" jsonb, +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-oam_ManagedElement" ( + "id" TEXT, + "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb, + "REL_FK_deployed-as-cloudifiedNF" TEXT, + "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb, + "REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" jsonb ); -ALTER TABLE ONLY ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "fdn" TEXT, - "gNBId" BIGINT, - "dUpLMNId" jsonb, - "gNBDUId" BIGINT, - "cmId" jsonb, - "gNBIdLength" INTEGER, - "REL_FK_managed-by-managedElement" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" VARCHAR(511), - "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" jsonb, - "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" jsonb -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" 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 ties_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb, - "sectorCarrierType" TEXT, - "essScLocalId" BIGINT, - "fdn" TEXT, - "cmId" jsonb, - "REL_FK_provided-by-enodebFunction" VARCHAR(511), - "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" VARCHAR(511), - "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb, - "REL_FK_used-antennaCapability" VARCHAR(511), - "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511), - "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_FK_used-by-euTranCell" VARCHAR(511), - "REL_ID_EUTRANCELL_USES_LTESECTORCARRIER" VARCHAR(511), - "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER" jsonb, - "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER" jsonb, - "REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER" jsonb -); - -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}'; - -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ALTER COLUMN "REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ( - "id" VARCHAR(511), - "CD_sourceIds" jsonb, +ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "eUtranFqBands" jsonb, + "geranFqBands" jsonb, + "nRFqBands" jsonb, + "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "fdn" TEXT, - "cmId" jsonb, - "REL_FK_deployed-as-cloudNativeSystem" VARCHAR(511), - "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" VARCHAR(511), - "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" jsonb, - "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" jsonb, - "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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-logical_NRCellCU" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellCU" ( + "id" TEXT, + "cellLocalId" INTEGER, + "nCI" BIGINT, + "nRTAC" INTEGER, + "plmnId" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "nCI" BIGINT, - "plmnId" jsonb, - "fdn" TEXT, - "nRTAC" BIGINT, - "cellLocalId" BIGINT, - "cmId" jsonb, - "REL_FK_provided-by-gnbcucpFunction" VARCHAR(511), - "REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" VARCHAR(511), - "REL_CD_sourceIds_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, - "REL_CD_classifiers_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, - "REL_CD_decorators_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb + "metadata" jsonb, + "REL_FK_provided-by-ocucpFunction" TEXT, + "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU" TEXT, + "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb, + "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "REL_CD_classifiers_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ALTER COLUMN "REL_CD_decorators_GNBCUCPFUNCTION_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 ties_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-logical_NRCellDU" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRCellDU" ( + "id" TEXT, + "cellLocalId" INTEGER, + "nCI" BIGINT, + "nRPCI" INTEGER, + "nRTAC" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "nRTAC" BIGINT, - "fdn" TEXT, - "nRPCI" BIGINT, - "nCI" BIGINT, - "cellLocalId" BIGINT, - "cmId" jsonb, - "REL_FK_grouped-by-sector" VARCHAR(511), - "REL_ID_SECTOR_GROUPS_NRCELLDU" VARCHAR(511), + "metadata" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU" TEXT, + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb, + "REL_FK_grouped-by-sector" TEXT, + "REL_ID_SECTOR_GROUPS_NRCELLDU" TEXT, "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" jsonb, "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" jsonb, "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" jsonb, - "REL_FK_provided-by-gnbduFunction" VARCHAR(511), - "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU" VARCHAR(511), - "REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU" jsonb, - "REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRCELLDU" jsonb, - "REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRCELLDU" jsonb + "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 ties_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-logical_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_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 ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ALTER COLUMN "REL_CD_decorators_GNBDUFUNCTION_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 '[]'; -CREATE TABLE IF NOT EXISTS ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NRSectorCarrier" ( + "id" TEXT, + "arfcnDL" INTEGER, + "arfcnUL" INTEGER, + "bSChannelBwDL" INTEGER, + "frequencyDL" INTEGER, + "frequencyUL" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "frequencyDL" BIGINT, - "arfcnDL" BIGINT, - "fdn" TEXT, - "essScLocalId" BIGINT, - "frequencyUL" BIGINT, - "cmId" jsonb, - "arfcnUL" BIGINT, - "REL_FK_used-by-nrCellDu" VARCHAR(511), - "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" VARCHAR(511), + "metadata" jsonb, + "REL_FK_used-by-nrCellDu" TEXT, + "REL_ID_NRCELLDU_USES_NRSECTORCARRIER" TEXT, "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" jsonb, "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" jsonb, - "REL_FK_provided-by-gnbduFunction" VARCHAR(511), - "REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" VARCHAR(511), - "REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, - "REL_FK_used-antennaCapability" VARCHAR(511), - "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511), + "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb, + "REL_FK_used-antennaCapability" TEXT, + "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" TEXT, "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, - "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb + "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" TEXT, + "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb, + "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb ); -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 ties_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 ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" 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 ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER" 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 ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" 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_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 '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ( + "id" TEXT, + "nearRtRicId" BIGINT, + "pLMNId" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "name" TEXT, - "REL_FK_deployed-on-nodeCluster" VARCHAR(511), - "REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER" VARCHAR(511), - "REL_CD_sourceIds_NAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, - "REL_CD_classifiers_NAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb, - "REL_CD_decorators_NAMESPACE_DEPLOYED_ON_NODECLUSTER" jsonb + "metadata" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "REL_CD_sourceIds_NAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "REL_CD_classifiers_NAMESPACE_DEPLOYED_ON_NODECLUSTER" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ALTER COLUMN "REL_CD_decorators_NAMESPACE_DEPLOYED_ON_NODECLUSTER" 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 ties_data."o-ran-smo-teiv-ran_NearRTRICFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "gNBCUName" TEXT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "pLMNId" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "name" TEXT, - "REL_FK_located-at-cloudSite" VARCHAR(511), - "REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE" VARCHAR(511), - "REL_CD_sourceIds_NODECLUSTER_LOCATED_AT_CLOUDSITE" jsonb, - "REL_CD_classifiers_NODECLUSTER_LOCATED_AT_CLOUDSITE" jsonb, - "REL_CD_decorators_NODECLUSTER_LOCATED_AT_CLOUDSITE" jsonb + "metadata" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "REL_CD_sourceIds_NODECLUSTER_LOCATED_AT_CLOUDSITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "REL_CD_classifiers_NODECLUSTER_LOCATED_AT_CLOUDSITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ALTER COLUMN "REL_CD_decorators_NODECLUSTER_LOCATED_AT_CLOUDSITE" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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 ties_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" ( + "id" TEXT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "pLMNIdList" jsonb, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "geo-location" geography, - "name" TEXT, - "cmId" jsonb, - "type" TEXT, - "REL_FK_installed-at-site" VARCHAR(511), - "REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" VARCHAR(511), - "REL_CD_sourceIds_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" jsonb, - "REL_CD_classifiers_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" jsonb, - "REL_CD_decorators_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" jsonb + "metadata" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "REL_CD_sourceIds_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "REL_CD_classifiers_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ALTER COLUMN "REL_CD_decorators_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" 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 ties_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; -CREATE TABLE IF NOT EXISTS ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ODUFunction" ( + "id" TEXT, + "dUpLMNId" jsonb, + "gNBDUId" BIGINT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "azimuth" DECIMAL, - "geo-location" geography, - "sectorId" BIGINT + "metadata" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-equipment_Site" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ORUFunction" ( + "id" TEXT, + "oruId" BIGINT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "name" TEXT, - "geo-location" geography, - "cmId" jsonb + "metadata" jsonb, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION" TEXT, + "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb, + "REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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 '[]'; -CREATE TABLE IF NOT EXISTS ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ( - "id" VARCHAR(511), - "aSide_TestEntityA" VARCHAR(511), - "bSide_TestEntityB" VARCHAR(511), +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_Sector" ( + "id" TEXT, + "azimuth" DECIMAL, + "geo-location" geography, + "sectorId" BIGINT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 '[]'; -CREATE TABLE IF NOT EXISTS ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ( - "id" VARCHAR(511), - "aSide_TestEntityA" VARCHAR(511), - "bSide_TestEntityB" VARCHAR(511), +ALTER TABLE ONLY ties_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" ( + "id" TEXT, + "aSide_NFDeployment" TEXT, + "bSide_OCUCPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, - "CD_decorators" jsonb + "CD_decorators" jsonb, + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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 ties_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-ran-logical_TestEntityA" ( - "id" VARCHAR(511), +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ( + "id" TEXT, + "aSide_NFDeployment" TEXT, + "bSide_OCUUPFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "attribute1" TEXT + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ( - "id" VARCHAR(511), +ALTER TABLE ONLY ties_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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ( + "id" TEXT, + "aSide_NFDeployment" TEXT, + "bSide_ODUFunction" TEXT, "CD_sourceIds" jsonb, "CD_classifiers" jsonb, "CD_decorators" jsonb, - "attribute1" TEXT, - "REL_FK_used-by-testEntityA" VARCHAR(511), - "REL_ID_TESTENTITYA_USES_TESTENTITYB" VARCHAR(511), - "REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB" jsonb, - "REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB" jsonb, - "REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB" jsonb + "metadata" jsonb ); -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_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-ran-logical_TestEntityB" ALTER COLUMN "REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ALTER COLUMN "REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ALTER COLUMN "REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB" SET DEFAULT '{}'; +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -SELECT ties_data.create_constraint_if_not_exists( - '70003c8082751e1832e7bc5c0d83db6d22c4fcdc', - 'PK_TESTENTITYA_GROUPS_TESTENTITYB_id', - 'ALTER TABLE ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ADD CONSTRAINT "PK_TESTENTITYA_GROUPS_TESTENTITYB_id" PRIMARY KEY ("id");' -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -SELECT ties_data.create_constraint_if_not_exists( - '73936e503f137d82d1422c0f08c66c7ff8b90209', - 'PK_TESTENTITYA_PROVIDES_TESTENTITYB_id', - 'ALTER TABLE ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ADD CONSTRAINT "PK_TESTENTITYA_PROVIDES_TESTENTITYB_id" PRIMARY KEY ("id");' +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ( + "id" TEXT, + "aSide_AntennaModule" TEXT, + "bSide_NRCellDU" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "metadata" jsonb ); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_TestEntityA', - 'PK_TestEntityA_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" ADD CONSTRAINT "PK_TestEntityA_id" PRIMARY KEY ("id");' -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_TestEntityB', - 'PK_TestEntityB_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ADD CONSTRAINT "PK_TestEntityB_id" PRIMARY KEY ("id");' -); +ALTER TABLE ONLY ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -SELECT ties_data.create_constraint_if_not_exists( - '70003c8082751e1832e7bc5c0d83db6d22c4fcdc', - 'FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA', - 'ALTER TABLE ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" (id) ON DELETE CASCADE;' -); +ALTER TABLE ONLY ties_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( - '70003c8082751e1832e7bc5c0d83db6d22c4fcdc', - 'FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB', - 'ALTER TABLE ties_data."70003c8082751e1832e7bc5c0d83db6d22c4fcdc" ADD CONSTRAINT "FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" (id) ON DELETE CASCADE;' + '3C2E2CE7BDF8321BC824B6318B190690F58DBB82', + 'PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A', + 'ALTER TABLE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" ADD CONSTRAINT "PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - '73936e503f137d82d1422c0f08c66c7ff8b90209', - 'FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA', - 'ALTER TABLE ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA" FOREIGN KEY ("aSide_TestEntityA") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_TestEntityA" (id) ON DELETE CASCADE;' + 'CFC235E0404703D1E4454647DF8AAE2C193DB402', + 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE', + 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");' ); SELECT ties_data.create_constraint_if_not_exists( - '73936e503f137d82d1422c0f08c66c7ff8b90209', - 'FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB', - 'ALTER TABLE ties_data."73936e503f137d82d1422c0f08c66c7ff8b90209" ADD CONSTRAINT "FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB" FOREIGN KEY ("bSide_TestEntityB") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_TestEntityB', - 'FK_TestEntityB_REL_FK_used-by-testEntityA', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_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-logical_TestEntityA" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_TestEntityB', - 'UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_TestEntityB" ADD CONSTRAINT "UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB" UNIQUE ("REL_ID_TESTENTITYA_USES_TESTENTITYB");' -); - -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS ties_data."341622dca4e0350289717b52df5883edc3fa0280" ( - "id" VARCHAR(511), - "fdn" TEXT, - "CD_sourceIds" jsonb, - "CD_classifiers" jsonb, - "CD_decorators" jsonb + '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 ONLY ties_data."341622dca4e0350289717b52df5883edc3fa0280" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."341622dca4e0350289717b52df5883edc3fa0280" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -ALTER TABLE ONLY ties_data."341622dca4e0350289717b52df5883edc3fa0280" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; - SELECT ties_data.create_constraint_if_not_exists( - 'ef701af8e1445ed5d377664ba1d3d1c645e31639', - 'PK_F568C5029499EE188A168886B2EF09C0D1FAAA9F', - 'ALTER TABLE ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ADD CONSTRAINT "PK_F568C5029499EE188A168886B2EF09C0D1FAAA9F" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'fa2dceaf53e045c136ce9db9bc5faae65a29fa4d', - 'PK_19E2CBE3A8BBA12A7D9EC9923573BC0A65B1EC4A', - 'ALTER TABLE ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ADD CONSTRAINT "PK_19E2CBE3A8BBA12A7D9EC9923573BC0A65B1EC4A" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '5f8facd51b2bbddc90d9dee9be697907441892d0', - 'PK_F52E445B46B712C0D9014D194AB039C205E69818', - 'ALTER TABLE ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ADD CONSTRAINT "PK_F52E445B46B712C0D9014D194AB039C205E69818" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '300672c8a708d6af0b9af2f9accdff5e6e005721', - 'PK_CCB39BED50FEF60B1B1F86A7C938BE89B7D90D38', - 'ALTER TABLE ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ADD CONSTRAINT "PK_CCB39BED50FEF60B1B1F86A7C938BE89B7D90D38" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'bc563e4310b0538e6bdd35f52684160af5b23671', - 'PK_77881E9D6F659316F836050DDC6E26FA4DE425EE', - 'ALTER TABLE ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ADD CONSTRAINT "PK_77881E9D6F659316F836050DDC6E26FA4DE425EE" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '3fdb9cd7557edf559a0e4de88df220e7545884b5', - 'PK_079D5D67E043B09F9C7CD4F6EA1DB12688D43F69', - 'ALTER TABLE ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ADD CONSTRAINT "PK_079D5D67E043B09F9C7CD4F6EA1DB12688D43F69" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'f86057a8762a50b1c7fb07af9d5c001bffaefd15', - 'PK_5D1AC46C58E1FE44FB266F86CE79B3AEBE1D92B3', - 'ALTER TABLE ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ADD CONSTRAINT "PK_5D1AC46C58E1FE44FB266F86CE79B3AEBE1D92B3" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '5b8a47d4a8297a0a1d31e091af06e26d25ef6caf', - 'PK_5b8a47d4a8297a0a1d31e091af06e26d25ef6caf_id', - 'ALTER TABLE ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ADD CONSTRAINT "PK_5b8a47d4a8297a0a1d31e091af06e26d25ef6caf_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '88f1bd76c7a935fb505cf235e6819f46c55ec98a', - 'PK_AntennaCapability_id', - 'ALTER TABLE ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ADD CONSTRAINT "PK_AntennaCapability_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'f8caf5ebe876c3001d67efe06e4d83abf0babe31', - 'PK_AntennaModule_id', - 'ALTER TABLE ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ADD CONSTRAINT "PK_AntennaModule_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'PK_CloudNativeApplication_id', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "PK_CloudNativeApplication_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '163276fa439cdfccabb80f7acacb6fa638e8d314', - 'PK_CloudNativeSystem_id', - 'ALTER TABLE ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ADD CONSTRAINT "PK_CloudNativeSystem_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_CloudSite', - 'PK_CloudSite_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ADD CONSTRAINT "PK_CloudSite_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_ENodeBFunction', - 'PK_ENodeBFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ADD CONSTRAINT "PK_ENodeBFunction_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_EUtranCell', - 'PK_EUtranCell_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ADD CONSTRAINT "PK_EUtranCell_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7', - 'PK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id', - 'ALTER TABLE ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ADD CONSTRAINT "PK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'c4a425179d3089b5288fdf059079d0ea26977f0f', - 'PK_GNBCUCPFunction_id', - 'ALTER TABLE ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ADD CONSTRAINT "PK_GNBCUCPFunction_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '70a4a84bca01ea022ab24d8cb82422c572922675', - 'PK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id', - 'ALTER TABLE ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ADD CONSTRAINT "PK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb', - 'PK_GNBCUUPFunction_id', - 'ALTER TABLE ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ADD CONSTRAINT "PK_GNBCUUPFunction_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '10484f157f490eb5b27e40dbfaf4d5f2be17c57c', - 'PK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id', - 'ALTER TABLE ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ADD CONSTRAINT "PK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_GNBDUFunction', - 'PK_GNBDUFunction_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ADD CONSTRAINT "PK_GNBDUFunction_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'PK_LTESectorCarrier_id', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "PK_LTESectorCarrier_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-oam_ManagedElement', - 'PK_ManagedElement_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ADD CONSTRAINT "PK_ManagedElement_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellCU', - 'PK_NRCellCU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ADD CONSTRAINT "PK_NRCellCU_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellDU', - 'PK_NRCellDU_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ADD CONSTRAINT "PK_NRCellDU_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'PK_NRSectorCarrier_id', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "PK_NRSectorCarrier_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_Namespace', - 'PK_Namespace_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ADD CONSTRAINT "PK_Namespace_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_NodeCluster', - 'PK_NodeCluster_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ADD CONSTRAINT "PK_NodeCluster_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '57a20807ab3f39c86b0b5bf9a819e0881353fa1e', - 'PK_PhysicalNetworkAppliance_id', - 'ALTER TABLE ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ADD CONSTRAINT "PK_PhysicalNetworkAppliance_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '22174a23af5d5a96143c83ddfa78654df0acb697', - 'PK_Sector_id', - 'ALTER TABLE ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ADD CONSTRAINT "PK_Sector_id" PRIMARY KEY ("id");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-equipment_Site', - 'PK_Site_id', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-equipment_Site" ADD CONSTRAINT "PK_Site_id" PRIMARY KEY ("id");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'ef701af8e1445ed5d377664ba1d3d1c645e31639', - 'FK_54FE608944AC8EFFFBE7E55744B8BA52F6B29ABB', - 'ALTER TABLE ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ADD CONSTRAINT "FK_54FE608944AC8EFFFBE7E55744B8BA52F6B29ABB" FOREIGN KEY ("REL_FK_C2F5EC33C0760F653CE7263A49C0B697FCA2D542") REFERENCES ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'fa2dceaf53e045c136ce9db9bc5faae65a29fa4d', - 'FK_9C091709D40D51DEE4DC87A44695F6EBA2E965DE', - 'ALTER TABLE ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ADD CONSTRAINT "FK_9C091709D40D51DEE4DC87A44695F6EBA2E965DE" FOREIGN KEY ("REL_FK_26958E3A529C4C8B68A29FDA906F8CD290F66078") REFERENCES ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'fa2dceaf53e045c136ce9db9bc5faae65a29fa4d', - 'UNIQUE_9A721779BB5547778B9258ACD73261B9AABFF302', - 'ALTER TABLE ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ADD CONSTRAINT "UNIQUE_9A721779BB5547778B9258ACD73261B9AABFF302" UNIQUE ("REL_ID_B7945BFD83380F3E12CF99F2B0F838F364027F92");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '5f8facd51b2bbddc90d9dee9be697907441892d0', - 'FK_899FCB466B0BBCC040E945A3E746F5DE53CCCB29', - 'ALTER TABLE ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ADD CONSTRAINT "FK_899FCB466B0BBCC040E945A3E746F5DE53CCCB29" FOREIGN KEY ("REL_FK_AB87B417CCD05C332DDD0C60F0C6AB41D38B05E5") REFERENCES ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '5f8facd51b2bbddc90d9dee9be697907441892d0', - 'UNIQUE_3DDA71C08F678AA7303FE0BD127CC27A80D1DDED', - 'ALTER TABLE ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ADD CONSTRAINT "UNIQUE_3DDA71C08F678AA7303FE0BD127CC27A80D1DDED" UNIQUE ("REL_ID_FC2F6A5A12917357B548C83F4B0C1AD58FA61413");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '5f8facd51b2bbddc90d9dee9be697907441892d0', - 'FK_E33FB71E6FAC69C92ADEEC55E63D401D21DF91AE', - 'ALTER TABLE ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ADD CONSTRAINT "FK_E33FB71E6FAC69C92ADEEC55E63D401D21DF91AE" FOREIGN KEY ("REL_FK_8C98B70070BBD11F90F192DDA3ECF6302390E956") REFERENCES ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '5f8facd51b2bbddc90d9dee9be697907441892d0', - 'UNIQUE_287E65679DC2108F55F43D62A4325F6DECF372E1', - 'ALTER TABLE ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ADD CONSTRAINT "UNIQUE_287E65679DC2108F55F43D62A4325F6DECF372E1" UNIQUE ("REL_ID_AFBF10D23507AD3B6408947D2A9AF8465BA7B08C");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '300672c8a708d6af0b9af2f9accdff5e6e005721', - 'FK_D43434F9F6FD1C14BE14A0EEDA4C9918B26E82F1', - 'ALTER TABLE ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ADD CONSTRAINT "FK_D43434F9F6FD1C14BE14A0EEDA4C9918B26E82F1" FOREIGN KEY ("REL_FK_609963BFEE15FF824280FBE201313C3CDACDDDCE") REFERENCES ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '300672c8a708d6af0b9af2f9accdff5e6e005721', - 'UNIQUE_4E6028C8AF5DB6D082B612C5CBB5B32A943C0AAD', - 'ALTER TABLE ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ADD CONSTRAINT "UNIQUE_4E6028C8AF5DB6D082B612C5CBB5B32A943C0AAD" UNIQUE ("REL_ID_040FC8B06B420BA5708AF4798102D1E65FB4DC61");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '3fdb9cd7557edf559a0e4de88df220e7545884b5', - 'FK_C5EB2FEB41FDD27A7CED04A3FD665B4BDEF994F5', - 'ALTER TABLE ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ADD CONSTRAINT "FK_C5EB2FEB41FDD27A7CED04A3FD665B4BDEF994F5" FOREIGN KEY ("REL_FK_48B14FA5B787C6398AD1DE5EE670AD0D2A2CB36F") REFERENCES ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '3fdb9cd7557edf559a0e4de88df220e7545884b5', - 'UNIQUE_176E72F1225D7EEFC222D87B6EC4D66DD968BD13', - 'ALTER TABLE ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ADD CONSTRAINT "UNIQUE_176E72F1225D7EEFC222D87B6EC4D66DD968BD13" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'f86057a8762a50b1c7fb07af9d5c001bffaefd15', - 'FK_BFC9C18D6DBCD1FFC021B021CF31444EAA1FEDCA', - 'ALTER TABLE ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ADD CONSTRAINT "FK_BFC9C18D6DBCD1FFC021B021CF31444EAA1FEDCA" FOREIGN KEY ("aSide_B0FD0521695A211BFF76F413A31F28CBA32E57ED") REFERENCES ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'f86057a8762a50b1c7fb07af9d5c001bffaefd15', - 'FK_EADC754A352728E72F7320F69D802725C71EDE3E', - 'ALTER TABLE ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ADD CONSTRAINT "FK_EADC754A352728E72F7320F69D802725C71EDE3E" FOREIGN KEY ("bSide_84EF1134719BB6FCF33A94FF770311FC722BCF41") REFERENCES ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '5b8a47d4a8297a0a1d31e091af06e26d25ef6caf', - 'FK_03713853A2B7ACDC198858CAFBFF355026FEA0B3', - 'ALTER TABLE ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ADD CONSTRAINT "FK_03713853A2B7ACDC198858CAFBFF355026FEA0B3" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '5b8a47d4a8297a0a1d31e091af06e26d25ef6caf', - 'FK_5059CE8D2FEE5A1FAD9E06F4FAAFC148BAEA70E3', - 'ALTER TABLE ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ADD CONSTRAINT "FK_5059CE8D2FEE5A1FAD9E06F4FAAFC148BAEA70E3" FOREIGN KEY ("bSide_AntennaModule") REFERENCES ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '88f1bd76c7a935fb505cf235e6819f46c55ec98a', - 'FK_AntennaCapability_REL_FK_used-by-lteSectorCarrier', - 'ALTER TABLE ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ADD CONSTRAINT "FK_AntennaCapability_REL_FK_used-by-lteSectorCarrier" FOREIGN KEY ("REL_FK_used-by-lteSectorCarrier") REFERENCES ties_data."c88307168935f02fdecc084ea5040bb9db16c701" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'f8caf5ebe876c3001d67efe06e4d83abf0babe31', - 'FK_AntennaModule_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ADD CONSTRAINT "FK_AntennaModule_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'f8caf5ebe876c3001d67efe06e4d83abf0babe31', - 'UNIQUE_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE', - 'ALTER TABLE ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ADD CONSTRAINT "UNIQUE_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'f8caf5ebe876c3001d67efe06e4d83abf0babe31', - 'FK_AntennaModule_REL_FK_installed-at-site', - 'ALTER TABLE ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ADD CONSTRAINT "FK_AntennaModule_REL_FK_installed-at-site" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES ties_data."o-ran-smo-teiv-ran-equipment_Site" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'f8caf5ebe876c3001d67efe06e4d83abf0babe31', - 'UNIQUE_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE', - 'ALTER TABLE ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ADD CONSTRAINT "UNIQUE_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'FK_CloudNativeApplication_REL_FK_realised-managedElement', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "FK_CloudNativeApplication_REL_FK_realised-managedElement" FOREIGN KEY ("REL_FK_realised-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'UNIQUE_DAB3C12479849DA6C222B812C2A8CD1535D0C186', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "UNIQUE_DAB3C12479849DA6C222B812C2A8CD1535D0C186" UNIQUE ("REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'FK_CloudNativeApplication_REL_FK_comprised-by-cloudNativeSystem', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "FK_CloudNativeApplication_REL_FK_comprised-by-cloudNativeSystem" FOREIGN KEY ("REL_FK_comprised-by-cloudNativeSystem") REFERENCES ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'UNIQUE_F2774BC0806E925ADA0B1CAA50B5A41DFB7BF79A', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "UNIQUE_F2774BC0806E925ADA0B1CAA50B5A41DFB7BF79A" UNIQUE ("REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'FK_CloudNativeApplication_REL_FK_deployed-on-namespace', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "FK_CloudNativeApplication_REL_FK_deployed-on-namespace" FOREIGN KEY ("REL_FK_deployed-on-namespace") REFERENCES ties_data."o-ran-smo-teiv-ran-cloud_Namespace" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'e01fcb87ad2c34ce66c34420255e25aaca270e5e', - 'UNIQUE_1A317D31DA93B0CF9A9F8A04077B0F60ABCFF49C', - 'ALTER TABLE ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ADD CONSTRAINT "UNIQUE_1A317D31DA93B0CF9A9F8A04077B0F60ABCFF49C" UNIQUE ("REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE");' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - '163276fa439cdfccabb80f7acacb6fa638e8d314', - 'FK_CloudNativeSystem_REL_FK_deployed-managedElement', - 'ALTER TABLE ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ADD CONSTRAINT "FK_CloudNativeSystem_REL_FK_deployed-managedElement" FOREIGN KEY ("REL_FK_deployed-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_ENodeBFunction', - 'FK_ENodeBFunction_REL_FK_managed-by-managedElement', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ADD CONSTRAINT "FK_ENodeBFunction_REL_FK_managed-by-managedElement" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_ENodeBFunction', - 'UNIQUE_F33037EE8037D0606D15FFB45EE8A27FD6DE30EE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ADD CONSTRAINT "UNIQUE_F33037EE8037D0606D15FFB45EE8A27FD6DE30EE" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_ENodeBFunction', - 'FK_ENodeBFunction_REL_FK_realised-by-physicalNetworkAppliance', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ADD CONSTRAINT "FK_ENodeBFunction_REL_FK_realised-by-physicalNetworkAppliance" FOREIGN KEY ("REL_FK_realised-by-physicalNetworkAppliance") REFERENCES ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_ENodeBFunction', - 'UNIQUE_6964DA7D7CC1F79A3DB8B43E5F77E42DF8DFBF73', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ADD CONSTRAINT "UNIQUE_6964DA7D7CC1F79A3DB8B43E5F77E42DF8DFBF73" UNIQUE ("REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_EUtranCell', - 'FK_EUtranCell_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ADD CONSTRAINT "FK_EUtranCell_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" (id) ON DELETE CASCADE;' + '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");' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_EUtranCell', - 'UNIQUE_EUtranCell_REL_ID_SECTOR_GROUPS_EUTRANCELL', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ADD CONSTRAINT "UNIQUE_EUtranCell_REL_ID_SECTOR_GROUPS_EUTRANCELL" UNIQUE ("REL_ID_SECTOR_GROUPS_EUTRANCELL");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_EUtranCell', - 'FK_EUtranCell_REL_FK_provided-by-enodebFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ADD CONSTRAINT "FK_EUtranCell_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_EUtranCell', - 'UNIQUE_EUtranCell_REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ADD CONSTRAINT "UNIQUE_EUtranCell_REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7', - 'FK_B2DDDC542E95DD31826EECEBBF67FD01DAF48833', - 'ALTER TABLE ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ADD CONSTRAINT "FK_B2DDDC542E95DD31826EECEBBF67FD01DAF48833" FOREIGN KEY ("aSide_GNBCUCPFunction") REFERENCES ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7', - 'FK_95C3AD1FCFBD310B9947B9B622CA8E0FC2135DC5', - 'ALTER TABLE ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ADD CONSTRAINT "FK_95C3AD1FCFBD310B9947B9B622CA8E0FC2135DC5" FOREIGN KEY ("bSide_CloudNativeApplication") REFERENCES ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'c4a425179d3089b5288fdf059079d0ea26977f0f', - 'FK_GNBCUCPFunction_REL_FK_managed-by-managedElement', - 'ALTER TABLE ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ADD CONSTRAINT "FK_GNBCUCPFunction_REL_FK_managed-by-managedElement" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - 'c4a425179d3089b5288fdf059079d0ea26977f0f', - 'UNIQUE_249F73FF1F4316A56DEF4424FA43C2064FFBE4DD', - 'ALTER TABLE ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ADD CONSTRAINT "UNIQUE_249F73FF1F4316A56DEF4424FA43C2064FFBE4DD" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION");' + '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;' ); SELECT ties_data.create_constraint_if_not_exists( - '70a4a84bca01ea022ab24d8cb82422c572922675', - 'FK_F3346189A1BB0DA705219A4136349DF50AE8AA33', - 'ALTER TABLE ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ADD CONSTRAINT "FK_F3346189A1BB0DA705219A4136349DF50AE8AA33" FOREIGN KEY ("aSide_GNBCUUPFunction") REFERENCES ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" (id) ON DELETE CASCADE;' + '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;' ); -SELECT ties_data.create_constraint_if_not_exists( - '70a4a84bca01ea022ab24d8cb82422c572922675', - 'FK_36215EA9FC5F31CC0F131E526A84A54CB006C66B', - 'ALTER TABLE ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ADD CONSTRAINT "FK_36215EA9FC5F31CC0F131E526A84A54CB006C66B" FOREIGN KEY ("bSide_CloudNativeApplication") REFERENCES ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb', - 'FK_GNBCUUPFunction_REL_FK_managed-by-managedElement', - 'ALTER TABLE ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ADD CONSTRAINT "FK_GNBCUUPFunction_REL_FK_managed-by-managedElement" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb', - 'UNIQUE_BDB349CDF0C4055902881ECCB71F460AE1DD323E', - 'ALTER TABLE ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ADD CONSTRAINT "UNIQUE_BDB349CDF0C4055902881ECCB71F460AE1DD323E" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION");' -); +CREATE INDEX IF NOT EXISTS "IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80" ON ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82" USING GIN ("CD_decorators"); -SELECT ties_data.create_constraint_if_not_exists( - '10484f157f490eb5b27e40dbfaf4d5f2be17c57c', - 'FK_69C6800CC81731E475893CC85582971C7530C98E', - 'ALTER TABLE ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ADD CONSTRAINT "FK_69C6800CC81731E475893CC85582971C7530C98E" FOREIGN KEY ("aSide_GNBDUFunction") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '10484f157f490eb5b27e40dbfaf4d5f2be17c57c', - 'FK_CA6721EE0944CBBB8E071CEA630162ABD7DFF2DA', - 'ALTER TABLE ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ADD CONSTRAINT "FK_CA6721EE0944CBBB8E071CEA630162ABD7DFF2DA" FOREIGN KEY ("bSide_CloudNativeApplication") REFERENCES ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_GNBDUFunction', - 'FK_GNBDUFunction_REL_FK_managed-by-managedElement', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ADD CONSTRAINT "FK_GNBDUFunction_REL_FK_managed-by-managedElement" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators"); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_GNBDUFunction', - 'UNIQUE_08DFEFAF56EDDE43CBDC336F459D28C6518D3E1D', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ADD CONSTRAINT "UNIQUE_08DFEFAF56EDDE43CBDC336F459D28C6518D3E1D" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION");' -); +CREATE INDEX IF NOT EXISTS "IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_BD96130868B69147B2F87B0D15F5829690DEF454" ON ties_data."o-ran-smo-teiv-cloud_CloudifiedNF" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'FK_LTESectorCarrier_REL_FK_used-antennaCapability', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'FK_LTESectorCarrier_REL_FK_used-by-euTranCell', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_used-by-euTranCell" FOREIGN KEY ("REL_FK_used-by-euTranCell") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C" ON ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE" USING GIN ("CD_decorators"); -SELECT ties_data.create_constraint_if_not_exists( - 'c88307168935f02fdecc084ea5040bb9db16c701', - 'UNIQUE_LTESectorCarrier_REL_ID_EUTRANCELL_USES_LTESECTORCARRIER', - 'ALTER TABLE ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ADD CONSTRAINT "UNIQUE_LTESectorCarrier_REL_ID_EUTRANCELL_USES_LTESECTORCARRIER" UNIQUE ("REL_ID_EUTRANCELL_USES_LTESECTORCARRIER");' -); +CREATE INDEX IF NOT EXISTS "IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-oam_ManagedElement', - 'FK_ManagedElement_REL_FK_deployed-as-cloudNativeSystem', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ADD CONSTRAINT "FK_ManagedElement_REL_FK_deployed-as-cloudNativeSystem" FOREIGN KEY ("REL_FK_deployed-as-cloudNativeSystem") REFERENCES ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-oam_ManagedElement', - 'UNIQUE_ADD7C124AEF822CB0293FC75E39449DC1AD097E5', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ADD CONSTRAINT "UNIQUE_ADD7C124AEF822CB0293FC75E39449DC1AD097E5" UNIQUE ("REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM");' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellCU', - 'FK_NRCellCU_REL_FK_provided-by-gnbcucpFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ADD CONSTRAINT "FK_NRCellCU_REL_FK_provided-by-gnbcucpFunction" FOREIGN KEY ("REL_FK_provided-by-gnbcucpFunction") REFERENCES ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellCU', - 'UNIQUE_NRCellCU_REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ADD CONSTRAINT "UNIQUE_NRCellCU_REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" UNIQUE ("REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellDU', - 'FK_NRCellDU_REL_FK_grouped-by-sector', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ADD CONSTRAINT "FK_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_46CDB369134F042EC021F7496DF721B49A9D43C0" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT"); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellDU', - 'UNIQUE_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ADD CONSTRAINT "UNIQUE_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellDU', - 'FK_NRCellDU_REL_FK_provided-by-gnbduFunction', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ADD CONSTRAINT "FK_NRCellDU_REL_FK_provided-by-gnbduFunction" FOREIGN KEY ("REL_FK_provided-by-gnbduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-logical_NRCellDU', - 'UNIQUE_NRCellDU_REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ADD CONSTRAINT "UNIQUE_NRCellDU_REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU" UNIQUE ("REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU");' -); +CREATE INDEX IF NOT EXISTS "IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC" ON ties_data."o-ran-smo-teiv-cloud_NFDeployment" USING GIN ("REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT"); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'FK_NRSectorCarrier_REL_FK_used-by-nrCellDu', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "FK_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'UNIQUE_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "UNIQUE_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'FK_NRSectorCarrier_REL_FK_provided-by-gnbduFunction', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "FK_NRSectorCarrier_REL_FK_provided-by-gnbduFunction" FOREIGN KEY ("REL_FK_provided-by-gnbduFunction") REFERENCES ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322" ON ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE" USING GIN ("CD_decorators"); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'UNIQUE_872BE05F1989443F2595D99A77BC03733B2D1E2F', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "UNIQUE_872BE05F1989443F2595D99A77BC03733B2D1E2F" UNIQUE ("REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER");' -); +CREATE INDEX IF NOT EXISTS "IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'FK_NRSectorCarrier_REL_FK_used-antennaCapability', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "FK_NRSectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D" ON ties_data."o-ran-smo-teiv-cloud_NodeCluster" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '39a335dca201ef99ae06f4ffd1908b534f8c6c39', - 'UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991', - 'ALTER TABLE ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ADD CONSTRAINT "UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_Namespace', - 'FK_Namespace_REL_FK_deployed-on-nodeCluster', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ADD CONSTRAINT "FK_Namespace_REL_FK_deployed-on-nodeCluster" FOREIGN KEY ("REL_FK_deployed-on-nodeCluster") REFERENCES ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_Namespace', - 'UNIQUE_Namespace_REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ADD CONSTRAINT "UNIQUE_Namespace_REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER" UNIQUE ("REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER");' -); +CREATE INDEX IF NOT EXISTS "IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417" ON ties_data."o-ran-smo-teiv-cloud_OCloudNamespace" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_NodeCluster', - 'FK_NodeCluster_REL_FK_located-at-cloudSite', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ADD CONSTRAINT "FK_NodeCluster_REL_FK_located-at-cloudSite" FOREIGN KEY ("REL_FK_located-at-cloudSite") REFERENCES ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" (id) ON DELETE CASCADE;' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran-cloud_NodeCluster', - 'UNIQUE_NodeCluster_REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE', - 'ALTER TABLE ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ADD CONSTRAINT "UNIQUE_NodeCluster_REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE" UNIQUE ("REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - '57a20807ab3f39c86b0b5bf9a819e0881353fa1e', - 'FK_PhysicalNetworkAppliance_REL_FK_installed-at-site', - 'ALTER TABLE ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ADD CONSTRAINT "FK_PhysicalNetworkAppliance_REL_FK_installed-at-site" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES ties_data."o-ran-smo-teiv-ran-equipment_Site" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - '57a20807ab3f39c86b0b5bf9a819e0881353fa1e', - 'UNIQUE_A9110A77514C472452AC80053A8010FBAF481AD0', - 'ALTER TABLE ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ADD CONSTRAINT "UNIQUE_A9110A77514C472452AC80053A8010FBAF481AD0" UNIQUE ("REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE");' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - '5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6', - 'PK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_id', - 'ALTER TABLE ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ADD CONSTRAINT "PK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_id" PRIMARY KEY ("id");' -); +CREATE INDEX IF NOT EXISTS "IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6', - 'FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_aSide_AntennaModule', - 'ALTER TABLE ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ADD CONSTRAINT "FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_aSide_AntennaModule" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0" ON ties_data."o-ran-smo-teiv-cloud_OCloudSite" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - '5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6', - 'FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_bSide_AntennaModule', - 'ALTER TABLE ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ADD CONSTRAINT "FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_bSide_AntennaModule" FOREIGN KEY ("bSide_AntennaModule") REFERENCES ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" (id) ON DELETE CASCADE;' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - '341622dca4e0350289717b52df5883edc3fa0280', - 'PK_2673E8FB17E57FD56D5E897DA13412B9165B90AA', - 'ALTER TABLE ties_data."341622dca4e0350289717b52df5883edc3fa0280" ADD CONSTRAINT "PK_2673E8FB17E57FD56D5E897DA13412B9165B90AA" PRIMARY KEY ("id");' -); +CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'cd39d44beed963d50df42cd301e63d288f911c97', - 'PK_E3722EAF721B41FACDCF065D2017267CE2C90BED', - 'ALTER TABLE ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ADD CONSTRAINT "PK_E3722EAF721B41FACDCF065D2017267CE2C90BED" PRIMARY KEY ("id");' -); +CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'cd39d44beed963d50df42cd301e63d288f911c97', - 'FK_00AE9B9921E38ACFEE934695787FA8794817A6ED', - 'ALTER TABLE ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ADD CONSTRAINT "FK_00AE9B9921E38ACFEE934695787FA8794817A6ED" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES ties_data."341622dca4e0350289717b52df5883edc3fa0280" (id) ON DELETE CASCADE;' -); +CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops); -SELECT ties_data.create_constraint_if_not_exists( - 'cd39d44beed963d50df42cd301e63d288f911c97', - 'FK_68EED3C83D2C93559F7A61E7D05B4363CDF1DB8F', - 'ALTER TABLE ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ADD CONSTRAINT "FK_68EED3C83D2C93559F7A61E7D05B4363CDF1DB8F" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES ties_data."341622dca4e0350289717b52df5883edc3fa0280" (id) ON DELETE CASCADE;' -); +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"); -SELECT ties_data.create_constraint_if_not_exists( - 'c6f3a3396e9165e886da928c5fe1382fb20dc850', - 'PK_F03D1DD176CD75707BD6217EF652705007C0F272', - 'ALTER TABLE ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ADD CONSTRAINT "PK_F03D1DD176CD75707BD6217EF652705007C0F272" PRIMARY KEY ("id");' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'c6f3a3396e9165e886da928c5fe1382fb20dc850', - 'FK_E19DA712FB443E0212578638DF62281CFD6BFA7A', - 'ALTER TABLE ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ADD CONSTRAINT "FK_E19DA712FB443E0212578638DF62281CFD6BFA7A" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES ties_data."341622dca4e0350289717b52df5883edc3fa0280" (id) ON DELETE CASCADE;' -); +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); -SELECT ties_data.create_constraint_if_not_exists( - 'c6f3a3396e9165e886da928c5fe1382fb20dc850', - 'FK_7772B14325D2340707AF687BF0F70F32914F935D', - 'ALTER TABLE ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ADD CONSTRAINT "FK_7772B14325D2340707AF687BF0F70F32914F935D" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES ties_data."341622dca4e0350289717b52df5883edc3fa0280" (id) ON DELETE CASCADE;' -); +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_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_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_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON ties_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_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON ties_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_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON ties_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_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_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_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_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_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_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_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_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_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_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_NRCellCU_plmnId" ON ties_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_E5930226819982DC0CFC1FA64FB3600647222435" ON ties_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_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_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_5D761303176D3B9338784DFBEE0CEC51046ADC30" ON ties_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_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON ties_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_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_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_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF" ON ties_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_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_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON ties_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_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON ties_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_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_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_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON ties_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_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_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON ties_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_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_5AB1D780E57D940C42BAD29772E9E2B6C63498A0" ON ties_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_E4E40B26C322AF63A662706AF8B0B36E1043B793" ON ties_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_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_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_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_B10FD045A6C3E169953CCC38CC2D801FCE15A75F" ON ties_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_84A29F8571860AC5A7BD1A99923485ECB6A3939D" ON ties_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_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_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_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_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON ties_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_6C81B2BBFCFE94C87598869A2099E04571202BA7" ON ties_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_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_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_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_ADD3393C27589066C4993A3491436C6FB57A539F" ON ties_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_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON ties_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_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_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_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_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24" ON ties_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_2A5AAAD13FDCFF7F2958005C22937366F6604A0D" ON ties_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_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_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_7B916E1753D2860DF434831CF1E9697ED9973C8F" ON ties_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_19C19556F9714850389595E0A16218FA229205FE" ON ties_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_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_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_0867A1E865A904F4BB513948DAEB60412BE67DF3" ON ties_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_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_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F" ON ties_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_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_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835" ON ties_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_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_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON ties_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 ties_data."o-ran-smo-teiv-ran_ODUFunction"; + +ANALYZE ties_data."o-ran-smo-teiv-equipment_Site"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE"; + +ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_NodeCluster"; + +ANALYZE ties_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_OCUCPFunction"; + +ANALYZE ties_data."o-ran-smo-teiv-oam_ManagedElement"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellDU"; + +ANALYZE ties_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_NearRTRICFunction"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_CloudifiedNF"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDeployment"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability"; + +ANALYZE ties_data."3C2E2CE7BDF8321BC824B6318B190690F58DBB82"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE"; + +ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_ORUFunction"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_NRCellCU"; + +ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_OCUUPFunction"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_NRSectorCarrier"; + +ANALYZE ties_data."o-ran-smo-teiv-ran_Sector"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudSite"; + +ANALYZE ties_data."o-ran-smo-teiv-cloud_OCloudNamespace"; + +COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql b/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql index 9a0f9e3..4e96026 100644 --- a/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql +++ b/teiv/src/test/resources/pgsqlschema/01_init-oran-smo-teiv-model-v1.sql @@ -29,11 +29,6 @@ SET default_table_access_method = heap; SET ROLE :pguser; -CREATE TABLE IF NOT EXISTS ties_model.execution_status ( - "schema" VARCHAR(127) PRIMARY KEY, - "status" VARCHAR(127) -); - CREATE TABLE IF NOT EXISTS ties_model.hash_info ( "name" TEXT PRIMARY KEY, "hashedValue" VARCHAR(63) NOT NULL, @@ -53,6 +48,7 @@ CREATE TABLE IF NOT EXISTS ties_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 ); @@ -79,9 +75,6 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE ); --- Update model schema exec status -INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success'); - COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; CD_classifiers CD_classifiers COLUMN CD_decorators CD_decorators COLUMN @@ -355,6 +348,23 @@ REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN +REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_metadata_NRCELLDU_USES_NRSECTORCARRIER REL_metadata_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_metadata_SECTOR_GROUPS_ANTENNAMODULE REL_metadata_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_metadata_SECTOR_GROUPS_NRCELLDU REL_metadata_SECTOR_GROUPS_NRCELLDU COLUMN UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT @@ -399,9 +409,11 @@ gNBId gNBId COLUMN gNBIdLength gNBIdLength COLUMN geo-location geo-location COLUMN geranFqBands geranFqBands COLUMN +horizontalBeamWidth horizontalBeamWidth COLUMN id id COLUMN mechanicalAntennaBearing mechanicalAntennaBearing COLUMN mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +metadata metadata COLUMN nCI nCI COLUMN nRFqBands nRFqBands COLUMN nRPCI nRPCI COLUMN @@ -440,6 +452,7 @@ plmnId plmnId COLUMN positionWithinSector positionWithinSector COLUMN sectorId sectorId COLUMN totalTilt totalTilt COLUMN +verticalBeamWidth verticalBeamWidth COLUMN \. COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; @@ -448,37 +461,37 @@ _3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2022-07-26 bW 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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= +o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gQ0xPVUQ7CgogICAgbGlzdCBDbG91ZGlmaWVkTkYgewogICAgICAgIGRlc2NyaXB0aW9uICJBIFJBTiBOZXR3b3JrIEZ1bmN0aW9uIHNvZnR3YXJlIHRoYXQgaXMgZGVwbG95ZWQgaW4gdGhlIE8tQ2xvdWQgdmlhIG9uZSBvciBtb3JlIE5GIERlcGxveW1lbnRzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZGlmaWVkIE5GIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTkZEZXBsb3ltZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzb2Z0d2FyZSBkZXBsb3ltZW50IG9uIE8tQ2xvdWQgcmVzb3VyY2VzIHRoYXQgcmVhbGl6ZXMsIGFsbCBvciBwYXJ0IG9mLCBhIENsb3VkaWZpZWQgTkYuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIE5GIERlcGxveW1lbnQiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWROYW1lc3BhY2UgewogICAgICAgIGRlc2NyaXB0aW9uICJPQ2xvdWROYW1lc3BhY2UgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgaXNvbGF0aW5nCiAgICAgICAgZ3JvdXBzIG9mIHJlc291cmNlcyB3aXRoaW4gYSBzaW5nbGUgY2x1c3Rlci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgTmFtZXNwYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTm9kZUNsdXN0ZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE5vZGVDbHVzdGVyIG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIE5vZGVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBOb2RlIENsdXN0ZXIiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgIGhvc3RzIHRoZSBORiBEZXBsb3ltZW50LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBDbG91ZCBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIENMT1VESUZJRURORl9DT01QUklTRVNfTkZERVBMT1lNRU5UIHsgLy8gMSB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgY29tcHJpc2VkLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDbG91ZGlmaWVkIE5GIGNvbXByaXNlcyBvZiB0aGVzZSBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGNvbXByaXNlZC1ieS1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCBwYXJ0IG9mIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfREVQTE9ZRURfT05fT0NMT1VETkFNRVNQQUNFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb24tb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgZGVwbG95ZWQgb24gTy1DbG91ZCBOYW1lc3BhY2UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXBsb3llZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkIE5hbWVzcGFjZSBkZXBsb3lzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZE5hbWVzcGFjZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ0xPVUROQU1FU1BBQ0VfREVQTE9ZRURfT05fTk9ERUNMVVNURVIgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgZGVwbG95ZWQtb24tbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBOYW1lc3BhY2UgZGVwbG95ZWQgb24gTm9kZSBDbHVzdGVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtb2Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBkZXBsb3lzIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOT0RFQ0xVU1RFUl9MT0NBVEVEX0FUX09DTE9VRFNJVEUgeyAvLyAxLi5uIHRvIDEuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGVkLWF0LW9jbG91ZFNpdGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm9kZSBDbHVzdGVyIGxvY2F0ZWQgYXQgTy1DbG91ZCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOb2RlQ2x1c3RlcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBsb2NhdGlvbi1vZi1vbm9kZUNsdXN0ZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DbG91ZCBTaXRlIGlzIGxvY2F0aW9uIG9mIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgT0Nsb3VkU2l0ZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0= 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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgY29tbW9uIHR5cGVzIG1vZGVsCgogIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGdyb3VwaW5nIFRvcF9HcnBfVHlwZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkdyb3VwaW5nIGNvbnRhaW5pbmcgdGhlIGtleSBhdHRyaWJ1dGUgY29tbW9uIHRvIGFsbCB0eXBlcy4KICAgICAgICAgICAgQWxsIHR5cGVzIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICAgICAgbGVhZiBpZCB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdG9wb2xvZ3kgZW50aXRpZXMuIFJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAgICBFbnRpdHkgSW5zdGFuY2UgSWRlbnRpZmllci4iOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgZGVjb3JhdG9ycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgZm9yIGFwcGxpY2F0aW9ucyB3aXNoaW5nCiAgICAgICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gZGVjb3JhdG9ycy4gVGhpcyBpcyBkb25lIHZpYSBhdWdtZW50YXRpb25zLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJDb25zdW1lciBkZWZpbmVkIHRhZ3MgdG8gdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIGlkZW50aXR5cmVmIHsgYmFzZSBjbGFzc2lmaWVyOyB9CiAgICB9CgogICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgIHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGFydGljaXBhdGluZyBlbnRpdGllcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllcnsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4KICAgICAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBiZWFyaW5nIG9uIGFudGVubmEgc3VidW5pdCB3aGVyZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgICAgICBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEgZWxlbWVudCByZXNwZWN0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIHBsYW5lLiBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpbXBhY3QuIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHRvdGFsVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVG90YWwgYW50ZW5uYSBlbGV2YXRpb24gaW5jbHVkaW5nIHRoZSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgICAgIFRpbHQgKFJFVCkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIGRpcmVjdGlvbiBvcnRob2dvbmFsIHRvIGFudGVubmEgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBhbnRlbm5hQmVhbVdpZHRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgYW5ndWxhciBzcGFuIG9mIHRoZSBtYWluIGxvYmUgb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICByYWRpYXRpb24gcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4KICAgICAgICAgICAgICAgICAgICBkZWdyZWVzLiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgICAgIGluc3RhbGxlZC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwoKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX0lOU1RBTExFRF9BVF9TSVRFIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBNYW5hZ2VkIEVsZW1lbnQgKE1FKSBpcyBhIG5vZGUgaW50byBhIHRlbGVjb21tdW5pY2F0aW9uCiAgICAgICAgICAgIG5ldHdvcmsgcHJvdmlkaW5nIHN1cHBvcnQgYW5kL29yIHNlcnZpY2UgdG8gc3Vic2NyaWJlcnMuIEFuIE1FCiAgICAgICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICAgICAgb3ZlciBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzIGZvciB0aGUgcHVycG9zZSBvZiBiZWluZyBtb25pdG9yZWQKICAgICAgICAgICAgYW5kL29yIGNvbnRyb2xsZWQuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CiAgICB9Cn0= -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBSYWRpbyBVbml0IChPLVJVKS4KCiAgICAgICAgQSBsb2dpY2FsIG5vZGUgaG9zdGluZyBMb3ctUEhZIGxheWVyIGFuZCBSRiBwcm9jZXNzaW5nIGJhc2VkIG9uIGEKICAgICAgICBsb3dlciBsYXllciBmdW5jdGlvbmFsIHNwbGl0LiAgVGhpcyBpcyBzaW1pbGFyIHRvIDNHUFDigJlzIOKAnFRSUOKAnSBvcgogICAgICAgIOKAnFJSSOKAnSBidXQgbW9yZSBzcGVjaWZpYyBpbiBpbmNsdWRpbmcgdGhlIExvdy1QSFkgbGF5ZXIgKEZGVC9pRkZULAogICAgICAgIFBSQUNIIGV4dHJhY3Rpb24pLiBUaGUgTy1SVSB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBpbnRlcmZhY2UKICAgICAgICAoYWxzbyBrbm93biBhcyBMTFMgaW50ZXJmYWNlKSBhcyB3ZWxsIGFzIExvdy1QSFkgZnVuY3Rpb25zIG9mIHRoZQogICAgICAgIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4gVGhlIE8tUlUKICAgICAgICB0ZXJtaW5hdGVzIHRoZSBPcGVuIEZyb250aGF1bCBNLVBsYW5lIGludGVyZmFjZSB0b3dhcmRzIHRoZSBPLURVCiAgICAgICAgYW5kIFNNTy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTy1SVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBvcnVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBPLVJVIHdpdGhpbiBhIE9SVUZ1bmN0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk5lYXItUmVhbC1UaW1lIFJBTiBJbnRlbGxpZ2VudCBDb250cm9sbGVyIChOZWFyLVJUIFJJQykuCgogICAgICAgIEFuIE8tUkFOIE5ldHdvcmsgRnVuY3Rpb24gKE5GKSB0aGF0IGVuYWJsZXMgbmVhci1yZWFsLXRpbWUgY29udHJvbAogICAgICAgIGFuZCBvcHRpbWl6YXRpb24gb2YgUkFOIGVsZW1lbnRzIGFuZCByZXNvdXJjZXMgdmlhIGZpbmUtZ3JhaW5lZAogICAgICAgIGRhdGEgY29sbGVjdGlvbiBhbmQgYWN0aW9ucyBvdmVyIEUyIGludGVyZmFjZS4gSXQgbWF5IGluY2x1ZGUKICAgICAgICBBSS9NTCAoQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UgLyBNYWNoaW5lIExlYXJuaW5nKSB3b3JrZmxvdwogICAgICAgIGluY2x1ZGluZyBtb2RlbCB0cmFpbmluZywgaW5mZXJlbmNlLCBhbmQgdXBkYXRlcy4KCiAgICAgICAgTm90ZTogSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgTmVhci1SVCBSSUMgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmVhclJ0UmljSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTmVhci1SVCBSSUMgd2l0aGluIGEgTmVhclJUUklDRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gRGlzdHJpYnV0ZWQgVW5pdCAoTy1EVSkuCgogICAgICAgIFRoZSBPLURVIGlzIGFuIE8tUkFOIE5GIGluIHRoZSBPLVJBTiBBcmNoaXRlY3R1cmUuIEFuIE8tRFUsIGNvbWJpbmVkCiAgICAgICAgd2l0aCBvbmUgb3IgbW9yZSBPLVJVKHMpIGNvbm5lY3RlZCB0byBpdCwgc3VwcG9ydHMgYW5kIGlzIGZ1bGx5CiAgICAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBmdW5jdGlvbnMgb2YgYSBnTkItRFUgYXMgZGVmaW5lZCBieSAzR1BQIFRTIDM4LjQwMS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgIGNvbm5lY3RlZCB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIE8tRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIE8tRFUgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE5HLVJBTgogICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApCgogICAgICAgIFRoaXMgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgUmFkaW8gUmVzb3VyY2UgQ29udHJvbCAoUlJDKSBhbmQKICAgICAgICB0aGUgY29udHJvbCBwbGFuZSBwYXJ0IG9mIHRoZSBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbAogICAgICAgIChQRENQKS4gVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tQ1UtVVAgYW5kIHRoZSBGMS1DIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aCB0aGUgTy1SQU4KICAgICAgICBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtQ1A6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1VUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9ubHkgb25lIE8tQ1UtQ1AgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25lIE8tRFUuIE9ubHkgb25lIE8tQ1UtQ1AgaXMgY29ubmVjdGVkIHRvIG9uZQogICAgICAgIE8tQ1UtVVAuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIKICAgICAgICB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUgTy1DVS1VUCBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuCgogICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtQ1AgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLUNQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBnTm9kZUItQ1UiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTgogICAgICAgICAgICAgICAgbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBPQ1VVUEZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTy1SQU4gQ2VudHJhbGl6ZWQgVW5pdCBVc2VyIFBsYW5lIChPLUNVLVVQKQoKICAgICAgICBBbiBPLUNVLVVQIGlzIGEgbG9naWNhbCBub2RlIGhvc3RpbmcgdGhlIFVzZXIgUGxhbmUgcGFydCBvZiB0aGUKICAgICAgICBQYWNrZXQgRGF0YSBDb252ZXJnZW5jZSBQcm90b2NvbCAoUERDUCkgYW5kIHRoZSBTZXJ2aWNlIERhdGEKICAgICAgICBBZGFwdGF0aW9uIFByb3RvY29sIChTREFQKS4gVGhlIE8tQ1UtVVAgdGVybWluYXRlcyB0aGUgRTEgaW50ZXJmYWNlCiAgICAgICAgY29ubmVjdGVkIHdpdGggdGhlIE8tQ1UtQ1AgYW5kIHRoZSBGMS1VIGludGVyZmFjZSBjb25uZWN0ZWQgd2l0aAogICAgICAgIHRoZSBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIE8tQ1UtVVA6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBPLURVIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBJcyBjb25uZWN0ZWQKICAgICAgICB0byB0aGUgTy1DVS1DUCB0aHJvdWdoIHRoZSBFMSBpbnRlcmZhY2UuIE9uZSBPLUNVLVVQIGlzCiAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIE8tQ1UtQ1AuIE9uZSBPLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBPLUNVLUNQLiBPbmUKICAgICAgICBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgRFVzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQogICAgICAgIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYW4gTy1DVS1DUCwgbXVsdGlwbGUgTy1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgTy1EVXMuIEFuIE8tQ1UtVVAgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgTkctUkFOIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kCiAgICAgICAgZGVsZXRlIHRoZSBPLUNVLVVQIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsaXN0IHBMTU5JZExpc3QgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLUNVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uCiAgICAgICAgU2lnbmFsIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQKICAgICAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1EVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIHNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbiBzaWduYWwKICAgICAgICAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kIHByb3ZpZGUKICAgICAgICB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBncm91cCBvZiBjby1sb2NhdGVkIENlbGxzIHRoYXQgaGF2ZSBhIHNoYXJlZAogICAgICAgIGNvdmVyYWdlIGFyZWEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUkNFTExEVSB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSB1c2VzIE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZWQgYnkgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTlJTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9DTE9VRF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09EVUZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VDUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0NVVVBGVU5DVElPTiB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1VUCBGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE8tQ1UtVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9DVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX05FQVJSVFJJQ0ZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhclJUUklDRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBOZWFyUlRSSUNGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46TmVhclJUUklDRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19BTlRFTk5BTU9EVUxFIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlY3RvciBncm91cHMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOlNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX0NMT1VEOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfREVQTE9ZRURfQVNfQ0xPVURJRklFRE5GIHsgIC8vIDAuLjEgdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBkZXBsb3llZC1hcy1jbG91ZGlmaWVkTkYgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IGRlcGxveWVkIGFzIENsb3VkaWZpZWQgTkYuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGRlcGxveWVkLW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkaWZpZWQgTkYgZGVwbG95cyBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtY2xvdWQ6Q2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTUFOQUdFREVMRU1FTlQgeyAvLyAxLi5uIHRvIDEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgc2VydmljZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9 -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-07-15 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT0RVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ== +o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-10-04 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIGFuZCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgZm9yIHNvdXJjZUlkcyBhbmQgcmVsaWFiaWxpdHlJbmRpY2F0b3IgdG8gbWV0YWRhdGEuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSBlbnRpdHkuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZSBUb3BvbG9neSBFbnRpdHkgaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlCiAgICAgICAgICAgICAgICBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkncyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGV4cG9zZWQgdG8gdGhlCiAgICAgICAgICAgICAgICBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgcmVzcG9uc2libGUgYWRhcHRlci4gVGhpcwogICAgICAgICAgICAgICAgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZAogICAgICAgICAgICAgICAgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgICAgIHR5cGUgc291cmNlSWQ7CiAgICAgICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIGdyb3VwaW5nIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyB0byBpZGVudGlmeSBzb3VyY2VJZHMgb24gYSB0b3BvbG9neSByZWxhdGlvbnNoaXAuIjsKCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcyB7CgogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAyOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgYW4gZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpcnMuCgogICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzCiAgICAgICAgICAgIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkKICAgICAgICAgICAgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlCiAgICAgICAgICAgIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgaXMgYXdhcmUuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBSRVNUT1JFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIGJhY2t1cCBhbmQgdGhlIHJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICAgICAgYWRhcHRlcnMgYXJlIGNoZWNraW5nIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBjdXJyZW50LiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVudW0gQURWSVNFRCB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVudGl0eSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgVG9wb2xvZ3kgRXhwb3N1cmUgSGFuZGxpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsbHkgbm90IGFsaWduZWQgd2l0aCB0aGUgc291cmNlIG9mIHRydXRoLiI7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMKICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgICAgIHR5cGUgc3RyaW5nOwogICAgfQp9 +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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gTG9naWNhbCBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBPUlVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpLgoKICAgICAgICBBIGxvZ2ljYWwgbm9kZSBob3N0aW5nIExvdy1QSFkgbGF5ZXIgYW5kIFJGIHByb2Nlc3NpbmcgYmFzZWQgb24gYQogICAgICAgIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWwgc3BsaXQuICBUaGlzIGlzIHNpbWlsYXIgdG8gM0dQUOKAmXMg4oCcVFJQ4oCdIG9yCiAgICAgICAg4oCcUlJI4oCdIGJ1dCBtb3JlIHNwZWNpZmljIGluIGluY2x1ZGluZyB0aGUgTG93LVBIWSBsYXllciAoRkZUL2lGRlQsCiAgICAgICAgUFJBQ0ggZXh0cmFjdGlvbikuIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZQogICAgICAgIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlCiAgICAgICAgcmFkaW8gaW50ZXJmYWNlIHRvd2FyZHMgdGhlIFVFLiBUaGlzIGlzIGRlcGxveWVkIGFzIGEgUE5GLiBUaGUgTy1SVQogICAgICAgIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIE0tUGxhbmUgaW50ZXJmYWNlIHRvd2FyZHMgdGhlIE8tRFUKICAgICAgICBhbmQgU01PLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBPLVJVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG9ydUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE8tUlUgd2l0aGluIGEgT1JVRnVuY3Rpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKS4KCiAgICAgICAgQW4gTy1SQU4gTmV0d29yayBGdW5jdGlvbiAoTkYpIHRoYXQgZW5hYmxlcyBuZWFyLXJlYWwtdGltZSBjb250cm9sCiAgICAgICAgYW5kIG9wdGltaXphdGlvbiBvZiBSQU4gZWxlbWVudHMgYW5kIHJlc291cmNlcyB2aWEgZmluZS1ncmFpbmVkCiAgICAgICAgZGF0YSBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgRTIgaW50ZXJmYWNlLiBJdCBtYXkgaW5jbHVkZQogICAgICAgIEFJL01MIChBcnRpZmljaWFsIEludGVsbGlnZW5jZSAvIE1hY2hpbmUgTGVhcm5pbmcpIHdvcmtmbG93CiAgICAgICAgaW5jbHVkaW5nIG1vZGVsIHRyYWluaW5nLCBpbmZlcmVuY2UsIGFuZCB1cGRhdGVzLgoKICAgICAgICBOb3RlOiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgIHRoZSBOZWFyLVJUIFJJQyBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuZWFyUnRSaWNJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBOZWFyLVJUIFJJQyB3aXRoaW4gYSBOZWFyUlRSSUNGdW5jdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4KICAgICAgICAgICAgICAgIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0RVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKS4KCiAgICAgICAgVGhlIE8tRFUgaXMgYW4gTy1SQU4gTkYgaW4gdGhlIE8tUkFOIEFyY2hpdGVjdHVyZS4gQW4gTy1EVSwgY29tYmluZWQKICAgICAgICB3aXRoIG9uZSBvciBtb3JlIE8tUlUocykgY29ubmVjdGVkIHRvIGl0LCBzdXBwb3J0cyBhbmQgaXMgZnVsbHkKICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiBhIGdOQi1EVSBhcyBkZWZpbmVkIGJ5IDNHUFAgVFMgMzguNDAxLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1EVToKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEYxLVUgaW50ZXJmYWNlLiBPbmUgTy1EVSBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBPLUNVLUNQLiBPbmUgTy1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgbXVsdGlwbGUgTy1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQklkTGVuZ3RoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0NVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWxpemVkIFVuaXQgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhpcyBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBSYWRpbyBSZXNvdXJjZSBDb250cm9sIChSUkMpIGFuZAogICAgICAgIHRoZSBjb250cm9sIHBsYW5lIHBhcnQgb2YgdGhlIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sCiAgICAgICAgKFBEQ1ApLiBUaGUgTy1DVS1DUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UgY29ubmVjdGVkIHdpdGgKICAgICAgICB0aGUgTy1DVS1VUCBhbmQgdGhlIEYxLUMgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBPLVJBTgogICAgICAgIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1DUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLVVQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25seSBvbmUgTy1DVS1DUCBpcwogICAgICAgIGNvbm5lY3RlZCB0byBvbmUgTy1EVS4gT25seSBvbmUgTy1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgTy1DVS1VUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBPLUNVLVVQcyB1bmRlcgogICAgICAgIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZSBPLUNVLVVQIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgTy1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1DUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIEFuIE8tQ1UtVVAgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgVXNlciBQbGFuZSBwYXJ0IG9mIHRoZQogICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlIFByb3RvY29sIChQRENQKSBhbmQgdGhlIFNlcnZpY2UgRGF0YQogICAgICAgIEFkYXB0YXRpb24gUHJvdG9jb2wgKFNEQVApLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIHRoZSBFMSBpbnRlcmZhY2UKICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgTy1DVS1DUCBhbmQgdGhlIEYxLVUgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoCiAgICAgICAgdGhlIE8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgTy1DVS1VUDoKICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIE8tRFUgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIElzIGNvbm5lY3RlZAogICAgICAgIHRvIHRoZSBPLUNVLUNQIHRocm91Z2ggdGhlIEUxIGludGVyZmFjZS4gT25lIE8tQ1UtVVAgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgTy1DVS1DUC4gT25lIE8tRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgIG11bHRpcGxlIE8tQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIE8tQ1UtQ1AuIE9uZQogICAgICAgIE8tQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCiAgICAgICAgc2FtZSBPLUNVLUNQLgoKICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhbiBPLUNVLUNQLCBtdWx0aXBsZSBPLUNVLVVQcyBhbmQKICAgICAgICBtdWx0aXBsZSBPLURVcy4gQW4gTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICBkZWxldGUgdGhlIE8tQ1UtVVAgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QgcExNTklkTGlzdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBQTE1OIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGdsb2JhbCBSQU4gbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUkNlbGxDVSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItQ1UuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24KICAgICAgICBTaWduYWwgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZAogICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSUQgZm9yIE5SIENHSS4gSWYgZW1wdHksCiAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhcmZjblVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTZWN0b3IgewogICAgICAgIGRlc2NyaXB0aW9uICJBIGdyb3VwIG9mIGNvLWxvY2F0ZWQgQ2VsbHMgdGhhdCBoYXZlIGEgc2hhcmVkCiAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgZGlzY292ZXJ5IG1lY2hhbmlzbS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKCiAgICAgICAgICAgIGxlYWYgYXppbXV0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXZlcmFnZSB2YWx1ZSBvZiB0aGUgYXppbXV0aHMgb2YgdGhlIGNlbGxzCiAgICAgICAgICAgICAgICBjb21wcmlzaW5nIHRoZSBzZWN0b3IsIGRldGVybWluZWQgZHVyaW5nIHNlY3RvciBkaXNjb3ZlcnkuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0ewogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxOwogICAgICAgICAgICAgICAgICAgIHJhbmdlICIwLi4zNjAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMRFUgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgT0RVRnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgRFUgY29tcG9uZW50IG9mIGEgZ05CIHRoYXQgcHJvdmlkZXMgdGhlIE5SQ2VsbERVLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9EVUZ1bmN0aW9uLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUlNlY3RvckNhcnJpZXIuCiAgICAgICAgICAgIEEgT0RVRnVuY3Rpb24gaW5zdGFuY2UgY2FuIHByb3ZpZGUgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBwcm92aWRlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fUFJPVklERVNfTlJDRUxMQ1UgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbENVIHR5cGUuCiAgICAgICAgICAgIFRoZSBPQ1VDUEZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIENVLUNQIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxDVS4KICAgICAgICAgICAgQSBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJDZWxsQ1UuCiAgICAgICAgICAgIEFuIE5SQ2VsbENVIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0NVQ1BGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxDdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLUNQIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtQ1UuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9DVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbENVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBOUkNlbGxEVSByZXByZXNlbnRzIHRoZSBjZWxsIHRoYXQgdXNlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gdXNlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiBvbmx5IGJlIHVzZWQgYnkgb25lIE5SQ2VsbERVLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgdXNlcyBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VkIGJ5IE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFDYXBhYmlsaXR5IHR5cGUuCiAgICAgICAgICAgIFRoZSBOUlNlY3RvckNhcnJpZXIgcmVwcmVzZW50cyB0aGUgY2FycmllciB0aGF0IHVzZXMgdGhlIEFudGVubmFDYXBhYmlsaXR5LgogICAgICAgICAgICBBbiBOUlNlY3RvckNhcnJpZXIgaW5zdGFuY2UgY2FuIHVzZSBvbmx5IG9uZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYnkgbWFueSBOUlNlY3RvckNhcnJpZXJzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX05SQ0VMTERVIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SQ2VsbERVIHR5cGUuCiAgICAgICAgICAgIFRoZSBTZWN0b3IgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGFyZWEgdGhhdCBncm91cHMgdGhlIE5SQ2VsbERVcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gb25seSBiZSBncm91cGVkIGJ5IG9uZSBTZWN0b3IuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ== +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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIFNFQ1RPUl9HUk9VUFNfQU5URU5OQU1PRFVMRSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJDZWxsRFUgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgTlJDZWxsRFUuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgTlJDZWxsRFVzLgogICAgICAgICAgICBBbiBOUkNlbGxEVSBpbnN0YW5jZSBjYW4gYmUgc2VydmVkIGJ5IG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgZ3JvdXBlZC1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlY3RvciBncm91cHMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOlNlY3RvcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBncm91cGVkLWJ5LXNlY3RvciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19BTlRFTk5BTU9EVUxFIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNlY3RvciB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIFNlY3RvciByZXByZXNlbnRzIHRoZSBnZW9ncmFwaGljYWwgYXJlYSB0aGF0IGdyb3VwcyB0aGUgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEEgU2VjdG9yIGluc3RhbmNlIGNhbiBncm91cCBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBvbmx5IGJlIGdyb3VwZWQgYnkgb25lIFNlY3Rvci4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBncm91cGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46U2VjdG9yOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGdyb3VwZWQtYnktc2VjdG9yIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= +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== \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -o-ran-smo-teiv-cloud_CloudifiedNF CloudifiedNF o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NFDeployment NFDeployment o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_NodeCluster NodeCluster o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud -o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud -o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment -o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment -o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam -o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_ORUFunction ORUFunction o-ran-smo-teiv-ran -o-ran-smo-teiv-ran_Sector Sector o-ran-smo-teiv-ran +COPY ties_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"] +o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud ["geo-location", "name"] +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment ["geo-location", "name"] +o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam [] +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRTAC", "plmnId"] +o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRPCI", "nRTAC"] +o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"] +o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran ["nearRtRicId", "pLMNId"] +o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"] +o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran ["gNBId", "gNBIdLength", "pLMNIdList"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["gNBDUId", "gNBId", "gNBIdLength"] +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; @@ -505,6 +518,7 @@ OCUCPFUNCTION_PROVIDES_NRCELLCU provided-nrCellCu OCUCPFunction o-ran-smo-teiv-r ODUFUNCTION_PROVIDES_NRCELLDU provided-nrCellDu ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran ODUFUNCTION_PROVIDES_NRSECTORCARRIER provided-nrSectorCarrier ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran SECTOR_GROUPS_ANTENNAMODULE grouped-antennaModule Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-rel-equipment-ran +SECTOR_GROUPS_ANTENNAMODULE grouped-antennaModule Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-rel-equipment-ran SECTOR_GROUPS_NRCELLDU grouped-nrCellDu Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran \. 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 91316ec..4dc1a22 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 @@ -23,33 +23,37 @@ BEGIN; DROP SCHEMA IF EXISTS ties_model cascade; CREATE SCHEMA IF NOT EXISTS ties_model; +ALTER SCHEMA ties_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 ( - "name" VARCHAR(511) PRIMARY KEY, - "hashedValue" VARCHAR(511), - "type" VARCHAR(511) + "name" TEXT PRIMARY KEY, + "hashedValue" VARCHAR(63) NOT NULL, + "type" VARCHAR(511) ); CREATE TABLE IF NOT EXISTS ties_model.module_reference ( - "name" VARCHAR(511) PRIMARY KEY, - "namespace" VARCHAR(511), - "domain" VARCHAR(511), - "includedModules" jsonb, - "content" TEXT, - "revision" VARCHAR(511) + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "domain" TEXT, + "includedModules" jsonb DEFAULT '[]'::jsonb, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS ties_model.entity_info ( - "storedAt" VARCHAR(511) PRIMARY KEY, - "name" VARCHAR(511), - "moduleReferenceName" VARCHAR(511), + "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 ); CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( - "name" VARCHAR(511) NOT NULL, + "name" TEXT NOT NULL, "aSideAssociationName" TEXT NOT NULL, "aSideMOType" TEXT NOT NULL, "aSideModule" TEXT NOT NULL, @@ -62,532 +66,472 @@ CREATE TABLE IF NOT EXISTS ties_model.relationship_info ( "bSideMaxCardinality" BIGINT NOT NULL, "associationKind" TEXT NOT NULL, "relationshipDataLocation" TEXT NOT NULL, + "storedAt" TEXT NOT NULL, "connectSameEntity" BOOLEAN NOT NULL, - "storedAt" VARCHAR(511) 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 ); COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin; -PK_ENodeBFunction_id PK_ENodeBFunction_id CONSTRAINT -FK_TestEntityB_REL_FK_used-by-testEntityA FK_TestEntityB_REL_FK_used-by-testEntityA CONSTRAINT -frequencyDL frequencyDL COLUMN -ANTENNAMODULE_REALISED_BY_ANTENNAMODULE ANTENNAMODULE_REALISED_BY_ANTENNAMODULE TABLE -aSide_AntennaModule aSide_AntennaModule COLUMN -bSide_AntennaModule bSide_AntennaModule COLUMN -PK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_id PK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_id CONSTRAINT -FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_aSide_AntennaModule FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_aSide_AntennaModule CONSTRAINT -FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_bSide_AntennaModule FK_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_bSide_AntennaModule CONSTRAINT -UNIQUE_GNBCUUPFunction_REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION UNIQUE_BDB349CDF0C4055902881ECCB71F460AE1DD323E CONSTRAINT -NRCellDU NRCellDU TABLE -NRSectorCarrier NRSectorCarrier TABLE -REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION COLUMN -PK_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE_id PK_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE_id CONSTRAINT -FK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_bSide_CloudNativeApplication FK_CA6721EE0944CBBB8E071CEA630162ABD7DFF2DA CONSTRAINT -FK_LTESectorCarrier_REL_FK_used-by-euTranCell FK_LTESectorCarrier_REL_FK_used-by-euTranCell CONSTRAINT -FK_GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN_bSide_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn FK_EADC754A352728E72F7320F69D802725C71EDE3E CONSTRAINT -frequencyUL frequencyUL COLUMN -FK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_aSide_GNBCUUPFunction FK_F3346189A1BB0DA705219A4136349DF50AE8AA33 CONSTRAINT -REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU COLUMN -PK_Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_id PK_77881E9D6F659316F836050DDC6E26FA4DE425EE CONSTRAINT -FK_Namespace_REL_FK_deployed-on-nodeCluster FK_Namespace_REL_FK_deployed-on-nodeCluster CONSTRAINT -ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt 1EF2A41C34A961CD8AE603E020B7B8B57345267F TABLE -UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB UNIQUE_TestEntityB_REL_ID_TESTENTITYA_USES_TESTENTITYB CONSTRAINT -UNIQUE_ManagedElement_REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM UNIQUE_ADD7C124AEF822CB0293FC75E39449DC1AD097E5 CONSTRAINT -NRCellCU NRCellCU TABLE -REL_FK_used-by-euTranCell REL_FK_used-by-euTranCell COLUMN -UNIQUE_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991 CONSTRAINT -PK_TESTENTITYA_PROVIDES_TESTENTITYB_id PK_TESTENTITYA_PROVIDES_TESTENTITYB_id CONSTRAINT -FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction CONSTRAINT -REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -bSide_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn bSide_84EF1134719BB6FCF33A94FF770311FC722BCF41 COLUMN -eNBId eNBId COLUMN -PK_NodeCluster_id PK_NodeCluster_id CONSTRAINT -FK_NRCellCU_REL_FK_provided-by-gnbcucpFunction FK_NRCellCU_REL_FK_provided-by-gnbcucpFunction CONSTRAINT -FK_CloudNativeSystem_REL_FK_deployed-managedElement FK_CloudNativeSystem_REL_FK_deployed-managedElement CONSTRAINT -PK_Sector_id PK_Sector_id CONSTRAINT -GNBCUCPFunction GNBCUCPFunction TABLE -UNIQUE_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE UNIQUE_287E65679DC2108F55F43D62A4325F6DECF372E1 CONSTRAINT -REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -FK_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_FK_provided-by-gnbduFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn FK_D43434F9F6FD1C14BE14A0EEDA4C9918B26E82F1 CONSTRAINT -PK_ManagedElement_id PK_ManagedElement_id CONSTRAINT -UNIQUE_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE UNIQUE_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE CONSTRAINT -PK_GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN_id PK_5D1AC46C58E1FE44FB266F86CE79B3AEBE1D92B3 CONSTRAINT -REL_FK_provided-by-gnbcucpFunction REL_FK_provided-by-gnbcucpFunction COLUMN -REL_FK_managed-by-managedElementttttttttttttttttttttttttttttttttttttttt REL_FK_48B14FA5B787C6398AD1DE5EE670AD0D2A2CB36F COLUMN -FK_GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN_aSide_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn FK_BFC9C18D6DBCD1FFC021B021CF31444EAA1FEDCA CONSTRAINT -ManagedElement ManagedElement TABLE -PK_AntennaModule_id PK_AntennaModule_id CONSTRAINT -FK_EUtranCell_REL_FK_provided-by-enodebFunction FK_EUtranCell_REL_FK_provided-by-enodebFunction CONSTRAINT -FK_ENodeBFunction_REL_FK_managed-by-managedElement FK_ENodeBFunction_REL_FK_managed-by-managedElement CONSTRAINT -UNIQUE_GNBDUFunction_REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION UNIQUE_08DFEFAF56EDDE43CBDC336F459D28C6518D3E1D CONSTRAINT -PK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id PK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id CONSTRAINT -FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB CONSTRAINT -FK_CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm_REL_FK_deployed-managedElementttttttttttttttttttttttttttttttttttttttttt FK_54FE608944AC8EFFFBE7E55744B8BA52F6B29ABB CONSTRAINT -REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -UNIQUE_CloudNativeApplication_REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE UNIQUE_1A317D31DA93B0CF9A9F8A04077B0F60ABCFF49C CONSTRAINT -UNIQUE_NRCellDU_REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU UNIQUE_NRCellDU_REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU CONSTRAINT -UNIQUE_Namespace_REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_Namespace_REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER CONSTRAINT -FK_GNBCUUPFunction_REL_FK_managed-by-managedElement FK_GNBCUUPFunction_REL_FK_managed-by-managedElement CONSTRAINT -aSide_GNBCUUPFunction aSide_GNBCUUPFunction COLUMN -UNIQUE_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN UNIQUE_3DDA71C08F678AA7303FE0BD127CC27A80D1DDED CONSTRAINT -eNodeBPlmnId eNodeBPlmnId COLUMN -PK_NRSectorCarrier_id PK_NRSectorCarrier_id CONSTRAINT -FK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_bSide_CloudNativeApplication FK_36215EA9FC5F31CC0F131E526A84A54CB006C66B CONSTRAINT -mechanicalAntennaBearing mechanicalAntennaBearing COLUMN -GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION TABLE -ENodeBFunction ENodeBFunction TABLE -nRPCI nRPCI COLUMN -antennaModelNumber antennaModelNumber COLUMN -REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION COLUMN -REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN -PK_NRCellCU_id PK_NRCellCU_id CONSTRAINT -REL_FK_deployed-as-cloudNativeSystem REL_FK_deployed-as-cloudNativeSystem COLUMN -PK_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_id PK_CCB39BED50FEF60B1B1F86A7C938BE89B7D90D38 CONSTRAINT -cellId cellId COLUMN -UNIQUE_NRSectorCarrier_REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER UNIQUE_872BE05F1989443F2595D99A77BC03733B2D1E2F CONSTRAINT -REL_FK_deployed-on-namespace REL_FK_deployed-on-namespace COLUMN -PK_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_id PK_F52E445B46B712C0D9014D194AB039C205E69818 CONSTRAINT -aSide_GNBCUCPFunction aSide_GNBCUCPFunction COLUMN -FK_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_deployed-on-namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_E33FB71E6FAC69C92ADEEC55E63D401D21DF91AE CONSTRAINT -UNIQUE_EUtranCell_REL_ID_SECTOR_GROUPS_EUTRANCELL UNIQUE_EUtranCell_REL_ID_SECTOR_GROUPS_EUTRANCELL CONSTRAINT -PK_CloudNativeApplication_id PK_CloudNativeApplication_id CONSTRAINT -PK_CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm_id PK_F568C5029499EE188A168886B2EF09C0D1FAAA9F CONSTRAINT -UNIQUE_EUtranCell_REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL UNIQUE_EUtranCell_REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL CONSTRAINT -name name COLUMN -REL_FK_provided-by-gnbduFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn REL_FK_609963BFEE15FF824280FBE201313C3CDACDDDCE COLUMN -REL_FK_located-at-cloudSite REL_FK_located-at-cloudSite COLUMN -REL_FK_realised-managedElementttttttttttttttttttttttttttttttttttttttttt REL_FK_AB87B417CCD05C332DDD0C60F0C6AB41D38B05E5 COLUMN -REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B COLUMN -geranFqBands geranFqBands COLUMN -REL_ID_MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN REL_ID_FC2F6A5A12917357B548C83F4B0C1AD58FA61413 COLUMN -FK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_aSide_GNBDUFunction FK_69C6800CC81731E475893CC85582971C7530C98E CONSTRAINT -REL_FK_realised-by-physicalNetworkAppliance REL_FK_realised-by-physicalNetworkAppliance COLUMN -PK_EUtranCell_id PK_EUtranCell_id CONSTRAINT -REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE COLUMN -FK_NRSectorCarrier_REL_FK_used-antennaCapability FK_NRSectorCarrier_REL_FK_used-antennaCapability CONSTRAINT -REL_ID_GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_ID_040FC8B06B420BA5708AF4798102D1E65FB4DC61 COLUMN -CloudNativeApplication CloudNativeApplication TABLE -positionWithinSector positionWithinSector COLUMN -PK_Namespace_id PK_Namespace_id CONSTRAINT -GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION TABLE -Sector Sector TABLE -REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE COLUMN -FK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_bSide_CloudNativeApplication FK_95C3AD1FCFBD310B9947B9B622CA8E0FC2135DC5 CONSTRAINT -PhysicalNetworkAppliance PhysicalNetworkAppliance TABLE -PK_GNBCUCPFunction_id PK_GNBCUCPFunction_id CONSTRAINT +CD_classifiers CD_classifiers COLUMN +CD_decorators CD_decorators COLUMN +CD_sourceIds CD_sourceIds COLUMN +FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_aSide_NFDeployment FK_A08D274894ECB6799E56C2089A494AF0345B9B16 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_bSide_OCloudNamespace FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_comprised-by-cloudifiedNF FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_serviced-managedElement FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_aSide_NodeCluster FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92 CONSTRAINT +FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_bSide_OCloudSite FK_888BF6FF782916E61B3FE80643A549A1CFDB6117 CONSTRAINT +FK_o-ran-smo-teiv-cloud_OCloudNamespace_REL_FK_deployed-on-nodeCluster FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF CONSTRAINT +FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_grouped-by-sector FK_078764B2F3D613D44CC6E3586F564C83164D2481 CONSTRAINT +FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_installed-at-site FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC CONSTRAINT +FK_o-ran-smo-teiv-oam_ManagedElement_REL_FK_deployed-as-cloudifiedNF FK_899B8130A861D1450FC49D3159D8B29C0628A717 CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_provided-by-oduFunction FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-antennaCapability FK_65D538D54EB33081C808540235FEB28823428E64 CONSTRAINT +FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu CONSTRAINT +FK_o-ran-smo-teiv-ran_NearRTRICFunction_REL_FK_managed-by-managedElement FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_managed-by-managedElement FK_122DD9709032528D161177B3624AD7AAF6589005 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUUPFunction_REL_FK_managed-by-managedElement FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D CONSTRAINT +FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_managed-by-managedElement FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80 CONSTRAINT +FK_o-ran-smo-teiv-ran_ORUFunction_REL_FK_managed-by-managedElement FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_aSide_NFDeployment FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_bSide_NearRTRICFunction FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_aSide_NFDeployment FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_bSide_OCUCPFunction FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_aSide_NFDeployment FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_bSide_OCUUPFunction FK_8585D545BC37A473A298E0F5F5942F897A7105B1 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_aSide_NFDeployment FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79 CONSTRAINT +FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_bSide_ODUFunction FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_aSide_AntennaModule FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_bSide_NRCellDU FK_8605800A4923C52258A8CE3989E18A7C93D22E8C CONSTRAINT +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_classifiers IDX_BD96130868B69147B2F87B0D15F5829690DEF454 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_sourceIds IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_classifiers IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_sourceIds IDX_F97E398B17532BCD9923CE0CF98E73227D890037 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_classifiers IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_sourceIds IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_classifiers IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_sourceIds IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_classifiers IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_sourceIds IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_classifiers IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_sourceIds IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_classifiers IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_sourceIds IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_classifiers IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_sourceIds IDX_905011128A2C218B5352C19ED1FE9851F43EB911 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_antennaBeamWidth IDX_21B0F1FE632B6CB185C49BA6F00224068F443215 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_Site_CD_classifiers IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_Site_CD_sourceIds IDX_102A50584376DE25B6BBD7157594C607A5C957F2 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_classifiers IDX_98AC4232BC02323E03416954215889CEE874A1E9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_sourceIds IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_634619CF7333EBC0AFDE990900B79220FC626EBA INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_classifiers IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_sourceIds IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_eUtranFqBands IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_geranFqBands IDX_A94722FF7B95D8974B494793908B57B4E1A9743B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_nRFqBands IDX_441B5C05448D63552C6414BD59C13641D8A4408D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_CD_classifiers IDX_E5930226819982DC0CFC1FA64FB3600647222435 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_CD_sourceIds IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_6891C1BB8EE214340A362906C08955E8ACC1C597 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_classifiers IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_sourceIds IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_classifiers IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_sourceIds IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_B975D24291849007D4AA6686C5D3983885D5C884 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_986B2223E72FF79237337329F4C3BB9DA9025A34 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_classifiers IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_sourceIds IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_0ECC814A408874C9F8E73EEE3968984A6345A606 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_classifiers IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_sourceIds IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_classifiers IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_sourceIds IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_50209F1FF59B49F79FF194887B631994F2B5148A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_pLMNIdList IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_classifiers IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_sourceIds IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_classifiers IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_sourceIds IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_classifiers IDX_19C19556F9714850389595E0A16218FA229205FE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_sourceIds IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_classifiers IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_sourceIds IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_classifiers IDX_03F9C6A2FA82614A788443AC6044BCED2401C465 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_sourceIds IDX_10BCC6B44663A8D5431668BEE5DF80423420C616 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_classifiers IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_sourceIds IDX_64B7C127C01069009A3FB13592DAE249B0029283 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_classifiers IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_sourceIds IDX_5996D077978D38D0C1A951A262F1F7E1E339F052 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_classifiers IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_sourceIds IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E INDEX +IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_decorators IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT IDX_46CDB369134F042EC021F7496DF721B49A9D43C0 INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_decorators IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322 INDEX +IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B INDEX +IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C INDEX +IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_SECTOR_GROUPS_NRCELLDU IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F INDEX +IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION IDX_ADD3393C27589066C4993A3491436C6FB57A539F INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX +IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F INDEX +IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_decorators IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80 INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_decorators IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3 INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_decorators IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F INDEX +IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_decorators IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_decorators IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753 INDEX +PK_o-ran-smo-teiv-cloud_CloudifiedNF_id PK_o-ran-smo-teiv-cloud_CloudifiedNF_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_id PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6 CONSTRAINT +PK_o-ran-smo-teiv-cloud_NFDeployment_id PK_o-ran-smo-teiv-cloud_NFDeployment_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_NodeCluster_id PK_o-ran-smo-teiv-cloud_NodeCluster_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_OCloudNamespace_id PK_o-ran-smo-teiv-cloud_OCloudNamespace_id CONSTRAINT +PK_o-ran-smo-teiv-cloud_OCloudSite_id PK_o-ran-smo-teiv-cloud_OCloudSite_id CONSTRAINT +PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT +PK_o-ran-smo-teiv-equipment_Site_id PK_o-ran-smo-teiv-equipment_Site_id CONSTRAINT +PK_o-ran-smo-teiv-oam_ManagedElement_id PK_o-ran-smo-teiv-oam_ManagedElement_id CONSTRAINT +PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NRCellCU_id PK_o-ran-smo-teiv-ran_NRCellCU_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NRCellDU_id PK_o-ran-smo-teiv-ran_NRCellDU_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NRSectorCarrier_id PK_o-ran-smo-teiv-ran_NRSectorCarrier_id CONSTRAINT +PK_o-ran-smo-teiv-ran_NearRTRICFunction_id PK_o-ran-smo-teiv-ran_NearRTRICFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_OCUCPFunction_id PK_o-ran-smo-teiv-ran_OCUCPFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_OCUUPFunction_id PK_o-ran-smo-teiv-ran_OCUUPFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ODUFunction_id PK_o-ran-smo-teiv-ran_ODUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_ORUFunction_id PK_o-ran-smo-teiv-ran_ORUFunction_id CONSTRAINT +PK_o-ran-smo-teiv-ran_Sector_id PK_o-ran-smo-teiv-ran_Sector_id CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_id PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_id PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_id PK_E551D02D14B3C04A565DC73A386BEB29627D3C08 CONSTRAINT +PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_id PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3 CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_id PK_F41873285F3BD831F63C6041B4356A063403406D CONSTRAINT +REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU COLUMN +REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_decorators_SECTOR_GROUPS_NRCELLDU REL_CD_decorators_SECTOR_GROUPS_NRCELLDU COLUMN +REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU COLUMN +REL_FK_comprised-by-cloudifiedNF REL_FK_comprised-by-cloudifiedNF COLUMN +REL_FK_deployed-as-cloudifiedNF REL_FK_deployed-as-cloudifiedNF COLUMN REL_FK_deployed-on-nodeCluster REL_FK_deployed-on-nodeCluster COLUMN -AntennaCapability AntennaCapability TABLE -NodeCluster NodeCluster TABLE +REL_FK_grouped-by-sector REL_FK_grouped-by-sector COLUMN +REL_FK_installed-at-site REL_FK_installed-at-site COLUMN +REL_FK_managed-by-managedElement REL_FK_managed-by-managedElement COLUMN +REL_FK_provided-by-ocucpFunction REL_FK_provided-by-ocucpFunction COLUMN +REL_FK_provided-by-oduFunction REL_FK_provided-by-oduFunction COLUMN +REL_FK_serviced-managedElement REL_FK_serviced-managedElement COLUMN +REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN +REL_FK_used-by-nrCellDu REL_FK_used-by-nrCellDu COLUMN +REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN REL_ID_NRCELLDU_USES_NRSECTORCARRIER REL_ID_NRCELLDU_USES_NRSECTORCARRIER COLUMN -PK_GNBCUUPFunction_id PK_GNBCUUPFunction_id CONSTRAINT -UNIQUE_LTESectorCarrier_REL_ID_EUTRANCELL_USES_LTESECTORCARRIER UNIQUE_LTESectorCarrier_REL_ID_EUTRANCELL_USES_LTESECTORCARRIER CONSTRAINT -FK_ManagedElement_REL_FK_deployed-as-cloudNativeSystem FK_ManagedElement_REL_FK_deployed-as-cloudNativeSystem CONSTRAINT -TestEntityA TestEntityA TABLE +REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN +REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN +REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT COLUMN +REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN +REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN +REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN +REL_metadata_NRCELLDU_USES_NRSECTORCARRIER REL_metadata_NRCELLDU_USES_NRSECTORCARRIER COLUMN +REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN +REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN +REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN +REL_metadata_SECTOR_GROUPS_ANTENNAMODULE REL_metadata_SECTOR_GROUPS_ANTENNAMODULE COLUMN +REL_metadata_SECTOR_GROUPS_NRCELLDU REL_metadata_SECTOR_GROUPS_NRCELLDU COLUMN +UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT +UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT +UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT +UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1 CONSTRAINT +UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0 CONSTRAINT +UNIQUE_o-ran-smo-teiv-oam_ManagedElement_REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellCU_REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NearRTRICFunction_REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION UNIQUE_E020461673334EB824643649B6B31670FB064EC8 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUUPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_ORUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241 CONSTRAINT +aSide_AntennaModule aSide_AntennaModule COLUMN +aSide_NFDeployment aSide_NFDeployment COLUMN +aSide_NodeCluster aSide_NodeCluster COLUMN +antennaBeamWidth antennaBeamWidth COLUMN +antennaModelNumber antennaModelNumber COLUMN +arfcnDL arfcnDL COLUMN +arfcnUL arfcnUL COLUMN azimuth azimuth COLUMN -TestEntityB TestEntityB TABLE -REL_FK_deployed-managedElementttttttttttttttttttttttttttttttttttttttttt REL_FK_C2F5EC33C0760F653CE7263A49C0B697FCA2D542 COLUMN -FK_EUtranCell_REL_FK_grouped-by-sector FK_EUtranCell_REL_FK_grouped-by-sector CONSTRAINT +bSChannelBwDL bSChannelBwDL COLUMN +bSide_AntennaCapability bSide_AntennaCapability COLUMN +bSide_NRCellDU bSide_NRCellDU COLUMN +bSide_NearRTRICFunction bSide_NearRTRICFunction COLUMN +bSide_OCUCPFunction bSide_OCUCPFunction COLUMN +bSide_OCUUPFunction bSide_OCUUPFunction COLUMN +bSide_OCloudNamespace bSide_OCloudNamespace COLUMN +bSide_OCloudSite bSide_OCloudSite COLUMN +bSide_ODUFunction bSide_ODUFunction COLUMN cellLocalId cellLocalId COLUMN -gNBCUName gNBCUName COLUMN -FK_NRSectorCarrier_REL_FK_used-by-nrCellDu FK_NRSectorCarrier_REL_FK_used-by-nrCellDu CONSTRAINT -electricalAntennaTilt electricalAntennaTilt COLUMN -REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN -aSide_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn aSide_B0FD0521695A211BFF76F413A31F28CBA32E57ED COLUMN -GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 7D7AACEBB0E4E4732835BA4BFE708DDD3738962D TABLE -PK_PhysicalNetworkAppliance_id PK_PhysicalNetworkAppliance_id CONSTRAINT -REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN +dUpLMNId dUpLMNId COLUMN eUtranFqBands eUtranFqBands COLUMN -FK_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_aSide_GNBCUCPFunction FK_B2DDDC542E95DD31826EECEBBF67FD01DAF48833 CONSTRAINT -REL_ID_EUTRANCELL_USES_LTESECTORCARRIER REL_ID_EUTRANCELL_USES_LTESECTORCARRIER COLUMN -REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION COLUMN -CloudSite CloudSite TABLE -GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION TABLE -UNIQUE_ENodeBFunction_REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE UNIQUE_6964DA7D7CC1F79A3DB8B43E5F77E42DF8DFBF73 CONSTRAINT -FK_PhysicalNetworkAppliance_REL_FK_installed-at-site FK_PhysicalNetworkAppliance_REL_FK_installed-at-site CONSTRAINT -CloudNativeSystem CloudNativeSystem TABLE -UNIQUE_NodeCluster_REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE UNIQUE_NodeCluster_REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE CONSTRAINT -REL_FK_used-by-lteSectorCarrier REL_FK_used-by-lteSectorCarrier COLUMN -attribute1 attribute1 COLUMN -PK_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_id PK_19E2CBE3A8BBA12A7D9EC9923573BC0A65B1EC4A CONSTRAINT -FK_AntennaModule_REL_FK_grouped-by-sector FK_AntennaModule_REL_FK_grouped-by-sector CONSTRAINT -FK_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_managed-by-managedElementttttttttttttttttttttttttttttttttttttttt FK_C5EB2FEB41FDD27A7CED04A3FD665B4BDEF994F5 CONSTRAINT -REL_FK_used-by-nrCellDu REL_FK_used-by-nrCellDu COLUMN -REL_FK_comprised-by-cloudNativeSystem REL_FK_comprised-by-cloudNativeSystem COLUMN -FK_GNBDUFunction_REL_FK_managed-by-managedElement FK_GNBDUFunction_REL_FK_managed-by-managedElement CONSTRAINT -PK_LTESectorCarrier_id PK_LTESectorCarrier_id CONSTRAINT -PK_AntennaCapability_id PK_AntennaCapability_id CONSTRAINT -PK_CloudNativeSystem_id PK_CloudNativeSystem_id CONSTRAINT -FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA CONSTRAINT +electricalAntennaTilt electricalAntennaTilt COLUMN +frequencyDL frequencyDL COLUMN +frequencyUL frequencyUL COLUMN +gNBCUName gNBCUName COLUMN +gNBDUId gNBDUId COLUMN +gNBId gNBId COLUMN +gNBIdLength gNBIdLength COLUMN geo-location geo-location COLUMN -REL_FK_grouped-by-sector REL_FK_grouped-by-sector COLUMN -FK_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE_aSide_AntennaCapability FK_03713853A2B7ACDC198858CAFBFF355026FEA0B3 CONSTRAINT -FK_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE_bSide_AntennaModule FK_5059CE8D2FEE5A1FAD9E06F4FAAFC148BAEA70E3 CONSTRAINT -REL_FK_deployed-as-cloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm REL_FK_26958E3A529C4C8B68A29FDA906F8CD290F66078 COLUMN +geranFqBands geranFqBands COLUMN +horizontalBeamWidth horizontalBeamWidth COLUMN id id COLUMN -gNBId gNBId COLUMN -REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION COLUMN -PK_NRCellDU_id PK_NRCellDU_id CONSTRAINT -EUtranCell EUtranCell TABLE -PK_Site_id PK_Site_id CONSTRAINT -REL_FK_installed-at-site REL_FK_installed-at-site COLUMN -REL_FK_used-by-testEntityA REL_FK_used-by-testEntityA COLUMN -FK_AntennaCapability_REL_FK_used-by-lteSectorCarrier FK_AntennaCapability_REL_FK_used-by-lteSectorCarrier CONSTRAINT -aSide_AntennaCapability aSide_AntennaCapability COLUMN -nRTAC nRTAC COLUMN -earfcndl earfcndl COLUMN -FK_NodeCluster_REL_FK_located-at-cloudSite FK_NodeCluster_REL_FK_located-at-cloudSite CONSTRAINT -aSide_GNBDUFunction aSide_GNBDUFunction COLUMN -Namespace Namespace TABLE -FK_AntennaModule_REL_FK_installed-at-site FK_AntennaModule_REL_FK_installed-at-site CONSTRAINT -earfcnul earfcnul COLUMN -PK_TestEntityB_id PK_TestEntityB_id CONSTRAINT -FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA CONSTRAINT -fdnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 3786A6CA64C9422F9E7FC35B7B039F345BBDDA65 COLUMN -UNIQUE_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_ID_MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM UNIQUE_9A721779BB5547778B9258ACD73261B9AABFF302 CONSTRAINT -REL_FK_deployed-on-namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee REL_FK_8C98B70070BBD11F90F192DDA3ECF6302390E956 COLUMN -FK_NRSectorCarrier_REL_FK_provided-by-gnbduFunction FK_NRSectorCarrier_REL_FK_provided-by-gnbduFunction CONSTRAINT -PK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id PK_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id CONSTRAINT -cmId cmId COLUMN -aSide_TestEntityA aSide_TestEntityA COLUMN -type type COLUMN +mechanicalAntennaBearing mechanicalAntennaBearing COLUMN +mechanicalAntennaTilt mechanicalAntennaTilt COLUMN +metadata metadata COLUMN nCI nCI COLUMN -ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE TABLE -REL_ID_TESTENTITYA_USES_TESTENTITYB REL_ID_TESTENTITYA_USES_TESTENTITYB COLUMN -NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 50AC08AB775076E74FC4891954F1D99D3D293ACC TABLE -REL_ID_MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM REL_ID_B7945BFD83380F3E12CF99F2B0F838F364027F92 COLUMN -REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE COLUMN -REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION COLUMN -FK_NRCellDU_REL_FK_grouped-by-sector FK_NRCellDU_REL_FK_grouped-by-sector CONSTRAINT -FK_CloudNativeApplication_REL_FK_realised-managedElement FK_CloudNativeApplication_REL_FK_realised-managedElement CONSTRAINT -TESTENTITYA_GROUPS_TESTENTITYB TESTENTITYA_GROUPS_TESTENTITYB TABLE -PK_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_id PK_079D5D67E043B09F9C7CD4F6EA1DB12688D43F69 CONSTRAINT -UNIQUE_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9 CONSTRAINT -duplexType duplexType COLUMN -AntennaModule AntennaModule TABLE -LTESectorCarrier LTESectorCarrier TABLE -REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN -FK_LTESectorCarrier_REL_FK_used-antennaCapability FK_LTESectorCarrier_REL_FK_used-antennaCapability CONSTRAINT -REL_FK_managed-by-managedElement REL_FK_managed-by-managedElement COLUMN -UNIQUE_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_ID_GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU UNIQUE_4E6028C8AF5DB6D082B612C5CBB5B32A943C0AAD CONSTRAINT -fdn fdn COLUMN -dUpLMNId dUpLMNId COLUMN -UNIQUE_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN UNIQUE_176E72F1225D7EEFC222D87B6EC4D66DD968BD13 CONSTRAINT -REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN -REL_ID_SECTOR_GROUPS_EUTRANCELL REL_ID_SECTOR_GROUPS_EUTRANCELL COLUMN -Site Site TABLE -REL_ID_SECTOR_GROUPS_NRCELLDU REL_ID_SECTOR_GROUPS_NRCELLDU COLUMN -UNIQUE_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU UNIQUE_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU CONSTRAINT -arfcnUL arfcnUL COLUMN -PK_GNBDUFunction_id PK_GNBDUFunction_id CONSTRAINT -Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 78682DB1FFA2533BA45F8E4FAA5596E1A98479FC TABLE -FK_ENodeBFunction_REL_FK_realised-by-physicalNetworkAppliance FK_ENodeBFunction_REL_FK_realised-by-physicalNetworkAppliance CONSTRAINT -FK_GNBCUCPFunction_REL_FK_managed-by-managedElement FK_GNBCUCPFunction_REL_FK_managed-by-managedElement CONSTRAINT -REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL COLUMN nRFqBands nRFqBands COLUMN -CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 003B7CAE0FA8C3C54BE1BAD8BB9A50985A2EA03F TABLE -tac tac COLUMN -arfcnDL arfcnDL COLUMN -REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN -bSide_CloudNativeApplication bSide_CloudNativeApplication COLUMN -PK_CloudSite_id PK_CloudSite_id CONSTRAINT -CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 25978231183BE3B9ADD7DBE6C77F5E59696CDE5F TABLE -earfcn earfcn COLUMN -GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN AC201B3A42917A9A983A1E3683B67C38C50630FC TABLE -REL_ID_CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE REL_ID_AFBF10D23507AD3B6408947D2A9AF8465BA7B08C COLUMN -sectorId sectorId COLUMN -FK_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_realised-managedElementttttttttttttttttttttttttttttttttttttttttt FK_899FCB466B0BBCC040E945A3E746F5DE53CCCB29 CONSTRAINT -REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE COLUMN -TESTENTITYA_PROVIDES_TESTENTITYB TESTENTITYA_PROVIDES_TESTENTITYB TABLE -REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM COLUMN -GNBCUUPFunction GNBCUUPFunction TABLE -REL_FK_realised-managedElement REL_FK_realised-managedElement COLUMN -UNIQUE_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE UNIQUE_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE CONSTRAINT -UNIQUE_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER UNIQUE_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER CONSTRAINT -bSide_TestEntityB bSide_TestEntityB COLUMN -REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION COLUMN -totalTilt totalTilt COLUMN -antennaBeamWidth antennaBeamWidth COLUMN -FK_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_FK_deployed-as-cloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm FK_9C091709D40D51DEE4DC87A44695F6EBA2E965DE CONSTRAINT -gNBIdLength gNBIdLength COLUMN -UNIQUE_ENodeBFunction_REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION UNIQUE_F33037EE8037D0606D15FFB45EE8A27FD6DE30EE CONSTRAINT -FK_NRCellDU_REL_FK_provided-by-gnbduFunction FK_NRCellDU_REL_FK_provided-by-gnbduFunction CONSTRAINT -UNIQUE_GNBCUCPFunction_REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION UNIQUE_249F73FF1F4316A56DEF4424FA43C2064FFBE4DD CONSTRAINT -FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB CONSTRAINT -cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd 020335B0F627C169E24167748C38FE756FB34AE2 COLUMN -REL_FK_deployed-managedElement REL_FK_deployed-managedElement COLUMN -FK_CloudNativeApplication_REL_FK_comprised-by-cloudNativeSystem FK_CloudNativeApplication_REL_FK_comprised-by-cloudNativeSystem CONSTRAINT +nRPCI nRPCI COLUMN +nRTAC nRTAC COLUMN +name name COLUMN +nearRtRicId nearRtRicId COLUMN +o-ran-smo-teiv-cloud_CloudifiedNF o-ran-smo-teiv-cloud_CloudifiedNF TABLE +o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE TABLE +o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud_NFDeployment TABLE +o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE TABLE +o-ran-smo-teiv-cloud_NodeCluster o-ran-smo-teiv-cloud_NodeCluster TABLE +o-ran-smo-teiv-cloud_OCloudNamespace o-ran-smo-teiv-cloud_OCloudNamespace TABLE +o-ran-smo-teiv-cloud_OCloudSite o-ran-smo-teiv-cloud_OCloudSite TABLE +o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE +o-ran-smo-teiv-equipment_Site o-ran-smo-teiv-equipment_Site TABLE +o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-oam_ManagedElement TABLE +o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE +o-ran-smo-teiv-ran_NRCellCU o-ran-smo-teiv-ran_NRCellCU TABLE +o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran_NRCellDU TABLE +o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran_NRSectorCarrier TABLE +o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-ran_NearRTRICFunction TABLE +o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-ran_OCUCPFunction TABLE +o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-ran_OCUUPFunction TABLE +o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran_ODUFunction TABLE +o-ran-smo-teiv-ran_ORUFunction o-ran-smo-teiv-ran_ORUFunction TABLE +o-ran-smo-teiv-ran_Sector o-ran-smo-teiv-ran_Sector TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION 3C2E2CE7BDF8321BC824B6318B190690F58DBB82 TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION TABLE +o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU TABLE +oruId oruId COLUMN pLMNId pLMNId COLUMN -PK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id PK_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION_id CONSTRAINT -UNIQUE_CloudNativeApplication_REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION UNIQUE_DAB3C12479849DA6C222B812C2A8CD1535D0C186 CONSTRAINT -essScLocalId essScLocalId COLUMN -REL_FK_provided-by-gnbduFunction REL_FK_provided-by-gnbduFunction COLUMN -UNIQUE_LTESectorCarrier_REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88 CONSTRAINT -sectorCarrierType sectorCarrierType COLUMN -UNIQUE_PhysicalNetworkAppliance_REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE UNIQUE_A9110A77514C472452AC80053A8010FBAF481AD0 CONSTRAINT -GNBDUFunction GNBDUFunction TABLE -mechanicalAntennaTilt mechanicalAntennaTilt COLUMN -UNIQUE_CloudNativeApplication_REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION UNIQUE_F2774BC0806E925ADA0B1CAA50B5A41DFB7BF79A CONSTRAINT -UNIQUE_NRCellCU_REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU UNIQUE_NRCellCU_REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU CONSTRAINT +pLMNIdList pLMNIdList COLUMN plmnId plmnId COLUMN -PK_TestEntityA_id PK_TestEntityA_id CONSTRAINT -FK_CloudNativeApplication_REL_FK_deployed-on-namespace FK_CloudNativeApplication_REL_FK_deployed-on-namespace CONSTRAINT -gNBDUId gNBDUId COLUMN -CD_sourceIds CD_sourceIds COLUMN -CD_classifiers CD_classifiers COLUMN -CD_decorators CD_decorators COLUMN -PK_TESTENTITYA_GROUPS_TESTENTITYB_id PK_TESTENTITYA_GROUPS_TESTENTITYB_id CONSTRAINT -REL_ID_SECTOR_GROUPS_ANTENNAMODULE REL_ID_SECTOR_GROUPS_ANTENNAMODULE COLUMN -AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee B69D3E92CA22CE61B921AE61BD3CF031791CF714 TABLE -ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE B9B76FD20FF23B2A41C82CB5EDF6FA25B6AC2BC6 TABLE -PK_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_id PK_2673E8FB17E57FD56D5E897DA13412B9165B90AA CONSTRAINT -PK_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_E3722EAF721B41FACDCF065D2017267CE2C90BED CONSTRAINT -FK_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_00AE9B9921E38ACFEE934695787FA8794817A6ED CONSTRAINT -FK_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_68EED3C83D2C93559F7A61E7D05B4363CDF1DB8F CONSTRAINT -ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE C35AE10CFF62DEDC5E3FC3C40E47373B10800818 TABLE -PK_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_F03D1DD176CD75707BD6217EF652705007C0F272 CONSTRAINT -FK_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_E19DA712FB443E0212578638DF62281CFD6BFA7A CONSTRAINT -FK_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_7772B14325D2340707AF687BF0F70F32914F935D CONSTRAINT -aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C COLUMN -bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E COLUMN -REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM REL_CD_B7945BFD83380F3E12CF99F2B0F838F364027F92 COLUMN -REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD COLUMN -REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN REL_CD_CEAD4CCE5250E7D3C64801C8FDDC21F1D87BEC0C COLUMN -REL_CD_sourceIds_GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_040FC8B06B420BA5708AF4798102D1E65FB4DC61 COLUMN -REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE COLUMN -REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION COLUMN -REL_CD_sourceIds_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE REL_CD_556274C475BA56EE4DEFB691F9037C869223A124 COLUMN -REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL COLUMN -REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION COLUMN -REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM COLUMN -REL_CD_sourceIds_GNBCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_sourceIds_GNBCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU COLUMN -REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRCELLDU COLUMN -REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER COLUMN -REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_sourceIds_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN -REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_sourceIds_NAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_sourceIds_NAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN -REL_CD_sourceIds_NODECLUSTER_LOCATED_AT_CLOUDSITE REL_CD_sourceIds_NODECLUSTER_LOCATED_AT_CLOUDSITE COLUMN -REL_CD_sourceIds_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE REL_CD_sourceIds_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION REL_CD_8F561B5FB3CF928F2C4046CE1A7C37A8FE06B9A7 COLUMN -REL_CD_sourceIds_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION REL_CD_39262797D0119611B8459ECF46754A074711E485 COLUMN -REL_CD_sourceIds_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE REL_CD_sourceIds_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE COLUMN -REL_CD_sourceIds_CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE REL_CD_F7E43E0D0F76D6EFED9AB684B84A69E177F591D2 COLUMN -REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION COLUMN -REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB COLUMN -REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM REL_CD_BF4AAC1A1A910D1182505CABF55BAAE822B2BE59 COLUMN -REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6 COLUMN -REL_CD_classifiers_MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN REL_CD_744530EF4EB1D281D23ADB3DB4CC926DFBE7A60D COLUMN -REL_CD_classifiers_GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_66AEF506899F14F936A2F48F9444E2202F5D43F9 COLUMN -REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE COLUMN -REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN -REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION COLUMN -REL_CD_classifiers_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE REL_CD_C6C6D295144A637110DA4E6121BE13F30EFDBEBF COLUMN -REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL COLUMN -REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL COLUMN -REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION COLUMN -REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER COLUMN -REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM COLUMN -REL_CD_classifiers_GNBCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_classifiers_GNBCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU COLUMN -REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRCELLDU REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRCELLDU COLUMN -REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER COLUMN -REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_classifiers_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN -REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_classifiers_NAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_classifiers_NAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN -REL_CD_classifiers_NODECLUSTER_LOCATED_AT_CLOUDSITE REL_CD_classifiers_NODECLUSTER_LOCATED_AT_CLOUDSITE COLUMN -REL_CD_classifiers_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE REL_CD_classifiers_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE COLUMN -REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION COLUMN -REL_CD_classifiers_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION REL_CD_CCEBD4C63B90BD1764CB5A15C282D6CDBDF0B1F2 COLUMN -REL_CD_classifiers_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION REL_CD_026A1F92A7D93728916AF3DCC2C013FB79E29D07 COLUMN -REL_CD_classifiers_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE REL_CD_classifiers_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE COLUMN -REL_CD_classifiers_CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE REL_CD_C4349BB0F0292A3CE7E456E3A4C40C86DD6B15DF COLUMN -REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION COLUMN -REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB COLUMN -REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM REL_CD_AE82DD80D666B52D79A314F8B4EE9B046830D009 COLUMN -REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B COLUMN -REL_CD_decorators_MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN REL_CD_4D1F8113C3096B383582A7A04E68974983B4259E COLUMN -REL_CD_decorators_GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_022F8280C0739C614C5F3293E7D8D349A8A10E30 COLUMN -REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE COLUMN -REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE COLUMN -REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION COLUMN -REL_CD_decorators_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE REL_CD_B369805A0EB24F7C841B0E541A015F85AE2A23B1 COLUMN -REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL COLUMN -REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL COLUMN -REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION COLUMN -REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN -REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER COLUMN -REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM COLUMN -REL_CD_decorators_GNBCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_decorators_GNBCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_decorators_SECTOR_GROUPS_NRCELLDU REL_CD_decorators_SECTOR_GROUPS_NRCELLDU COLUMN -REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRCELLDU REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRCELLDU COLUMN -REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER COLUMN -REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_decorators_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN -REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN -REL_CD_decorators_NAMESPACE_DEPLOYED_ON_NODECLUSTER REL_CD_decorators_NAMESPACE_DEPLOYED_ON_NODECLUSTER COLUMN -REL_CD_decorators_NODECLUSTER_LOCATED_AT_CLOUDSITE REL_CD_decorators_NODECLUSTER_LOCATED_AT_CLOUDSITE COLUMN -REL_CD_decorators_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE REL_CD_decorators_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE COLUMN -REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION COLUMN -REL_CD_decorators_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION REL_CD_21E2495C31F0DBF735976C90F4CD10D1215190E1 COLUMN -REL_CD_decorators_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION REL_CD_D32E90288E1982363B2BD8DA9D2E90AA16F71575 COLUMN -REL_CD_decorators_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE REL_CD_decorators_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE COLUMN -REL_CD_decorators_CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE REL_CD_8AD499BB116F3213C079F643D4B3532035D092D2 COLUMN -REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION COLUMN -REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB COLUMN -o-ran-smo-teiv-ran-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt fa2dceaf53e045c136ce9db9bc5faae65a29fa4d TABLE -o-ran-smo-teiv-ran-oam_ManagedElement o-ran-smo-teiv-ran-oam_ManagedElement TABLE -o-ran-smo-teiv-ran-cloud_NodeCluster o-ran-smo-teiv-ran-cloud_NodeCluster TABLE -o-ran-smo-teiv-ran-cloud_CloudNativeSystem 163276fa439cdfccabb80f7acacb6fa638e8d314 TABLE -o-ran-smo-teiv-ran-cloud_CloudNativeApplication e01fcb87ad2c34ce66c34420255e25aaca270e5e TABLE -o-ran-smo-teiv-ran-cloud_CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ef701af8e1445ed5d377664ba1d3d1c645e31639 TABLE -o-ran-smo-teiv-ran-cloud_CloudSite o-ran-smo-teiv-ran-cloud_CloudSite TABLE -o-ran-smo-teiv-ran-cloud_Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee bc563e4310b0538e6bdd35f52684160af5b23671 TABLE -o-ran-smo-teiv-ran-cloud_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 5f8facd51b2bbddc90d9dee9be697907441892d0 TABLE -o-ran-smo-teiv-ran-cloud_Namespace o-ran-smo-teiv-ran-cloud_Namespace TABLE -o-ran-smo-teiv-ran-logical-to-equipment_Sector 22174a23af5d5a96143c83ddfa78654df0acb697 TABLE -o-ran-smo-teiv-ran-logical_GNBCUUPFunction 8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb TABLE -o-ran-smo-teiv-ran-logical_ENodeBFunction o-ran-smo-teiv-ran-logical_ENodeBFunction TABLE -o-ran-smo-teiv-ran-logical_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 300672c8a708d6af0b9af2f9accdff5e6e005721 TABLE -o-ran-smo-teiv-ran-logical_NRCellDU o-ran-smo-teiv-ran-logical_NRCellDU TABLE -o-ran-smo-teiv-ran-logical_LTESectorCarrier c88307168935f02fdecc084ea5040bb9db16c701 TABLE -o-ran-smo-teiv-ran-logical_GNBDUFunction o-ran-smo-teiv-ran-logical_GNBDUFunction TABLE -o-ran-smo-teiv-ran-logical_NRCellCU o-ran-smo-teiv-ran-logical_NRCellCU TABLE -o-ran-smo-teiv-ran-logical_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 3fdb9cd7557edf559a0e4de88df220e7545884b5 TABLE -o-ran-smo-teiv-ran-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 341622dca4e0350289717b52df5883edc3fa0280 TABLE -o-ran-smo-teiv-ran-logical_EUtranCell o-ran-smo-teiv-ran-logical_EUtranCell TABLE -o-ran-smo-teiv-ran-logical_GNBCUCPFunction c4a425179d3089b5288fdf059079d0ea26977f0f TABLE -o-ran-smo-teiv-ran-logical_NRSectorCarrier 39a335dca201ef99ae06f4ffd1908b534f8c6c39 TABLE -o-ran-smo-teiv-ran-logical_AntennaCapability 88f1bd76c7a935fb505cf235e6819f46c55ec98a TABLE -o-ran-smo-teiv-ran-logical_TestEntityB o-ran-smo-teiv-ran-logical_TestEntityB TABLE -o-ran-smo-teiv-ran-logical_TestEntityA o-ran-smo-teiv-ran-logical_TestEntityA TABLE -o-ran-smo-teiv-ran-equipment_Site o-ran-smo-teiv-ran-equipment_Site TABLE -o-ran-smo-teiv-ran-equipment_AntennaModule f8caf5ebe876c3001d67efe06e4d83abf0babe31 TABLE -o-ran-smo-teiv-ran-equipment_PhysicalNetworkAppliance 57a20807ab3f39c86b0b5bf9a819e0881353fa1e TABLE -o-ran-smo-teiv-ran-logical-to-cloud_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION 70a4a84bca01ea022ab24d8cb82422c572922675 TABLE -o-ran-smo-teiv-ran-logical-to-equipment_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE 5b8a47d4a8297a0a1d31e091af06e26d25ef6caf TABLE -o-ran-smo-teiv-ran-logical-to-cloud_GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN f86057a8762a50b1c7fb07af9d5c001bffaefd15 TABLE -o-ran-smo-teiv-ran-logical_TESTENTITYA_PROVIDES_TESTENTITYB 73936e503f137d82d1422c0f08c66c7ff8b90209 TABLE -o-ran-smo-teiv-ran-logical_TESTENTITYA_GROUPS_TESTENTITYB 70003c8082751e1832e7bc5c0d83db6d22c4fcdc TABLE -o-ran-smo-teiv-ran-equipment_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE 5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6 TABLE -o-ran-smo-teiv-ran-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE cd39d44beed963d50df42cd301e63d288f911c97 TABLE -o-ran-smo-teiv-ran-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE c6f3a3396e9165e886da928c5fe1382fb20dc850 TABLE -o-ran-smo-teiv-ran-logical-to-cloud_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION 7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7 TABLE -o-ran-smo-teiv-ran-logical-to-cloud_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION 10484f157f490eb5b27e40dbfaf4d5f2be17c57c TABLE -\. - -COPY ties_model.module_reference("name","revision", "namespace", "domain", "includedModules", "content") FROM stdin; -o-ran-smo-teiv-ran-logical-to-cloud 2023-10-24 urn:rdns:o-ran:-ran-logical-to-cloud RAN_LOGICAL_TO_CLOUD ["o-ran-smo-teiv-ran-logical", "o-ran-smo-teiv-ran-cloud"] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbC10by1jbG91ZCB7DQogICAgeWFuZy12ZXJzaW9uIDEuMTsNCiAgICBuYW1lc3BhY2UgInVybjpyZG5zOmNvbTplcmljc3Nvbjp0b3BpbnZtb2RlbDplcmljc3Nvbi10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbC10by1jbG91ZCI7DQogICAgcHJlZml4IHJhbmxvZ3RvY2xvdWRlcml0b3BpbnY7DQoNCiAgICBpbXBvcnQgZXJpY3Nzb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggeWV4dGU7IH0NCg0KICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCB0eXBlc2VyaXRvcGludjsgfQ0KDQogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggeWV4dGVyaXRvcGludjsgfQ0KDQogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbCB7cHJlZml4IHJhbmxvZ2VyaXRvcGludjsgfQ0KDQogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tY2xvdWQge3ByZWZpeCByYW5jbG91ZGVyaXRvcGludjsgfQ0KDQogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7DQogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7DQogICAgZGVzY3JpcHRpb24NCiAgICAiUkFOIExvZ2ljYWwgdG8gUkFOIENsb3VkIHRvcG9sb2d5IG1vZGVsLg0KDQogICAgQ29weXJpZ2h0IChjKSAyMDIzIEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIExvZ2ljYWwgdG8gUkFOIENsb3VkIHRvcG9sb2d5IHJlbGF0aW9ucyI7DQoNCiAgICByZXZpc2lvbiAiMjAyMy0xMC0yNCIgew0KICAgICAgICBkZXNjcmlwdGlvbg0KICAgICAgICAiSW5pdGlhbCByZXZpc2lvbi4iOw0KICAgICAgICB5ZXh0ZTp2ZXJzaW9uICIwIjsNCiAgICAgICAgeWV4dGU6cmVsZWFzZSAiMSI7DQogICAgICAgIHlleHRlOmNvcnJlY3Rpb24gIjEiOw0KICAgIH0NCg0KICAgIHlleHRlcml0b3BpbnY6ZG9tYWluIFJBTl9MT0dJQ0FMX1RPX0NMT1VEOw0KDQogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgR05CRFVGVU5DVElPTl9SRUFMSVNFRF9CWV9DTE9VRE5BVElWRUFQUExJQ0FUSU9OIHsgLy8gMC4ubiB0byAwLi5tDQoNCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYnktY2xvdWROYXRpdmVBcHBsaWNhdGlvbiB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIHJlYWxpc2VkIGJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgQ2xvdWQgTmF0aXZlIEFwcGxpY2F0aW9uLiI7DQogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmFTaWRlIHJhbmxvZ2VyaXRvcGludjpHTkJEVUZ1bmN0aW9uOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWduYmR1RnVuY3Rpb24gew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkIE5hdGl2ZSBBcHBsaWNhdGlvbiByZWFsaXNlcyBnTm9kZUJEVSBGdW5jdGlvbi4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjpiU2lkZSByYW5jbG91ZGVyaXRvcGludjpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgR05CQ1VDUEZVTkNUSU9OX1JFQUxJU0VEX0JZX0NMT1VETkFUSVZFQVBQTElDQVRJT04geyAvLyAwLi5uIHRvIDAuLm0NCg0KICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCByZWFsaXNlZC1ieS1jbG91ZE5hdGl2ZUFwcGxpY2F0aW9uIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUItQ1UtQ1AgRnVuY3Rpb24gcmVhbGlzZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgIENsb3VkIE5hdGl2ZSBBcHBsaWNhdGlvbi4uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YVNpZGUgcmFubG9nZXJpdG9waW52OkdOQkNVQ1BGdW5jdGlvbjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYtbGlzdCByZWFsaXNlZC1nbmJjdWNwRnVuY3Rpb24gew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkIE5hdGl2ZSBBcHBsaWNhdGlvbiByZWFsaXNlcw0KICAgICAgICAgICAgICAgICAgICAgICAgZ05vZGVCQ1VDUCBGdW5jdGlvbi4uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgcmFuY2xvdWRlcml0b3BpbnY6Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHlleHRlcml0b3BpbnY6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEdOQkNVVVBGVU5DVElPTl9SRUFMSVNFRF9CWV9DTE9VRE5BVElWRUFQUExJQ0FUSU9OIHsgLy8gMC4ubiB0byAwLi5tDQoNCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYnktY2xvdWROYXRpdmVBcHBsaWNhdGlvbiB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLUNVLVVQIEZ1bmN0aW9uIHJlYWxpc2VkIGJ5DQogICAgICAgICAgICAgICAgICAgICAgICBDbG91ZCBOYXRpdmUgQXBwbGljYXRpb24uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YVNpZGUgcmFubG9nZXJpdG9waW52OkdOQkNVVVBGdW5jdGlvbjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYtbGlzdCByZWFsaXNlZC1nbmJjdXVwRnVuY3Rpb24gew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkIE5hdGl2ZSBBcHBsaWNhdGlvbiByZWFsaXNlcw0KICAgICAgICAgICAgICAgICAgICAgICAgZ05vZGVCQ1VVUCBGdW5jdGlvbi4uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgcmFuY2xvdWRlcml0b3BpbnY6Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCn0= -o-ran-smo-teiv-ran-equipment 2023-06-26 urn:rdns:o-ran:o-ran-smo-teiv-ran-equipment RAN_EQUIPMENT [] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tZXF1aXBtZW50IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpyZG5zOmNvbTplcmljc3Nvbjp0b3BpbnZtb2RlbDplcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktcmFuLWVxdWlwbWVudCI7CiAgICBwcmVmaXggcmFuZXF1aXBlcml0b3BpbnY7CgogICAgaW1wb3J0IGVyaWNzc29uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlOyB9CgogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IHR5cGVzZXJpdG9waW52OyB9CgogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggeWV4dGVyaXRvcGludjsgfQoKCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiUkFOIEVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgIFJBTiBMb2dpY2FsIGRvbWFpbiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgZnVuY3Rpb25hbCBjYXBhYmlsaXR5CiAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4iOwoKICAgIHJldmlzaW9uICIyMDIzLTEyLTEyIiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIHlleHRlOnZlcnNpb24gIjAiOwogICAgICAgIHlleHRlOnJlbGVhc2UgIjIiOwogICAgICAgIHlleHRlOmNvcnJlY3Rpb24gIjAiOwogICAgfQoKICAgIHlleHRlcml0b3BpbnY6ZG9tYWluIFJBTl9FUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUKICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4gYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBmZG4gewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgRnVsbCBEaXN0aW5ndWlzaGVkIE5hbWUgKEZETikgaWRlbnRpZmllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFTdWJVbml0IE1PLiBJdCBjb250YWlucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCBmcm9tIHRoZSBTdWJuZXR3b3JrIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50ZW5uYVN1YlVuaXQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdHlwZXNlcml0b3BpbnY6XzNHUFBfRkROX1R5cGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllci4gVGhpcyBhdHRyaWJ1dGUgaXMgcGFydCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGFudGVubmEgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUgdmVydGljYWwgcGxhbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVtb3RlIEVsZWN0cmljYWwgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWx0IGRvd24gaXMgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgQW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hIHJhZGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4gZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZHVwbGV4VHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdG9yIG9mIEVVdHJhbkNlbGwgdHlwZSwgRkREIG9yIFRERCI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIHR5cGUxIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gInR5cGUxIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpTT1VSQ0VfSURTOwogICAgICAgIH0KICAgIH0KCiAgICB5ZXh0ZXJpdG9waW52OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1VTRVNfQU5URU5OQU1PRFVMRSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLjEpCgogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSByZWFsaXNlZCBieSBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmFTaWRlIHJhbmVxdWlwZXJpdG9waW52OkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSByZWFsaXNlcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmJTaWRlIHJhbmVxdWlwZXJpdG9waW52OkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KfQ== -o-ran-smo-teiv-ran-oam-to-cloud 2023-10-24 urn:rdns:o-ran:o-ran-smo-teiv-ran-oam-to-cloud RAN_OAM_TO_CLOUD ["o-ran-smo-teiv-ran-oam", "o-ran-smo-teiv-ran-cloud"] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tb2FtLXRvLWNsb3VkIHsNCiAgICB5YW5nLXZlcnNpb24gMS4xOw0KICAgIG5hbWVzcGFjZSAidXJuOnJkbnM6Y29tOmVyaWNzc29uOnRvcGludm1vZGVsOmVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tb2FtLXRvLWNsb3VkIjsNCiAgICBwcmVmaXggcmFub2FtdG9jbG91ZGVyaXRvcGludjsNCg0KICAgIGltcG9ydCBlcmljc3Nvbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCB5ZXh0ZTsgfQ0KDQogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IHR5cGVzZXJpdG9waW52OyB9DQoNCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCB5ZXh0ZXJpdG9waW52OyB9DQoNCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LXJhbi1vYW0ge3ByZWZpeCByYW5vYW1lcml0b3BpbnY7IH0NCg0KICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktcmFuLWNsb3VkIHtwcmVmaXggcmFuY2xvdWRlcml0b3BpbnY7IH0NCg0KICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOw0KICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOw0KICAgIGRlc2NyaXB0aW9uIA0KICAgICJSQU4gTyZNIHRvIENsb3VkIHRvcG9sb2d5IG1vZGVsLg0KDQogICAgQ29weXJpZ2h0IChjKSAyMDIzIEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICAgIA0KICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zIjsNCg0KICAgIHJldmlzaW9uICIyMDIzLTEwLTI0IiB7DQogICAgICAgIGRlc2NyaXB0aW9uDQogICAgICAgICJJbml0aWFsIHJldmlzaW9uLiI7DQogICAgICAgIHlleHRlOnZlcnNpb24gIjAiOw0KICAgICAgICB5ZXh0ZTpyZWxlYXNlICIxIjsNCiAgICAgICAgeWV4dGU6Y29ycmVjdGlvbiAiMSI7DQogICAgfQ0KDQogICAgeWV4dGVyaXRvcGludjpkb21haW4gUkFOX09BTV9UT19DTE9VRDsNCg0KICAgIHlleHRlcml0b3BpbnY6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX0RFUExPWUVEX0FTX0NMT1VETkFUSVZFU1lTVEVNIHsgIC8vIDAuLjEgdG8gMQ0KDQogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZiBkZXBsb3llZC1hcy1jbG91ZE5hdGl2ZVN5c3RlbSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IGRlcGxveWVkIGFzIENsb3VkIE5hdGl2ZSBTeXN0ZW0uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YVNpZGUgcmFub2FtZXJpdG9waW52Ok1hbmFnZWRFbGVtZW50Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZiBkZXBsb3llZC1tYW5hZ2VkRWxlbWVudCB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWQgTmF0aXZlIFN5c3RlbSBkZXBsb3lzIE1hbmFnZWQgRWxlbWVudC4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjpiU2lkZSByYW5jbG91ZGVyaXRvcGludjpDbG91ZE5hdGl2ZVN5c3RlbTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfUkVBTElTRURfQllfQ0xPVUROQVRJVkVBUFBMSUNBVElPTiB7IC8vIDEgdG8gMS4ubg0KDQogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWJ5LWNsb3VkTmF0aXZlQXBwbGljYXRpb24gew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCByZWFsaXNlZCBieSBDbG91ZCANCiAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZSBBcHBsaWNhdGlvbi4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSByYW5vYW1lcml0b3BpbnY6TWFuYWdlZEVsZW1lbnQ7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYgcmVhbGlzZWQtbWFuYWdlZEVsZW1lbnQgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNsb3VkIE5hdGl2ZSBBcHBsaWNhdGlvbiByZWFsaXNlcyANCiAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZWQgRWxlbWVudC4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjpiU2lkZSByYW5jbG91ZGVyaXRvcGludjpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7DQogICAgICAgIH0JDQogICAgfQ0KfQ== -o-ran-smo-teiv-ran-oam-to-logical 2023-10-24 urn:rdns:o-ran:o-ran-smo-teiv-ran-oam-to-logical RAN_OAM_TO_LOGICAL ["o-ran-smo-teiv-ran-oam", "o-ran-smo-teiv-ran-logical"] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tb2FtLXRvLWxvZ2ljYWwgew0KICAgIHlhbmctdmVyc2lvbiAxLjE7DQogICAgbmFtZXNwYWNlICJ1cm46cmRuczpjb206ZXJpY3Nzb246dG9waW52bW9kZWw6ZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LXJhbi1vYW0tdG8tbG9naWNhbCI7DQogICAgcHJlZml4IHJhbm9hbXRvbG9nZXJpdG9waW52Ow0KDQogICAgaW1wb3J0IGVyaWNzc29uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlOyB9DQoNCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggdHlwZXNlcml0b3BpbnY7IH0NCg0KICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlcml0b3BpbnY7IH0NCg0KICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktcmFuLW9hbSB7cHJlZml4IHJhbm9hbWVyaXRvcGludjsgfQ0KDQogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbCB7cHJlZml4IHJhbmxvZ2VyaXRvcGludjsgfQ0KDQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogICAgDQogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucyI7DQoNCiAgICByZXZpc2lvbiAiMjAyMy0xMC0yNCIgew0KICAgICAgICBkZXNjcmlwdGlvbg0KICAgICAgICAiSW5pdGlhbCByZXZpc2lvbi4iOw0KICAgICAgICB5ZXh0ZTp2ZXJzaW9uICIwIjsNCiAgICAgICAgeWV4dGU6cmVsZWFzZSAiMSI7DQogICAgICAgIHlleHRlOmNvcnJlY3Rpb24gIjEiOw0KICAgIH0NCg0KICAgIHlleHRlcml0b3BpbnY6ZG9tYWluIFJBTl9PQU1fVE9fTE9HSUNBTDsNCg0KICAgIHlleHRlcml0b3BpbnY6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfRU5PREVCRlVOQ1RJT04geyAgIC8vIDEgdG8gMC4ubg0KDQogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZW5vZGViRnVuY3Rpb24gew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIGVOb2RlQiBGdW5jdGlvbi4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSByYW5vYW1lcml0b3BpbnY6TWFuYWdlZEVsZW1lbnQ7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gImVOb2RlQiBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOw0KICAgICAgICAgICAgeWV4dGVyaXRvcGludjpiU2lkZSByYW5sb2dlcml0b3BpbnY6RU5vZGVCRnVuY3Rpb247DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHlleHRlcml0b3BpbnY6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfR05CRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubg0KDQogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZ25iZHVGdW5jdGlvbiB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgZ05vZGVCLURVIEZ1bmN0aW9uLiI7DQogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmFTaWRlIHJhbm9hbWVyaXRvcGludjpNYW5hZ2VkRWxlbWVudDsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7DQogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmJTaWRlIHJhbmxvZ2VyaXRvcGludjpHTkJEVUZ1bmN0aW9uOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19HTkJDVUNQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4NCg0KICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLWduYmN1Y3BGdW5jdGlvbiB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgZ05vZGVCLUNVLUNQIEZ1bmN0aW9uLiI7DQogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmFTaWRlIHJhbm9hbWVyaXRvcGludjpNYW5hZ2VkRWxlbWVudDsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLUNVLUNQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7DQogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmJTaWRlIHJhbmxvZ2VyaXRvcGludjpHTkJDVUNQRnVuY3Rpb247DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsNCiAgICAgICAgfQkNCiAgICB9DQoNCiAgICB5ZXh0ZXJpdG9waW52OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX0dOQkNVVVBGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubg0KDQogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZ25iY3V1cEZ1bmN0aW9uIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgbWFuYWdlcyBnTm9kZUItQ1UtVVAgRnVuY3Rpb24uIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YVNpZGUgcmFub2FtZXJpdG9waW52Ok1hbmFnZWRFbGVtZW50Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZiBtYW5hZ2VkLWJ5LW1hbmFnZWRFbGVtZW50IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUItQ1UtVVAgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsNCiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgcmFubG9nZXJpdG9waW52OkdOQkNVVVBGdW5jdGlvbjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KfQ== -o-ran-smo-teiv-ran-cloud 2023-06-26 urn:rdns:o-ran:o-ran-smo-teiv-ran-cloud RAN_CLOUD [] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOnJkbnM6Y29tOmVyaWNzc29uOnRvcGludm1vZGVsOmVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tY2xvdWQiOwogICAgcHJlZml4IHJhbmNsb3VkZXJpdG9waW52OwoKICAgIGltcG9ydCBlcmljc3Nvbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCB5ZXh0ZTsgfQoKICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCB0eXBlc2VyaXRvcGludjsgfQoKICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlcml0b3BpbnY7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiUkFOIENsb3VkIHRvcG9sb2d5IG1vZGVsLgoKICAgIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQogICAgUkFOIENMT1VEIGRvbWFpbiwgd2hpY2ggY29tcHJpc2VzIGNsb3VkIGluZnJhc3RydWNlIGFuZAogICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLiI7CgogICAgcmV2aXNpb24gIjIwMjMtMDYtMjYiIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgeWV4dGU6dmVyc2lvbiAiMCI7CiAgICAgICAgeWV4dGU6cmVsZWFzZSAiMSI7CiAgICAgICAgeWV4dGU6Y29ycmVjdGlvbiAiMCI7CiAgICB9CgogICAgeWV4dGVyaXRvcGludjpkb21haW4gUkFOX0NMT1VEOwoKICAgIGxpc3QgQ2xvdWRTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdAogICAgICAgICAgICAgICAgICAgIGhvc3RzIHRoZSBDbG91ZCBOYXRpdmUgQXBwbGljYXRpb25zLiI7CgogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KfQ== -o-ran-smo-teiv-ran-logical-to-equipment 2023-10-24 urn:rdns:o-ran:-ran-logical-to-equipment RAN_LOGICAL_TO_EQUIPMENT ["o-ran-smo-teiv-ran-logical", "o-ran-smo-teiv-ran-equipment"] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tZXF1aXBtZW50LXRvLWxvZ2ljYWwgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOnJkbnM6Y29tOmVyaWNzc29uOnRvcGludm1vZGVsOmVyaWNzc29uLXRvcG9sb2d5YW5kaW52ZW50b3J5LXJhbi1lcXVpcG1lbnQtdG8tbG9naWNhbCI7CiAgICBwcmVmaXggcmFubG9ndG9lcXVpcGVyaXRvcGludjsKCiAgICBpbXBvcnQgZXJpY3Nzb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggeWV4dGU7IH0KCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggdHlwZXNlcml0b3BpbnY7IH0KCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCB5ZXh0ZXJpdG9waW52OyB9CgogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbCB7cHJlZml4IHJhbmxvZ2VyaXRvcGludjsgfQoKICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktcmFuLWVxdWlwbWVudCB7cHJlZml4IHJhbmVxdWlwZXJpdG9waW52OyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiUkFOIExvZ2ljYWwgdG8gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTG9naWNhbCB0byBFcXVpcG1lbnQgdG9wb2xvZ3kKICAgIGVudGl0aWVzIGFuZCByZWxhdGlvbnMuIjsKCiAgICByZXZpc2lvbiAiMjAyMy0xMi0xMiIgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICB5ZXh0ZTp2ZXJzaW9uICIwIjsKICAgICAgICB5ZXh0ZTpyZWxlYXNlICIyIjsKICAgICAgICB5ZXh0ZTpjb3JyZWN0aW9uICIwIjsKICAgIH0KCiAgICB5ZXh0ZXJpdG9waW52OmRvbWFpbiBFUVVJUE1FTlRfVE9fUkFOX0xPR0lDQUw7CgogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSByYW5lcXVpcGVyaXRvcGludjpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmJTaWRlIHJhbmxvZ2VyaXRvcGludjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQo= -o-ran-smo-teiv-ran-logical 2023-11-03 urn:rdns:o-ran:o-ran-smo-teiv-ran-logical RAN_LOGICAL [] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tbG9naWNhbCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46cmRuczpjb206ZXJpY3Nzb246dG9waW52bW9kZWw6ZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LXJhbi1sb2dpY2FsIjsKICAgIHByZWZpeCByYW5sb2dlcml0b3BpbnY7CgogICAgaW1wb3J0IGVyaWNzc29uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlOyB9CgogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IHR5cGVzZXJpdG9waW52OyB9CgogICAgaW1wb3J0IGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggeWV4dGVyaXRvcGludjsgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQogICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkKICAgIG9mIHRoZSBkZXBsb3llZCBSQU4gdGhhdCBhcmUgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjMtMTItMTIiIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgeWV4dGU6dmVyc2lvbiAiMCI7CiAgICAgICAgeWV4dGU6cmVsZWFzZSAiMyI7CiAgICAgICAgeWV4dGU6Y29ycmVjdGlvbiAiMCI7CiAgICB9CgogICAgeWV4dGVyaXRvcGludjpkb21haW4gUkFOX0xPR0lDQUw7CgogICAgZ3JvdXBpbmcgUExNTklkIHsKICAgICAgICBsZWFmIG1jYyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTW9iaWxlIENvdW50cnkgQ29kZSAoTUNDKSBpZGVudGlmaWVzIHVuaXF1ZWx5CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbWljaWxlIGNvdW50cnkgb2YgbW9iaWxlIHN1YnNjcmliZXIuCgogICAgICAgICAgICAgICAgICAgICAgICBNQ0MgY29uc2lzdHMgb2YgdGhyZWUgZGVjaW1hbCBkaWdpdHMuIFRoZSBmaXJzdCBkaWdpdAogICAgICAgICAgICAgICAgICAgICAgICBvZiBNQ0MgaWRlbnRpZmllcyBnZW9ncmFwaGljIHJlZ2lvbi4gKFZhbHVlcyAxIGFuZCA4CiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmaXJzdCBkaWdpdCBhcmUgbm90IGFsbG93ZWQuKQogICAgICAgICAgICAgICAgICAgICAgICBBcyBkZWZhdWx0IHZhbHVlLCB1c2UgMDAxLgogICAgICAgICAgICAgICAgICAgICAgICBBbGxvd2VkIHZhbHVlczogWzAyMzQ1Njc5XVswLTldWzAtOV0KCiAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljYXRpb246IDNHUFAgVFMgMjguNTQxCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogXlswMjM0NTY3OV1bMC05XVswLTldJCI7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgaWRlbnRpZmllcyBob21lIFBMTU4KICAgICAgICAgICAgICAgICAgICAgICAgb2YgbW9iaWxlIHN1YnNjcmlwdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgIE1OQyBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgZGVjaW1hbCBkaWdpdHMuIEZvcgogICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlLCBNTkMgb2YgMDAxIGlzIG5vdCBzYW1lIGFzIE1OQyBvZiAwMS4KICAgICAgICAgICAgICAgICAgICAgICAgQXMgZGVmYXVsdCB2YWx1ZSwgdXNlIDAxLgogICAgICAgICAgICAgICAgICAgICAgICBBbGxvd2VkIHZhbHVlczogWzAtOV1bMC05XVswLTldfFswLTldWzAtOV0KCiAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljYXRpb246IDNHUFAgVFMgMjguNTQxCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogXigoWzAtOV1bMC05XVswLTldKXwoWzAtOV1bMC05XSkpJCI7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gRXZvbHZlZCBOb2RlIEIgKGVOb2RlQikgaXMgdGhlIG9ubHkgbWFuZGF0b3J5CiAgICAgICAgICAgICAgICAgICAgbm9kZSBpbiB0aGUgcmFkaW8gYWNjZXNzIG5ldHdvcmsgKFJBTikgb2YgTG9uZy1UZXJtCiAgICAgICAgICAgICAgICAgICAgRXZvbHV0aW9uIChMVEUpLiBUaGUgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlCiAgICAgICAgICAgICAgICAgICAgc3RhdGlvbiB0aGF0IGhhbmRsZXMgcmFkaW8gY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY2VsbCBhbmQgY2FycmllcyBvdXQgcmFkaW8gcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlciBkZWNpc2lvbnMuIFVubGlrZSAyLzNHCiAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3MgUkFOLCB0aGVyZSBpcyBubyBjZW50cmFsaXplZCByYWRpbyBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciBpbiBMVEUuIEl0IGlzIHRoZSBoYXJkd2FyZSB0aGF0IGlzIGNvbm5lY3RlZAogICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcwogICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IHdpdGggbW9iaWxlIGhhbmRzZXRzIChVc2VyIEVxdWlwbWVudCksIGxpa2UgYSBiYXNlCiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIgc3RhdGlvbiAoQlRTKSBpbiBHU00gbmV0d29ya3MuIFRoaXMgc2ltcGxpZmllcwogICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlciByZXNwb25zZSB0aW1lcy4iOwoKICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKCiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2VsbCBHbG9iYWwgSWRlbnRpdHksIGFuZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgICAgICBkZWZhdWx0IDExOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGR1cGxleFR5cGUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRvciBvZiBFVXRyYW5DZWxsIHR5cGUsIEZERCBvciBUREQiOwogICAgICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgZW51bSB0ZGQgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVEREIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBlTm9kZUJQbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgRU5vZGVCIFB1YmxpYyBMYW5kIE1vYmlsZSBOZXR3b3JrCiAgICAgICAgICAgICAgICAoUExNTikgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIKICAgICAgICAgICAgICAgIEdsb2JhbCBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZSAoTUNDPTAwMSwgTU5DPTAxKQogICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBjYW4gbm90IGJlIHVzZWQgYXMgYSB2YWxpZCBQTE1OIElkZW50aXR5LiI7CgogICAgICAgICAgICAgICAgbGVhZiBtY2MgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTUNDIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6U09VUkNFX0lEUzsKICAgICAgICB9CiAgICB9CiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwKICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIFJCUyBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlCiAgICAgICAgICAgICAgICAgICAgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLiBUaGUgTU8gYWxzbwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGFzc29jaWF0ZWQgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3NvY2lhdGVkIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlNPVVJDRV9JRFM7CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTFRFU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBMVEUgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgZm9yIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcwogICAgICAgICAgICAgICAgICAgIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYSBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UKICAgICAgICAgICAgICAgICAgICBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbiBoYXZpbmcKICAgICAgICAgICAgICAgICAgICBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuCiAgICAgICAgICAgICAgICAgICAgVGhlIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbAogICAgICAgICAgICAgICAgICAgIGludGVyZmVyZW5jZSBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zCiAgICAgICAgICAgICAgICAgICAgdXNlIHRocmVlIHNlY3RvciBjZWxscy4iOwoKICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0b3IgY2FycmllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlNvdXJjZUlkZW50aWZpZXJzR3JwOwoKICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzCiAgICAgICAgICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgZm9yIGRlZmluaW5nIHRoZSBsb2dpY2FsCiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgICAgICAgICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICB3aXRoIGEgYmFzZSBzdGF0aW9uIGhhdmluZyBpdHMgb3duIGFudGVubmFzLAogICAgICAgICAgICAgICAgICAgIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlIGNvbmNlcHQKICAgICAgICAgICAgICAgICAgICBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlbmNlIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yIGNlbGxzLiI7CgogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFyZmNuREwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIEZyZXF1ZW5jeSBDaGFubmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeURMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIGRvd25saW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpTb3VyY2VJZGVudGlmaWVyc0dycDsKICAgICAgICB9CiAgICB9CgogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgdHlwZXNlcml0b3BpbnY6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmFTaWRlIExURVNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ3BhYmlsaXR5IHVzZWQgYnkgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5PREVCRlVOQ1RJT05fUFJPVklERVNfTFRFU0VDVE9SQ0FSUklFUiB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1sdGVTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gImVOb2RlQiBGdW5jdGlvbiBwcm92aWRlcyBMVEUgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgeWV4dGVyaXRvcGludjpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTlJTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICB5ZXh0ZXJpdG9waW52OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIHlleHRlcml0b3BpbnY6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFDQVBBQklMSVRZX1JFQUxJU0VEX0JZX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLm4gdG8gMC4ubSkKCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgICAgICAgICAgeWV4dGVyaXRvcGludjphU2lkZSByYW5sb2dlcml0b3BpbnY6QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgIHlleHRlcml0b3BpbnY6YlNpZGUgcmFubG9nZXJpdG9waW52OkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-ran-oam 2023-06-26 urn:rdns:o-ran:o-ran-smo-teiv-ran-oam RAN_OAM [] bW9kdWxlIGVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tb2FtIHsNCiAgICB5YW5nLXZlcnNpb24gMS4xOw0KICAgIG5hbWVzcGFjZSAidXJuOnJkbnM6Y29tOmVyaWNzc29uOnRvcGludm1vZGVsOmVyaWNzc29uLXByZS1yMS10b3BvbG9neWFuZGludmVudG9yeS1yYW4tb2FtIjsNCiAgICBwcmVmaXggcmFub2FtZXJpdG9waW52Ow0KDQogICAgaW1wb3J0IGVyaWNzc29uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlOyB9DQoNCiAgICBpbXBvcnQgZXJpY3Nzb24tcHJlLXIxLXRvcG9sb2d5YW5kaW52ZW50b3J5LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggdHlwZXNlcml0b3BpbnY7IH0NCg0KICAgIGltcG9ydCBlcmljc3Nvbi1wcmUtcjEtdG9wb2xvZ3lhbmRpbnZlbnRvcnktY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IHlleHRlcml0b3BpbnY7IH0NCg0KICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOw0KICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOw0KICAgIGRlc2NyaXB0aW9uIA0KICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLg0KDQogICAgQ29weXJpZ2h0IChjKSAyMDIzIEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICAgIA0KICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIA0KICAgIFJBTiBPJk0gZG9tYWluLCB3aGljaCBhcmUgaW50ZW5kZWQgdG8gcmVwcmVzZW50IG1hbmFnZW1lbnQgc3lzdGVtcyANCiAgICBhbmQgbWFuYWdlbWVudCBpbnRlcmZhY2VzLiI7DQoNCiAgICByZXZpc2lvbiAiMjAyMy0wNi0yNiIgew0KICAgICAgICBkZXNjcmlwdGlvbg0KICAgICAgICAiSW5pdGlhbCByZXZpc2lvbi4iOw0KICAgICAgICB5ZXh0ZTp2ZXJzaW9uICIwIjsNCiAgICAgICAgeWV4dGU6cmVsZWFzZSAiMSI7DQogICAgICAgIHlleHRlOmNvcnJlY3Rpb24gIjAiOw0KICAgIH0NCg0KICAgIHlleHRlcml0b3BpbnY6ZG9tYWluIFJBTl9PQU07DQogICAgICAgIA0KICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgew0KICAgICAgICBkZXNjcmlwdGlvbiANCiAgICAgICAgIkEgTWFuYWdlZCBFbGVtZW50IChNRSkgaXMgYSBub2RlIGludG8gYSB0ZWxlY29tbXVuaWNhdGlvbiBuZXR3b3JrIA0KICAgICAgICBwcm92aWRpbmcgc3VwcG9ydCBhbmQvb3Igc2VydmljZSB0byBzdWJzY3JpYmVycy4gQW4gTUUgY29tbXVuaWNhdGVzIA0KICAgICAgICB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgb3ZlciBvbmUgb3IgbW9yZSANCiAgICAgICAgaW50ZXJmYWNlcyBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgbW9uaXRvcmVkIGFuZC9vciBjb250cm9sbGVkLiI7DQoNCiAgICAgICAgdXNlcyB0eXBlc2VyaXRvcGludjpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGZkbiB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgRnVsbCBEaXN0aW5ndWlzaGVkIE5hbWUgKEZETikgaWRlbnRpZmllcyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgTU8uIEl0IGNvbnRhaW5zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCBmcm9tIHRoZSBTdWJuZXR3b3JrIHRvIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkRWxlbWVudC4iOw0KICAgICAgICAgICAgICAgIHR5cGUgdHlwZXNlcml0b3BpbnY6XzNHUFBfRkROX1R5cGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbnRhaW5lciBjbUlkIHsNCiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzZXJpdG9waW52OkNNX0lEOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ== +positionWithinSector positionWithinSector COLUMN +sectorId sectorId COLUMN +totalTilt totalTilt COLUMN +verticalBeamWidth verticalBeamWidth COLUMN \. COPY ties_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 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZHVsZSBkZWZpbmVzIFlBTkcgZXh0ZW5zaW9ucyBuZWVkZWQKICAgIDNHUFAgWUFORyBtb2RlbGluZy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTkgM0dQUC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBFeHRlbnNpb25zIE1VU1QgYmUgZGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZQogICAgZGVzY3JpcHRpb24gc3RhdGVtZW50OgogICAgICAgIC0gV2hhdCBpcyB0aGlzIHN0YXRlbWVudC4KICAgICAgICAtIE5ld2xpbmUsCiAgICAgICAgLSBUaGlzIHN0YXRlbWVudCBjYW4gYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlIHh4eCBzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBzdWJzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gTmV3bGluZQogICAgICAgIC0gSXMgY2hhbmdpbmcgdGhpcyBzdGF0ZW1lbnQgYW4gZWRpdG9yaWFsLCBCQyhiYWNrd2FyZHMgY29tcGF0aWJsZSkKICAgICAgICBvciBOQkMobm9uLUJDKSBjaGFuZ2U/CiAgICAgICAgLSBOZXdsaW5lLgogICAgICAgIC0gVGhlIGFyZ3VtZW50IGl0cyBtZWFuaW5nIGFuZCB0eXBlLiBQcmVmZXJhYmx5IHVzZSBZQU5HIHR5cGVzIGFuZAogICAgICAgICAgY29uc3RyYWludHMgdG8gZGVmaW5lIHRoZSBhcmd1bWVudCdzIHR5cGUuCgogICAgQW55IGV4dGVuc2lvbiBzdGF0ZW1lbnQgY2FuIGJlIGFkZGVkIHdpdGggYQogICAgZGV2aWF0aW9uL2RldmlhdGUgYWRkIHN0YXRlbWVudC4gSW4gdGhpcyBjYXNlIHRoZSByZXN0cmljdGlvbiBhYm91dAogICAgdGhlIHBhcmVudCBzdGF0ZW1lbnQgb2YgdGhlIGV4dGVuc2lvbiBTSEFMTCBiZSBldmFsdWF0ZWQgYmFzZWQgb24gdGhlCiAgICB0YXJnZXQgb2YgdGhlIGRldmlhdGlvbiBzdGF0ZW1lbnQuCgogICAgU3VwcG9ydCBmb3IgdGhpcyBtb2R1bGUgZG9lcyBub3QgbWVhbiB0aGF0IGEgWUFORyBzZXJ2ZXIgaW1wbGVtZW50cwogICAgc3VwcG9ydCBmb3IgZWFjaCBvZiB0aGVzZSBleHRlbnNpb25zLgogICAgSW1wbGVtZW50ZXJzIG9mIGVhY2ggc3BlY2lmaWMgbW9kdWxlIHVzaW5nIGFuIGV4dGVuc2lvbnMgTVVTVCBjaGVjawogICAgaWYgdGhlIHNlcnZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSB1c2VkIGV4dGVuc2lvbi4KICAgIE5vdGU6IG1vZHVsZXMgdXNlIG1hbnkgZXh0ZW5zaW9ucyB3aGljaCBpbmRpdmlkdWFsCiAgICBpbXBsZW1lbnRhdGlvbnMgTUFZIG9yIE1BWSBOT1Qgc3VwcG9ydC4KICAgIElmIHN1cHBvcnQgZm9yIGFuIGV4dGVuc2lvbiBpcyBtaXNzaW5nIHRoZSBleHRlbnNpb24gc3RhdGVtZW50IG5lZWRzCiAgICBpbmRpdmlkdWFsIGhhbmRsaW5nIG9yIGl0IFNIT1VMRCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZHVsZSB1c2luZwogICAgdGhlIGV4dGVuc2lvbiBlLmcuIHdpdGggYSBkZXZpYXRpb24uCiAgICAgICAgICAiOwoKICByZXZpc2lvbiAiMjAxOS0wNi0yMyIgewogICAgZGVzY3JpcHRpb24gIkluaXRpYWwgdmVyc2lvbiI7CiAgfQoKICBleHRlbnNpb24gaW5WYXJpYW50IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSBkYXRhIG5vZGUgY2FuIG9ubHkgYmUgc2V0IHdoZW4gaXRzCiAgICAgIHBhcmVudCBkYXRhIG5vZGUgaXMgYmVpbmcgY3JlYXRlZC4gVG8gY2hhbmdlIHRoZSB2YWx1ZSBhZnRlciB0aGF0LCB0aGUKICAgICAgcGFyZW50IGRhdGEgbm9kZSBtdXN0IGJlIGRlbGV0ZWQgYW5kIHJlY3JlYXRlZCB3aXRoIHRoZSBkYXRhIG5vZGUKICAgICAgaGF2aW5nIHRoZSBuZXcgdmFsdWUuCgogICAgICBJdCBpcyB1bm5lY2Vzc2FyeSB0byB1c2UgYW5kIE1VU1QgTk9UIGJlIHVzZWQgZm9yIGtleSBsZWFmcy4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiwgbGVhZi1saXN0LCBsaXN0CiAgICAgIHN0YXRlbWVudHMgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgoKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0CiAgICAgIGhhcyBhIGRlZmF1bHQgc3RhdGVtZW50IG9yIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBkYXRhIG5vZGUKICAgICAgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIE5PVCBiZSB1c2VkIGZvciBjb25maWc9ZmFsc2UgZGF0YSBvciBpbiBhbgogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9Cg== -_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= -ietf-inet-types urn:ietf:params:xml:ns:yang:ietf-inet-types \N [] 2013-07-15 bW9kdWxlIGlldGYtaW5ldC10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtaW5ldC10eXBlcyI7CiAgcHJlZml4ICJpbmV0IjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcyBmb3IgSW50ZXJuZXQgYWRkcmVzc2VzIGFuZCByZWxhdGVkIHRoaW5ncy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSBpcC1hZGRyZXNzLW5vLXpvbmUKICAgICAgLSBpcHY0LWFkZHJlc3Mtbm8tem9uZQogICAgICAtIGlwdjYtYWRkcmVzcy1uby16b25lIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBwcm90b2NvbCBmaWVsZHMgKioqLwoKICB0eXBlZGVmIGlwLXZlcnNpb24gewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gdW5rbm93biB7CiAgICAgICAgdmFsdWUgIjAiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJBbiB1bmtub3duIG9yIHVuc3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlIEludGVybmV0CiAgICAgICAgICBwcm90b2NvbC4iOwogICAgICB9CiAgICAgIGVudW0gaXB2NCB7CiAgICAgICAgdmFsdWUgIjEiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJUaGUgSVB2NCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA3OTEuIjsKICAgICAgfQogICAgICBlbnVtIGlwdjYgewogICAgICAgIHZhbHVlICIyIjsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAiVGhlIElQdjYgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMgMjQ2MC4iOwogICAgICB9CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgdGhlIElQIHByb3RvY29sLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEluZXRWZXJzaW9uIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgIDc5MTogSW50ZXJuZXQgUHJvdG9jb2wKICAgICAgUkZDIDI0NjA6IEludGVybmV0IFByb3RvY29sLCBWZXJzaW9uIDYgKElQdjYpIFNwZWNpZmljYXRpb24KICAgICAgUkZDIDQwMDE6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIEludGVybmV0IE5ldHdvcmsgQWRkcmVzc2VzIjsKICB9CgogIHR5cGVkZWYgZHNjcCB7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgIjAuLjYzIjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBkc2NwIHR5cGUgcmVwcmVzZW50cyBhIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIENvZGUgUG9pbnQKICAgICAgdGhhdCBtYXkgYmUgdXNlZCBmb3IgbWFya2luZyBwYWNrZXRzIGluIGEgdHJhZmZpYyBzdHJlYW0uCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBEc2NwIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzI4OTogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGZvciB0aGUgRGlmZmVyZW50aWF0ZWQKICAgICAgICAgICAgICAgIFNlcnZpY2VzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgMjQ3NDogRGVmaW5pdGlvbiBvZiB0aGUgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgRmllbGQKICAgICAgICAgICAgICAgIChEUyBGaWVsZCkgaW4gdGhlIElQdjQgYW5kIElQdjYgSGVhZGVycwogICAgICBSRkMgMjc4MDogSUFOQSBBbGxvY2F0aW9uIEd1aWRlbGluZXMgRm9yIFZhbHVlcyBJbgogICAgICAgICAgICAgICAgdGhlIEludGVybmV0IFByb3RvY29sIGFuZCBSZWxhdGVkIEhlYWRlcnMiOwogIH0KCiAgdHlwZWRlZiBpcHY2LWZsb3ctbGFiZWwgewogICAgdHlwZSB1aW50MzIgewogICAgICByYW5nZSAiMC4uMTA0ODU3NSI7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2Ni1mbG93LWxhYmVsIHR5cGUgcmVwcmVzZW50cyB0aGUgZmxvdyBpZGVudGlmaWVyIG9yIEZsb3cKICAgICAgTGFiZWwgaW4gYW4gSVB2NiBwYWNrZXQgaGVhZGVyIHRoYXQgbWF5IGJlIHVzZWQgdG8KICAgICAgZGlzY3JpbWluYXRlIHRyYWZmaWMgZmxvd3MuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSVB2NkZsb3dMYWJlbCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM1OTU6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIElQdjYgRmxvdyBMYWJlbAogICAgICBSRkMgMjQ2MDogSW50ZXJuZXQgUHJvdG9jb2wsIFZlcnNpb24gNiAoSVB2NikgU3BlY2lmaWNhdGlvbiI7CiAgfQoKICB0eXBlZGVmIHBvcnQtbnVtYmVyIHsKICAgIHR5cGUgdWludDE2IHsKICAgICAgcmFuZ2UgIjAuLjY1NTM1IjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBwb3J0LW51bWJlciB0eXBlIHJlcHJlc2VudHMgYSAxNi1iaXQgcG9ydCBudW1iZXIgb2YgYW4KICAgICAgSW50ZXJuZXQgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sIHN1Y2ggYXMgVURQLCBUQ1AsIERDQ1AsIG9yCiAgICAgIFNDVFAuICBQb3J0IG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IElBTkEuICBBIGN1cnJlbnQgbGlzdCBvZgogICAgICBhbGwgYXNzaWdubWVudHMgaXMgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuaWFuYS5vcmcvPi4KCiAgICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBudW1iZXIgdmFsdWUgemVybyBpcyByZXNlcnZlZCBieSBJQU5BLiAgSW4KICAgICAgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdmFsdWUgemVybyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4KICAgICAgYmUgZXhjbHVkZWQgYnkgc3VidHlwaW5nIHRoZSBwb3J0LW51bWJlciB0eXBlLgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSW5ldFBvcnROdW1iZXIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgNzY4OiBVc2VyIERhdGFncmFtIFByb3RvY29sCiAgICAgIFJGQyAgNzkzOiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbAogICAgICBSRkMgNDk2MDogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sCiAgICAgIFJGQyA0MzQwOiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKERDQ1ApCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBhdXRvbm9tb3VzIHN5c3RlbXMgKioqLwoKICB0eXBlZGVmIGFzLW51bWJlciB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBhcy1udW1iZXIgdHlwZSByZXByZXNlbnRzIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlcnMKICAgICAgd2hpY2ggaWRlbnRpZnkgYW4gQXV0b25vbW91cyBTeXN0ZW0gKEFTKS4gIEFuIEFTIGlzIGEgc2V0CiAgICAgIG9mIHJvdXRlcnMgdW5kZXIgYSBzaW5nbGUgdGVjaG5pY2FsIGFkbWluaXN0cmF0aW9uLCB1c2luZwogICAgICBhbiBpbnRlcmlvciBnYXRld2F5IHByb3RvY29sIGFuZCBjb21tb24gbWV0cmljcyB0byByb3V0ZQogICAgICBwYWNrZXRzIHdpdGhpbiB0aGUgQVMsIGFuZCB1c2luZyBhbiBleHRlcmlvciBnYXRld2F5CiAgICAgIHByb3RvY29sIHRvIHJvdXRlIHBhY2tldHMgdG8gb3RoZXIgQVNlcy4gIElBTkEgbWFpbnRhaW5zCiAgICAgIHRoZSBBUyBudW1iZXIgc3BhY2UgYW5kIGhhcyBkZWxlZ2F0ZWQgbGFyZ2UgcGFydHMgdG8gdGhlCiAgICAgIHJlZ2lvbmFsIHJlZ2lzdHJpZXMuCgogICAgICBBdXRvbm9tb3VzIHN5c3RlbSBudW1iZXJzIHdlcmUgb3JpZ2luYWxseSBsaW1pdGVkIHRvIDE2CiAgICAgIGJpdHMuICBCR1AgZXh0ZW5zaW9ucyBoYXZlIGVubGFyZ2VkIHRoZSBhdXRvbm9tb3VzIHN5c3RlbQogICAgICBudW1iZXIgc3BhY2UgdG8gMzIgYml0cy4gIFRoaXMgdHlwZSB0aGVyZWZvcmUgdXNlcyBhbiB1aW50MzIKICAgICAgYmFzZSB0eXBlIHdpdGhvdXQgYSByYW5nZSByZXN0cmljdGlvbiBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgIGEgbGFyZ2VyIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlciBzcGFjZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBJbmV0QXV0b25vbW91c1N5c3RlbU51bWJlciB0ZXh0dWFsIGNvbnZlbnRpb24gb2YKICAgICAgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDE5MzA6IEd1aWRlbGluZXMgZm9yIGNyZWF0aW9uLCBzZWxlY3Rpb24sIGFuZCByZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgIG9mIGFuIEF1dG9ub21vdXMgU3lzdGVtIChBUykKICAgICAgUkZDIDQyNzE6IEEgQm9yZGVyIEdhdGV3YXkgUHJvdG9jb2wgNCAoQkdQLTQpCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcwogICAgICBSRkMgNjc5MzogQkdQIFN1cHBvcnQgZm9yIEZvdXItT2N0ZXQgQXV0b25vbW91cyBTeXN0ZW0gKEFTKQogICAgICAgICAgICAgICAgTnVtYmVyIFNwYWNlIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIElQIGFkZHJlc3NlcyBhbmQgaG9zdG5hbWVzICoqKi8KCiAgdHlwZWRlZiBpcC1hZGRyZXNzIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgICB0eXBlIGluZXQ6aXB2Ni1hZGRyZXNzOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGlwLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBzdXBwb3J0cyBzY29wZWQgYWRkcmVzc2VzCiAgICAgIGJ5IGFsbG93aW5nIHpvbmUgaWRlbnRpZmllcnMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQwMDc6IElQdjYgU2NvcGVkIEFkZHJlc3MgQXJjaGl0ZWN0dXJlIjsKICB9CgogIHR5cGVkZWYgaXB2NC1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybgogICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICsgICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKScKICAgICAgKyAnKCVbXHB7Tn1ccHtMfV0rKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIlRoZSBpcHY0LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBpbgogICAgICAgZG90dGVkLXF1YWQgbm90YXRpb24uICBUaGUgSVB2NCBhZGRyZXNzIG1heSBpbmNsdWRlIGEgem9uZQogICAgICAgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgICBUaGUgem9uZSBpbmRleCBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBpZGVudGljYWwgYWRkcmVzcwogICAgICAgdmFsdWVzLiAgRm9yIGxpbmstbG9jYWwgYWRkcmVzc2VzLCB0aGUgem9uZSBpbmRleCB3aWxsCiAgICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgIGludGVyZmFjZS4gIElmIHRoZSB6b25lIGluZGV4IGlzIG5vdCBwcmVzZW50LCB0aGUgZGVmYXVsdAogICAgICAgem9uZSBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgdXNlZC4KCiAgICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgdGhlIHpvbmUgaW5kZXggaXMgdGhlIG51bWVyaWNhbAogICAgICAgZm9ybWF0IjsKICB9CgogIHR5cGVkZWYgaXB2Ni1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoJVtccHtOfVxwe0x9XSspPyc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKCUuKyk/JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzcyBpbiBmdWxsLAogICAgICBtaXhlZCwgc2hvcnRlbmVkLCBhbmQgc2hvcnRlbmVkLW1peGVkIG5vdGF0aW9uLiAgVGhlIElQdjYKICAgICAgYWRkcmVzcyBtYXkgaW5jbHVkZSBhIHpvbmUgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgIFRoZSB6b25lIGluZGV4IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGlkZW50aWNhbCBhZGRyZXNzCiAgICAgIHZhbHVlcy4gIEZvciBsaW5rLWxvY2FsIGFkZHJlc3NlcywgdGhlIHpvbmUgaW5kZXggd2lsbAogICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgaW50ZXJmYWNlLiAgSWYgdGhlIHpvbmUgaW5kZXggaXMgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0CiAgICAgIHpvbmUgb2YgdGhlIGRldmljZSB3aWxsIGJlIHVzZWQuCgogICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBvZiBJUHY2IGFkZHJlc3NlcyB1c2VzIHRoZSB0ZXh0dWFsCiAgICAgIHJlcHJlc2VudGF0aW9uIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiAgVGhlCiAgICAgIGNhbm9uaWNhbCBmb3JtYXQgZm9yIHRoZSB6b25lIGluZGV4IGlzIHRoZSBudW1lcmljYWwKICAgICAgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDExLjIgb2YgUkZDIDQwMDcuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDI5MTogSVAgVmVyc2lvbiA2IEFkZHJlc3NpbmcgQXJjaGl0ZWN0dXJlCiAgICAgIFJGQyA0MDA3OiBJUHY2IFNjb3BlZCBBZGRyZXNzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNTk1MjogQSBSZWNvbW1lbmRhdGlvbiBmb3IgSVB2NiBBZGRyZXNzIFRleHQKICAgICAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIjsKICB9CgogIHR5cGVkZWYgaXAtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzLW5vLXpvbmU7CiAgICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3Mtbm8tem9uZTsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcC1hZGRyZXNzLW5vLXpvbmUgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzCiAgICAgIElQIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHNjb3BlZAogICAgICBhZGRyZXNzZXMgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgem9uZSBpZGVudGlmaWVycyBpbiB0aGUKICAgICAgYWRkcmVzcyBmb3JtYXQuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUiOwogIH0KCiAgdHlwZWRlZiBpcHY0LWFkZHJlc3Mtbm8tem9uZSB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzIHsKICAgICAgcGF0dGVybiAnWzAtOVwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjQgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY0LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3MgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GOlwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjYgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY2LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQyOTE6IElQIFZlcnNpb24gNiBBZGRyZXNzaW5nIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICB0eXBlZGVmIGlwLXByZWZpeCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSBpbmV0OmlwdjQtcHJlZml4OwogICAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXAtcHJlZml4IHR5cGUgcmVwcmVzZW50cyBhbiBJUCBwcmVmaXggYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb25zCiAgICAgIGltcGxpZXMgdGhlIElQIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgaXB2NC1wcmVmaXggewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICArICAnKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSknCiAgICAgICArICcvKChbMC05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMl0pKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2NC1wcmVmaXggdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXguCiAgICAgIFRoZSBwcmVmaXggbGVuZ3RoIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZQogICAgICBzbGFzaCBjaGFyYWN0ZXIgYW5kIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYW4gSVB2NCBwcmVmaXggaGFzIGFsbCBiaXRzIG9mCiAgICAgIHRoZSBJUHY0IGFkZHJlc3Mgc2V0IHRvIHplcm8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCiAgICAgIElQdjQgcHJlZml4LiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtcHJlZml4IHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoLygoWzAtOV0pfChbMC05XXsyfSl8KDFbMC0xXVswLTldKXwoMTJbMC04XSkpKSc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKC8uKyknOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGlwdjYtcHJlZml4IHR5cGUgcmVwcmVzZW50cyBhbiBJUHY2IGFkZHJlc3MgcHJlZml4LgogICAgICBUaGUgcHJlZml4IGxlbmd0aCBpcyBnaXZlbiBieSB0aGUgbnVtYmVyIGZvbGxvd2luZyB0aGUKICAgICAgc2xhc2ggY2hhcmFjdGVyIGFuZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMjguCgogICAgICBBIHByZWZpeCBsZW5ndGggdmFsdWUgb2YgbiBjb3JyZXNwb25kcyB0byBhbiBJUCBhZGRyZXNzCiAgICAgIG1hc2sgdGhhdCBoYXMgbiBjb250aWd1b3VzIDEtYml0cyBmcm9tIHRoZSBtb3N0CiAgICAgIHNpZ25pZmljYW50IGJpdCAoTVNCKSBhbmQgYWxsIG90aGVyIGJpdHMgc2V0IHRvIDAuCgogICAgICBUaGUgSVB2NiBhZGRyZXNzIHNob3VsZCBoYXZlIGFsbCBiaXRzIHRoYXQgZG8gbm90IGJlbG9uZwogICAgICB0byB0aGUgcHJlZml4IHNldCB0byB6ZXJvLgoKICAgICAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYW4gSVB2NiBwcmVmaXggaGFzIGFsbCBiaXRzIG9mCiAgICAgIHRoZSBJUHY2IGFkZHJlc3Mgc2V0IHRvIHplcm8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCiAgICAgIElQdjYgcHJlZml4LiAgRnVydGhlcm1vcmUsIHRoZSBJUHY2IGFkZHJlc3MgaXMgcmVwcmVzZW50ZWQKICAgICAgYXMgZGVmaW5lZCBpbiBTZWN0aW9uIDQgb2YgUkZDIDU5NTIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNTk1MjogQSBSZWNvbW1lbmRhdGlvbiBmb3IgSVB2NiBBZGRyZXNzIFRleHQKICAgICAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBkb21haW4gbmFtZSBhbmQgVVJJIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBkb21haW4tbmFtZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIGxlbmd0aCAiMS4uMjUzIjsKICAgICAgcGF0dGVybgogICAgICAgICcoKChbYS16QS1aMC05X10oW2EtekEtWjAtOVwtX10pezAsNjF9KT9bYS16QS1aMC05XVwuKSonCiAgICAgICsgJyhbYS16QS1aMC05X10oW2EtekEtWjAtOVwtX10pezAsNjF9KT9bYS16QS1aMC05XVwuPyknCiAgICAgICsgJ3xcLic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZG9tYWluLW5hbWUgdHlwZSByZXByZXNlbnRzIGEgRE5TIGRvbWFpbiBuYW1lLiAgVGhlCiAgICAgIG5hbWUgU0hPVUxEIGJlIGZ1bGx5IHF1YWxpZmllZCB3aGVuZXZlciBwb3NzaWJsZS4KCiAgICAgIEludGVybmV0IGRvbWFpbiBuYW1lcyBhcmUgb25seSBsb29zZWx5IHNwZWNpZmllZC4gIFNlY3Rpb24KICAgICAgMy41IG9mIFJGQyAxMDM0IHJlY29tbWVuZHMgYSBzeW50YXggKG1vZGlmaWVkIGluIFNlY3Rpb24KICAgICAgMi4xIG9mIFJGQyAxMTIzKS4gIFRoZSBwYXR0ZXJuIGFib3ZlIGlzIGludGVuZGVkIHRvIGFsbG93CiAgICAgIGZvciBjdXJyZW50IHByYWN0aWNlIGluIGRvbWFpbiBuYW1lIHVzZSwgYW5kIHNvbWUgcG9zc2libGUKICAgICAgZnV0dXJlIGV4cGFuc2lvbi4gIEl0IGlzIGRlc2lnbmVkIHRvIGhvbGQgdmFyaW91cyB0eXBlcyBvZgogICAgICBkb21haW4gbmFtZXMsIGluY2x1ZGluZyBuYW1lcyB1c2VkIGZvciBBIG9yIEFBQUEgcmVjb3JkcwogICAgICAoaG9zdCBuYW1lcykgYW5kIG90aGVyIHJlY29yZHMsIHN1Y2ggYXMgU1JWIHJlY29yZHMuICBOb3RlCiAgICAgIHRoYXQgSW50ZXJuZXQgaG9zdCBuYW1lcyBoYXZlIGEgc3RyaWN0ZXIgc3ludGF4IChkZXNjcmliZWQKICAgICAgaW4gUkZDIDk1MikgdGhhbiB0aGUgRE5TIHJlY29tbWVuZGF0aW9ucyBpbiBSRkNzIDEwMzQgYW5kCiAgICAgIDExMjMsIGFuZCB0aGF0IHN5c3RlbXMgdGhhdCB3YW50IHRvIHN0b3JlIGhvc3QgbmFtZXMgaW4KICAgICAgc2NoZW1hIG5vZGVzIHVzaW5nIHRoZSBkb21haW4tbmFtZSB0eXBlIGFyZSByZWNvbW1lbmRlZCB0bwogICAgICBhZGhlcmUgdG8gdGhpcyBzdHJpY3RlciBzdGFuZGFyZCB0byBlbnN1cmUgaW50ZXJvcGVyYWJpbGl0eS4KCiAgICAgIFRoZSBlbmNvZGluZyBvZiBETlMgbmFtZXMgaW4gdGhlIEROUyBwcm90b2NvbCBpcyBsaW1pdGVkCiAgICAgIHRvIDI1NSBjaGFyYWN0ZXJzLiAgU2luY2UgdGhlIGVuY29kaW5nIGNvbnNpc3RzIG9mIGxhYmVscwogICAgICBwcmVmaXhlZCBieSBhIGxlbmd0aCBieXRlcyBhbmQgdGhlcmUgaXMgYSB0cmFpbGluZyBOVUxMCiAgICAgIGJ5dGUsIG9ubHkgMjUzIGNoYXJhY3RlcnMgY2FuIGFwcGVhciBpbiB0aGUgdGV4dHVhbCBkb3R0ZWQKICAgICAgbm90YXRpb24uCgogICAgICBUaGUgZGVzY3JpcHRpb24gY2xhdXNlIG9mIHNjaGVtYSBub2RlcyB1c2luZyB0aGUgZG9tYWluLW5hbWUKICAgICAgdHlwZSBNVVNUIGRlc2NyaWJlIHdoZW4gYW5kIGhvdyB0aGVzZSBuYW1lcyBhcmUgcmVzb2x2ZWQgdG8KICAgICAgSVAgYWRkcmVzc2VzLiAgTm90ZSB0aGF0IHRoZSByZXNvbHV0aW9uIG9mIGEgZG9tYWluLW5hbWUgdmFsdWUKICAgICAgbWF5IHJlcXVpcmUgdG8gcXVlcnkgbXVsdGlwbGUgRE5TIHJlY29yZHMgKGUuZy4sIEEgZm9yIElQdjQKICAgICAgYW5kIEFBQUEgZm9yIElQdjYpLiAgVGhlIG9yZGVyIG9mIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgYW5kCiAgICAgIHdoaWNoIEROUyByZWNvcmQgdGFrZXMgcHJlY2VkZW5jZSBjYW4gZWl0aGVyIGJlIGRlZmluZWQKICAgICAgZXhwbGljaXRseSBvciBtYXkgZGVwZW5kIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQogICAgICByZXNvbHZlci4KCiAgICAgIERvbWFpbi1uYW1lIHZhbHVlcyB1c2UgdGhlIFVTLUFTQ0lJIGVuY29kaW5nLiAgVGhlaXIgY2Fub25pY2FsCiAgICAgIGZvcm1hdCB1c2VzIGxvd2VyY2FzZSBVUy1BU0NJSSBjaGFyYWN0ZXJzLiAgSW50ZXJuYXRpb25hbGl6ZWQKICAgICAgZG9tYWluIG5hbWVzIE1VU1QgYmUgQS1sYWJlbHMgYXMgcGVyIFJGQyA1ODkwLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDICA5NTI6IERvRCBJbnRlcm5ldCBIb3N0IFRhYmxlIFNwZWNpZmljYXRpb24KICAgICAgUkZDIDEwMzQ6IERvbWFpbiBOYW1lcyAtIENvbmNlcHRzIGFuZCBGYWNpbGl0aWVzCiAgICAgIFJGQyAxMTIzOiBSZXF1aXJlbWVudHMgZm9yIEludGVybmV0IEhvc3RzIC0tIEFwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICBhbmQgU3VwcG9ydAogICAgICBSRkMgMjc4MjogQSBETlMgUlIgZm9yIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHNlcnZpY2VzCiAgICAgICAgICAgICAgICAoRE5TIFNSVikKICAgICAgUkZDIDU4OTA6IEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcyBpbiBBcHBsaWNhdGlvbnMKICAgICAgICAgICAgICAgIChJRE5BKTogRGVmaW5pdGlvbnMgYW5kIERvY3VtZW50IEZyYW1ld29yayI7CiAgfQoKICB0eXBlZGVmIGhvc3QgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgICB0eXBlIGluZXQ6ZG9tYWluLW5hbWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaG9zdCB0eXBlIHJlcHJlc2VudHMgZWl0aGVyIGFuIElQIGFkZHJlc3Mgb3IgYSBETlMKICAgICAgZG9tYWluIG5hbWUuIjsKICB9CgogIHR5cGVkZWYgdXJpIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIHVyaSB0eXBlIHJlcHJlc2VudHMgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIKICAgICAgKFVSSSkgYXMgZGVmaW5lZCBieSBTVEQgNjYuCgogICAgICBPYmplY3RzIHVzaW5nIHRoZSB1cmkgdHlwZSBNVVNUIGJlIGluIFVTLUFTQ0lJIGVuY29kaW5nLAogICAgICBhbmQgTVVTVCBiZSBub3JtYWxpemVkIGFzIGRlc2NyaWJlZCBieSBSRkMgMzk4NiBTZWN0aW9ucwogICAgICA2LjIuMSwgNi4yLjIuMSwgYW5kIDYuMi4yLjIuICBBbGwgdW5uZWNlc3NhcnkKICAgICAgcGVyY2VudC1lbmNvZGluZyBpcyByZW1vdmVkLCBhbmQgYWxsIGNhc2UtaW5zZW5zaXRpdmUKICAgICAgY2hhcmFjdGVycyBhcmUgc2V0IHRvIGxvd2VyY2FzZSBleGNlcHQgZm9yIGhleGFkZWNpbWFsCiAgICAgIGRpZ2l0cywgd2hpY2ggYXJlIG5vcm1hbGl6ZWQgdG8gdXBwZXJjYXNlIGFzIGRlc2NyaWJlZCBpbgogICAgICBTZWN0aW9uIDYuMi4yLjEuCgogICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gaGVscCBwcm92aWRlCiAgICAgIHVuaXF1ZSBVUklzLiAgTm90ZSB0aGF0IHRoaXMgbm9ybWFsaXphdGlvbiBpcyBub3QKICAgICAgc3VmZmljaWVudCB0byBwcm92aWRlIHVuaXF1ZW5lc3MuICBUd28gVVJJcyB0aGF0IGFyZQogICAgICB0ZXh0dWFsbHkgZGlzdGluY3QgYWZ0ZXIgdGhpcyBub3JtYWxpemF0aW9uIG1heSBzdGlsbCBiZQogICAgICBlcXVpdmFsZW50LgoKICAgICAgT2JqZWN0cyB1c2luZyB0aGUgdXJpIHR5cGUgbWF5IHJlc3RyaWN0IHRoZSBzY2hlbWVzIHRoYXQKICAgICAgdGhleSBwZXJtaXQuICBGb3IgZXhhbXBsZSwgJ2RhdGE6JyBhbmQgJ3VybjonIHNjaGVtZXMKICAgICAgbWlnaHQgbm90IGJlIGFwcHJvcHJpYXRlLgoKICAgICAgQSB6ZXJvLWxlbmd0aCBVUkkgaXMgbm90IGEgdmFsaWQgVVJJLiAgVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgICBleHByZXNzICdVUkkgYWJzZW50JyB3aGVyZSByZXF1aXJlZC4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBVcmkgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQgaW4gUkZDIDUwMTcuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzk4NjogVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpOiBHZW5lcmljIFN5bnRheAogICAgICBSRkMgMzMwNTogUmVwb3J0IGZyb20gdGhlIEpvaW50IFczQy9JRVRGIFVSSSBQbGFubmluZyBJbnRlcmVzdAogICAgICAgICAgICAgICAgR3JvdXA6IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgKFVSSXMpLCBVUkxzLAogICAgICAgICAgICAgICAgYW5kIFVuaWZvcm0gUmVzb3VyY2UgTmFtZXMgKFVSTnMpOiBDbGFyaWZpY2F0aW9ucwogICAgICAgICAgICAgICAgYW5kIFJlY29tbWVuZGF0aW9ucwogICAgICBSRkMgNTAxNzogTUlCIFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFVuaWZvcm0gUmVzb3VyY2UKICAgICAgICAgICAgICAgIElkZW50aWZpZXJzIChVUklzKSI7CiAgfQoKfQ== -ietf-yang-types urn:ietf:params:xml:ns:yang:ietf-yang-types \N [] 2013-07-15 bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgoKCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCgoKCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQ== -o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsKICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyBleHRlbnNpb25zIHRvIHRoZSBZQU5HIGxhbmd1YWdlIHRoYXQgdG9wb2xvZ3kgYW5kCiAgICBpbnZlbnRvcnkgbW9kZWxzIHdpbGwgdXNlIHRvIGRlZmluZSBhbmQgYW5ub3RhdGUgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9 -o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogICAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZQogICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICB9CgogICAgY29udGFpbmVyIG1ldGFkYXRhIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgbWV0YWRhdGEuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGlkZW50aXR5IGNsYXNzaWZpZXJ7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgICAgIHdpdGggaWRlbnRpdHkuICI7CiAgICB9Cn0= -o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgRXF1aXBtZW50CiAgICBkb21haW4sIHdoaWNoIGlzIG1vZGVsbGVkIHRvIHVuZGVyc3RhbmQgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGVxdWlwbWVudAogICAgc3VjaCBhcyBhbnRlbm5hcyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsL2NhcnJpZXIgYW5kIHRoZWlyIHJlbGV2YW50CiAgICBwcm9wZXJ0aWVzIGUuZy4gdGlsdCwgbWF4IHBvd2VyIGV0Yy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgICAgIGFudGVubmEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhbnRlbm5hTW9kZWxOdW1iZXIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlZlbmRvci1zcGVjaWZpYyBhbnRlbm5hIG1vZGVsIGlkZW50aWZpZXIuIFRoaXMKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHVuaXQgaXMgaW5zdGFsbGVkLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLCBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgICAgIGRvd250aWx0LCBhbmQgbmVnYXRpdmUgaW5kaWNhdGVzIHVwdGlsdC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBwb3NpdGlvbldpdGhpblNlY3RvciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSB1bml0IHBvc2l0aW9uIHdpdGhpbiBzZWN0b3IuIFRoaXMgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vIG9wZXJhdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgdGlsdCBhbmQgdGhlIHRpbHQgYXBwbGllZCBieSB0aGUgUmVtb3RlIEVsZWN0cmljYWwKICAgICAgICAgICAgICAgICAgICBUaWx0IChSRVQpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRWxlY3RyaWNhbGx5LWNvbnRyb2xsZWQgdGlsdCBvZiBtYWluIGJlYW0gbWF4aW11bQogICAgICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7IHRpbHQgZG93biBpcwogICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLCB0aWx0IHVwIGlzIG5lZ2F0aXZlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICAgICAgZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgbGlzdCBTaXRlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBzaXRlIGlzIGEgcGh5c2ljYWwgbG9jYXRpb24gd2hlcmUgYW4gZXF1aXBtZW50IGNhbiBiZQogICAgICAgICAgICBpbnN0YWxsZWQuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIFNpdGUiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX0lOU1RBTExFRF9BVF9TSVRFIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -o-ran-smo-teiv-oam urn:o-ran:smo-teiv-oam OAM [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIk8mTSB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgTyZNIGRvbWFpbiwKICAgIHdoaWNoIGFyZSBpbnRlbmRlZCB0byByZXByZXNlbnQgbWFuYWdlbWVudCBzeXN0ZW1zIGFuZCBtYW5hZ2VtZW50CiAgICBpbnRlcmZhY2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50IHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBNYW5hZ2VkIEVsZW1lbnQgKE1FKSBpcyBhIG5vZGUgaW50byBhIHRlbGVjb21tdW5pY2F0aW9uCiAgICAgICAgICAgIG5ldHdvcmsgcHJvdmlkaW5nIHN1cHBvcnQgYW5kL29yIHNlcnZpY2UgdG8gc3Vic2NyaWJlcnMuIEFuIE1FCiAgICAgICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICAgICAgb3ZlciBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzIGZvciB0aGUgcHVycG9zZSBvZiBiZWluZyBtb25pdG9yZWQKICAgICAgICAgICAgYW5kL29yIGNvbnRyb2xsZWQuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CiAgICB9Cn0= -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgUkFOIGRvbWFpbiwKICAgIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eSBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlCiAgICByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgR05CRFVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLgoKICAgICAgICAgICAgQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ2VudHJhbGl6ZWQgVW5pdCAoZ05CLUNVKSBhbmQgYSBnTkItRFUuCiAgICAgICAgICAgIFRoZSBDVSBwcm9jZXNzZXMgbm9uLXJlYWwgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVCiAgICAgICAgICAgIHByb2Nlc3NlcyBQSFkgbGV2ZWwgcHJvdG9jb2wgYW5kIHJlYWwgdGltZSBzZXJ2aWNlcy4gVGhlIGdOQi1DVSBhbmQKICAgICAgICAgICAgdGhlIGdOQi1EVSB1bml0cyBhcmUgY29ubmVjdGVkIHZpYSBGMSBsb2dpY2FsIGludGVyZmFjZS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBmb3IgYSBnTkItRFU6CiAgICAgICAgICAgIElzIGNvbm5lY3RlZCB0byB0aGUgZ05CLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIGdOQi1EVSBpcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgbXVsdGlwbGUgZ05CLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBnTkItQ1UtQ1AuCgogICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUgZ05CLUNVLVVQcyBhbmQKICAgICAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4KICAgICAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGNvbnRhaW5lciBkVXBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEdOQkNVQ1BGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBDZW50cmFsaXplZCBVbml0IENvbnRyb2wgUGxhbmUgKGdOQi1DVS1DUCkKCiAgICAgICAgICAgIFRoaXMgaXMgYSBsb2dpY2FsIG5vZGUgaG9zdGluZyB0aGUgUmFkaW8gUmVzb3VyY2UgQ29udHJvbCAoUlJDKSBhbmQKICAgICAgICAgICAgdGhlIGNvbnRyb2wgcGxhbmUgcGFydCBvZiB0aGUgUGFja2V0IERhdGEgQ29udmVyZ2VuY2UgUHJvdG9jb2wKICAgICAgICAgICAgKFBEQ1ApIG9mIHRoZSBnTm9kZUIgQ2VudHJhbGl6ZWQgVW5pdCAoZ05CLUNVKSBmb3IgYW4gRS1VVFJBTiBnTm9kZUIKICAgICAgICAgICAgKGVuLWdOQikgb3IgYSBnTm9kZUIgKGdOQikuIFRoZSBnTkItQ1UtQ1AgdGVybWluYXRlcyB0aGUgRTEKICAgICAgICAgICAgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBnTkItQ1UtVVAgYW5kIHRoZSBGMS1DIGludGVyZmFjZQogICAgICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgZ05vZGVCIERpc3RyaWJ1dGVkIFVuaXQgKGdOQi1EVSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgZ05CLUNVLUNQOgogICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1EVSB0aHJvdWdoIHRoZSBGMS1DIGludGVyZmFjZS4gSXMgY29ubmVjdGVkCiAgICAgICAgICAgIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRTEgaW50ZXJmYWNlLiBPbmx5IG9uZSBnTkItQ1UtQ1AgaXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIG9uZSBnTkItRFUuIE9ubHkgb25lIGdOQi1DVS1DUCBpcyBjb25uZWN0ZWQgdG8gb25lCiAgICAgICAgICAgIGdOQi1DVS1VUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIKICAgICAgICAgICAgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgZ05CLUNVLUNQLk9uZSBnTkItQ1UtVVAgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgICAgICBtdWx0aXBsZSBEVXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgZ05CLUNVLUNQLgoKICAgICAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1EVXMuIEEgZ05CLUNVLUNQIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZQogICAgICAgICAgICBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQKICAgICAgICAgICAgZGVsZXRlIHRoZSBnTkItQ1UtQ1Agb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZ05CQ1VOYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOCiAgICAgICAgICAgICAgICAgICAgbm9kZSBpZGVudGl0eSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBHTkJDVVVQRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUIgQ2VudHJhbGl6ZWQgVW5pdCBVc2VyIFBsYW5lIChnTkItQ1UtVVApCgogICAgICAgICAgICBBIGdOQi1DVS1VUCBpcyBhIGxvZ2ljYWwgbm9kZSBob3N0aW5nIHRoZSBVc2VyIFBsYW5lIHBhcnQgb2YgdGhlCiAgICAgICAgICAgIFBhY2tldCBEYXRhIENvbnZlcmdlbmNlLCBQcm90b2NvbCAoUERDUCkgb2YgdGhlIGdOb2RlQiBDZW50cmFsaXplZAogICAgICAgICAgICBVbml0IChnTkItQ1UpIGZvciBhbiBFLVVUUkFOIGdOb2RlQiAoZW4tZ05CKSwgYW5kIHRoZSBVc2VyIFBsYW5lCiAgICAgICAgICAgIHBhcnQgb2YgdGhlIFBEQ1AgcHJvdG9jb2wgYW5kIHRoZSBTZXJ2aWNlIERhdGEgQWRhcHRhdGlvbiBQcm90b2NvbAogICAgICAgICAgICAoU0RBUCkgb2YgdGhlIGdOQi1DVSBmb3IgYSBnTm9kZUIgKGdOQikuIFRoZSBnTkItQ1UtVVAgdGVybWluYXRlcwogICAgICAgICAgICB0aGUgRTEgaW50ZXJmYWNlIGNvbm5lY3RlZCB3aXRoIHRoZSBnTkItQ1UtQ1AgYW5kIHRoZSBGMS1VIGludGVyZmFjZQogICAgICAgICAgICBjb25uZWN0ZWQgd2l0aCB0aGUgZ05vZGVCIERpc3RyaWJ1dGVkIFVuaXQgKGdOQi1EVSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgZ05CLUNVLVVQOgogICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1EVSB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gSXMgY29ubmVjdGVkCiAgICAgICAgICAgIHRvIHRoZSBnTkItQ1UtQ1AgdGhyb3VnaCB0aGUgRTEgaW50ZXJmYWNlLiBPbmUgZ05CLUNVLVVQIGlzCiAgICAgICAgICAgIGNvbm5lY3RlZCB0byBvbmx5IG9uZSBnTkItQ1UtQ1AuIE9uZSBnTkItRFUgY2FuIGJlIGNvbm5lY3RlZCB0bwogICAgICAgICAgICBtdWx0aXBsZSBnTkItQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIGdOQi1DVS1DUC4gT25lCiAgICAgICAgICAgIGdOQi1DVS1VUCBjYW4gYmUgY29ubmVjdGVkIHRvIG11bHRpcGxlIERVcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUKICAgICAgICAgICAgc2FtZSBnTkItQ1UtQ1AuCgogICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUgZ05CLUNVLVVQcyBhbmQKICAgICAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gQSBnTkItQ1UtVVAgaXMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCiAgICAgICAgICAgIE5HLVJBTiBub2RlIG9iamVjdC4gSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZAogICAgICAgICAgICBkZWxldGUgdGhlIGdOQi1DVS1VUCBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbENVIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1DVS4KCiAgICAgICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgICAgICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uCiAgICAgICAgICAgIFNpZ25hbCAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kCiAgICAgICAgICAgIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIHBsbW5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBJRCBmb3IgTlIgQ0dJLiBJZiBlbXB0eSwKICAgICAgICAgICAgICAgICAgICBHTkJDVUNQRnVuY3Rpb246OnBMTU5JZCBpcyB1c2VkIGZvciBQTE1OIElEIGluIE5SIENHSSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5IjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsRFUgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgICAgIFN5bmNocm9uaXphdGlvbiBzaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24gc2lnbmFsCiAgICAgICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgY2VsbExvY2FsSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlBDSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIFBoeXNpY2FsIENlbGwgSWRlbnRpdHkgKFBDSSkgb2YgdGhlIE5SIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJUQUMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gRXZvbHZlZCBOb2RlIEIgKGVOb2RlQikgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IG5vZGUgaW4KICAgICAgICAgICAgdGhlIHJhZGlvIGFjY2VzcyBuZXR3b3JrIChSQU4pIG9mIExvbmctVGVybSBFdm9sdXRpb24gKExURSkuIFRoZQogICAgICAgICAgICBlTm9kZUIgaXMgYSBjb21wbGV4IGJhc2Ugc3RhdGlvbiB0aGF0IGhhbmRsZXMgcmFkaW8gY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgaW4gdGhlIGNlbGwgYW5kIGNhcnJpZXMgb3V0IHJhZGlvIHJlc291cmNlIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyCiAgICAgICAgICAgIGRlY2lzaW9ucy4gVW5saWtlIDIvM0cgd2lyZWxlc3MgUkFOLCB0aGVyZSBpcyBubyBjZW50cmFsaXplZCByYWRpbwogICAgICAgICAgICBuZXR3b3JrIGNvbnRyb2xsZXIgaW4gTFRFLiBJdCBpcyB0aGUgaGFyZHdhcmUgdGhhdCBpcyBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzIGRpcmVjdGx5IHdpdGggbW9iaWxlCiAgICAgICAgICAgIGhhbmRzZXRzIChVc2VyIEVxdWlwbWVudCksIGxpa2UgYSBiYXNlIHRyYW5zY2VpdmVyIHN0YXRpb24gKEJUUykgaW4KICAgICAgICAgICAgR1NNIG5ldHdvcmtzLiBUaGlzIHNpbXBsaWZpZXMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIGxvd2VyCiAgICAgICAgICAgIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBDZWxsIEdsb2JhbAogICAgICAgICAgICAgICAgICAgIElkZW50aXR5LCBhbmQgaXMgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIgdGhlIFMxCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBlTm9kZUJQbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgUHVibGljIExhbmQgTW9iaWxlIE5ldHdvcmsgKFBMTU4pIElECiAgICAgICAgICAgICAgICAgICAgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIgR2xvYmFsIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgbm9kZSBvdmVyIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIChNQ0M9MDAxLCBNTkM9MDEpIGluZGljYXRlcyB0aGF0IHRoZSBQTE1OIGlzIG5vdCBpbml0aWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGNhbiBub3QgYmUgdXNlZCBhcyBhIHZhbGlkIFBMTU4gSWRlbnRpdHkuIjsKCiAgICAgICAgICAgICAgICBsZWFmIG1jYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNQ0MgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5IHVzZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMC4uOTk5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlYWYgbW5jTGVuZ3RoIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGxlbmd0aCBvZiB0aGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMi4uMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBFVXRyYW5DZWxsIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBGREQgb3IgVEREIEVVdHJhbkNlbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgcGFyYW1ldGVycyBuZWVkZWQgYnkgdGhlIGNlbGwuCiAgICAgICAgICAgICAgICAgICAgSXQgYWxzbyBjb250YWlucyBwYXJhbWV0ZXJzIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnkgY29tbW9uIGNoYW5uZWxzLiBBbiBFVVRSQU4gc3RhbmRzCiAgICAgICAgICAgICAgICAgICAgZm9yIEV2b2x2ZWQgVW5pdmVyc2FsIE1vYmlsZSBUZWxlY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0gKFVNVFMpIFRlcnJlc3RyaWFsIFJhZGlvIEFjY2VzcyBOZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgd2hpY2ggY29udGFpbnMgYW4gZU5vZGVCLiBUaGUgZU5vZGVCIGNvbmNyZXRlCiAgICAgICAgICAgICAgICAgICAgY2xhc3MgaXMgZXh0ZW5kZWQgZnJvbSB0aGUgRVVUUkFOIE5vZGUgYWJzdHJhY3QgY2xhc3MuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsSWR7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkJTIGludGVybmFsIElEIGF0dHJpYnV0ZSBmb3IgRVV0cmFuQ2VsbC4gTXVzdCBiZQogICAgICAgICAgICAgICAgICAgIHVuaXF1ZSBpbiB0aGUgUkJTLiBUb2dldGhlciB3aXRoIHRoZSBOb2RlIElEIGFuZCBQdWJsaWMKICAgICAgICAgICAgICAgICAgICBMYW5kIE1vYmlsZSBOZXR3b3JrIChQTE1OKSB0aGlzIGlzIGEgdW5pdmVyc2FsbHkgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgY2VsbCBJRCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVhcmZjbmRsIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjZW50cmFsIGRvd25saW5rCiAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVhcmZjbnVsIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDaGFubmVsIG51bWJlciBmb3IgdGhlIGNlbnRyYWwgdXBsaW5rIGZyZXF1ZW5jeSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGRsQ2hhbm5lbEJhbmR3aWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRvd25saW5rIGNoYW5uZWwgYmFuZHdpZHRoIGluIHRoZSBGREQgY2VsbC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlYXJmY24gewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFLVVUUkEgQWJzb2x1dGUgUmFkaW8gRnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAgICAgKEVBUkZDTikgZm9yIHRoZSBUREQgY2VsbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGNoYW5uZWxCYW5kd2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjaGFubmVsIGJhbmR3aWR0aCBpbiB0aGUgVEREIGNlbGwuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgdGFjIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUcmFja2luZyBBcmVhIENvZGUgZm9yIHRoZSBFVXRyYW4gQ2VsbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGR1cGxleFR5cGUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRvciBvZiBFVXRyYW5DZWxsIHR5cGUsIEZERCBvciBUREQiOwogICAgICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBmZGQgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRkREIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSB0ZGQgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVEREIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciBkb3dubGluayI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGFyZmNuVUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIGZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIHVwbGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgdXBsaW5rIGNoYW5uZWwiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBiU0NoYW5uZWxCd0RMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCUyBDaGFubmVsIGJhbmR3aWR0aCBpbiBNSHogZm9yIGRvd25saW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTFRFU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBMVEUgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIGZvcgogICAgICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgICAgICBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUKICAgICAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICAgICAgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0b3IgY2FycmllcgogICAgICAgICAgICAgICAgICAgIG1vZGVsbGVkIGJ5IE1PIFNlY3RvckNhcnJpZXIgaXMgYSBkaWdpdGFsIHNlY3Rvci4iOwogICAgICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBub3JtYWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vdCBhIGRpZ2l0YWwgc2VjdG9yIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDJEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmlnaHQgZGlnaXRhbCBzZWN0b3IgZm9yIDJEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAzOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA0OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmlnaHQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbWlkZGxlX2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDU7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNaWRkbGUgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbCBhbmQgdGhlIFJCUwogICAgICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZi1saXN0IGVVdHJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcyB0aGF0IGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGdlcmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBHRVJBTiBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNlY3RvciB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgZ3JvdXAgb2YgY28tbG9jYXRlZCBDZWxscyB0aGF0IGhhdmUgYSBzaGFyZWQKICAgICAgICAgICAgY292ZXJhZ2UgYXJlYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvcklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbml2ZXJzYWxseSB1bmlxdWUgSUQgZ2VuZXJhdGVkIGJ5IHRoZSBzZWN0b3IncwogICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgICAgIGNvbXByaXNpbmcgdGhlIHNlY3RvciwgZGV0ZXJtaW5lZCBkdXJpbmcgc2VjdG9yIGRpc2NvdmVyeS4iOwogICAgICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjR7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVncmVlcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5PREVCRlVOQ1RJT05fUFJPVklERVNfRVVUUkFOQ0VMTCB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLWV1VHJhbkNlbGwgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZU5vZGVCIEZ1bmN0aW9uIHByb3ZpZGVzIEVVVFJBTiBDZWxsLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFVVRSQU4gQ2VsbCBwcm92aWRlZCBieSBlTm9kZUIgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVVdHJhbkNlbGw7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5PREVCRlVOQ1RJT05fUFJPVklERVNfTFRFU0VDVE9SQ0FSUklFUiB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZU5vZGVCIEZ1bmN0aW9uIHByb3ZpZGVzIExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRU5vZGVCRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktZW5vZGViRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IGVOb2RlQiBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBHTkJEVUZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTERVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEdOQkRVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktZ25iZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHByb3ZpZGVkIGJ5IGdOb2RlQi1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgR05CRFVGVU5DVElPTl9QUk9WSURFU19OUlNFQ1RPUkNBUlJJRVIgeyAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBHTkJEVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWduYmR1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZ05vZGVCLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgR05CQ1VDUEZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTENVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsQ3UgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLUNVQ1AgRnVuY3Rpb24gcHJvdmlkZXMgTlIgQ2VsbC1DVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgR05CQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWduYmN1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLUNVIHByb3ZpZGVkIGJ5IGdOb2RlQi1DVUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxDVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFVVRSQU5DRUxMX1VTRVNfTFRFU0VDVE9SQ0FSUklFUiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHVzZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFVVRSQU4gQ2VsbCB1c2VzIExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRVV0cmFuQ2VsbDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWV1VHJhbkNlbGwgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZWQgYnkgRVVUUkFOIENlbGwuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIExURVNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBMVEVTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIExURVNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SQ0VMTERVX1VTRVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSB1c2VzIE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LW5yQ2VsbER1IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZWQgYnkgTlIgQ2VsbC1EVS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTlJTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0VVVFJBTkNFTEwgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBncm91cGVkLWV1VHJhbkNlbGwgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBFVVRSQU4gQ2VsbC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgU2VjdG9yOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGdyb3VwZWQtYnktc2VjdG9yIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVVVFJBTiBDZWxsIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFVXRyYW5DZWxsOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 -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 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IHJlbGF0aW9ucyBiZXR3ZWVuIEVxdWlwbWVudCBhbmQgUkFOLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9FUVVJUE1FTlRfUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgc2VydmljZWQgYnkgdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBncm91cGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46U2VjdG9yOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGdyb3VwZWQtYnktc2VjdG9yIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGdyb3VwZWQgYnkgU2VjdG9yLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0= -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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucwoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfT0FNX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfRU5PREVCRlVOQ1RJT04geyAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZW5vZGViRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LW9hbTpNYW5hZ2VkRWxlbWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBtYW5hZ2VkLWJ5LW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gImVOb2RlQiBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46RU5vZGVCRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19HTkJEVUZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1nbmJkdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIGdOb2RlQi1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUItRFUgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkdOQkRVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19HTkJDVUNQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLWduYmN1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgbWFuYWdlcyBnTm9kZUItQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLUNVLUNQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpHTkJDVUNQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19HTkJDVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLWduYmN1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgbWFuYWdlcyBnTm9kZUItQ1UtVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpHTkJDVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQp9 +_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-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-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-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-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== \. - -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -o-ran-smo-teiv-ran-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-ran-oam -o-ran-smo-teiv-ran-oam_ManagedElement ManagedElement o-ran-smo-teiv-ran-oam -o-ran-smo-teiv-ran-cloud_NodeCluster NodeCluster o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_CloudNativeSystem CloudNativeSystem o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_CloudNativeApplication CloudNativeApplication o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_CloudSite CloudSite o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-cloud_Namespace Namespace o-ran-smo-teiv-ran-cloud -o-ran-smo-teiv-ran-logical-to-equipment_Sector Sector o-ran-smo-teiv-ran-logical-to-equipment -o-ran-smo-teiv-ran-logical_GNBCUUPFunction GNBCUUPFunction o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_NRCellDU NRCellDU o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_NRCellCU NRCellCU o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-equipment -o-ran-smo-teiv-ran-logical_EUtranCell EUtranCell o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_GNBCUCPFunction GNBCUCPFunction o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_AntennaCapability AntennaCapability o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_TestEntityB TestEntityB o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-logical_TestEntityA TestEntityA o-ran-smo-teiv-ran-logical -o-ran-smo-teiv-ran-equipment_Site Site o-ran-smo-teiv-ran-equipment -o-ran-smo-teiv-ran-equipment_AntennaModule AntennaModule o-ran-smo-teiv-ran-equipment -o-ran-smo-teiv-ran-equipment_PhysicalNetworkAppliance PhysicalNetworkAppliance o-ran-smo-teiv-ran-equipment +COPY ties_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"] +o-ran-smo-teiv-cloud_OCloudNamespace OCloudNamespace o-ran-smo-teiv-cloud ["name"] +o-ran-smo-teiv-cloud_OCloudSite OCloudSite o-ran-smo-teiv-cloud ["geo-location", "name"] +o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"] +o-ran-smo-teiv-equipment_Site Site o-ran-smo-teiv-equipment ["geo-location", "name"] +o-ran-smo-teiv-oam_ManagedElement ManagedElement o-ran-smo-teiv-oam [] +o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran ["eUtranFqBands", "geranFqBands", "nRFqBands"] +o-ran-smo-teiv-ran_NRCellCU NRCellCU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRTAC", "plmnId"] +o-ran-smo-teiv-ran_NRCellDU NRCellDU o-ran-smo-teiv-ran ["cellLocalId", "nCI", "nRPCI", "nRTAC"] +o-ran-smo-teiv-ran_NRSectorCarrier NRSectorCarrier o-ran-smo-teiv-ran ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"] +o-ran-smo-teiv-ran_NearRTRICFunction NearRTRICFunction o-ran-smo-teiv-ran ["nearRtRicId", "pLMNId"] +o-ran-smo-teiv-ran_OCUCPFunction OCUCPFunction o-ran-smo-teiv-ran ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"] +o-ran-smo-teiv-ran_OCUUPFunction OCUUPFunction o-ran-smo-teiv-ran ["gNBId", "gNBIdLength", "pLMNIdList"] +o-ran-smo-teiv-ran_ODUFunction ODUFunction o-ran-smo-teiv-ran ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"] +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", "relationshipDataLocation", "storedAt", "connectSameEntity", "moduleReferenceName") FROM stdin; -MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN managed-gnbduFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-ran-oam 1 1 managed-by-managedElementttttttttttttttttttttttttttttttttttttttt GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn false o-ran-smo-teiv-ran-oam-to-logical -MANAGEDELEMENTTTTTTTTTTT_DEPLOYED_AS_CLOUDNATIVESYSTEMMMMMMMMMMM deployed-as-cloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-ran-oam 1 1 deployed-managedElementttttttttttttttttttttttttttttttttttttttttt CloudNativeSystemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm o-ran-smo-teiv-ran-cloud 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt false o-ran-smo-teiv-ran-oam-to-cloud -MANAGEDELEMENTTTTTTTTT_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNN realised-by-cloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-ran-oam 1 1 realised-managedElementttttttttttttttttttttttttttttttttttttttttt CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-cloud 1 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-cloud_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn false o-ran-smo-teiv-ran-oam-to-cloud -MANAGEDELEMENT_MANAGES_ENODEBFUNCTION managed-enodebFunction ManagedElement o-ran-smo-teiv-ran-oam 1 1 managed-by-managedElement ENodeBFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_ENodeBFunction false o-ran-smo-teiv-ran-oam-to-logical -MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION managed-gnbcucpFunction ManagedElement o-ran-smo-teiv-ran-oam 1 1 managed-by-managedElement GNBCUCPFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_GNBCUCPFunction false o-ran-smo-teiv-ran-oam-to-logical -MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION managed-gnbcuupFunction ManagedElement o-ran-smo-teiv-ran-oam 1 1 managed-by-managedElement GNBCUUPFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_GNBCUUPFunction false o-ran-smo-teiv-ran-oam-to-logical -MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION realised-by-cloudNativeApplication ManagedElement o-ran-smo-teiv-ran-oam 1 1 realised-managedElement CloudNativeApplication o-ran-smo-teiv-ran-cloud 1 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-cloud_CloudNativeApplication false o-ran-smo-teiv-ran-oam-to-cloud -MANAGEDELEMENT_MANAGES_GNBDUFUNCTION managed-gnbduFunction ManagedElement o-ran-smo-teiv-ran-oam 1 1 managed-by-managedElement GNBDUFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_GNBDUFunction false o-ran-smo-teiv-ran-oam-to-logical -MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM deployed-as-cloudNativeSystem ManagedElement o-ran-smo-teiv-ran-oam 1 1 deployed-managedElement CloudNativeSystem o-ran-smo-teiv-ran-cloud 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-oam_ManagedElement false o-ran-smo-teiv-ran-oam-to-cloud -NODECLUSTER_LOCATED_AT_CLOUDSITE located-at-cloudSite NodeCluster o-ran-smo-teiv-ran-cloud 0 9223372036854775807 location-of-nodeCluster CloudSite o-ran-smo-teiv-ran-cloud 1 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-cloud_NodeCluster false o-ran-smo-teiv-ran-cloud -CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION comprised-cloudNativeApplication CloudNativeSystem o-ran-smo-teiv-ran-cloud 0 1 comprised-by-cloudNativeSystem CloudNativeApplication o-ran-smo-teiv-ran-cloud 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-cloud_CloudNativeApplication false o-ran-smo-teiv-ran-cloud -CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE deployed-on-namespace CloudNativeApplication o-ran-smo-teiv-ran-cloud 0 9223372036854775807 deployed-cloudNativeApplication Namespace o-ran-smo-teiv-ran-cloud 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-cloud_CloudNativeApplication false o-ran-smo-teiv-ran-cloud -CLOUDNATIVEAPPLICATIONNNNNNNNNNN_DEPLOYED_ON_NAMESPACEEEEEEEEEEE deployed-on-namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-cloud 0 9223372036854775807 deployed-cloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Namespaceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-cloud 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-cloud_CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn false o-ran-smo-teiv-ran-cloud -NAMESPACE_DEPLOYED_ON_NODECLUSTER deployed-on-nodeCluster Namespace o-ran-smo-teiv-ran-cloud 0 9223372036854775807 deployed-namespace NodeCluster o-ran-smo-teiv-ran-cloud 1 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-cloud_Namespace false o-ran-smo-teiv-ran-cloud -SECTOR_GROUPS_EUTRANCELL grouped-euTranCell Sector o-ran-smo-teiv-ran-logical-to-equipment 0 1 grouped-by-sector EUtranCell o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_EUtranCell false o-ran-smo-teiv-ran-logical-to-equipment -SECTOR_GROUPS_ANTENNAMODULE grouped-antennaModule Sector o-ran-smo-teiv-ran-logical-to-equipment 0 1 grouped-by-sector AntennaModule o-ran-smo-teiv-ran-equipment 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-equipment_AntennaModule false o-ran-smo-teiv-ran-logical-to-equipment -SECTOR_GROUPS_NRCELLDU grouped-nrCellDu Sector o-ran-smo-teiv-ran-logical-to-equipment 0 1 grouped-by-sector NRCellDU o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRCellDU false o-ran-smo-teiv-ran-logical-to-equipment -GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION realised-by-cloudNativeApplication GNBCUUPFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-gnbcuupFunction CloudNativeApplication o-ran-smo-teiv-ran-cloud 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical-to-cloud_GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION false o-ran-smo-teiv-ran-logical-to-cloud -ENODEBFUNCTION_PROVIDES_EUTRANCELL provided-euTranCell ENodeBFunction o-ran-smo-teiv-ran-logical 1 1 provided-by-enodebFunction EUtranCell o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_EUtranCell false o-ran-smo-teiv-ran-logical -ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran-logical 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_LTESectorCarrier false o-ran-smo-teiv-ran-logical -ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE realised-by-physicalNetworkAppliance ENodeBFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-enodebFunction PhysicalNetworkAppliance o-ran-smo-teiv-ran-equipment 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-logical_ENodeBFunction false o-ran-smo-teiv-ran-logical-to-equipment -NRCELLDU_USES_NRSECTORCARRIER used-nrSectorCarrier NRCellDU o-ran-smo-teiv-ran-logical 0 1 used-by-nrCellDu NRSectorCarrier o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRSectorCarrier false o-ran-smo-teiv-ran-logical -LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran-logical 0 1 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran-logical 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-logical_LTESectorCarrier false o-ran-smo-teiv-ran-logical -GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION realised-by-cloudNativeApplication GNBDUFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-gnbduFunction CloudNativeApplication o-ran-smo-teiv-ran-cloud 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical-to-cloud_GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION false o-ran-smo-teiv-ran-logical-to-cloud -GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER provided-nrSectorCarrier GNBDUFunction o-ran-smo-teiv-ran-logical 1 1 provided-by-gnbduFunction NRSectorCarrier o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRSectorCarrier false o-ran-smo-teiv-ran-logical -GNBDUFUNCTION_PROVIDES_NRCELLDU provided-nrCellDu GNBDUFunction o-ran-smo-teiv-ran-logical 1 1 provided-by-gnbduFunction NRCellDU o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRCellDU false o-ran-smo-teiv-ran-logical -GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN realised-by-cloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-gnbduFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn CloudNativeApplicationnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-cloud 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical-to-cloud_GNBDUFUNCTIONNNNNNNNN_REALISED_BY_CLOUDNATIVEAPPLICATIONNNNNNNNN false o-ran-smo-teiv-ran-logical-to-cloud -GNBDUFUNCTIONNNNNNNNNNNNNNUUU_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU provided-nrCellDuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran-logical 1 1 provided-by-gnbduFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU false o-ran-smo-teiv-ran-logical -EUTRANCELL_USES_LTESECTORCARRIER used-lteSectorCarrier EUtranCell o-ran-smo-teiv-ran-logical 0 1 used-by-euTranCell LTESectorCarrier o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_LTESectorCarrier false o-ran-smo-teiv-ran-logical -GNBCUCPFUNCTION_PROVIDES_NRCELLCU provided-nrCellCu GNBCUCPFunction o-ran-smo-teiv-ran-logical 1 1 provided-by-gnbcucpFunction NRCellCU o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_NRCellCU false o-ran-smo-teiv-ran-logical -GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION realised-by-cloudNativeApplication GNBCUCPFunction o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-gnbcucpFunction CloudNativeApplication o-ran-smo-teiv-ran-cloud 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical-to-cloud_GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION false o-ran-smo-teiv-ran-logical-to-cloud -NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability NRSectorCarrier o-ran-smo-teiv-ran-logical 0 9223372036854775807 used-by-nrSectorCarrier AntennaCapability o-ran-smo-teiv-ran-logical 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-logical_NRSectorCarrier false o-ran-smo-teiv-ran-logical -ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE realised-by-antennaModule AntennaCapability o-ran-smo-teiv-ran-logical 0 9223372036854775807 realised-antennaCapability AntennaModule o-ran-smo-teiv-ran-equipment 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical-to-equipment_ANTENNACAPABILITY_REALISED_BY_ANTENNAMODULE false o-ran-smo-teiv-ran-logical-to-equipment -TESTENTITYA_PROVIDES_TESTENTITYB provided-testEntityB TestEntityA o-ran-smo-teiv-ran-logical 0 2 provided-by-testEntityA TestEntityB o-ran-smo-teiv-ran-logical 0 3 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical_TESTENTITYA_PROVIDES_TESTENTITYB false o-ran-smo-teiv-ran-logical -TESTENTITYA_USES_TESTENTITYB used-TestEntityB TestEntityA o-ran-smo-teiv-ran-logical 0 1 used-by-testEntityA TestEntityB o-ran-smo-teiv-ran-logical 0 2 BI_DIRECTIONAL B_SIDE o-ran-smo-teiv-ran-logical_TestEntityB false o-ran-smo-teiv-ran-logical -TESTENTITYA_GROUPS_TESTENTITYB grouped-testEntityB TestEntityA o-ran-smo-teiv-ran-logical 0 2 grouped-by-testEntityA TestEntityB o-ran-smo-teiv-ran-logical 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-logical_TESTENTITYA_GROUPS_TESTENTITYB false o-ran-smo-teiv-ran-logical -ANTENNAMODULE_INSTALLED_AT_SITE installed-at-site AntennaModule o-ran-smo-teiv-ran-equipment 0 9223372036854775807 installed-antennaModule Site o-ran-smo-teiv-ran-equipment 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-equipment_AntennaModule false o-ran-smo-teiv-ran-equipment -PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE installed-at-site PhysicalNetworkAppliance o-ran-smo-teiv-ran-equipment 0 9223372036854775807 installed-physicalNetworkAppliance Site o-ran-smo-teiv-ran-equipment 0 1 BI_DIRECTIONAL A_SIDE o-ran-smo-teiv-ran-equipment_PhysicalNetworkAppliance false o-ran-smo-teiv-ran-equipment -ANTENNAMODULE_REALISED_BY_ANTENNAMODULE realised-by-antennaModule AntennaModule o-ran-smo-teiv-ran-equipment 0 9223372036854775807 realised-antennaModule AntennaModule o-ran-smo-teiv-ran-equipment 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-equipment_ANTENNAMODULE_REALISED_BY_ANTENNAMODULE true o-ran-smo-teiv-ran-equipment -ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE realised-by-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-equipment 0 1 realised-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-equipment 0 9223372036854775807 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE true o-ran-smo-teiv-ran-equipment -ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE deployed-on-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-equipment 0 1 deployed-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee o-ran-smo-teiv-ran-equipment 0 1 BI_DIRECTIONAL RELATION o-ran-smo-teiv-ran-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE true o-ran-smo-teiv-ran-equipment +COPY ties_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 +CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT comprised-nFDeployment CloudifiedNF o-ran-smo-teiv-cloud 1 1 comprised-by-cloudifiedNF NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-cloud +MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF deployed-as-cloudifiedNF ManagedElement o-ran-smo-teiv-oam 1 1 deployed-managedElement CloudifiedNF o-ran-smo-teiv-cloud 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam_ManagedElement o-ran-smo-teiv-rel-oam-cloud +MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION managed-nearRTRICFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NearRTRICFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_OCUCPFUNCTION managed-ocucpFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_OCUUPFUNCTION managed-ocuupFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_ODUFUNCTION managed-oduFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-rel-oam-ran +MANAGEDELEMENT_MANAGES_ORUFUNCTION managed-oruFunction ManagedElement o-ran-smo-teiv-oam 1 1 managed-by-managedElement ORUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_ORUFunction o-ran-smo-teiv-rel-oam-ran +NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE deployed-on-ocloudNamespace NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 deployed-nFDeployment OCloudNamespace o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE o-ran-smo-teiv-cloud +NFDEPLOYMENT_SERVES_MANAGEDELEMENT serviced-managedElement NFDeployment o-ran-smo-teiv-cloud 1 9223372036854775807 serving-nFDeployment ManagedElement o-ran-smo-teiv-oam 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_NFDeployment o-ran-smo-teiv-rel-oam-cloud +NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION serviced-nearRTRICFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment NearRTRICFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUCPFUNCTION serviced-ocucpFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_OCUUPFUNCTION serviced-ocuupFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran +NFDEPLOYMENT_SERVES_ODUFUNCTION serviced-oduFunction NFDeployment o-ran-smo-teiv-cloud 0 9223372036854775807 serving-nFDeployment ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION o-ran-smo-teiv-rel-cloud-ran +NODECLUSTER_LOCATED_AT_OCLOUDSITE located-at-ocloudSite NodeCluster o-ran-smo-teiv-cloud 1 9223372036854775807 location-of-onodeCluster OCloudSite o-ran-smo-teiv-cloud 1 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud +NRCELLDU_USES_NRSECTORCARRIER used-nrSectorCarrier NRCellDU o-ran-smo-teiv-ran 0 1 used-by-nrCellDu NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-nrSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER deployed-on-nodeCluster OCloudNamespace o-ran-smo-teiv-cloud 1 9223372036854775807 deployed-ocloudNamespace NodeCluster o-ran-smo-teiv-cloud 1 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-cloud_OCloudNamespace o-ran-smo-teiv-cloud +OCUCPFUNCTION_PROVIDES_NRCELLCU provided-nrCellCu OCUCPFunction o-ran-smo-teiv-ran 1 1 provided-by-ocucpFunction NRCellCU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellCU o-ran-smo-teiv-ran +ODUFUNCTION_PROVIDES_NRCELLDU provided-nrCellDu ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran +ODUFUNCTION_PROVIDES_NRSECTORCARRIER provided-nrSectorCarrier ODUFunction o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRSectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRSectorCarrier o-ran-smo-teiv-ran +SECTOR_GROUPS_ANTENNAMODULE grouped-antennaModule Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-rel-equipment-ran +SECTOR_GROUPS_NRCELLDU grouped-nrCellDu Sector o-ran-smo-teiv-ran 0 1 grouped-by-sector NRCellDU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDU o-ran-smo-teiv-ran \. ; -COMMIT; +COMMIT; \ No newline at end of file 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 new file mode 100644 index 0000000..dca3ded --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/02_init-oran-smo-teiv-consumer-data.sql @@ -0,0 +1,53 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_consumer_data; +ALTER SCHEMA ties_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" ( + "name" TEXT PRIMARY KEY, + "namespace" TEXT, + "revision" TEXT NOT NULL, + "content" TEXT NOT NULL, + "ownerAppId" VARCHAR(511) NOT NULL, + "status" VARCHAR(127) NOT NULL +); + +CREATE TABLE IF NOT EXISTS ties_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 +); + +CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" ( + "name" TEXT PRIMARY KEY, + "moduleReferenceName" TEXT NOT NULL, + FOREIGN KEY ("moduleReferenceName") REFERENCES ties_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 new file mode 100644 index 0000000..739a717 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/03_init-oran-smo-teiv-groups.sql @@ -0,0 +1,70 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE SCHEMA IF NOT EXISTS ties_groups; +ALTER SCHEMA ties_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 ( + 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 + EXECUTE constraint_sql; + END IF; +END; +$$ language 'plpgsql'; + +CREATE TABLE IF NOT EXISTS ties_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" ( + "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 +); + +CREATE TABLE IF NOT EXISTS ties_groups."dynamic_groups" ( + "id" VARCHAR(150) PRIMARY KEY, + "criteria" JSONB NOT NULL, + FOREIGN KEY ("id") REFERENCES ties_groups."groups" ("id") ON DELETE CASCADE +); + +SELECT ties_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''))' +); + +COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/consumer-data.sql b/teiv/src/test/resources/pgsqlschema/consumer-data.sql new file mode 100644 index 0000000..4f204f5 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/consumer-data.sql @@ -0,0 +1,43 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +COPY ties_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; +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; +test-app-module:Indoor test-app-module +test-app-module:Outdoor test-app-module +test-app-module:Rural test-app-module +test-app-module:Weekday test-app-module +test-app-module:Weekend test-app-module +\. + +COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/data-deprecated.sql b/teiv/src/test/resources/pgsqlschema/data-deprecated.sql index 32c628c..38030bd 100644 --- a/teiv/src/test/resources/pgsqlschema/data-deprecated.sql +++ b/teiv/src/test/resources/pgsqlschema/data-deprecated.sql @@ -191,35 +191,35 @@ E128C30D7E2ADB7DEF904CE7E936A586 Example Cloud App/16 \N urn:base64:Q2xvdWROYXRp C549905CF3CC890CE5746C5E10ACF00D Example Cloud App/19 \N urn:base64:Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjpDNTQ5OTA1Q0YzQ0M4OTBDRTU3NDZDNUUxMEFDRjAwRDpERVBMT1lFRF9PTjpOYW1lc3BhY2U6NzM1NjYyNURENUVBOEI2N0UzNTY0MDRFNDdEQkYxNkM= 8D51EFC759166044DACBCA63C4EDFC51 urn:base64:TWFuYWdlZEVsZW1lbnQ6OEQ1MUVGQzc1OTE2NjA0NERBQ0JDQTYzQzRFREZDNTE6UkVBTElTRURfQlk6Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjpDNTQ5OTA1Q0YzQ0M4OTBDRTU3NDZDNUUxMEFDRjAwRA== \N 7356625DD5EA8B67E356404E47DBF16C \. -COPY ties_data."GNBDUFunction" (id, fdn, "dUpLMNId", "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION", "REL_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION_EIID") FROM stdin; -5A548EA9D166341776CA0695837E55D8 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=16 {"mnc":"82","mcc":"456"} 16 2 DC86CA7724113F4C0DF42BFEAA17FD53 urn:base64:TWFuYWdlZEVsZW1lbnQ6REM4NkNBNzcyNDExM0Y0QzBERjQyQkZFQUExN0ZENTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBNTQ4RUE5RDE2NjM0MTc3NkNBMDY5NTgzN0U1NUQ4 -7D80E5C6E0C9EC246370E86B7E524F8C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=17 {"mnc":"82","mcc":"456"} 17 2 1F0B4F7CEC39A09ADC16EB8D787978E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MUYwQjRGN0NFQzM5QTA5QURDMTZFQjhENzg3OTc4RTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjdEODBFNUM2RTBDOUVDMjQ2MzcwRTg2QjdFNTI0RjhD -BBB3C42A4F8AC94091B297DF708DD50B SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=18 {"mnc":"82","mcc":"456"} 18 2 AEAFE291F1DE32DEFFF0073D297B7693 urn:base64:TWFuYWdlZEVsZW1lbnQ6QUVBRkUyOTFGMURFMzJERUZGRjAwNzNEMjk3Qjc2OTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkJCQjNDNDJBNEY4QUM5NDA5MUIyOTdERjcwOERENTBC -4CFF136200A2DE36205A13559C55DB2A SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=19 {"mnc":"82","mcc":"456"} 19 2 8D51EFC759166044DACBCA63C4EDFC51 urn:base64:TWFuYWdlZEVsZW1lbnQ6OEQ1MUVGQzc1OTE2NjA0NERBQ0JDQTYzQzRFREZDNTE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjRDRkYxMzYyMDBBMkRFMzYyMDVBMTM1NTlDNTVEQjJB -D3215E08570BE58339C7463626B50E37 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=9 {"mnc":"82","mcc":"456"} 9 1 DA1039E77700A9EEFFA280049ECE9227 urn:base64:TWFuYWdlZEVsZW1lbnQ6REExMDM5RTc3NzAwQTlFRUZGQTI4MDA0OUVDRTkyMjc6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkQzMjE1RTA4NTcwQkU1ODMzOUM3NDYzNjI2QjUwRTM3 -1050570EBB1315E1AE7A9FD5E1400A00 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=10 {"mnc":"82","mcc":"456"} 10 2 6F02817AFE4D53237DB235EBE5378613 urn:base64:TWFuYWdlZEVsZW1lbnQ6NkYwMjgxN0FGRTRENTMyMzdEQjIzNUVCRTUzNzg2MTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjEwNTA1NzBFQkIxMzE1RTFBRTdBOUZENUUxNDAwQTAw -B6A6DE7D0965F02D48ECA86706A4454F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=11 {"mnc":"82","mcc":"456"} 11 2 0181BB891A56BBD886771EBA3A69F19A urn:base64:TWFuYWdlZEVsZW1lbnQ6MDE4MUJCODkxQTU2QkJEODg2NzcxRUJBM0E2OUYxOUE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkI2QTZERTdEMDk2NUYwMkQ0OEVDQTg2NzA2QTQ0NTRG -E5FD5ACD55C553A92738477ECB0465B9 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=12 {"mnc":"82","mcc":"456"} 12 2 1E113BF2E3ABD819E0FBC6C6128BEFE5 urn:base64:TWFuYWdlZEVsZW1lbnQ6MUUxMTNCRjJFM0FCRDgxOUUwRkJDNkM2MTI4QkVGRTU6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkU1RkQ1QUNENTVDNTUzQTkyNzM4NDc3RUNCMDQ2NUI5 -25E690E22BDA90B9C4FEE1F083CBA597 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=13 {"mnc":"82","mcc":"456"} 13 2 27500EB447000209EE6E3CA1B31FBA92 urn:base64:TWFuYWdlZEVsZW1lbnQ6Mjc1MDBFQjQ0NzAwMDIwOUVFNkUzQ0ExQjMxRkJBOTI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjI1RTY5MEUyMkJEQTkwQjlDNEZFRTFGMDgzQ0JBNTk3 -5A3085C3400C3096E2ED2321452766B1 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=14 {"mnc":"82","mcc":"456"} 14 2 06222D277EE209CD8DCA1FE61CE752E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MDYyMjJEMjc3RUUyMDlDRDhEQ0ExRkU2MUNFNzUyRTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBMzA4NUMzNDAwQzMwOTZFMkVEMjMyMTQ1Mjc2NkIx -7F16F93D8816D9EBC76E52BB44A3CFF5 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=15 {"mnc":"82","mcc":"456"} 15 2 436C59D4065E5222414DAD697C8842D2 urn:base64:TWFuYWdlZEVsZW1lbnQ6NDM2QzU5RDQwNjVFNTIyMjQxNERBRDY5N0M4ODQyRDI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjdGMTZGOTNEODgxNkQ5RUJDNzZFNTJCQjQ0QTNDRkY1 +COPY ties_data."ODUFunction" (id, fdn, "dUpLMNId", "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_MANAGEDELEMENT_MANAGES_ODUFUNCTION_EIID") FROM stdin; +5A548EA9D166341776CA0695837E55D8 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=16 {"mnc":"82","mcc":"456"} 16 2 DC86CA7724113F4C0DF42BFEAA17FD53 urn:base64:TWFuYWdlZEVsZW1lbnQ6REM4NkNBNzcyNDExM0Y0QzBERjQyQkZFQUExN0ZENTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBNTQ4RUE5RDE2NjM0MTc3NkNBMDY5NTgzN0U1NUQ4 +7D80E5C6E0C9EC246370E86B7E524F8C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=17 {"mnc":"82","mcc":"456"} 17 2 1F0B4F7CEC39A09ADC16EB8D787978E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MUYwQjRGN0NFQzM5QTA5QURDMTZFQjhENzg3OTc4RTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjdEODBFNUM2RTBDOUVDMjQ2MzcwRTg2QjdFNTI0RjhD +BBB3C42A4F8AC94091B297DF708DD50B SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=18 {"mnc":"82","mcc":"456"} 18 2 AEAFE291F1DE32DEFFF0073D297B7693 urn:base64:TWFuYWdlZEVsZW1lbnQ6QUVBRkUyOTFGMURFMzJERUZGRjAwNzNEMjk3Qjc2OTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkJCQjNDNDJBNEY4QUM5NDA5MUIyOTdERjcwOERENTBC +4CFF136200A2DE36205A13559C55DB2A SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=19 {"mnc":"82","mcc":"456"} 19 2 8D51EFC759166044DACBCA63C4EDFC51 urn:base64:TWFuYWdlZEVsZW1lbnQ6OEQ1MUVGQzc1OTE2NjA0NERBQ0JDQTYzQzRFREZDNTE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjRDRkYxMzYyMDBBMkRFMzYyMDVBMTM1NTlDNTVEQjJB +D3215E08570BE58339C7463626B50E37 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=9 {"mnc":"82","mcc":"456"} 9 1 DA1039E77700A9EEFFA280049ECE9227 urn:base64:TWFuYWdlZEVsZW1lbnQ6REExMDM5RTc3NzAwQTlFRUZGQTI4MDA0OUVDRTkyMjc6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkQzMjE1RTA4NTcwQkU1ODMzOUM3NDYzNjI2QjUwRTM3 +1050570EBB1315E1AE7A9FD5E1400A00 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=10 {"mnc":"82","mcc":"456"} 10 2 6F02817AFE4D53237DB235EBE5378613 urn:base64:TWFuYWdlZEVsZW1lbnQ6NkYwMjgxN0FGRTRENTMyMzdEQjIzNUVCRTUzNzg2MTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjEwNTA1NzBFQkIxMzE1RTFBRTdBOUZENUUxNDAwQTAw +B6A6DE7D0965F02D48ECA86706A4454F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=11 {"mnc":"82","mcc":"456"} 11 2 0181BB891A56BBD886771EBA3A69F19A urn:base64:TWFuYWdlZEVsZW1lbnQ6MDE4MUJCODkxQTU2QkJEODg2NzcxRUJBM0E2OUYxOUE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkI2QTZERTdEMDk2NUYwMkQ0OEVDQTg2NzA2QTQ0NTRG +E5FD5ACD55C553A92738477ECB0465B9 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=12 {"mnc":"82","mcc":"456"} 12 2 1E113BF2E3ABD819E0FBC6C6128BEFE5 urn:base64:TWFuYWdlZEVsZW1lbnQ6MUUxMTNCRjJFM0FCRDgxOUUwRkJDNkM2MTI4QkVGRTU6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkU1RkQ1QUNENTVDNTUzQTkyNzM4NDc3RUNCMDQ2NUI5 +25E690E22BDA90B9C4FEE1F083CBA597 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=13 {"mnc":"82","mcc":"456"} 13 2 27500EB447000209EE6E3CA1B31FBA92 urn:base64:TWFuYWdlZEVsZW1lbnQ6Mjc1MDBFQjQ0NzAwMDIwOUVFNkUzQ0ExQjMxRkJBOTI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjI1RTY5MEUyMkJEQTkwQjlDNEZFRTFGMDgzQ0JBNTk3 +5A3085C3400C3096E2ED2321452766B1 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=14 {"mnc":"82","mcc":"456"} 14 2 06222D277EE209CD8DCA1FE61CE752E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MDYyMjJEMjc3RUUyMDlDRDhEQ0ExRkU2MUNFNzUyRTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBMzA4NUMzNDAwQzMwOTZFMkVEMjMyMTQ1Mjc2NkIx +7F16F93D8816D9EBC76E52BB44A3CFF5 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ODUFunction=15 {"mnc":"82","mcc":"456"} 15 2 436C59D4065E5222414DAD697C8842D2 urn:base64:TWFuYWdlZEVsZW1lbnQ6NDM2QzU5RDQwNjVFNTIyMjQxNERBRDY5N0M4ODQyRDI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjdGMTZGOTNEODgxNkQ5RUJDNzZFNTJCQjQ0QTNDRkY1 \. -COPY ties_data."GNBCUCPFunction" (id, fdn, "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION", "REL_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION_EIID") FROM stdin; -0525930249302B9649FC8F201EC4F7FC SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUCPFunction=1 1 1 5BCC1BC502B66423981F90A6EA8D157E urn:base64:TWFuYWdlZEVsZW1lbnQ6NUJDQzFCQzUwMkI2NjQyMzk4MUY5MEE2RUE4RDE1N0U6TUFOQUdFUzpHTkJDVUNQRnVuY3Rpb246MDUyNTkzMDI0OTMwMkI5NjQ5RkM4RjIwMUVDNEY3RkM= +COPY ties_data."OCUCPFunction" (id, fdn, "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION", "REL_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION_EIID") FROM stdin; +0525930249302B9649FC8F201EC4F7FC SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUCPFunction=1 1 1 5BCC1BC502B66423981F90A6EA8D157E urn:base64:TWFuYWdlZEVsZW1lbnQ6NUJDQzFCQzUwMkI2NjQyMzk4MUY5MEE2RUE4RDE1N0U6TUFOQUdFUzpHTkJDVUNQRnVuY3Rpb246MDUyNTkzMDI0OTMwMkI5NjQ5RkM4RjIwMUVDNEY3RkM= \. -COPY ties_data."GNBCUUPFunction" (id, fdn, "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION", "REL_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION_EIID") FROM stdin; -9B007881A1B8DE33D1D3063BE601D4B6 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=2 2 1 577CA8F71FFC2FC3C39D93D0F28E47EC urn:base64:TWFuYWdlZEVsZW1lbnQ6NTc3Q0E4RjcxRkZDMkZDM0MzOUQ5M0QwRjI4RTQ3RUM6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OUIwMDc4ODFBMUI4REUzM0QxRDMwNjNCRTYwMUQ0QjY= -9806ABE2985BDD4FE6BD2B38549C973C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=3 3 1 E87AF3DB09EE273C6F153AA00D4D1171 urn:base64:TWFuYWdlZEVsZW1lbnQ6RTg3QUYzREIwOUVFMjczQzZGMTUzQUEwMEQ0RDExNzE6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OTgwNkFCRTI5ODVCREQ0RkU2QkQyQjM4NTQ5Qzk3M0M= -99BBA3EC64BE596400B38FEBD9677FC6 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=4 4 1 A73755B1422176B1169546D884BD9FCC urn:base64:TWFuYWdlZEVsZW1lbnQ6QTczNzU1QjE0MjIxNzZCMTE2OTU0NkQ4ODRCRDlGQ0M6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OTlCQkEzRUM2NEJFNTk2NDAwQjM4RkVCRDk2NzdGQzY= -6B3E56B6C991F4E569115DE5633B0AA0 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=5 5 1 D76CCB4E654B2CF5D248196E9B9524AD urn:base64:TWFuYWdlZEVsZW1lbnQ6RDc2Q0NCNEU2NTRCMkNGNUQyNDgxOTZFOUI5NTI0QUQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246NkIzRTU2QjZDOTkxRjRFNTY5MTE1REU1NjMzQjBBQTA= -A18F3452C918E8F2C54E600F42005DBD SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=6 6 1 E7CEF72CB78163D1B26B8B2A7A39757A urn:base64:TWFuYWdlZEVsZW1lbnQ6RTdDRUY3MkNCNzgxNjNEMUIyNkI4QjJBN0EzOTc1N0E6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QTE4RjM0NTJDOTE4RThGMkM1NEU2MDBGNDIwMDVEQkQ= -F1C32B9DECA2230D9765BE2F54F1EDFE SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=7 7 1 E57C2A20E96A8C9E7099BAD60957B59A urn:base64:TWFuYWdlZEVsZW1lbnQ6RTU3QzJBMjBFOTZBOEM5RTcwOTlCQUQ2MDk1N0I1OUE6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246RjFDMzJCOURFQ0EyMjMwRDk3NjVCRTJGNTRGMUVERkU= -BFEEAC2CE60273CB0A78319CC201A7FE SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=8 8 1 E64371CD4D12ED0CED200DD3A7591784 urn:base64:TWFuYWdlZEVsZW1lbnQ6RTY0MzcxQ0Q0RDEyRUQwQ0VEMjAwREQzQTc1OTE3ODQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QkZFRUFDMkNFNjAyNzNDQjBBNzgzMTlDQzIwMUE3RkU= +COPY ties_data."OCUUPFunction" (id, fdn, "gNBId", "gNBIdLength", "REL_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION", "REL_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION_EIID") FROM stdin; +9B007881A1B8DE33D1D3063BE601D4B6 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=2 2 1 577CA8F71FFC2FC3C39D93D0F28E47EC urn:base64:TWFuYWdlZEVsZW1lbnQ6NTc3Q0E4RjcxRkZDMkZDM0MzOUQ5M0QwRjI4RTQ3RUM6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OUIwMDc4ODFBMUI4REUzM0QxRDMwNjNCRTYwMUQ0QjY= +9806ABE2985BDD4FE6BD2B38549C973C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=3 3 1 E87AF3DB09EE273C6F153AA00D4D1171 urn:base64:TWFuYWdlZEVsZW1lbnQ6RTg3QUYzREIwOUVFMjczQzZGMTUzQUEwMEQ0RDExNzE6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OTgwNkFCRTI5ODVCREQ0RkU2QkQyQjM4NTQ5Qzk3M0M= +99BBA3EC64BE596400B38FEBD9677FC6 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=4 4 1 A73755B1422176B1169546D884BD9FCC urn:base64:TWFuYWdlZEVsZW1lbnQ6QTczNzU1QjE0MjIxNzZCMTE2OTU0NkQ4ODRCRDlGQ0M6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246OTlCQkEzRUM2NEJFNTk2NDAwQjM4RkVCRDk2NzdGQzY= +6B3E56B6C991F4E569115DE5633B0AA0 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=5 5 1 D76CCB4E654B2CF5D248196E9B9524AD urn:base64:TWFuYWdlZEVsZW1lbnQ6RDc2Q0NCNEU2NTRCMkNGNUQyNDgxOTZFOUI5NTI0QUQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246NkIzRTU2QjZDOTkxRjRFNTY5MTE1REU1NjMzQjBBQTA= +A18F3452C918E8F2C54E600F42005DBD SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=6 6 1 E7CEF72CB78163D1B26B8B2A7A39757A urn:base64:TWFuYWdlZEVsZW1lbnQ6RTdDRUY3MkNCNzgxNjNEMUIyNkI4QjJBN0EzOTc1N0E6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QTE4RjM0NTJDOTE4RThGMkM1NEU2MDBGNDIwMDVEQkQ= +F1C32B9DECA2230D9765BE2F54F1EDFE SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=7 7 1 E57C2A20E96A8C9E7099BAD60957B59A urn:base64:TWFuYWdlZEVsZW1lbnQ6RTU3QzJBMjBFOTZBOEM5RTcwOTlCQUQ2MDk1N0I1OUE6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246RjFDMzJCOURFQ0EyMjMwRDk3NjVCRTJGNTRGMUVERkU= +BFEEAC2CE60273CB0A78319CC201A7FE SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/OCUUPFunction=8 8 1 E64371CD4D12ED0CED200DD3A7591784 urn:base64:TWFuYWdlZEVsZW1lbnQ6RTY0MzcxQ0Q0RDEyRUQwQ0VEMjAwREQzQTc1OTE3ODQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QkZFRUFDMkNFNjAyNzNDQjBBNzgzMTlDQzIwMUE3RkU= \. -COPY ties_data."NRCellCU" (id, fdn, "cellLocalId", "plmnId", "nCI", "nRTAC", "REL_GNBCUCPFUNCTION_PROVIDES_NRCELLCU_EIID", "REL_GNBCUCPFUNCTION_PROVIDES_NRCELLCU") FROM stdin; +COPY ties_data."NRCellCU" (id, fdn, "cellLocalId", "plmnId", "nCI", "nRTAC", "REL_OCUCPFUNCTION_PROVIDES_NRCELLCU_EIID", "REL_OCUCPFUNCTION_PROVIDES_NRCELLCU") FROM stdin; ED15B5C47ACEB0B4975D7A7B6B9FD4F8 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellCU=1 1 {"mnc":"82","mcc":"456"} 1 456 urn:base64:R05CQ1VDUEZ1bmN0aW9uOjA1MjU5MzAyNDkzMDJCOTY0OUZDOEYyMDFFQzRGN0ZDOlBST1ZJREVTOk5SQ2VsbENVOkVEMTVCNUM0N0FDRUIwQjQ5NzVEN0E3QjZCOUZENEY4 0525930249302B9649FC8F201EC4F7FC C21ED6B73BFC01F0A98F1D492DFD7FBD SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellCU=2 2 {"mnc":"82","mcc":"456"} 2 456 urn:base64:R05CQ1VDUEZ1bmN0aW9uOjA1MjU5MzAyNDkzMDJCOTY0OUZDOEYyMDFFQzRGN0ZDOlBST1ZJREVTOk5SQ2VsbENVOkMyMUVENkI3M0JGQzAxRjBBOThGMUQ0OTJERkQ3RkJE 0525930249302B9649FC8F201EC4F7FC D1462F73968E5CC050AAD327331494D9 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellCU=3 3 {"mnc":"82","mcc":"456"} 3 456 urn:base64:R05CQ1VDUEZ1bmN0aW9uOjA1MjU5MzAyNDkzMDJCOTY0OUZDOEYyMDFFQzRGN0ZDOlBST1ZJREVTOk5SQ2VsbENVOkQxNDYyRjczOTY4RTVDQzA1MEFBRDMyNzMzMTQ5NEQ5 0525930249302B9649FC8F201EC4F7FC @@ -528,7 +528,7 @@ CAC6EF5CC954F7A7F5294A643CD7A160 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetw 803132C8AC37DED60CB9CB9986D9BC3D SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/EUtranCell=80 80 456 789 123 1 FDD urn:base64:RU5vZGVCRnVuY3Rpb246MEMyNjUxQUI1RDQzMDEyMzcyOUIzMzZFODYzNUUwRTA6UFJPVklERVM6RVV0cmFuQ2VsbDo4MDMxMzJDOEFDMzdERUQ2MENCOUNCOTk4NkQ5QkMzRA== \N 0C2651AB5D430123729B336E8635E0E0 \N \. -COPY ties_data."NRCellDU" (id, fdn, "cellLocalId", "nCI", "nRPCI", "nRTAC", "REL_GNBDUFUNCTION_PROVIDES_NRCELLDU_EIID", "REL_SECTOR_GROUPS_NRCELLDU_EIID", "REL_GNBDUFUNCTION_PROVIDES_NRCELLDU", "REL_SECTOR_GROUPS_NRCELLDU") FROM stdin; +COPY ties_data."NRCellDU" (id, fdn, "cellLocalId", "nCI", "nRPCI", "nRTAC", "REL_ODUFUNCTION_PROVIDES_NRCELLDU_EIID", "REL_SECTOR_GROUPS_NRCELLDU_EIID", "REL_ODUFUNCTION_PROVIDES_NRCELLDU", "REL_SECTOR_GROUPS_NRCELLDU") FROM stdin; 98C3A4591A37718E1330F0294E23B62A SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=1 1 1 789 456 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTo5OEMzQTQ1OTFBMzc3MThFMTMzMEYwMjk0RTIzQjYyQQ== urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTo5OEMzQTQ1OTFBMzc3MThFMTMzMEYwMjk0RTIzQjYyQQ== D3215E08570BE58339C7463626B50E37 F5128C172A70C4FCD4739650B06DE9E2 F9546E82313AC1D5E690DCD7BE55606F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=2 2 2 789 456 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpGOTU0NkU4MjMxM0FDMUQ1RTY5MERDRDdCRTU1NjA2Rg== urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTpGOTU0NkU4MjMxM0FDMUQ1RTY5MERDRDdCRTU1NjA2Rg== D3215E08570BE58339C7463626B50E37 F5128C172A70C4FCD4739650B06DE9E2 B480427E8A0C0B8D994E437784BB382F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=3 3 3 789 456 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpCNDgwNDI3RThBMEMwQjhEOTk0RTQzNzc4NEJCMzgyRg== urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTpCNDgwNDI3RThBMEMwQjhEOTk0RTQzNzc4NEJCMzgyRg== D3215E08570BE58339C7463626B50E37 F5128C172A70C4FCD4739650B06DE9E2 @@ -713,7 +713,7 @@ BF6A9895F0DA4A0328FAA8E33F372D3F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetw 5C2B860A2AE8149A46531B69F2252301 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/LTESectorCarrier=80 80 MO urn:base64:RVV0cmFuQ2VsbDo4MDMxMzJDOEFDMzdERUQ2MENCOUNCOTk4NkQ5QkMzRDpVU0VTOkxURVNlY3RvckNhcnJpZXI6NUMyQjg2MEEyQUU4MTQ5QTQ2NTMxQjY5RjIyNTIzMDE= urn:base64:TFRFU2VjdG9yQ2Fycmllcjo1QzJCODYwQTJBRTgxNDlBNDY1MzFCNjlGMjI1MjMwMTpVU0VTOkFudGVubmFDYXBhYmlsaXR5OjU5RTM5QUVCMkNEOEVDMDAxODg1M0Q3RUY3NUU0RTc3 urn:base64:RU5vZGVCRnVuY3Rpb246MEMyNjUxQUI1RDQzMDEyMzcyOUIzMzZFODYzNUUwRTA6UFJPVklERVM6TFRFU2VjdG9yQ2Fycmllcjo1QzJCODYwQTJBRTgxNDlBNDY1MzFCNjlGMjI1MjMwMQ== 803132C8AC37DED60CB9CB9986D9BC3D 59E39AEB2CD8EC0018853D7EF75E4E77 0C2651AB5D430123729B336E8635E0E0 \. -COPY ties_data."NRSectorCarrier" (id, fdn, "arfcnDL", "arfcnUL", "essScLocalId", "frequencyDL", "frequencyUL", "REL_NRCELLDU_USES_NRSECTORCARRIER_EIID", "REL_NRSECTORCARRIER_USES_ANTENNACAPABILITY_EIID", "REL_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER_EIID", "REL_NRCELLDU_USES_NRSECTORCARRIER", "REL_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER") FROM stdin; +COPY ties_data."NRSectorCarrier" (id, fdn, "arfcnDL", "arfcnUL", "essScLocalId", "frequencyDL", "frequencyUL", "REL_NRCELLDU_USES_NRSECTORCARRIER_EIID", "REL_NRSECTORCARRIER_USES_ANTENNACAPABILITY_EIID", "REL_ODUFUNCTION_PROVIDES_NRSECTORCARRIER_EIID", "REL_NRCELLDU_USES_NRSECTORCARRIER", "REL_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "REL_ODUFUNCTION_PROVIDES_NRSECTORCARRIER") FROM stdin; 280DC38868CEE3ED4A6BA9149ABE7A6C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRSectorCarrier=1 1000 20 1 20 20 urn:base64:TlJDZWxsRFU6OThDM0E0NTkxQTM3NzE4RTEzMzBGMDI5NEUyM0I2MkE6VVNFUzpOUlNlY3RvckNhcnJpZXI6MjgwREMzODg2OENFRTNFRDRBNkJBOTE0OUFCRTdBNkM= urn:base64:TlJTZWN0b3JDYXJyaWVyOjI4MERDMzg4NjhDRUUzRUQ0QTZCQTkxNDlBQkU3QTZDOlVTRVM6QW50ZW5uYUNhcGFiaWxpdHk6NTgzNUY3N0JFOUQ0RTEwMjMxNkJENTkxOTVGNjM3MEI= urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUlNlY3RvckNhcnJpZXI6MjgwREMzODg2OENFRTNFRDRBNkJBOTE0OUFCRTdBNkM= 98C3A4591A37718E1330F0294E23B62A 5835F77BE9D4E102316BD59195F6370B D3215E08570BE58339C7463626B50E37 5C5B83AAB9E669D3138091E9AAC19405 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRSectorCarrier=2 1000 20 2 20 20 urn:base64:TlJDZWxsRFU6Rjk1NDZFODIzMTNBQzFENUU2OTBEQ0Q3QkU1NTYwNkY6VVNFUzpOUlNlY3RvckNhcnJpZXI6NUM1QjgzQUFCOUU2NjlEMzEzODA5MUU5QUFDMTk0MDU= urn:base64:TlJTZWN0b3JDYXJyaWVyOjVDNUI4M0FBQjlFNjY5RDMxMzgwOTFFOUFBQzE5NDA1OlVTRVM6QW50ZW5uYUNhcGFiaWxpdHk6MDRGMzlFQkFCNzI0NTRFNEQzMzMxRDZDMzM2N0I0NUY= urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUlNlY3RvckNhcnJpZXI6NUM1QjgzQUFCOUU2NjlEMzEzODA5MUU5QUFDMTk0MDU= F9546E82313AC1D5E690DCD7BE55606F 04F39EBAB72454E4D3331D6C3367B45F D3215E08570BE58339C7463626B50E37 E49D942C16E0364E1E0788138916D70C SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRSectorCarrier=3 1000 20 3 20 20 urn:base64:TlJDZWxsRFU6QjQ4MDQyN0U4QTBDMEI4RDk5NEU0Mzc3ODRCQjM4MkY6VVNFUzpOUlNlY3RvckNhcnJpZXI6RTQ5RDk0MkMxNkUwMzY0RTFFMDc4ODEzODkxNkQ3MEM= urn:base64:TlJTZWN0b3JDYXJyaWVyOkU0OUQ5NDJDMTZFMDM2NEUxRTA3ODgxMzg5MTZENzBDOlVTRVM6QW50ZW5uYUNhcGFiaWxpdHk6QTc3QjIzN0E1NDFCMkQzMjI1QjRCNjFEMzA5OEU0QUE= urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUlNlY3RvckNhcnJpZXI6RTQ5RDk0MkMxNkUwMzY0RTFFMDc4ODEzODkxNkQ3MEM= B480427E8A0C0B8D994E437784BB382F A77B237A541B2D3225B4B61D3098E4AA D3215E08570BE58339C7463626B50E37 @@ -815,11 +815,11 @@ DA2FC8B45D346CFD1C9BB7F074CCA32F SubNetwork=SolarSystem/SubNetwork=Earth/SubNetw A00B93EACEE32A938CD9A83446E1B3AE SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRSectorCarrier=99 1000 20 99 20 20 urn:base64:TlJDZWxsRFU6RjQ1MzFDMzEyMDVGMjhCQzg4MzBDQUQ3QTdDMkZEQTE6VVNFUzpOUlNlY3RvckNhcnJpZXI6QTAwQjkzRUFDRUUzMkE5MzhDRDlBODM0NDZFMUIzQUU= urn:base64:TlJTZWN0b3JDYXJyaWVyOkEwMEI5M0VBQ0VFMzJBOTM4Q0Q5QTgzNDQ2RTFCM0FFOlVTRVM6QW50ZW5uYUNhcGFiaWxpdHk6RTFDMzQwREYwRkZBNTEyMTFEREI1RjgyOUUyQTI3RUU= urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUlNlY3RvckNhcnJpZXI6QTAwQjkzRUFDRUUzMkE5MzhDRDlBODM0NDZFMUIzQUU= F4531C31205F28BC8830CAD7A7C2FDA1 E1C340DF0FFA51211DDB5F829E2A27EE 4CFF136200A2DE36205A13559C55DB2A \. -COPY ties_data."GNBCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "GNBCUCPFunction", "CloudNativeApplication") FROM stdin; +COPY ties_data."OCUCPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "OCUCPFunction", "CloudNativeApplication") FROM stdin; urn:base64:R05CQ1VDUEZ1bmN0aW9uOjA1MjU5MzAyNDkzMDJCOTY0OUZDOEYyMDFFQzRGN0ZDOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246MzI1NjEyMEU3M0FERDQwMjZBNDNBOTcxRENFNUMxNTE= 0525930249302B9649FC8F201EC4F7FC 3256120E73ADD4026A43A971DCE5C151 \. -COPY ties_data."GNBCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "GNBCUUPFunction", "CloudNativeApplication") FROM stdin; +COPY ties_data."OCUUPFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "OCUUPFunction", "CloudNativeApplication") FROM stdin; urn:base64:R05CQ1VVUEZ1bmN0aW9uOkJGRUVBQzJDRTYwMjczQ0IwQTc4MzE5Q0MyMDFBN0ZFOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246QUQ0MkQ5MDQ5N0U5M0QyNzYyMTVERjZEM0I4OTlFMTc= BFEEAC2CE60273CB0A78319CC201A7FE AD42D90497E93D276215DF6D3B899E17 urn:base64:R05CQ1VVUEZ1bmN0aW9uOkYxQzMyQjlERUNBMjIzMEQ5NzY1QkUyRjU0RjFFREZFOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246OTgwMEQ4MUM3NDNCRjQyNDZGRUI5NTA2M0Q2QjBGNkI= F1C32B9DECA2230D9765BE2F54F1EDFE 9800D81C743BF4246FEB95063D6B0F6B urn:base64:R05CQ1VVUEZ1bmN0aW9uOkExOEYzNDUyQzkxOEU4RjJDNTRFNjAwRjQyMDA1REJEOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246Mzk4REQxOUE1RkQ5MDJDOTgxRTRENTlGNDRFMjdGMDc= A18F3452C918E8F2C54E600F42005DBD 398DD19A5FD902C981E4D59F44E27F07 @@ -829,7 +829,7 @@ urn:base64:R05CQ1VVUEZ1bmN0aW9uOjk4MDZBQkUyOTg1QkRENEZFNkJEMkIzODU0OUM5NzNDOlJFQ urn:base64:R05CQ1VVUEZ1bmN0aW9uOjlCMDA3ODgxQTFCOERFMzNEMUQzMDYzQkU2MDFENEI2OlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246RUUyRDRBREExMEZGNjg3RkY2QTg2NUNDOUU1NkE0MzY= 9B007881A1B8DE33D1D3063BE601D4B6 EE2D4ADA10FF687FF6A865CC9E56A436 \. -COPY ties_data."GNBDUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "GNBDUFunction", "CloudNativeApplication") FROM stdin; +COPY ties_data."ODUFUNCTION_REALISED_BY_CLOUDNATIVEAPPLICATION" (id, "ODUFunction", "CloudNativeApplication") FROM stdin; urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpSRUFMSVNFRF9CWTpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOkM1NDk5MDVDRjNDQzg5MENFNTc0NkM1RTEwQUNGMDBE 4CFF136200A2DE36205A13559C55DB2A C549905CF3CC890CE5746C5E10ACF00D urn:base64:R05CRFVGdW5jdGlvbjpCQkIzQzQyQTRGOEFDOTQwOTFCMjk3REY3MDhERDUwQjpSRUFMSVNFRF9CWTpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOjlFMDI5MTY4OTQzNTIwMEFFMTMzMkZCQkI5OTJDMTUx BBB3C42A4F8AC94091B297DF708DD50B 9E0291689435200AE1332FBBB992C151 urn:base64:R05CRFVGdW5jdGlvbjo3RDgwRTVDNkUwQzlFQzI0NjM3MEU4NkI3RTUyNEY4QzpSRUFMSVNFRF9CWTpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOjZCNjU1OTcxNTY0QzAyRjFGQjdFNUQ3RTg0RjlEREFG 7D80E5C6E0C9EC246370E86B7E524F8C 6B655971564C02F1FB7E5D7E84F9DDAF diff --git a/teiv/src/test/resources/pgsqlschema/data.sql b/teiv/src/test/resources/pgsqlschema/data.sql index 49dc28b..ee3b2bd 100644 --- a/teiv/src/test/resources/pgsqlschema/data.sql +++ b/teiv/src/test/resources/pgsqlschema/data.sql @@ -20,188 +20,318 @@ -- -COPY ties_data."163276fa439cdfccabb80f7acacb6fa638e8d314" ("id", "name", "REL_FK_deployed-managedElement" ) FROM stdin; +BEGIN; +COPY ties_data."responsible_adapter" ("id", "hashed_id") FROM stdin; +namespace-ran-topology-adapter +namespace:ran-topology-adapter \\xe7ed2726d18e3eb3c36fd1b932ab7b9a1def21ec +test-namespace:test-adapter-id \\x866db960e7d78018cbdf401ff8c0db523f0e27bb +ran-topology-adapter \\x5b35d8c6c5f8e8acb48912b8f328ebc9b6924e03 \. -COPY ties_data."ef701af8e1445ed5d377664ba1d3d1c645e31639" ("id", "name", "REL_FK_C2F5EC33C0760F653CE7263A49C0B697FCA2D542" ) FROM stdin; -C4E311A55666726FD9FE25CA572AFAF9 Example Cloud Native System/1 \N +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 ties_data."o-ran-smo-teiv-ran-oam_ManagedElement" ("id", "cmId", "fdn", "REL_FK_deployed-as-cloudNativeSystem", "REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDNATIVESYSTEM" ) FROM stdin; -DA1039E77700A9EEFFA280049ECE9227 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=9 \N \N -6F02817AFE4D53237DB235EBE5378613 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=10 \N \N -27500EB447000209EE6E3CA1B31FBA92 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=13 \N \N -06222D277EE209CD8DCA1FE61CE752E6 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=14 \N \N -DC86CA7724113F4C0DF42BFEAA17FD53 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=16 \N \N -8D51EFC759166044DACBCA63C4EDFC51 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=19 \N \N -E64371CD4D12ED0CED200DD3A7591784 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=28 \N \N +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 ties_data."fa2dceaf53e045c136ce9db9bc5faae65a29fa4d" ("id", "cmId", "fdn", "REL_FK_26958E3A529C4C8B68A29FDA906F8CD290F66078", "REL_ID_B7945BFD83380F3E12CF99F2B0F838F364027F92" ) FROM stdin; -45EF31D8A1FD624D7276390A1215BFC3 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=1 C4E311A55666726FD9FE25CA572AFAF9 urn:base64:TWFuYWdlZEVsZW1lbnQ6NDVFRjMxRDhBMUZENjI0RDcyNzYzOTBBMTIxNUJGQzM6REVQTE9ZRURfQVM6Q2xvdWROYXRpdmVTeXN0ZW06QzRFMzExQTU1NjY2NzI2RkQ5RkUyNUNBNTcyQUZBRjk= -DA1039E77700A9EEFFA280049ECE9227 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=9 \N \N -6F02817AFE4D53237DB235EBE5378613 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=10 \N \N -27500EB447000209EE6E3CA1B31FBA92 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=13 \N \N -06222D277EE209CD8DCA1FE61CE752E6 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=14 \N \N -DC86CA7724113F4C0DF42BFEAA17FD53 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=16 \N \N -8D51EFC759166044DACBCA63C4EDFC51 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=19 \N \N -E64371CD4D12ED0CED200DD3A7591784 \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/ManagedElement=28 \N \N +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 ties_data."o-ran-smo-teiv-ran-cloud_CloudSite" ("id", "geo-location", "name" ) FROM stdin; -16EE17AE89DF11B69E94B3F6827C2C0E POINT(59.4019881 17.9419888) ORAN +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 ties_data."o-ran-smo-teiv-ran-cloud_NodeCluster" ("id", "name", "REL_FK_located-at-cloudSite", "REL_ID_NODECLUSTER_LOCATED_AT_CLOUDSITE" ) FROM stdin; -015C2DDBD7AC722B34ED6A20EDEEB9C3 Example NodeCluster/45 16EE17AE89DF11B69E94B3F6827C2C0E urn:base64:Tm9kZUNsdXN0ZXI6MDE1QzJEREJEN0FDNzIyQjM0RUQ2QTIwRURFRUI5QzM6TE9DQVRFRF9BVDpDbG91ZFNpdGU6MTZFRTE3QUU4OURGMTFCNjlFOTRCM0Y2ODI3QzJDMEU= +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 ties_data."o-ran-smo-teiv-ran-cloud_Namespace" ("id", "name", "REL_FK_deployed-on-nodeCluster", "REL_ID_NAMESPACE_DEPLOYED_ON_NODECLUSTER" ) FROM stdin; -1C02E96B2AAE036C7AE404BC38C308E0 Example Namespace/1 \N \N +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 ties_data."bc563e4310b0538e6bdd35f52684160af5b23671" ("id", "name" ) FROM stdin; -1C02E96B2AAE036C7AE404BC38C308E0 Example Namespace/1 +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 ties_data."e01fcb87ad2c34ce66c34420255e25aaca270e5e" ("id", "name", "REL_FK_realised-managedElement", "REL_ID_MANAGEDELEMENT_REALISED_BY_CLOUDNATIVEAPPLICATION", "REL_FK_comprised-by-cloudNativeSystem", "REL_ID_CLOUDNATIVESYSTEM_COMPRISES_CLOUDNATIVEAPPLICATION", "REL_FK_deployed-on-namespace", "REL_ID_CLOUDNATIVEAPPLICATION_DEPLOYED_ON_NAMESPACE" ) FROM stdin; -AD42D90497E93D276215DF6D3B899E17 Cloud Native CUUPApp/8 \N \N \N \N \N \N -719BD5C7CD8A939D76A83DA95DA45C01 Example Cloud App/9 \N \N \N \N 1C02E96B2AAE036C7AE404BC38C308E0 urn:base64:Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjo3MTlCRDVDN0NEOEE5MzlENzZBODNEQTk1REE0NUMwMTpERVBMT1lFRF9PTjpOYW1lc3BhY2U6MUMwMkU5NkIyQUFFMDM2QzdBRTQwNEJDMzhDMzA4RTA= -416F31E6EB09055326621F4919D35BFF Example Cloud App/10 \N \N \N \N \N \N -C549905CF3CC890CE5746C5E10ACF00D Example Cloud App/19 \N \N \N \N \N \N +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 ties_data."5f8facd51b2bbddc90d9dee9be697907441892d0" ("id", "name", "REL_FK_AB87B417CCD05C332DDD0C60F0C6AB41D38B05E5", "REL_ID_FC2F6A5A12917357B548C83F4B0C1AD58FA61413", "REL_FK_8C98B70070BBD11F90F192DDA3ECF6302390E956", "REL_ID_AFBF10D23507AD3B6408947D2A9AF8465BA7B08C" ) FROM stdin; -AD42D90497E93D276215DF6D3B899E17 Cloud Native CUUPApp/8 \N \N \N \N -719BD5C7CD8A939D76A83DA95DA45C01 Example Cloud App/9 \N \N 1C02E96B2AAE036C7AE404BC38C308E0 urn:base64:Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjo3MTlCRDVDN0NEOEE5MzlENzZBODNEQTk1REE0NUMwMTpERVBMT1lFRF9PTjpOYW1lc3BhY2U6MUMwMkU5NkIyQUFFMDM2QzdBRTQwNEJDMzhDMzA4RTA= -416F31E6EB09055326621F4919D35BFF Example Cloud App/10 6F02817AFE4D53237DB235EBE5378613 urn:base64:TWFuYWdlZEVsZW1lbnQ6NkYwMjgxN0FGRTRENTMyMzdEQjIzNUVCRTUzNzg2MTM6UkVBTElTRURfQlk6Q2xvdWROYXRpdmVBcHBsaWNhdGlvbjo0MTZGMzFFNkVCMDkwNTUzMjY2MjFGNDkxOUQzNUJGRg== \N \N -C549905CF3CC890CE5746C5E10ACF00D Example Cloud App/19 \N \N \N \N +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 ties_data."22174a23af5d5a96143c83ddfa78654df0acb697" ("id", "geo-location", "sectorId", "azimuth" ) FROM stdin; -2F445AA5744FA3D230FD6838531F1407 POINT(59.4019881 17.9419888) 1 1 -F5128C172A70C4FCD4739650B06DE9E2 POINT(59.4019881 17.9419888) 2 2 -ADB1BAAC878C0BEEFE3175C60F44BB1D POINT(59.4019881 17.9419888) 4 3 +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 ties_data."c4a425179d3089b5288fdf059079d0ea26977f0f" ("id", "pLMNId", "cmId", "fdn", "gNBCUName", "gNBIdLength", "gNBId", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_GNBCUCPFUNCTION" ) FROM stdin; +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 ties_data."8fe520ccd54b8f72ef7b2d3061264ddc2481e4eb" ("id", "cmId", "fdn", "gNBIdLength", "gNBId", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBCUUPFUNCTION" ) FROM stdin; -BFEEAC2CE60273CB0A78319CC201A7FE \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBCUUPFunction=8 1 8 E64371CD4D12ED0CED200DD3A7591784 urn:base64:TWFuYWdlZEVsZW1lbnQ6RTY0MzcxQ0Q0RDEyRUQwQ0VEMjAwREQzQTc1OTE3ODQ6TUFOQUdFUzpHTkJDVVVQRnVuY3Rpb246QkZFRUFDMkNFNjAyNzNDQjBBNzgzMTlDQzIwMUE3RkU= ["gnbcucp-gnbcuup-model:Weekend", "gnbcucp-gnbcuup-model:Weekday"] {"gnbcucp-gnbcuup-model:metadata": "value1", "gnbcucp-gnbcuup-model:meta": "value2"} +COPY ties_data."o-ran-smo-teiv-equipment_Site" ("id", "geo-location", "name", "CD_sourceIds", "CD_classifiers", "CD_decorators") FROM stdin; \. -COPY ties_data."o-ran-smo-teiv-ran-logical_GNBDUFunction" ("id", "gNBDUId", "cmId", "fdn", "dUpLMNId", "gNBIdLength", "gNBId", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_GNBDUFUNCTION" ) FROM stdin; -D3215E08570BE58339C7463626B50E37 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=9 {"mcc":{"mcca":"123","mccb":{"mccba":123}},"mcb":["a123","b123","c012"],"mnc":"82"} 1 9 DA1039E77700A9EEFFA280049ECE9227 urn:base64:TWFuYWdlZEVsZW1lbnQ6REExMDM5RTc3NzAwQTlFRUZGQTI4MDA0OUVDRTkyMjc6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkQzMjE1RTA4NTcwQkU1ODMzOUM3NDYzNjI2QjUwRTM3 [] [] {} [] {} -1050570EBB1315E1AE7A9FD5E1400A00 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=10 {"mcc":{"mcca":"234","mccb":{"mccba":234}},"mcb":["a123","b123","c012"],"mnc":"82"} 2 10 6F02817AFE4D53237DB235EBE5378613 urn:base64:TWFuYWdlZEVsZW1lbnQ6NkYwMjgxN0FGRTRENTMyMzdEQjIzNUVCRTUzNzg2MTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjEwNTA1NzBFQkIxMzE1RTFBRTdBOUZENUUxNDAwQTAw [] [] {} [] {} -25E690E22BDA90B9C4FEE1F083CBA597 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=13 {"mcc":{"mcca":"345","mccb":{"mccba":345}},"mcb":["a123","b123","c012"],"mnc":"82"} 2 13 27500EB447000209EE6E3CA1B31FBA92 urn:base64:TWFuYWdlZEVsZW1lbnQ6Mjc1MDBFQjQ0NzAwMDIwOUVFNkUzQ0ExQjMxRkJBOTI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjI1RTY5MEUyMkJEQTkwQjlDNEZFRTFGMDgzQ0JBNTk3 [] [] {} [] {} -5A3085C3400C3096E2ED2321452766B1 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=14 {"mcc":{"mcca":"456","mccb":{"mccba":456}},"mcb":["a123","b123","c012"],"mnc":"82"} 2 14 06222D277EE209CD8DCA1FE61CE752E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MDYyMjJEMjc3RUUyMDlDRDhEQ0ExRkU2MUNFNzUyRTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBMzA4NUMzNDAwQzMwOTZFMkVEMjMyMTQ1Mjc2NkIx [] [] {} [] {} -5A548EA9D166341776CA0695837E55D8 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=16 {"mcc":{"mcca":"567","mccb":{"mccba":567}},"mcb":["a123","b123","c012"],"mnc":"82"} 2 16 DC86CA7724113F4C0DF42BFEAA17FD53 urn:base64:TWFuYWdlZEVsZW1lbnQ6REM4NkNBNzcyNDExM0Y0QzBERjQyQkZFQUExN0ZENTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBNTQ4RUE5RDE2NjM0MTc3NkNBMDY5NTgzN0U1NUQ4 ["urn:3gpp:dn:/SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=16","urn:cmHandle:/395221E080CCF0FD1924103B15873814"] ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm", "test-app-module:data":"test"} ["test-app-module:Indoor","test-app-module:Rural","test-app-module:Weekend"] {"test-app-module:textdata":"Stockholm", "test-app-module:data":"test"} -4CFF136200A2DE36205A13559C55DB2A \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=19 {"mcc":{"mcca":"678","mccb":{"mccba":678}},"mcb":["a123","b123","c012"],"mnc":"82"} 2 19 8D51EFC759166044DACBCA63C4EDFC51 urn:base64:TWFuYWdlZEVsZW1lbnQ6OEQ1MUVGQzc1OTE2NjA0NERBQ0JDQTYzQzRFREZDNTE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjRDRkYxMzYyMDBBMkRFMzYyMDVBMTM1NTlDNTVEQjJB [] [] {} [] {} -\. +-- Test specific entries -- -COPY ties_data."3fdb9cd7557edf559a0e4de88df220e7545884b5" ("id", "gNBDUId", "cmId", "3786A6CA64C9422F9E7FC35B7B039F345BBDDA65", "dUpLMNId", "gNBIdLength", "gNBId", "REL_FK_48B14FA5B787C6398AD1DE5EE670AD0D2A2CB36F", "REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B" ) FROM stdin; -D3215E08570BE58339C7463626B50E37 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=9 {"mcc":"456","mnc":"82"} 1 9 DA1039E77700A9EEFFA280049ECE9227 urn:base64:TWFuYWdlZEVsZW1lbnQ6REExMDM5RTc3NzAwQTlFRUZGQTI4MDA0OUVDRTkyMjc6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOkQzMjE1RTA4NTcwQkU1ODMzOUM3NDYzNjI2QjUwRTM3 -1050570EBB1315E1AE7A9FD5E1400A00 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=10 {"mcc":"456","mnc":"82"} 2 10 6F02817AFE4D53237DB235EBE5378613 urn:base64:TWFuYWdlZEVsZW1lbnQ6NkYwMjgxN0FGRTRENTMyMzdEQjIzNUVCRTUzNzg2MTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjEwNTA1NzBFQkIxMzE1RTFBRTdBOUZENUUxNDAwQTAw -25E690E22BDA90B9C4FEE1F083CBA597 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=13 {"mcc":"456","mnc":"82"} 2 13 27500EB447000209EE6E3CA1B31FBA92 urn:base64:TWFuYWdlZEVsZW1lbnQ6Mjc1MDBFQjQ0NzAwMDIwOUVFNkUzQ0ExQjMxRkJBOTI6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjI1RTY5MEUyMkJEQTkwQjlDNEZFRTFGMDgzQ0JBNTk3 -5A3085C3400C3096E2ED2321452766B1 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=14 {"mcc":"456","mnc":"82"} 2 14 06222D277EE209CD8DCA1FE61CE752E6 urn:base64:TWFuYWdlZEVsZW1lbnQ6MDYyMjJEMjc3RUUyMDlDRDhEQ0ExRkU2MUNFNzUyRTY6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBMzA4NUMzNDAwQzMwOTZFMkVEMjMyMTQ1Mjc2NkIx -5A548EA9D166341776CA0695837E55D8 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=16 {"mcc":"456","mnc":"82"} 2 16 DC86CA7724113F4C0DF42BFEAA17FD53 urn:base64:TWFuYWdlZEVsZW1lbnQ6REM4NkNBNzcyNDExM0Y0QzBERjQyQkZFQUExN0ZENTM6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjVBNTQ4RUE5RDE2NjM0MTc3NkNBMDY5NTgzN0U1NUD4 -4CFF136200A2DE36205A13559C55DB2A \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/GNBDUFunction=19 {"mcc":"456","mnc":"82"} 2 19 8D51EFC759166044DACBCA63C4EDFC51 urn:base64:TWFuYWdlZEVsZW1lbnQ6OEQ1MUVGQzc1OTE2NjA0NERBQ0JDQTYzQzRFREZDNTE6TUFOQUdFUzpHTkJEVUZ1bmN0aW9uOjRDRkYxMzYyMDBBMkRFMzYyMDVBMTM1NTlDNTVEQjJB -\. +CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ( + "id" TEXT, + "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT, + "F03B534AFF0872651FED60C54AB56BEDADAB94B5" BIGINT, + "333177AA699C0DE6399503171DCF48FB396322B0" INTEGER, + "027B1A8019C6DEF04558B90D9D8B52253B82FEC6" BIGINT, + "478D043D81678134EF1C8BFB073A70F882C4AF12" DECIMAL, + "8252D18D44F633831557076D827993C45278024D" jsonb, + "68C48305AB6C3A30DD927F5D38562379374A4B31" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-entityTypeA" TEXT, + "REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0" TEXT, + "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" jsonb, + "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" jsonb, + "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" jsonb +); -COPY ties_data."88f1bd76c7a935fb505cf235e6819f46c55ec98a" ("id", "nRFqBands", "eUtranFqBands", "cmId", "fdn", "geranFqBands", "REL_FK_used-by-lteSectorCarrier" ) FROM stdin; -5835F77BE9D4E102316BD59195F6370B ["123","456","789"] ["123","4564","789"] \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaCapability=1 ["123","456","789"] \N -A77B237A541B2D3225B4B61D3098E4AA ["123","456","789"] ["123","4564","789"] \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaCapability=3 ["123","456","789"] \N -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -COPY ties_data."o-ran-smo-teiv-ran-logical_NRCellDU" ("id", "nRPCI", "cmId", "cellLocalId", "fdn", "nCI", "nRTAC", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_NRCELLDU", "REL_FK_provided-by-gnbduFunction", "REL_ID_GNBDUFUNCTION_PROVIDES_NRCELLDU" ) FROM stdin; -98C3A4591A37718E1330F0294E23B62A 789 \N 1 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=1 1 456 F5128C172A70C4FCD4739650B06DE9E2 urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTo5OEMzQTQ1OTFBMzc3MThFMTMzMEYwMjk0RTIzQjYyQQ== D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTo5OEMzQTQ1OTFBMzc3MThFMTMzMEYwMjk0RTIzQjYyQQ== -F9546E82313AC1D5E690DCD7BE55606F 789 \N 2 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=2 2 456 F5128C172A70C4FCD4739650B06DE9E2 urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTpGOTU0NkU4MjMxM0FDMUQ1RTY5MERDRDdCRTU1NjA2Rg== D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpGOTU0NkU4MjMxM0FDMUQ1RTY5MERDRDdCRTU1NjA2Rg== -B480427E8A0C0B8D994E437784BB382F 789 \N 3 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=3 3 456 F5128C172A70C4FCD4739650B06DE9E2 urn:base64:U2VjdG9yOkY1MTI4QzE3MkE3MEM0RkNENDczOTY1MEIwNkRFOUUyOkdST1VQUzpOUkNlbGxEVTpCNDgwNDI3RThBMEMwQjhEOTk0RTQzNzc4NEJCMzgyRg== D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpCNDgwNDI3RThBMEMwQjhEOTk0RTQzNzc4NEJCMzgyRg== -76E9F605D4F37330BF0B505E94F64F11 789 \N 91 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=91 91 456 \N \N 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTo3NkU5RjYwNUQ0RjM3MzMwQkYwQjUwNUU5NEY2NEYxMQ== -67A1BDA10B5AF43028D07C7BE5CB1AE2 789 \N 92 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=92 92 456 \N \N 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTo2N0ExQkRBMTBCNUFGNDMwMjhEMDdDN0JFNUNCMUFFMg== -B3B0A1939EFCA654A37005B6A7F24BD7 789 \N 93 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=93 93 456 \N \N 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTpCM0IwQTE5MzlFRkNBNjU0QTM3MDA1QjZBN0YyNEJENw== -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -COPY ties_data."300672c8a708d6af0b9af2f9accdff5e6e005721" ("id", "nRPCI", "cmId", "020335B0F627C169E24167748C38FE756FB34AE2", "fdn", "nCI", "nRTAC", "REL_FK_609963BFEE15FF824280FBE201313C3CDACDDDCE", "REL_ID_040FC8B06B420BA5708AF4798102D1E65FB4DC61" ) FROM stdin; -98C3A4591A37718E1330F0294E23B62A 789 \N 1 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=1 1 456 D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTo5OEMzQTQ1OTFBMzc3MThFMTMzMEYwMjk0RTIzQjYyQQ== -F9546E82313AC1D5E690DCD7BE55606F 789 \N 2 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=2 2 456 D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpGOTU0NkU4MjMxM0FDMUQ1RTY5MERDRDdCRTU1NjA2Rg== -B480427E8A0C0B8D994E437784BB382F 789 \N 3 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=3 3 456 D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUkNlbGxEVTpCNDgwNDI3RThBMEMwQjhEOTk0RTQzNzc4NEJCMzgyRg== -76E9F605D4F37330BF0B505E94F64F11 789 \N 91 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=91 91 456 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTo3NkU5RjYwNUQ0RjM3MzMwQkYwQjUwNUU5NEY2NEYxMQ== -67A1BDA10B5AF43028D07C7BE5CB1AE2 789 \N 92 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=92 92 456 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTo2N0ExQkRBMTBCNUFGNDMwMjhEMDdDN0JFNUNCMUFFMg== -B3B0A1939EFCA654A37005B6A7F24BD7 789 \N 93 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=93 93 456 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTpCM0IwQTE5MzlFRkNBNjU0QTM3MDA1QjZBN0YyNEJENw== -F26F279E91D0941DB4F646E707EA403A 789 \N 94 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRCellDU=94 94 456 4CFF136200A2DE36205A13559C55DB2A urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpQUk9WSURFUzpOUkNlbGxEVTpGMjZGMjc5RTkxRDA5NDFEQjRGNjQ2RTcwN0VBNDAzQQ== -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -COPY ties_data."39a335dca201ef99ae06f4ffd1908b534f8c6c39" ("id", "fdn", "frequencyUL", "cmId", "essScLocalId", "arfcnUL", "frequencyDL", "arfcnDL", "REL_FK_used-by-nrCellDu", "REL_ID_NRCELLDU_USES_NRSECTORCARRIER", "REL_FK_provided-by-gnbduFunction", "REL_ID_GNBDUFUNCTION_PROVIDES_NRSECTORCARRIER", "REL_FK_used-antennaCapability", "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY", "CD_classifiers", "CD_decorators" ) FROM stdin; -E49D942C16E0364E1E0788138916D70C SubNetwork=SolarSyst3em/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/NRSectorCarrier=3 20 \N 20 3 20 20 B480427E8A0C0B8D994E437784BB382F urn:base64:TlJDZWxsRFU6QjQ4MDQyN0U4QTBDMEI4RDk5NEU0Mzc3ODRCQjM4MkY6VVNFUzpOUlNlY3RvckNhcnJpZXI6RTQ5RDk0MkMxNkUwMzY0RTFFMDc4ODEzODkxNkQ3MEM= D3215E08570BE58339C7463626B50E37 urn:base64:R05CRFVGdW5jdGlvbjpEMzIxNUUwODU3MEJFNTgzMzlDNzQ2MzYyNkI1MEUzNzpQUk9WSURFUzpOUlNlY3RvckNhcnJpZXI6RTQ5RDk0MkMxNkUwMzY0RTFFMDc4ODEzODkxNkQ3MEM= A77B237A541B2D3225B4B61D3098E4AA urn:base64:TlJTZWN0b3JDYXJyaWVyOkU0OUQ5NDJDMTZFMDM2NEUxRTA3ODgxMzg5MTZENzBDOlVTRVM6QW50ZW5uYUNhcGFiaWxpdHk6QTc3QjIzN0E1NDFCMkQzMjI1QjRCNjFEMzA5OEU0QUE= ["gnbcucp-gnbcuup-model:Weekend", "gnbcucp-gnbcuup-model:Weekday"] {"gnbcucp-gnbcuup-model:metadata": "value1", "gnbcucp-gnbcuup-model:meta": "value2"} -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]'; -COPY ties_data."f8caf5ebe876c3001d67efe06e4d83abf0babe31" ("id", "mechanicalAntennaTilt", "antennaBeamWidth", "geo-location", "fdn", "cmId", "antennaModelNumber", "totalTilt", "mechanicalAntennaBearing", "positionWithinSector", "electricalAntennaTilt", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_ANTENNAMODULE", "REL_FK_installed-at-site", "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE" ) FROM stdin; -278A05C67D47D117C2DC5BDF5E00AE70 123 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModule=1 \N ['123-abc'] 45 123 ['123', '456', '789'] 1 ADB1BAAC878C0BEEFE3175C60F44BB1D urn:base64:U2VjdG9yOkFEQjFCQUFDODc4QzBCRUVGRTMxNzVDNjBGNDRCQjFEOkdST1VQUzpBbnRlbm5hTW9kdWxlOjI3OEEwNUM2N0Q0N0QxMTdDMkRDNUJERjVFMDBBRTcw \N \N -279A05C67D47D117C2DC5BDF5E00AE70 456 \N \N SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModule=2 \N ['123-xyz'] 45 123 ['123', '456', '789'] 1 \N \N \N \N -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]'; -COPY ties_data."341622dca4e0350289717b52df5883edc3fa0280" ("id", "fdn" ) FROM stdin; -378A05C67D47D117C2DC5BDF5E00AE70 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=11 -379A05C67D47D117C2DC5BDF5E00AE70 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=12 -478A05C67D47D117C2DC5BDF5E00AE70 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=21 -479A05C67D47D117C2DC5BDF5E00AE70 SubNetwork=SolarSystem/SubNetwork=Earth/SubNetwork=Europe/SubNetwork=Hungary/AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee=22 -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}'; -COPY ties_data."o-ran-smo-teiv-ran-logical_ENodeBFunction" ("id", "eNBId", "cmId", "eNodeBPlmnId", "fdn", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION", "REL_FK_realised-by-physicalNetworkAppliance", "REL_ID_ENODEBFUNCTION_REALISED_BY_PHYSICALNETWORKAPPLIANCE" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -COPY ties_data."o-ran-smo-teiv-ran-logical_EUtranCell" ("id", "cellId", "cmId", "earfcn", "duplexType", "tac", "fdn", "earfcndl", "earfcnul", "REL_FK_grouped-by-sector", "REL_ID_SECTOR_GROUPS_EUTRANCELL", "REL_FK_provided-by-enodebFunction", "REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD COLUMN IF NOT EXISTS "REL_metadata_F53C39EC1F710F3096BE0588F6783A03A378516A" jsonb; -COPY ties_data."c88307168935f02fdecc084ea5040bb9db16c701" ("id", "fdn", "cmId", "sectorCarrierType", "essScLocalId", "REL_FK_provided-by-enodebFunction", "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER", "REL_FK_used-antennaCapability", "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY", "REL_FK_used-by-euTranCell", "REL_ID_EUTRANCELL_USES_LTESECTORCARRIER" ) FROM stdin; -\. +CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ( + "id" TEXT, + "aSide_EntityTypeA" TEXT, + "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); -COPY ties_data."o-ran-smo-teiv-ran-logical_NRCellCU" ("id", "fdn", "cmId", "plmnId", "nCI", "cellLocalId", "nRTAC", "REL_FK_provided-by-gnbcucpFunction", "REL_ID_GNBCUCPFUNCTION_PROVIDES_NRCELLCU" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD COLUMN IF NOT EXISTS "metadata" jsonb; -COPY ties_data."57a20807ab3f39c86b0b5bf9a819e0881353fa1e" ("id", "geo-location", "cmId", "name", "type", "REL_FK_installed-at-site", "REL_ID_PHYSICALNETWORKAPPLIANCE_INSTALLED_AT_SITE" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -COPY ties_data."o-ran-smo-teiv-ran-equipment_Site" ("id", "geo-location", "cmId", "name" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -COPY ties_data."7cd7062ea24531b2f48e4f2fdc51eaf0b82f88c7" ("id", "aSide_GNBCUCPFunction", "bSide_CloudNativeApplication" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -COPY ties_data."70a4a84bca01ea022ab24d8cb82422c572922675" ("id", "aSide_GNBCUUPFunction", "bSide_CloudNativeApplication", "CD_classifiers", "CD_decorators" ) FROM stdin; -urn:base64:R05CQ1VVUEZ1bmN0aW9uOkJGRUVBQzJDRTYwMjczQ0IwQTc4MzE5Q0MyMDFBN0ZFOlJFQUxJU0VEX0JZOkNsb3VkTmF0aXZlQXBwbGljYXRpb246QUQ0MkQ5MDQ5N0U5M0QyNzYyMTVERjZEM0I4OTlFMTc= BFEEAC2CE60273CB0A78319CC201A7FE AD42D90497E93D276215DF6D3B899E17 ["gnbcucp-gnbcuup-model:Weekend", "gnbcucp-gnbcuup-model:Weekday"] {"gnbcucp-gnbcuup-model:metadata": "value1", "gnbcucp-gnbcuup-model:meta": "value2"} -\. +CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ( + "id" TEXT, + "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815" TEXT, + "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); -COPY ties_data."10484f157f490eb5b27e40dbfaf4d5f2be17c57c" ("id", "aSide_GNBDUFunction", "bSide_CloudNativeApplication" ) FROM stdin; -urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpSRUFMSVNFRF9CWTpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOkM1NDk5MDVDRjNDQzg5MENFNTc0NkM1RTEwQUNGMDBE 4CFF136200A2DE36205A13559C55DB2A C549905CF3CC890CE5746C5E10ACF00D -\. +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; -COPY ties_data."f86057a8762a50b1c7fb07af9d5c001bffaefd15" ("id", "aSide_B0FD0521695A211BFF76F413A31F28CBA32E57ED", "bSide_84EF1134719BB6FCF33A94FF770311FC722BCF41" ) FROM stdin; -urn:base64:R05CRFVGdW5jdGlvbjo0Q0ZGMTM2MjAwQTJERTM2MjA1QTEzNTU5QzU1REIyQTpSRUFMSVNFRF9CWTpDbG91ZE5hdGl2ZUFwcGxpY2F0aW9uOkM1NDk5MDVDRjNDQzg5MENFNTc0NkM1RTEwQUNGMDBE 4CFF136200A2DE36205A13559C55DB2A C549905CF3CC890CE5746C5E10ACF00D -\. +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; -COPY ties_data."5b8a47d4a8297a0a1d31e091af06e26d25ef6caf" ("id", "aSide_AntennaCapability", "bSide_AntennaModule" ) FROM stdin; -\. +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -COPY ties_data."5123d0adfb7b4a04e7f2e5e1783f476ed5cf76f6" ("id", "aSide_AntennaModule", "bSide_AntennaModule" ) FROM stdin; -urn:base64:QW50ZW5uYU1vZHVsZToyNzhBMDVDNjdENDdEMTE3QzJEQzVCREY1RTAwQUU3MDpSRUFMSVNFRF9CWTpBbnRlbm5hTW9kdWxlOjI3OEEwNUM2N0Q0N0QxMTdDMkRDNUJERjVFMDBBRTcwCg== 278A05C67D47D117C2DC5BDF5E00AE70 279A05C67D47D117C2DC5BDF5E00AE70 -\. +ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" ( + "id" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5" TEXT, + "REL_ID_31A5B55158140557F09AE15589A8B8038416689B" TEXT, + "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" jsonb, + "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" jsonb, + "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" jsonb, + "REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA" TEXT, + "REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845" TEXT, + "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" jsonb, + "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" jsonb, + "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" jsonb +); + +ALTER TABLE ONLY ties_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 ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; -COPY ties_data."cd39d44beed963d50df42cd301e63d288f911c97" ("id", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" ) FROM stdin; -urn:base64:QW50ZW5uYU1vZHVsZTozNzhBMDVDNjdENDdEMTE3QzJEQzVCREY1RTAwQUU3MDpSRUFMSVNFRF9CWTpBbnRlbm5hTW9kdWxlOjM3OUEwNUM2N0Q0N0QxMTdDMkRDNUJERjVFMDBBRTcwCg== 378A05C67D47D117C2DC5BDF5E00AE70 379A05C67D47D117C2DC5BDF5E00AE70 +ALTER TABLE ONLY ties_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 ties_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 ties_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 ties_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 ties_data."test-built-in-module_EntityTypeA" ADD COLUMN IF NOT EXISTS "REL_metadata_3H23F80D423BF8F96A2906643B7B4712604FC45F" jsonb; + +SELECT ties_data.create_constraint_if_not_exists( + '10B9F515756871D3EF6558FAF1F112BAE207945D', + 'PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB', + 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '54110F8D085BBBA7BB6DE5CE71B511562090F7EE', + 'PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D', + 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + 'FB1E124031A12CD85D3335194B39B193723A0490', + 'PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD', + 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");' +); + +SELECT ties_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");' +); + +SELECT ties_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;' +); + +SELECT ties_data.create_constraint_if_not_exists( + '10B9F515756871D3EF6558FAF1F112BAE207945D', + 'UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14', + 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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");' +); + +SELECT ties_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;' +); + +SELECT ties_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");' +); + +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 ties_data."c6f3a3396e9165e886da928c5fe1382fb20dc850" ("id", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C", "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" ) FROM stdin; -urn:base64:QW50ZW5uYU1vZHVsZTo0NzhBMDVDNjdENDdEMTE3QzJEQzVCREY1RTAwQUU3MDpERVBMT1lFRF9CWTpBbnRlbm5hTW9kdWxlOjQ3OUEwNUM2N0Q0N0QxMTdDMkRDNUJERjVFMDBBRTcwCg== 478A05C67D47D117C2DC5BDF5E00AE70 479A05C67D47D117C2DC5BDF5E00AE70 +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 ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin; -gnbdu-function-model \N \N [] 2024-05-02 Z25kYnUtZnVuY3Rpb24tbW9kZWwgeWFuZyBtb2RlbCBmaWxlCg== -gnbcucp-gnbcuup-model \N \N [] 2024-05-02 Z25iY3VjcC1nbmJjdXVwLW1vZGVsIHlhbmcgbW9kZWwgZmlsZQo= -gnbcucp-gnbcuup-old-model \N \N [] 2024-05-02 Z25iY3VjcC1nbmJjdXVwLW1vZGVsIHlhbmcgbW9kZWwgZmlsZQo= -module-rapp-module \N \N [] 2024-05-01 dGVzdE1vZHVsZQo= +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"] [] {} \. -; \ No newline at end of file +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 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} +\. + +COMMIT; + diff --git a/teiv/src/test/resources/pgsqlschema/groups.sql b/teiv/src/test/resources/pgsqlschema/groups.sql new file mode 100644 index 0000000..29afcf5 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/groups.sql @@ -0,0 +1,83 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +COPY ties_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 +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655441000 test-static-group-for-delete static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440001 test-group-get-entities-by-type dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002 test-group-get-rels-for-entity-id dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003 test-group-get-rels-by-type dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440004 test-group-get-rels-for-non-existing-entity-id dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440005 test-group-get-entities-by-type-with-invalid-scope dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440100 test-group-get-entities-by-type-invalid-json dynamic +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 test-group-get-by-id-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440202 test-group-get-by-name-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440203 test-group-get-by-name-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391 test-group-empty-provided-members static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440371 test-group-invalid-topology-type static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440361 test-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351 test-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341 test-group-get-static-members static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211 test-group-merge-remove-provided-members-in-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440212 test-group-no-data-for-merge-in-static-group static +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440213 test-group-no-data-for-remove-in-static-group static +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 +\. + +COPY ties_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"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440002 {"queryType": "getRelationshipsForEntityId", "domain": "TEIV", "entityTypeName": "ODUFunction", "entityId": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440003 {"queryType": "getRelationshipsByType", "domain": "REL_OAM_RAN", "relationshipTypeName": "MANAGEDELEMENT_MANAGES_ODUFUNCTION"} +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"}} +\. + +COPY ties_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"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU {"urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=4E40BE000AFEA418CE1B9ED9E21D38DA51772175BD498BE825D9EA362F9B7393C36AB72F6FDEE702439143D578268A2E84719A9352C8EA70F847B7B7664E047C", "urn:o-ran:smo:teiv:sha512:ODUFUNCTION_PROVIDES_NRCELLDU=78ECC09D4832328976EF0F9C19699EE05D98E3837368D386AE39AD027543494AC620086BD2A7403DACFAA7B474B3DEBD313E0906F1EDE7FA2B584E16542A706A"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY {"urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65", "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DEDUMMYID"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 invalid-module:InvalidTopology {"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440201 invalid-module:InvalidTopology:InvalidString {"urn:3gpp:dn:providedMemberId"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440351 invalid-module:InvalidTopology {"urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440371 invalid-module:InvalidTopology:InvalidString {"urn:3gpp:dn:providedMemberIds1"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440391 o-ran-smo-teiv-ran:NRCellDU {} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341 o-ran-smo-teiv-ran:NRCellDU {"urn:3gpp:dn:providedMemberIds1", "urn:3gpp:dn:providedMemberIds2"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440341 o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULE_SERVES_ANTENNACAPABILITY {"urn:3gpp:dn:providedMemberIds3", "urn:3gpp:dn:providedMemberIds4"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440211 o-ran-smo-teiv-ran:NRCellDU {"urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=3", "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=4"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440214 o-ran-smo-teiv-ran:ODUFunction {"urn:3gpp:dn:ManagedElement=1,ODUFunction=1", "urn:3gpp:dn:ManagedElement=1,ODUFunction=2", "urn:3gpp:dn:ManagedElement=1,ODUFunction=3", "urn:3gpp:dn:ManagedElement=1,ODUFunction=4", "urn:3gpp:dn:ManagedElement=1,ODUFunction=5", "urn:3gpp:dn:ManagedElement=1,ODUFunction=6", "urn:3gpp:dn:ManagedElement=1,ODUFunction=7", "urn:3gpp:dn:ManagedElement=1,ODUFunction=8", "urn:3gpp:dn:ManagedElement=1,ODUFunction=9", "urn:3gpp:dn:ManagedElement=1,ODUFunction=10"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440215 o-ran-smo-teiv-ran:NRSectorCarrier {"urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=1", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=1", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=2", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=3", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=3", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=3"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440216 o-ran-smo-teiv-equipment:AntennaModule {"urn:3gpp:dn:ManagedElement=1,AntennaModule=1", "urn:3gpp:dn:ManagedElement=1,AntennaModule=2", "urn:3gpp:dn:ManagedElement=1,AntennaModule=2", "urn:3gpp:dn:ManagedElement=1,AntennaModule=2"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440216 o-ran-smo-teiv-ran:NRSectorCarrier {"urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=1", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=1", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=2", "urn:3gpp:dn:ManagedElement=1,NRSectorCarrier=3"} +urn:o-ran:smo:teiv:group=550e8400-e29b-41d4-a716-446655440216 o-ran-smo-teiv-ran:NRCellCU {"urn:3gpp:dn:ManagedElement=1,NRCellCU=1", "urn:3gpp:dn:ManagedElement=1,NRCellCU=1", "urn:3gpp:dn:ManagedElement=1,NRCellCU=2", "urn:3gpp:dn:ManagedElement=1,NRCellCU=3"} +\. + +COMMIT; diff --git a/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql new file mode 100644 index 0000000..950ee83 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql @@ -0,0 +1,527 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE TABLE IF NOT EXISTS ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; + +ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ALTER COLUMN "CD_classifiers" 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" ( + "id" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_used-nrCellDu" TEXT, + "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU" TEXT, + "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" jsonb, + "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" jsonb, + "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 ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD COLUMN IF NOT EXISTS "REL_metadata_780D8ABEAC14A0B2ET73FC4EB093C446F7CD3E56" jsonb; + +ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "metadata" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_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 ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ALTER COLUMN "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ( + "id" TEXT, + "antennaBeamWidth" jsonb, + "antennaModelNumber" TEXT, + "electricalAntennaTilt" INTEGER, + "geo-location" geography, + "mechanicalAntennaBearing" INTEGER, + "mechanicalAntennaTilt" INTEGER, + "positionWithinSector" TEXT, + "totalTilt" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY ties_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 ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."53089669D370B15C78B7E8376D434921D1C94240" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb +); + +ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD COLUMN IF NOT EXISTS "updated_time" TIMESTAMPTZ; + +ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD COLUMN IF NOT EXISTS "metadata" jsonb; + +ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."53089669D370B15C78B7E8376D434921D1C94240" ALTER COLUMN "CD_classifiers" 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" ( + "id" TEXT, + "eUtranFqBands" jsonb, + "geranFqBands" jsonb, + "nRFqBands" jsonb, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "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 ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "metadata" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."83C555BD948277E4A7C99698690BF800604C0603" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ( + "id" TEXT, + "020335B0F627C169E24167748C38FE756FB34AE2" INTEGER, + "nCI" BIGINT, + "nRPCI" INTEGER, + "nRTAC" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F" TEXT, + "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" jsonb, + "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" jsonb, + "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" jsonb +); + +ALTER TABLE ONLY ties_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 ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "REL_updated_time_FF2D6C2A0F47782B339C603874498CC8572F9D76" TIMESTAMPTZ; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD COLUMN IF NOT EXISTS "REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A" jsonb; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "metadata" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ALTER COLUMN "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" 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" ( + "id" TEXT, + "dUpLMNId" jsonb, + "gNBDUId" BIGINT, + "gNBId" BIGINT, + "gNBIdLength" INTEGER, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_provided-by-oduFunction" TEXT, + "REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F" TEXT, + "REL_FK_managed-by-managedElement" TEXT, + "REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B" TEXT, + "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" jsonb, + "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" jsonb, + "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 ties_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 ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_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 ties_data."9759D655D5978786B3284FE8057D912192AEB550" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ( + "id" TEXT, + "sectorCarrierType" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "REL_FK_used-antennaCapability" TEXT, + "REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64" TEXT, + "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" jsonb, + "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" jsonb, + "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" jsonb +); + +ALTER TABLE ONLY ties_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 ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "REL_updated_time_F322F0914F5B3B97073AE60B2ACC62C66CCE9B09" TIMESTAMPTZ; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD COLUMN IF NOT EXISTS "REL_metadata_F723867781098568079DD82E5D5E529374F97E98" jsonb; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "metadata" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ALTER COLUMN "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" 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" ( + "id" TEXT, + "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C" TEXT, + "bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC" TEXT, + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "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 ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]'; + +ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "CD_decorators" SET DEFAULT '{}'; + +ALTER TABLE ONLY ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ALTER COLUMN "metadata" SET DEFAULT '{}'; + +SELECT ties_data.create_constraint_if_not_exists( + '235E984E81B76ADCCFA68BDE09D3BBE49A355919', + 'PK_E38D71419D2D129A6834B4E3283938D44105C199', + 'ALTER TABLE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919" ADD CONSTRAINT "PK_E38D71419D2D129A6834B4E3283938D44105C199" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '28C9A375E800E82308EBE7DA2932EF2C0AF13C38', + 'PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62', + 'ALTER TABLE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '53017288F3FE983848689A3DD21D48D298CCD23E', + 'PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA', + 'ALTER TABLE ties_data."53017288F3FE983848689A3DD21D48D298CCD23E" ADD CONSTRAINT "PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '53089669D370B15C78B7E8376D434921D1C94240', + 'PK_054AA52D66B07A7CCFFE992ED59634B506322187', + 'ALTER TABLE ties_data."53089669D370B15C78B7E8376D434921D1C94240" ADD CONSTRAINT "PK_054AA52D66B07A7CCFFE992ED59634B506322187" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '83C555BD948277E4A7C99698690BF800604C0603', + 'PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF', + 'ALTER TABLE ties_data."83C555BD948277E4A7C99698690BF800604C0603" ADD CONSTRAINT "PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '84E676149362F50C55FE1E004B98D4891916BBF3', + 'PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5', + 'ALTER TABLE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + '9759D655D5978786B3284FE8057D912192AEB550', + 'PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65', + 'ALTER TABLE ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + 'C278F34A021D7A9AD13BE860608751874F21C00C', + 'PK_00966063B84AE30FE4B3DEF804C06532734473E9', + 'ALTER TABLE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "PK_00966063B84AE30FE4B3DEF804C06532734473E9" PRIMARY KEY ("id");' +); + +SELECT ties_data.create_constraint_if_not_exists( + 'CE18CE5B725879B4016F5C281D80D37A95EA7E28', + 'PK_4307C17B59528C77107E7C39986C0D18277F61FD', + 'ALTER TABLE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" ADD CONSTRAINT "PK_4307C17B59528C77107E7C39986C0D18277F61FD" PRIMARY KEY ("id");' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_data.create_constraint_if_not_exists( + '28C9A375E800E82308EBE7DA2932EF2C0AF13C38', + 'UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C', + 'ALTER TABLE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38" ADD CONSTRAINT "UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C" UNIQUE ("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU");' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_data.create_constraint_if_not_exists( + '84E676149362F50C55FE1E004B98D4891916BBF3', + 'UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3', + 'ALTER TABLE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3" ADD CONSTRAINT "UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3" UNIQUE ("REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F");' +); + +SELECT ties_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;' +); + +SELECT ties_data.create_constraint_if_not_exists( + '9759D655D5978786B3284FE8057D912192AEB550', + 'UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A', + 'ALTER TABLE ties_data."9759D655D5978786B3284FE8057D912192AEB550" ADD CONSTRAINT "UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");' +); + +SELECT ties_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;' +); + +SELECT ties_data.create_constraint_if_not_exists( + 'C278F34A021D7A9AD13BE860608751874F21C00C', + 'UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8', + 'ALTER TABLE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C" ADD CONSTRAINT "UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8" UNIQUE ("REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64");' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +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_65CAD728629B6E4501E261A44FA4551A3C29FF7E" ON ties_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_DF65ACAC403E061AF151ECC6E1A0B5251A57663A" ON ties_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_9B2B02F454ADC81B20DF50A78854FDDAE1E07781" ON ties_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_411D5CAD37663D02499EB24445A21693A234FFDE" ON ties_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_9375E42087BDE5DF649B8F30DA3DEE96D07C863C" ON ties_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_FF1E0F629EA6972551FCE6D99834A31FE5A7FB10" ON ties_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_629B2C2E73E2B5BF5BB31BB816EE0597484360CD" ON ties_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_0A8C3B8A6C6FC1C4C60C47C3996F65D200F2CDAC" ON ties_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_BC63EFD4857126FFC64E88F6136B85CA31E2A0EB" ON ties_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_337B9980AA0401C715A372CF8615E73F826B9DAE" ON ties_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_572A048D2B70E8CE7B919179CE285264951E6057" ON ties_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_941E47F8B0E1F353F356F09A7D4EED3670560681" ON ties_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_BF805D12F8B66196DC7513960E3872DCFCCCA31E" ON ties_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_6BEF4595F68DF48B662E68003C784CD6D944087B" ON ties_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_8F11B2E5857B19A3F9FB339F4DFB139751097100" ON ties_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_98DD6CE7BB866A4EA737CE96FF985936134D39C5" ON ties_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_FF9E656D3D0CB257F97FDDCB728E7637783C889B" ON ties_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_389F565ED970F5EB2FAC8A94766B2A60E5DEB022" ON ties_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_C65D145DDF1B1222AB4DFF08B0F504605F3E8468" ON ties_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_A3CD76C492D00CAAE49571191E3270D53FA818EE" ON ties_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_E61FF1756D360B904A01B032904F380F9D4A8650" ON ties_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_A2E437FF2DD6096051A873525763FD9EF7709350" ON ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28" USING GIN ("CD_decorators"); + +ANALYZE ties_data."CE18CE5B725879B4016F5C281D80D37A95EA7E28"; + +ANALYZE ties_data."9759D655D5978786B3284FE8057D912192AEB550"; + +ANALYZE ties_data."53089669D370B15C78B7E8376D434921D1C94240"; + +ANALYZE ties_data."84E676149362F50C55FE1E004B98D4891916BBF3"; + +ANALYZE ties_data."C278F34A021D7A9AD13BE860608751874F21C00C"; + +ANALYZE ties_data."28C9A375E800E82308EBE7DA2932EF2C0AF13C38"; + +ANALYZE ties_data."83C555BD948277E4A7C99698690BF800604C0603"; + +ANALYZE ties_data."235E984E81B76ADCCFA68BDE09D3BBE49A355919"; + +ANALYZE ties_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 new file mode 100644 index 0000000..c20e10b --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/ingestion-test-model.sql @@ -0,0 +1,149 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +COPY ties_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 +FK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_99559DB06CF1125A1EB4364780EB8B2A8A6C4BCA CONSTRAINT +FK_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_FK_used-nrCellDu FK_6CAC17243CDF76F4F070B2D097A169FBD41588AB CONSTRAINT +FK_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_managed-by-managedElement FK_059D7C49C9FF74C65CE378DB6DA019FE030027EB CONSTRAINT +FK_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_FK_used-antennaCapability FK_6292B05AE4EFCFFAE3343B626AA0E854181DC8E0 CONSTRAINT +FK_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_FK_provided-by-oduFunction FK_3B5DED591A6C8D4A14706E7E9B712BB23E4B01CF CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee FK_B44561B5980FFD16E1386AEA3192A2612C96D738 CONSTRAINT +FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy FK_5DD6B84381C61E614924591CA5F01C4169700280 CONSTRAINT +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers IDX_65CAD728629B6E4501E261A44FA4551A3C29FF7E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds IDX_A431A290E4A5C18874FE31117537BB03F86A4BE1 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers IDX_2B2F5C1C9635A1AF418B85A486601087C420E8F9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds IDX_629B2C2E73E2B5BF5BB31BB816EE0597484360CD INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_classifiers IDX_FF1E0F629EA6972551FCE6D99834A31FE5A7FB10 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_sourceIds IDX_822F9AB2F47067FDB88F9C322BC6A2B3B6C947B9 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_antennaBeamWidth IDX_9375E42087BDE5DF649B8F30DA3DEE96D07C863C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_classifiers IDX_FC784BD0FA3BEBD9F5C8333C558B7A0BE874E9B4 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_sourceIds IDX_DF65ACAC403E061AF151ECC6E1A0B5251A57663A INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_411D5CAD37663D02499EB24445A21693A234FFDE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_A784A72DDC0B6161C3C40CC809908B28CBA3586C INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_classifiers IDX_DD78610CF631FE9F7AEB4068C0A4D8A40234DB31 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_sourceIds IDX_337B9980AA0401C715A372CF8615E73F826B9DAE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_eUtranFqBands IDX_7DACD641D4ED26579A7D8F94C74447B19D067ECD INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_geranFqBands IDX_BC63EFD4857126FFC64E88F6136B85CA31E2A0EB INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_nRFqBands IDX_E754CEE6CB27BA7BE1ECB90F717B2C241381B00F INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_classifiers IDX_AA040BB82CC5AD00E57E39F729D6AB3DF6CCA9F8 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_sourceIds IDX_8F11B2E5857B19A3F9FB339F4DFB139751097100 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_FF9E656D3D0CB257F97FDDCB728E7637783C889B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_0648B3E68F701DC7FDC41A87DE0D79FB167AFB78 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_classifiers IDX_2888BA890DB44CD93287CAAF0695047CF39B736B INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_sourceIds IDX_389F565ED970F5EB2FAC8A94766B2A60E5DEB022 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_A3CD76C492D00CAAE49571191E3270D53FA818EE INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_839D67DA1D3875780CA8C2EC7DFD39C4F0A7D666 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_classifiers IDX_941E47F8B0E1F353F356F09A7D4EED3670560681 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_sourceIds IDX_5AEF72C5C2C83452A1BC8535E3EFF6E2AC9F4E02 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_8A9B70E4E83E34700456A8395E18BE2F7E793F20 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_BF805D12F8B66196DC7513960E3872DCFCCCA31E INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_CD_classifiers IDX_AF0E12037BDEE1B45F3F902B29E0823D713DBB06 INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_CD_sourceIds IDX_E61FF1756D360B904A01B032904F380F9D4A8650 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators IDX_B38A3DE6633390FD5D88720054D2659A52D9E5D9 INDEX +IDX_GIN_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators IDX_0A8C3B8A6C6FC1C4C60C47C3996F65D200F2CDAC INDEX +IDX_GIN_o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_decorators IDX_734E3F8FAD3A1B010D7E2095EA1357D4CEABD249 INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_decorators IDX_9B2B02F454ADC81B20DF50A78854FDDAE1E07781 INDEX +IDX_GIN_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_B0FFEC36366A5E403AADCA0B9DCEB13F511B226F INDEX +IDX_GIN_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_decorators IDX_572A048D2B70E8CE7B919179CE285264951E6057 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_decorators IDX_98DD6CE7BB866A4EA737CE96FF985936134D39C5 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN IDX_DED8DFAF8F597276CAA4680444C6A069A0570510 INDEX +IDX_GIN_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_dUpLMNId IDX_E1ACC551BE0D4D70B82C930C793C0C3751006444 INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_decorators IDX_C65D145DDF1B1222AB4DFF08B0F504605F3E8468 INDEX +IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY IDX_8D9A8B3F7A4B33D0D985B1F13D210F71277AACBC INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_decorators IDX_C6135512BCBC5F91EAD1D324759ADD1B88901FE9 INDEX +IDX_GIN_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU IDX_6BEF4595F68DF48B662E68003C784CD6D944087B INDEX +IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_CD_decorators IDX_A2E437FF2DD6096051A873525763FD9EF7709350 INDEX +PK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_E38D71419D2D129A6834B4E3283938D44105C199 CONSTRAINT +PK_o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_id PK_054AA52D66B07A7CCFFE992ED59634B506322187 CONSTRAINT +PK_o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_id PK_D70EE78F6AD699CEB48CB9531574C1979C2D8ADA CONSTRAINT +PK_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_id PK_F702AF3A5CAAC6B868FEBA4CE6464E2243E8FA62 CONSTRAINT +PK_o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_id PK_8D02617AC88C132BFCBC9D632334DCA8D415BAAF CONSTRAINT +PK_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_id PK_DC5BAFEC8AD0A864ADD4A21F6AEDE50F25D28F65 CONSTRAINT +PK_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_id PK_00966063B84AE30FE4B3DEF804C06532734473E9 CONSTRAINT +PK_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_id PK_444AE2C6A8809EBDD1B911623638A5F6558FC5B5 CONSTRAINT +PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_id PK_4307C17B59528C77107E7C39986C0D18277F61FD CONSTRAINT +REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052 COLUMN +REL_metadata_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A COLUMN +REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5 COLUMN +REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_metadata_F723867781098568079DD82E5D5E529374F97E98 COLUMN +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_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 +REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92 COLUMN +REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054 COLUMN +REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5 COLUMN +REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD COLUMN +REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4 COLUMN +REL_FK_used-nrCellDu REL_FK_used-nrCellDu COLUMN +REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F COLUMN +REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64 COLUMN +REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B COLUMN +REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU COLUMN +UNIQUE_o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU UNIQUE_734E3D6BB96CF74951FC24E93EDCC920A48F970C CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN UNIQUE_A105D998A021EF05E41D7EFCA7EFCFE4DEA9049A CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY UNIQUE_8BA54615B1C74692F55B5335A230309881FF9BF8 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU UNIQUE_15A52B744DF4DBB44E6CA285D0A05203897B7BE3 CONSTRAINT +aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C COLUMN +bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC COLUMN +bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E COLUMN +cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd 020335B0F627C169E24167748C38FE756FB34AE2 COLUMN +o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE 235E984E81B76ADCCFA68BDE09D3BBE49A355919 TABLE +o-ran-smo-teiv-equipment_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE 53089669D370B15C78B7E8376D434921D1C94240 TABLE +o-ran-smo-teiv-equipment_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 53017288F3FE983848689A3DD21D48D298CCD23E TABLE +o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt 28C9A375E800E82308EBE7DA2932EF2C0AF13C38 TABLE +o-ran-smo-teiv-ran_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 83C555BD948277E4A7C99698690BF800604C0603 TABLE +o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 9759D655D5978786B3284FE8057D912192AEB550 TABLE +o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr C278F34A021D7A9AD13BE860608751874F21C00C TABLE +o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 84E676149362F50C55FE1E004B98D4891916BBF3 TABLE +o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY CE18CE5B725879B4016F5C281D80D37A95EA7E28 TABLE +\. + +COPY ties_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 +o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran +o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran +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; +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 +ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU provided-nrCellDu ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran 1 1 provided-by-oduFunction NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran +LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY used-antennaCapability LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr o-ran-smo-teiv-ran +MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN managed-oduFunction ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam 1 1 managed-by-managedElement ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn o-ran-smo-teiv-rel-oam-ran +ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU used-nrCellDu ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-oam 1 1 used-by-managedElement NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-oam_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt o-ran-smo-teiv-rel-oam-ran +\. + +; + +COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/pgsqlschema/model.sql b/teiv/src/test/resources/pgsqlschema/model.sql index 335817f..b8def27 100644 --- a/teiv/src/test/resources/pgsqlschema/model.sql +++ b/teiv/src/test/resources/pgsqlschema/model.sql @@ -42,6 +42,9 @@ REL_CD_decorators_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHAN REL_CD_sourceIds_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C COLUMN REL_CD_sourceIds_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A COLUMN REL_CD_sourceIds_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B COLUMN +REL_metadata_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_3H23F80D423BF8F96A2906643B7B4712604FC45F COLUMN +REL_metadata_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_3B43F80D423BF8F96A2906643B7B4712604FC28B COLUMN +REL_metadata_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_metadata_F53C39EC1F710F3096BE0588F6783A03A378516A COLUMN REL_FK_grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5 COLUMN REL_FK_provided-by-entityTypeA REL_FK_provided-by-entityTypeA COLUMN REL_FK_used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA COLUMN @@ -72,12 +75,12 @@ 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== module-rapp-module \N \N [] 2024-05-01 dGVzdE1vZHVsZQo= -test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsNCiAgICB5YW5nLXZlcnNpb24gMS4xOw0KICAgIG5hbWVzcGFjZSAidGVzdC1idWlsdC1pbi1uYW1lc3BhY2UiOw0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQ0KDQogICAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IHR5cGVzM2dwcDsgfQ0KDQogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsNCiAgICAgICAgcHJlZml4IGdlbzsNCiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7DQogICAgfQ0KDQogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7DQogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7DQogICAgZGVzY3JpcHRpb24NCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOw0KDQogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsNCiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOw0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpkb21haW4gVEVTVDsNCg0KICAgIGxpc3QgRW50aXR5VHlwZUEgew0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgIH0NCg0KICAgIGxpc3QgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgew0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUExV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgew0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEyV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgew0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgew0KICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTRXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7DQogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNVdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsNCiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsNCiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgew0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjb250YWluZXIgYXR0cmlidXRlQTdXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7DQogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQV9VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgfQ0KDQogICAgICAgIGxlYWYgdXNlZC1ieS1lbnRpdHlUeXBlQSB7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfUFJPVklERVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLm4NCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQoNCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYgZ3JvdXBlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgfQ0KDQogICAgICAgIGxlYWYtbGlzdCBncm91cGVkLWJ5LWVudGl0eVR5cGVBIHsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQV9JTlNUQUxMRURfQVRfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi5uIHRvIDAuLm0NCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgfQ0KDQogICAgICAgIGxlYWYtbGlzdCBpbnN0YWxsZWQtZW50aXR5VHlwZUEgew0KICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgIH0NCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjENCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZiB1c2VkLWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQoNCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQogICAgfQ0KfQ== +test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA4LTIwIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc291cmNlSWRzLW9yLXRlaXYtdHlwZXMgewogICAgICAgICAgICB0eXBlIGxlYWZyZWYgewogICAgICAgICAgICAgICAgcGF0aCAiL29yLXRlaXYtdHlwZXM6c291cmNlSWRzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQSBsZWFmLWxpc3QgdGhhdCByZWZlcmVuY2VzIHRoZSBzb3VyY2VJZHMgZnJvbSBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNvdXJjZUlkcy1vci10ZWl2LXR5cGVzIHsKICAgICAgICAgICAgdHlwZSBsZWFmcmVmIHsKICAgICAgICAgICAgICAgIHBhdGggIi9vci10ZWl2LXR5cGVzOnNvdXJjZUlkcyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgbGVhZi1saXN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgc291cmNlSWRzIGZyb20gby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMtb3ItdGVpdi10eXBlcyB7CiAgICAgICAgICAgIHR5cGUgbGVhZnJlZiB7CiAgICAgICAgICAgICAgICBwYXRoICIvb3ItdGVpdi10eXBlczpzb3VyY2VJZHMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBIGxlYWYtbGlzdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHNvdXJjZUlkcyBmcm9tIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMtb3ItdGVpdi10eXBlcyB7CiAgICAgICAgICAgIHR5cGUgbGVhZnJlZiB7CiAgICAgICAgICAgICAgICBwYXRoICIvb3ItdGVpdi10eXBlczpzb3VyY2VJZHMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBIGxlYWYtbGlzdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHNvdXJjZUlkcyBmcm9tIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIjsKICAgICAgICB9CiAgICB9Cn0= \. -COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin; -test-built-in-module_EntityTypeA EntityTypeA test-built-in-module -test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module +COPY ties_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; 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 new file mode 100644 index 0000000..604f598 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/test-data-for-ingestion-validation.sql @@ -0,0 +1,157 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB" ( + "id" VARCHAR(511), + "aSide_TestEntityA" VARCHAR(511), + "bSide_TestEntityB" VARCHAR(511), + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB" ( + "id" VARCHAR(511), + "aSide_TestEntityA" VARCHAR(511), + "bSide_TestEntityB" VARCHAR(511), + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityA" ( + "id" VARCHAR(511), + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "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 '{}'; + +CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_TestEntityB" ( + "id" VARCHAR(511), + "CD_sourceIds" jsonb, + "CD_classifiers" jsonb, + "CD_decorators" jsonb, + "attribute1" TEXT, + "REL_FK_used-by-testEntityA" VARCHAR(511), + "REL_ID_TESTENTITYA_USES_TESTENTITYB" VARCHAR(511), + "REL_CD_sourceIds_TESTENTITYA_USES_TESTENTITYB" jsonb, + "REL_CD_classifiers_TESTENTITYA_USES_TESTENTITYB" jsonb, + "REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB" jsonb, + "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( + '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");' +); + +SELECT ties_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");' +); + +SELECT ties_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");' +); + +SELECT ties_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");' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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;' +); + +SELECT ties_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");' +); + +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 new file mode 100644 index 0000000..115d155 --- /dev/null +++ b/teiv/src/test/resources/pgsqlschema/test-model-for-ingestion-validation.sql @@ -0,0 +1,60 @@ +-- +-- ============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========================================================= +-- + +BEGIN; + +COPY ties_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 +FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB FK_TESTENTITYA_PROVIDES_TESTENTITYB_bSide_TestEntityB CONSTRAINT +o-ran-smo-teiv-ran_TestEntityA o-ran-smo-teiv-ran_TestEntityA TABLE +o-ran-smo-teiv-ran_TestEntityB o-ran-smo-teiv-ran_TestEntityB TABLE +attribute1 attribute1 COLUMN +FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA FK_TESTENTITYA_PROVIDES_TESTENTITYB_aSide_TestEntityA CONSTRAINT +REL_FK_used-by-testEntityA REL_FK_used-by-testEntityA COLUMN +PK_TestEntityB_id PK_TestEntityB_id CONSTRAINT +FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA FK_TESTENTITYA_GROUPS_TESTENTITYB_aSide_TestEntityA CONSTRAINT +aSide_TestEntityA aSide_TestEntityA COLUMN +REL_ID_TESTENTITYA_USES_TESTENTITYB REL_ID_TESTENTITYA_USES_TESTENTITYB COLUMN +o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB o-ran-smo-teiv-ran_TESTENTITYA_GROUPS_TESTENTITYB TABLE +o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB o-ran-smo-teiv-ran_TESTENTITYA_PROVIDES_TESTENTITYB TABLE +bSide_TestEntityB bSide_TestEntityB COLUMN +FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB FK_TESTENTITYA_GROUPS_TESTENTITYB_bSide_TestEntityB CONSTRAINT +PK_TestEntityA_id PK_TestEntityA_id CONSTRAINT +PK_TESTENTITYA_GROUPS_TESTENTITYB_id PK_TESTENTITYA_GROUPS_TESTENTITYB_id CONSTRAINT +REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB REL_CD_decorators_TESTENTITYA_USES_TESTENTITYB COLUMN +\. + +COPY ties_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; +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 +\. + +; + +COMMIT; \ No newline at end of file diff --git a/teiv/src/test/resources/yang/parser/bad-yang-file.yang b/teiv/src/test/resources/yang/parser/bad-yang-file.yang new file mode 100644 index 0000000..2f94a71 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/bad-yang-file.yang @@ -0,0 +1,63 @@ +module o-ran-smo-teiv-common-yang-types { + + yang-version 1.1; + namespace "urn:o-ran:smo-teiv-common-yang-types"; + prefix typeseritopinv; + + import o-ran-smo-teiv-common-yang-types {prefix or-teiv-types; } + + import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } + + organization "ORAN"; + contact "The Authors"; + description + "Topology and Inventory common types model + + Copyright (C) 2024 Ericsson + Modifications Copyright (C) 2024 OpenInfra Foundation Europe + + This model contains re-usable data types that topology and inventory models + will frequently use as part of types and relationships."; + + revision "2023-07-04" { + description "First draft."; + yexte:version "0"; + yexte:release "1"; + yexte:correction "0"; + } + + grouping Top_Grp_Type { + + description + "Grouping containing the key attribute common to all types. All types + MUST use this grouping."; + + leaf id { + type string; + description "Key leaf for the data type. Using types MAY restrict the + allowed values for keys. Represents the Entity Instance Identifier + (EIID) used to uniquely identify network entities in Topology."; + } + } + + grouping CM_ID { + + description + "Grouping containing the key attributes to make + use of Configuration Management (CM)."; + + leaf cmHandle { + type string; + description "Unique identifier for network entities in CM."; + } + + leaf resourceIdentifier { + type string; + description "The xpath expression identifying the resource in the Node model yang tree."; + } + } + + typedef _3GPP_FDN_Type { + type types3gpp:DistinguishedName; + } +} \ No newline at end of file diff --git a/teiv/src/test/resources/yang/parser/entity-in-wrong-ns.json b/teiv/src/test/resources/yang/parser/entity-in-wrong-ns.json new file mode 100644 index 0000000..fa490d2 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/entity-in-wrong-ns.json @@ -0,0 +1,15 @@ +{ + "o-ran-smo-teiv-cloud:GNBCUCPFunction": [ + { + "id": "gNBCUCPName_1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "gNBCUName": "str", + "gNBId": 12 + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/geolocation.json b/teiv/src/test/resources/yang/parser/geolocation.json new file mode 100644 index 0000000..0322a60 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/geolocation.json @@ -0,0 +1,33 @@ +{ + "o-ran-smo-teiv-equipment:AntennaModule": [ + { + "id": "id1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "positionWithinSector": "6", + "geo-location": { + "latitude": 12.78232, + "longitude": 56.7455 + } + } + }, + { + "id": "id2", + "sourceIds": [ + "source2", + "source3" + ], + "attributes": { + "positionWithinSector": "7", + "geo-location": { + "latitude": 22.78232, + "longitude": 66.7455, + "height": 123.1234 + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/missing-key.json b/teiv/src/test/resources/yang/parser/missing-key.json new file mode 100644 index 0000000..d83e2eb --- /dev/null +++ b/teiv/src/test/resources/yang/parser/missing-key.json @@ -0,0 +1,14 @@ +{ + "o-ran-smo-teiv-ran:GNBCUCPFunction": [ + { + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "gNBCUName": "str", + "gNBId": 12 + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/multiple-entity.json b/teiv/src/test/resources/yang/parser/multiple-entity.json new file mode 100644 index 0000000..f2dce35 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/multiple-entity.json @@ -0,0 +1,47 @@ +{ + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "ocucp_1", + "sourceIds": [ + "fdn_ocucp_1", + "cmHandle_ocucp_1" + ], + "attributes": { + "gNBCUName": "str", + "gNBId": 12 + } + } + ], + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "odu_21", + "sourceIds": [ + "fdn_odu_21", + "cmHandle_odu_21" + ], + "attributes": { + "gNBDUId": 1, + "gNBId": 21, + "dUpLMNId": { + "mcc": "210", + "mnc": "021" + } + } + }, + { + "id": "odu_22", + "sourceIds": [ + "fdn_odu_22", + "cmHandle_odu_22" + ], + "attributes": { + "gNBDUId": 2, + "gNBId": 22, + "dUpLMNId": { + "mcc": "220", + "mnc": "022" + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/not-existing-entity.json b/teiv/src/test/resources/yang/parser/not-existing-entity.json new file mode 100644 index 0000000..4c28130 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/not-existing-entity.json @@ -0,0 +1,18 @@ +{ + "o-ran-smo-teiv-cloud:NotExistingEntity": [ + { + "id": "id1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "name": "entityName1", + "cmId": { + "cmHandle": "047683E080CCF0FD2015987A74028473", + "resourceIdentifier": "/nm-ComTop:Entity[@id=id00001]" + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/source-ids-without-list.json b/teiv/src/test/resources/yang/parser/source-ids-without-list.json new file mode 100644 index 0000000..8fcd045 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/source-ids-without-list.json @@ -0,0 +1,16 @@ +{ + "o-ran-smo-teiv-ran:ODUFunction": [ + { + "id": "odu_21", + "sourceIds": "fdn_odu_21", + "attributes": { + "gNBDUId": 1, + "gNBId": 21, + "dUpLMNId": { + "mcc": "210", + "mnc": "021" + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-attributes.json b/teiv/src/test/resources/yang/parser/wrong-attributes.json new file mode 100644 index 0000000..47d60a0 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-attributes.json @@ -0,0 +1,16 @@ +{ + "o-ran-smo-teiv-ran:OCUCPFunction": [ + { + "id": "OCUCPName_1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "gNBCUName": "str", + "gNBId": 12, + "unknownField": 34 + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-entity-name.json b/teiv/src/test/resources/yang/parser/wrong-entity-name.json new file mode 100644 index 0000000..8e66a75 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-entity-name.json @@ -0,0 +1,15 @@ +{ + "o-ran-smo-teiv-ran:GGNBDUFunction": [ + { + "id": "gNBDUId_1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "gNBDUId": 1, + "gNBId": 21 + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-namespace.json b/teiv/src/test/resources/yang/parser/wrong-namespace.json new file mode 100644 index 0000000..deacace --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-namespace.json @@ -0,0 +1,15 @@ +{ + "o-ran-smo-teiv-ran-cloud:GNBCUCPFunction": [ + { + "id": "gNBCUCPName_1", + "sourceIds": [ + "source1", + "source2" + ], + "attributes": { + "gNBCUName": "str", + "gNBId": 12 + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-source-ids-list-with-one-long.json b/teiv/src/test/resources/yang/parser/wrong-source-ids-list-with-one-long.json new file mode 100644 index 0000000..bc338ef --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-source-ids-list-with-one-long.json @@ -0,0 +1,18 @@ +{ + "o-ran-smo-teiv-ran:GNBDUFunction": [ + { + "id": "gnbdu_21", + "sourceIds": [ + 2 + ], + "attributes": { + "gNBDUId": 1, + "gNBId": 21, + "dUpLMNId": { + "mcc": "210", + "mnc": "021" + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-source-ids-list.json b/teiv/src/test/resources/yang/parser/wrong-source-ids-list.json new file mode 100644 index 0000000..fc5ec75 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-source-ids-list.json @@ -0,0 +1,20 @@ +{ + "o-ran-smo-teiv-ran:GNBDUFunction": [ + { + "id": "gnbdu_21", + "sourceIds": [ + "fdn_gnbdu_21", + "cmHandle_gnbdu_21", + false + ], + "attributes": { + "gNBDUId": 1, + "gNBId": 21, + "dUpLMNId": { + "mcc": "210", + "mnc": "021" + } + } + } + ] +} diff --git a/teiv/src/test/resources/yang/parser/wrong-source-ids-long-without-list.json b/teiv/src/test/resources/yang/parser/wrong-source-ids-long-without-list.json new file mode 100644 index 0000000..a829405 --- /dev/null +++ b/teiv/src/test/resources/yang/parser/wrong-source-ids-long-without-list.json @@ -0,0 +1,16 @@ +{ + "o-ran-smo-teiv-ran:GNBDUFunction": [ + { + "id": "gnbdu_21", + "sourceIds": 2, + "attributes": { + "gNBDUId": 1, + "gNBId": 21, + "dUpLMNId": { + "mcc": "210", + "mnc": "021" + } + } + } + ] +} diff --git a/yang-parser/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java b/yang-parser/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java index 13084e0..4302475 100644 --- a/yang-parser/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java +++ b/yang-parser/src/main/java/org/oran/smo/yangtools/parser/data/instance/AbstractStructureInstance.java @@ -21,13 +21,17 @@ package org.oran.smo.yangtools.parser.data.instance; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import org.oran.smo.yangtools.parser.data.dom.YangDataDomNode; import org.oran.smo.yangtools.parser.model.statements.AbstractStatement; +import org.oran.smo.yangtools.parser.util.NamespaceModuleIdentifier; /** * This class represents a structural element, which can be either a true (singleton) @@ -48,6 +52,8 @@ public abstract class AbstractStructureInstance extends AbstractDataInstance { */ private final List contentChildren = new ArrayList<>(); + private Set emptyChildLeafListIdentifiers; + /** * Constructor for a structure instance that was specified in data. */ @@ -79,6 +85,24 @@ public abstract class AbstractStructureInstance extends AbstractDataInstance { return contentChildren; } + public void setEmptyChildLeafListIdentifiers(final Set val) { + this.emptyChildLeafListIdentifiers = val; + } + + public void addEmptyChildLeafListIdentifiers(final Set toAdd) { + if (toAdd.isEmpty()) { + return; + } + if (emptyChildLeafListIdentifiers == null) { + emptyChildLeafListIdentifiers = new HashSet<>(); + } + emptyChildLeafListIdentifiers.addAll(toAdd); + } + + public Set getEmptyChildLeafListIdentifiers() { + return emptyChildLeafListIdentifiers == null ? Collections.emptySet() : emptyChildLeafListIdentifiers; + } + /** * Returns the container instance of the given namespace and name. May return null if not found. */ -- 2.16.6