From 5bddaab484adbde863c6629cf5d684abd1ce2da0 Mon Sep 17 00:00:00 2001 From: leventecsanyi Date: Wed, 15 Jan 2025 11:57:28 +0100 Subject: [PATCH] Moved impl package out from api package - refactored cps service packages and the architecture test Issue-ID: CPS-2543 Change-Id: I0fab54cebd157b19ff6105b7d4b6d8265a1af485 Signed-off-by: leventecsanyi --- .../onap/cps/architecture/CpsArchitectureTest.java | 6 +- .../cps/{api => }/impl/CpsAnchorServiceImpl.java | 2 +- .../cps/{api => }/impl/CpsDataServiceImpl.java | 2 +- .../{api => }/impl/CpsDataspaceServiceImpl.java | 2 +- .../cps/{api => }/impl/CpsDeltaServiceImpl.java | 2 +- .../cps/{api => }/impl/CpsModuleServiceImpl.java | 2 +- .../cps/{api => }/impl/CpsQueryServiceImpl.java | 2 +- .../impl/YangTextSchemaSourceSetCache.java | 2 +- .../java/org/onap/cps/utils/PrefixResolver.java | 2 +- .../main/java/org/onap/cps/utils/YangParser.java | 2 +- .../{api => }/impl/CpsAnchorServiceImplSpec.groovy | 3 +- .../{api => }/impl/CpsDataServiceImplSpec.groovy | 2 +- .../impl/CpsDataspaceServiceImplSpec.groovy | 3 +- .../{api => }/impl/CpsDeltaServiceImplSpec.groovy | 2 +- .../{api => }/impl/CpsModuleServiceImplSpec.groovy | 2 +- .../{api => }/impl/CpsQueryServiceImplSpec.groovy | 3 +- .../cps/{api => }/impl/E2ENetworkSliceSpec.groovy | 352 ++++++++++----------- .../impl/YangTextSchemaSourceSetCacheSpec.groovy | 2 +- .../org/onap/cps/utils/PrefixResolverSpec.groovy | 2 +- .../org/onap/cps/utils/YangParserSpec.groovy | 2 +- docs/api/swagger/ncmp/openapi.yaml | 50 ++- 21 files changed, 219 insertions(+), 228 deletions(-) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsAnchorServiceImpl.java (99%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsDataServiceImpl.java (99%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsDataspaceServiceImpl.java (98%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsDeltaServiceImpl.java (99%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsModuleServiceImpl.java (99%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/CpsQueryServiceImpl.java (99%) rename cps-service/src/main/java/org/onap/cps/{api => }/impl/YangTextSchemaSourceSetCache.java (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsAnchorServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsDataServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsDataspaceServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsDeltaServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsModuleServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/CpsQueryServiceImplSpec.groovy (99%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/E2ENetworkSliceSpec.groovy (98%) rename cps-service/src/test/groovy/org/onap/cps/{api => }/impl/YangTextSchemaSourceSetCacheSpec.groovy (99%) diff --git a/cps-application/src/test/java/org/onap/cps/architecture/CpsArchitectureTest.java b/cps-application/src/test/java/org/onap/cps/architecture/CpsArchitectureTest.java index e68343b364..06ca632f36 100644 --- a/cps-application/src/test/java/org/onap/cps/architecture/CpsArchitectureTest.java +++ b/cps-application/src/test/java/org/onap/cps/architecture/CpsArchitectureTest.java @@ -43,11 +43,9 @@ public class CpsArchitectureTest extends ArchitectureTestBase { @ArchTest static final ArchRule cpsServiceImplShouldDependOnServiceAndEventsAndPathParserPackages = - // I think impl package should be moved from the api package. - // So in a way this whole rule is breaking our architecture goals - classes().that().resideInAPackage("org.onap.cps.api.impl..").should().onlyDependOnClassesThat() + classes().that().resideInAPackage("org.onap.cps.impl..").should().onlyDependOnClassesThat() .resideInAnyPackage(commonAndListedPackages("org.onap.cps.api..", - "org.onap.cps.api.impl..", + "org.onap.cps.impl..", "org.onap.cps.events..", "org.onap.cps.impl.utils..", "org.onap.cps.spi..", diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsAnchorServiceImpl.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsAnchorServiceImpl.java index 2a2ddc6c11..fb22311128 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsAnchorServiceImpl.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import java.util.Collection; import lombok.RequiredArgsConstructor; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsDataServiceImpl.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsDataServiceImpl.java index 3b5baf5e68..f2513173a6 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsDataServiceImpl.java @@ -22,7 +22,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import io.micrometer.core.annotation.Timed; import java.io.Serializable; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsDataspaceServiceImpl.java similarity index 98% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsDataspaceServiceImpl.java index af48f202bb..15caa2276d 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsDataspaceServiceImpl.java @@ -21,7 +21,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import java.util.Collection; import lombok.RequiredArgsConstructor; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsDeltaServiceImpl.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsDeltaServiceImpl.java index a515b5d65a..7a9d142506 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsDeltaServiceImpl.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import java.io.Serializable; import java.util.ArrayList; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsModuleServiceImpl.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsModuleServiceImpl.java index 6740262bcc..7622ba5fe2 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsModuleServiceImpl.java @@ -21,7 +21,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import io.micrometer.core.annotation.Timed; import java.util.Collection; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsQueryServiceImpl.java b/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/CpsQueryServiceImpl.java rename to cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java index 1d6f0c3ab6..e534e0aea1 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsQueryServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import io.micrometer.core.annotation.Timed; import java.util.Collection; diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/YangTextSchemaSourceSetCache.java b/cps-service/src/main/java/org/onap/cps/impl/YangTextSchemaSourceSetCache.java similarity index 99% rename from cps-service/src/main/java/org/onap/cps/api/impl/YangTextSchemaSourceSetCache.java rename to cps-service/src/main/java/org/onap/cps/impl/YangTextSchemaSourceSetCache.java index b893bcea09..688669c941 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/YangTextSchemaSourceSetCache.java +++ b/cps-service/src/main/java/org/onap/cps/impl/YangTextSchemaSourceSetCache.java @@ -20,7 +20,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl; +package org.onap.cps.impl; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.micrometer.core.instrument.Metrics; diff --git a/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java b/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java index 646ed556f5..bd348a25d1 100644 --- a/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java +++ b/cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java @@ -21,11 +21,11 @@ package org.onap.cps.utils; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.impl.YangTextSchemaSourceSetCache; import org.onap.cps.api.model.Anchor; import org.onap.cps.cpspath.parser.CpsPathPrefixType; import org.onap.cps.cpspath.parser.CpsPathQuery; import org.onap.cps.cpspath.parser.CpsPathUtil; +import org.onap.cps.impl.YangTextSchemaSourceSetCache; import org.onap.cps.yang.YangTextSchemaSourceSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; diff --git a/cps-service/src/main/java/org/onap/cps/utils/YangParser.java b/cps-service/src/main/java/org/onap/cps/utils/YangParser.java index 7fa10a134a..08f450e2f1 100644 --- a/cps-service/src/main/java/org/onap/cps/utils/YangParser.java +++ b/cps-service/src/main/java/org/onap/cps/utils/YangParser.java @@ -29,8 +29,8 @@ import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.exceptions.DataValidationException; -import org.onap.cps.api.impl.YangTextSchemaSourceSetCache; import org.onap.cps.api.model.Anchor; +import org.onap.cps.impl.YangTextSchemaSourceSetCache; import org.onap.cps.yang.TimedYangTextSchemaSourceSetBuilder; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsAnchorServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsAnchorServiceImplSpec.groovy index 223ae71987..22f5c9f83e 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsAnchorServiceImplSpec.groovy @@ -18,7 +18,8 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl + import org.onap.cps.impl.utils.CpsValidator import org.onap.cps.spi.CpsAdminPersistenceService diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDataServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsDataServiceImplSpec.groovy index ff44cb20a2..3ea859ae6d 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDataServiceImplSpec.groovy @@ -21,7 +21,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl import ch.qos.logback.classic.Level import ch.qos.logback.classic.Logger diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDataspaceServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsDataspaceServiceImplSpec.groovy index ae68929c42..468fe76d41 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDataspaceServiceImplSpec.groovy @@ -18,7 +18,8 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl + import org.onap.cps.impl.utils.CpsValidator import org.onap.cps.spi.CpsAdminPersistenceService diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDeltaServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsDeltaServiceImplSpec.groovy index 65dac62710..d3dfcf8826 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsDeltaServiceImplSpec.groovy @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl import org.onap.cps.api.model.DataNode import spock.lang.Specification diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsModuleServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsModuleServiceImplSpec.groovy index d1101fc248..ce871621e5 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsModuleServiceImplSpec.groovy @@ -21,7 +21,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl import org.onap.cps.TestUtils import org.onap.cps.api.CpsAnchorService diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy index 7d2932570e..80db83b27a 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy @@ -19,7 +19,8 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl + import org.onap.cps.impl.utils.CpsValidator import org.onap.cps.spi.CpsDataPersistenceService diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/E2ENetworkSliceSpec.groovy similarity index 98% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/E2ENetworkSliceSpec.groovy index f2fed7c899..4ab71f7228 100755 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/E2ENetworkSliceSpec.groovy @@ -1,176 +1,176 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation. - * Modifications Copyright (C) 2021-2022 Bell Canada. - * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2022-2024 TechMahindra Ltd. - * ================================================================================ - * 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.onap.cps.api.impl - -import com.fasterxml.jackson.databind.ObjectMapper -import org.onap.cps.TestUtils -import org.onap.cps.api.CpsAnchorService -import org.onap.cps.api.CpsDeltaService -import org.onap.cps.events.CpsDataUpdateEventsService -import org.onap.cps.impl.utils.CpsValidator -import org.onap.cps.spi.CpsDataPersistenceService -import org.onap.cps.spi.CpsModulePersistenceService -import org.onap.cps.api.model.Anchor -import org.onap.cps.utils.ContentType -import org.onap.cps.utils.JsonObjectMapper -import org.onap.cps.utils.PrefixResolver -import org.onap.cps.utils.YangParser -import org.onap.cps.utils.YangParserHelper -import org.onap.cps.yang.TimedYangTextSchemaSourceSetBuilder -import org.onap.cps.yang.YangTextSchemaSourceSetBuilder -import spock.lang.Specification - -class E2ENetworkSliceSpec extends Specification { - def mockModuleStoreService = Mock(CpsModulePersistenceService) - def mockDataStoreService = Mock(CpsDataPersistenceService) - def mockCpsAnchorService = Mock(CpsAnchorService) - def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) - def mockCpsValidator = Mock(CpsValidator) - def timedYangTextSchemaSourceSetBuilder = new TimedYangTextSchemaSourceSetBuilder() - def yangParser = new YangParser(new YangParserHelper(), mockYangTextSchemaSourceSetCache, timedYangTextSchemaSourceSetBuilder) - def mockCpsDeltaService = Mock(CpsDeltaService) - def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) - def mockPrefixResolver = Mock(PrefixResolver) - - def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService, - mockYangTextSchemaSourceSetCache, mockCpsAnchorService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) - - def mockDataUpdateEventsService = Mock(CpsDataUpdateEventsService) - def cpsDataServiceImpl = new CpsDataServiceImpl(mockDataStoreService, mockDataUpdateEventsService, mockCpsAnchorService, mockCpsValidator, - yangParser, mockCpsDeltaService, jsonObjectMapper, mockPrefixResolver) - def dataspaceName = 'someDataspace' - def anchorName = 'someAnchor' - def schemaSetName = 'someSchemaSet' - def noTimestamp = null - - def 'E2E model can be parsed by CPS.'() { - given: 'Valid yang resource as name-to-content map' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( - 'ietf/ietf-inet-types@2013-07-15.yang', - 'ietf/ietf-yang-types@2013-07-15.yang', - 'e2e/basic/ran-network2020-08-06.yang' - ) - when: 'Create schema set method is invoked' - cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) - then: 'Parameters are validated and processing is delegated to persistence service' - 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) - } - - def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() { - given: 'Valid yang resource as name-to-content map' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( - 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') - when: 'Create schema set method is invoked' - cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) - then: 'Parameters are validated and processing is delegated to persistence service' - 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) - } - - def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() { - given: 'Valid yang resource as name-to-content map' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( - 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') - def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() - def dataNodeStored - and : 'a valid json is provided for the model' - def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt') - and : 'all the further dependencies are mocked ' - mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >> - new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).dataspaceName(dataspaceName).build() - mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >> - YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) - mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext - when: 'saveData method is invoked' - cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp) - then: 'Parameters are validated and processing is delegated to persistence service' - 1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >> - { args -> dataNodeStored = args[2]} - def child = dataNodeStored[0].childDataNodes[0] - assert child.childDataNodes.size() == 1 - and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes ' - def listOfTAForCoverageArea = child.childDataNodes[0] - listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + - 'coverage-area[@coverageArea=\'Washington\']' - listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234 - and: 'list of cells in a tracking area are stored with correct xpath and child nodes ' - def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0] - listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + - 'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']' - listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709 - } - - def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() { - def dataNodeStored - given: 'valid yang resource as name-to-content map' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( - 'e2e/basic/cps-ran-inventory@2021-01-28.yang') - def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() - and : 'a valid json is provided for the model' - def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json') - and : 'all the further dependencies are mocked ' - mockCpsAnchorService.getAnchor('someDataspace', 'someAnchor') >> - new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').dataspaceName(dataspaceName).build() - mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) - mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext - when: 'saveData method is invoked' - cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp) - then: 'parameters are validated and processing is delegated to persistence service' - 1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >> - { args -> dataNodeStored = args[2]} - and: 'the size of the tree is correct' - def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored[0]) - assert cpsRanInventory.size() == 4 - and: 'ran-inventory contains the correct child node' - def ranInventory = cpsRanInventory.get('/ran-inventory') - def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']') - def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']') - def pLMNIdList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']') - ranInventory.getChildDataNodes().size() == 1 - ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath}) - and: 'ranSlices contains the correct child node' - ranSlices.getChildDataNodes().size() == 1 - ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath}) - and: 'sliceProfilesList contains the correct child node' - sliceProfilesList.getChildDataNodes().size() == 1 - sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath}) - and: 'pLMNIdList contains no children' - pLMNIdList.getChildDataNodes().size() == 0 - - } - - def 'E2E RAN Schema Model.'(){ - given: 'yang resources' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( - 'ietf/ietf-inet-types@2013-07-15.yang', - 'ietf/ietf-yang-types@2013-07-15.yang', - 'e2e/basic/cps-ran-schema-model@2021-05-19.yang' - ) - and : 'json data' - def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json') - expect: 'schema context is built with no exception indicating the schema set being valid ' - def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() - and: 'data is parsed with no exception indicating the model match' - new YangParserHelper().parseData(ContentType.JSON, jsonData, schemaContext, '', false) != null - } -} +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021-2024 Nordix Foundation. + * Modifications Copyright (C) 2021-2022 Bell Canada. + * Modifications Copyright (C) 2021 Pantheon.tech + * Modifications Copyright (C) 2022-2024 TechMahindra Ltd. + * ================================================================================ + * 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.onap.cps.impl + +import com.fasterxml.jackson.databind.ObjectMapper +import org.onap.cps.TestUtils +import org.onap.cps.api.CpsAnchorService +import org.onap.cps.api.CpsDeltaService +import org.onap.cps.events.CpsDataUpdateEventsService +import org.onap.cps.impl.utils.CpsValidator +import org.onap.cps.spi.CpsDataPersistenceService +import org.onap.cps.spi.CpsModulePersistenceService +import org.onap.cps.api.model.Anchor +import org.onap.cps.utils.ContentType +import org.onap.cps.utils.JsonObjectMapper +import org.onap.cps.utils.PrefixResolver +import org.onap.cps.utils.YangParser +import org.onap.cps.utils.YangParserHelper +import org.onap.cps.yang.TimedYangTextSchemaSourceSetBuilder +import org.onap.cps.yang.YangTextSchemaSourceSetBuilder +import spock.lang.Specification + +class E2ENetworkSliceSpec extends Specification { + def mockModuleStoreService = Mock(CpsModulePersistenceService) + def mockDataStoreService = Mock(CpsDataPersistenceService) + def mockCpsAnchorService = Mock(CpsAnchorService) + def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) + def mockCpsValidator = Mock(CpsValidator) + def timedYangTextSchemaSourceSetBuilder = new TimedYangTextSchemaSourceSetBuilder() + def yangParser = new YangParser(new YangParserHelper(), mockYangTextSchemaSourceSetCache, timedYangTextSchemaSourceSetBuilder) + def mockCpsDeltaService = Mock(CpsDeltaService) + def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) + def mockPrefixResolver = Mock(PrefixResolver) + + def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService, + mockYangTextSchemaSourceSetCache, mockCpsAnchorService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder) + + def mockDataUpdateEventsService = Mock(CpsDataUpdateEventsService) + def cpsDataServiceImpl = new CpsDataServiceImpl(mockDataStoreService, mockDataUpdateEventsService, mockCpsAnchorService, mockCpsValidator, + yangParser, mockCpsDeltaService, jsonObjectMapper, mockPrefixResolver) + def dataspaceName = 'someDataspace' + def anchorName = 'someAnchor' + def schemaSetName = 'someSchemaSet' + def noTimestamp = null + + def 'E2E model can be parsed by CPS.'() { + given: 'Valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'ietf/ietf-inet-types@2013-07-15.yang', + 'ietf/ietf-yang-types@2013-07-15.yang', + 'e2e/basic/ran-network2020-08-06.yang' + ) + when: 'Create schema set method is invoked' + cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + then: 'Parameters are validated and processing is delegated to persistence service' + 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() { + given: 'Valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') + when: 'Create schema set method is invoked' + cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + then: 'Parameters are validated and processing is delegated to persistence service' + 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() { + given: 'Valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + def dataNodeStored + and : 'a valid json is provided for the model' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt') + and : 'all the further dependencies are mocked ' + mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >> + new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).dataspaceName(dataspaceName).build() + mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >> + YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) + mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext + when: 'saveData method is invoked' + cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp) + then: 'Parameters are validated and processing is delegated to persistence service' + 1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >> + { args -> dataNodeStored = args[2]} + def child = dataNodeStored[0].childDataNodes[0] + assert child.childDataNodes.size() == 1 + and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes ' + def listOfTAForCoverageArea = child.childDataNodes[0] + listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + + 'coverage-area[@coverageArea=\'Washington\']' + listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234 + and: 'list of cells in a tracking area are stored with correct xpath and child nodes ' + def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0] + listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + + 'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']' + listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709 + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() { + def dataNodeStored + given: 'valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-ran-inventory@2021-01-28.yang') + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + and : 'a valid json is provided for the model' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json') + and : 'all the further dependencies are mocked ' + mockCpsAnchorService.getAnchor('someDataspace', 'someAnchor') >> + new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').dataspaceName(dataspaceName).build() + mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) + mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext + when: 'saveData method is invoked' + cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp) + then: 'parameters are validated and processing is delegated to persistence service' + 1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >> + { args -> dataNodeStored = args[2]} + and: 'the size of the tree is correct' + def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored[0]) + assert cpsRanInventory.size() == 4 + and: 'ran-inventory contains the correct child node' + def ranInventory = cpsRanInventory.get('/ran-inventory') + def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']') + def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']') + def pLMNIdList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']') + ranInventory.getChildDataNodes().size() == 1 + ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath}) + and: 'ranSlices contains the correct child node' + ranSlices.getChildDataNodes().size() == 1 + ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath}) + and: 'sliceProfilesList contains the correct child node' + sliceProfilesList.getChildDataNodes().size() == 1 + sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath}) + and: 'pLMNIdList contains no children' + pLMNIdList.getChildDataNodes().size() == 0 + + } + + def 'E2E RAN Schema Model.'(){ + given: 'yang resources' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'ietf/ietf-inet-types@2013-07-15.yang', + 'ietf/ietf-yang-types@2013-07-15.yang', + 'e2e/basic/cps-ran-schema-model@2021-05-19.yang' + ) + and : 'json data' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json') + expect: 'schema context is built with no exception indicating the schema set being valid ' + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + and: 'data is parsed with no exception indicating the model match' + new YangParserHelper().parseData(ContentType.JSON, jsonData, schemaContext, '', false) != null + } +} diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/YangTextSchemaSourceSetCacheSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/impl/YangTextSchemaSourceSetCacheSpec.groovy similarity index 99% rename from cps-service/src/test/groovy/org/onap/cps/api/impl/YangTextSchemaSourceSetCacheSpec.groovy rename to cps-service/src/test/groovy/org/onap/cps/impl/YangTextSchemaSourceSetCacheSpec.groovy index 5b9d11f439..fe49d04f3c 100644 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/YangTextSchemaSourceSetCacheSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/impl/YangTextSchemaSourceSetCacheSpec.groovy @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= */ -package org.onap.cps.api.impl +package org.onap.cps.impl import org.onap.cps.TestUtils import org.onap.cps.impl.utils.CpsValidator diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy index f80678f7d3..3198e54092 100644 --- a/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy @@ -23,7 +23,7 @@ package org.onap.cps.utils import org.onap.cps.TestUtils -import org.onap.cps.api.impl.YangTextSchemaSourceSetCache +import org.onap.cps.impl.YangTextSchemaSourceSetCache import org.onap.cps.api.model.Anchor import org.onap.cps.yang.YangTextSchemaSourceSet import org.onap.cps.yang.YangTextSchemaSourceSetBuilder diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/YangParserSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/YangParserSpec.groovy index 62c681eb07..a2fadb7e9f 100644 --- a/cps-service/src/test/groovy/org/onap/cps/utils/YangParserSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/utils/YangParserSpec.groovy @@ -29,7 +29,7 @@ import org.onap.cps.yang.YangTextSchemaSourceSet import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode import org.opendaylight.yangtools.yang.model.api.SchemaContext import spock.lang.Specification -import org.onap.cps.api.impl.YangTextSchemaSourceSetCache +import org.onap.cps.impl.YangTextSchemaSourceSetCache class YangParserSpec extends Specification { diff --git a/docs/api/swagger/ncmp/openapi.yaml b/docs/api/swagger/ncmp/openapi.yaml index 4e369f5dce..692266183b 100644 --- a/docs/api/swagger/ncmp/openapi.yaml +++ b/docs/api/swagger/ncmp/openapi.yaml @@ -38,7 +38,7 @@ paths: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -155,7 +155,7 @@ paths: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -299,7 +299,7 @@ paths: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -419,7 +419,7 @@ paths: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -544,7 +544,7 @@ paths: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -1542,7 +1542,7 @@ components: examples: sample 1: value: - resourceIdentifier: "\GNBDUFunction" + resourceIdentifier: \GNBDUFunction sample 2: value: resourceIdentifier: "\\GNBDUFunction[@gNBId='1001']" @@ -1872,19 +1872,13 @@ components: RestModuleDefinition: example: moduleName: my-module-name - content: | - module _3gpp-nr-nrm-gnbdufunction { - yang-version 1.1; - namespace 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction'; - prefix gnbdu3gpp; - revision '2020-09-15' { - description - 'Defines the YANG mapping of the GNBDUFunction Information - Object Class (IOC) that is part of the NR Network Resource Model (NRM). - Copyright 2024, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, - TTA, TTC). All rights reserved.'; - } - } + content: "module _3gpp-nr-nrm-gnbdufunction {\n yang-version 1.1;\n namespace\ + \ 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction';\n prefix gnbdu3gpp;\n revision\ + \ '2020-09-15' {\n description\n 'Defines the YANG mapping of the\ + \ GNBDUFunction Information \n Object Class (IOC) that is part of the\ + \ NR Network Resource Model (NRM). \n Copyright 2024, 3GPP Organizational\ + \ Partners (ARIB, ATIS, CCSA, ETSI, TSDSI,\n TTA, TTC). All rights reserved.';\n\ + \ }\n}\n" revision: 2020-09-15 properties: moduleName: @@ -1894,17 +1888,13 @@ components: example: 2020-09-15 type: string content: - example: | - module _3gpp-nr-nrm-gnbdufunction { - yang-version 1.1; - namespace 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction'; - prefix gnbdu3gpp; - revision '2020-09-15' { - description - 'Defines the YANG mapping of the GNBDUFunction Information - Object Class (IOC) that is part of the NR Network Resource Model (NRM). - Copyright 2024, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, - TTA, TTC). All rights reserved.'; + example: "module _3gpp-nr-nrm-gnbdufunction {\n yang-version 1.1;\n namespace\ + \ 'urn:3gpp:sa5:_3gpp-nr-nrm-gnbdufunction';\n prefix gnbdu3gpp;\n revision\ + \ '2020-09-15' {\n description\n 'Defines the YANG mapping of the\ + \ GNBDUFunction Information \n Object Class (IOC) that is part of\ + \ the NR Network Resource Model (NRM). \n Copyright 2024, 3GPP Organizational\ + \ Partners (ARIB, ATIS, CCSA, ETSI, TSDSI,\n TTA, TTC). All rights\ + \ reserved.';\n }\n}\n" type: string title: Module definitions type: object -- 2.16.6