Moved impl package out from api package 05/139905/4
authorleventecsanyi <levente.csanyi@est.tech>
Wed, 15 Jan 2025 10:57:28 +0000 (11:57 +0100)
committerleventecsanyi <levente.csanyi@est.tech>
Fri, 17 Jan 2025 10:49:15 +0000 (11:49 +0100)
 - refactored cps service packages and the architecture test

Issue-ID: CPS-2543
Change-Id: I0fab54cebd157b19ff6105b7d4b6d8265a1af485
Signed-off-by: leventecsanyi <levente.csanyi@est.tech>
21 files changed:
cps-application/src/test/java/org/onap/cps/architecture/CpsArchitectureTest.java
cps-service/src/main/java/org/onap/cps/impl/CpsAnchorServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsAnchorServiceImpl.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/impl/CpsDataServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/impl/CpsDataspaceServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsDataspaceServiceImpl.java with 98% similarity]
cps-service/src/main/java/org/onap/cps/impl/CpsDeltaServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/impl/CpsModuleServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/impl/CpsQueryServiceImpl.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/CpsQueryServiceImpl.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/impl/YangTextSchemaSourceSetCache.java [moved from cps-service/src/main/java/org/onap/cps/api/impl/YangTextSchemaSourceSetCache.java with 99% similarity]
cps-service/src/main/java/org/onap/cps/utils/PrefixResolver.java
cps-service/src/main/java/org/onap/cps/utils/YangParser.java
cps-service/src/test/groovy/org/onap/cps/impl/CpsAnchorServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAnchorServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/CpsDataServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/CpsDataspaceServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataspaceServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/CpsDeltaServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDeltaServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/CpsModuleServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/CpsQueryServiceImplSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/E2ENetworkSliceSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy with 98% similarity]
cps-service/src/test/groovy/org/onap/cps/impl/YangTextSchemaSourceSetCacheSpec.groovy [moved from cps-service/src/test/groovy/org/onap/cps/api/impl/YangTextSchemaSourceSetCacheSpec.groovy with 99% similarity]
cps-service/src/test/groovy/org/onap/cps/utils/PrefixResolverSpec.groovy
cps-service/src/test/groovy/org/onap/cps/utils/YangParserSpec.groovy
docs/api/swagger/ncmp/openapi.yaml

index e68343b..06ca632 100644 (file)
@@ -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..",
@@ -18,7 +18,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.api.impl;
+package org.onap.cps.impl;
 
 import java.util.Collection;
 import lombok.RequiredArgsConstructor;
@@ -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;
@@ -21,7 +21,7 @@
  *  ============LICENSE_END=========================================================
  */
 
-package org.onap.cps.api.impl;
+package org.onap.cps.impl;
 
 import java.util.Collection;
 import lombok.RequiredArgsConstructor;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
index 646ed55..bd348a2 100644 (file)
 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;
index 7fa10a1..08f450e 100644 (file)
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
-/*\r
- * ============LICENSE_START=======================================================\r
- * Copyright (C) 2021-2024 Nordix Foundation.\r
- * Modifications Copyright (C) 2021-2022 Bell Canada.\r
- * Modifications Copyright (C) 2021 Pantheon.tech\r
- * Modifications Copyright (C) 2022-2024 TechMahindra Ltd.\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *       http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- * SPDX-License-Identifier: Apache-2.0\r
- * ============LICENSE_END=========================================================\r
- */\r
-\r
-package org.onap.cps.api.impl\r
-\r
-import com.fasterxml.jackson.databind.ObjectMapper\r
-import org.onap.cps.TestUtils\r
-import org.onap.cps.api.CpsAnchorService\r
-import org.onap.cps.api.CpsDeltaService\r
-import org.onap.cps.events.CpsDataUpdateEventsService\r
-import org.onap.cps.impl.utils.CpsValidator\r
-import org.onap.cps.spi.CpsDataPersistenceService\r
-import org.onap.cps.spi.CpsModulePersistenceService\r
-import org.onap.cps.api.model.Anchor\r
-import org.onap.cps.utils.ContentType\r
-import org.onap.cps.utils.JsonObjectMapper\r
-import org.onap.cps.utils.PrefixResolver\r
-import org.onap.cps.utils.YangParser\r
-import org.onap.cps.utils.YangParserHelper\r
-import org.onap.cps.yang.TimedYangTextSchemaSourceSetBuilder\r
-import org.onap.cps.yang.YangTextSchemaSourceSetBuilder\r
-import spock.lang.Specification\r
-\r
-class E2ENetworkSliceSpec extends Specification {\r
-    def mockModuleStoreService = Mock(CpsModulePersistenceService)\r
-    def mockDataStoreService = Mock(CpsDataPersistenceService)\r
-    def mockCpsAnchorService = Mock(CpsAnchorService)\r
-    def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache)\r
-    def mockCpsValidator = Mock(CpsValidator)\r
-    def timedYangTextSchemaSourceSetBuilder = new TimedYangTextSchemaSourceSetBuilder()\r
-    def yangParser = new YangParser(new YangParserHelper(), mockYangTextSchemaSourceSetCache, timedYangTextSchemaSourceSetBuilder)\r
-    def mockCpsDeltaService = Mock(CpsDeltaService)\r
-    def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper())\r
-    def mockPrefixResolver = Mock(PrefixResolver)\r
-\r
-    def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService,\r
-            mockYangTextSchemaSourceSetCache, mockCpsAnchorService, mockCpsValidator,timedYangTextSchemaSourceSetBuilder)\r
-\r
-    def mockDataUpdateEventsService = Mock(CpsDataUpdateEventsService)\r
-    def cpsDataServiceImpl = new CpsDataServiceImpl(mockDataStoreService, mockDataUpdateEventsService, mockCpsAnchorService, mockCpsValidator,\r
-            yangParser, mockCpsDeltaService, jsonObjectMapper, mockPrefixResolver)\r
-    def dataspaceName = 'someDataspace'\r
-    def anchorName = 'someAnchor'\r
-    def schemaSetName = 'someSchemaSet'\r
-    def noTimestamp = null\r
-\r
-    def 'E2E model can be parsed by CPS.'() {\r
-        given: 'Valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'ietf/ietf-inet-types@2013-07-15.yang',\r
-                    'ietf/ietf-yang-types@2013-07-15.yang',\r
-                    'e2e/basic/ran-network2020-08-06.yang'\r
-            )\r
-        when: 'Create schema set method is invoked'\r
-            cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
-        then: 'Parameters are validated and processing is delegated to persistence service'\r
-            1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
-    }\r
-\r
-    def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() {\r
-        given: 'Valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
-        when: 'Create schema set method is invoked'\r
-            cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
-        then: 'Parameters are validated and processing is delegated to persistence service'\r
-            1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
-    }\r
-\r
-    def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() {\r
-        given: 'Valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
-            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
-            def dataNodeStored\r
-        and : 'a valid json is provided for the model'\r
-            def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt')\r
-        and : 'all the further dependencies are mocked '\r
-            mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >>\r
-                    new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).dataspaceName(dataspaceName).build()\r
-            mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >>\r
-                    YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
-            mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext\r
-        when: 'saveData method is invoked'\r
-            cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp)\r
-        then: 'Parameters are validated and processing is delegated to persistence service'\r
-            1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >>\r
-                    { args -> dataNodeStored = args[2]}\r
-            def child = dataNodeStored[0].childDataNodes[0]\r
-            assert child.childDataNodes.size() == 1\r
-        and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes '\r
-            def listOfTAForCoverageArea = child.childDataNodes[0]\r
-            listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
-                    'coverage-area[@coverageArea=\'Washington\']'\r
-            listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234\r
-        and: 'list of cells in a tracking area are stored with correct xpath and child nodes '\r
-            def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0]\r
-            listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
-                    'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']'\r
-            listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709\r
-    }\r
-\r
-    def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() {\r
-        def dataNodeStored\r
-        given: 'valid yang resource as name-to-content map'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'e2e/basic/cps-ran-inventory@2021-01-28.yang')\r
-            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
-        and : 'a valid json is provided for the model'\r
-            def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json')\r
-        and : 'all the further dependencies are mocked '\r
-            mockCpsAnchorService.getAnchor('someDataspace', 'someAnchor') >>\r
-                    new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').dataspaceName(dataspaceName).build()\r
-            mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
-            mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext\r
-        when: 'saveData method is invoked'\r
-            cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp)\r
-        then: 'parameters are validated and processing is delegated to persistence service'\r
-            1 * mockDataStoreService.storeDataNodes('someDataspace', 'someAnchor', _) >>\r
-                    { args -> dataNodeStored = args[2]}\r
-        and: 'the size of the tree is correct'\r
-            def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored[0])\r
-            assert  cpsRanInventory.size() == 4\r
-        and: 'ran-inventory contains the correct child node'\r
-            def ranInventory = cpsRanInventory.get('/ran-inventory')\r
-            def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']')\r
-            def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']')\r
-            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\']')\r
-            ranInventory.getChildDataNodes().size() == 1\r
-            ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath})\r
-        and: 'ranSlices contains the correct child node'\r
-            ranSlices.getChildDataNodes().size() == 1\r
-            ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath})\r
-        and: 'sliceProfilesList contains the correct child node'\r
-            sliceProfilesList.getChildDataNodes().size() == 1\r
-            sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath})\r
-        and: 'pLMNIdList contains no children'\r
-            pLMNIdList.getChildDataNodes().size() == 0\r
-\r
-    }\r
-\r
-    def 'E2E RAN Schema Model.'(){\r
-        given: 'yang resources'\r
-            def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
-                    'ietf/ietf-inet-types@2013-07-15.yang',\r
-                    'ietf/ietf-yang-types@2013-07-15.yang',\r
-                    'e2e/basic/cps-ran-schema-model@2021-05-19.yang'\r
-            )\r
-        and : 'json data'\r
-            def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json')\r
-        expect: 'schema context is built with no exception indicating the schema set being valid '\r
-            def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
-        and: 'data is parsed with no exception indicating the model match'\r
-            new YangParserHelper().parseData(ContentType.JSON, jsonData, schemaContext, '', false) != null\r
-    }\r
-}\r
+/*
+ * ============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
+    }
+}
index f80678f..3198e54 100644 (file)
@@ -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
index 62c681e..a2fadb7 100644 (file)
@@ -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 {
 
index 4e369f5..6922661 100644 (file)
@@ -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