P2 - Get module names and revisions rest layer 17/123917/2
authorniamhcore <niamh.core@est.tech>
Tue, 7 Sep 2021 09:27:18 +0000 (10:27 +0100)
committerniamhcore <niamh.core@est.tech>
Tue, 7 Sep 2021 15:39:34 +0000 (16:39 +0100)
Issue-ID: CPS-485
Signed-off-by: niamhcore <niamh.core@est.tech>
Change-Id: I1bcf45902207d0dba6b5dfe8277cb06571694db3

13 files changed:
cps-ncmp-rest/docs/openapi/ncmproxy.yml
cps-ncmp-rest/docs/openapi/openapi.yml
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy
cps-ri/src/main/java/org/onap/cps/spi/impl/CpsModulePersistenceServiceImpl.java
cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsModulePersistenceServiceIntegrationSpec.groovy
cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java
cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java
cps-service/src/main/java/org/onap/cps/spi/CpsModulePersistenceService.java
cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModuleServiceImplSpec.groovy

index 138337d..5e2957f 100755 (executable)
@@ -279,5 +279,32 @@ resourceDataForPassthroughRunning:
         $ref: 'components.yaml#/components/responses/Unauthorized'
       403:
         $ref: 'components.yaml#/components/responses/Forbidden'
+      404:
+        $ref: 'components.yaml#/components/responses/NotFound'
+
+fetchModuleReferencesByCmHandle:
+  get:
+    description: fetch all module references (name and revision) for a given cm handle
+    tags:
+      - network-cm-proxy
+    summary: Fetch all module references (name and revision) for a given cm handle
+    operationId: getModuleReferencesByCmHandle
+    parameters:
+      - $ref: 'components.yaml#/components/parameters/cmHandleInPath'
+    responses:
+      200:
+        description: OK
+        content:
+          application/json:
+            schema:
+              type: string
+            example: [{"moduleName": "nc-notifications", "revision": "2008-07-14"}]
+        $ref: 'components.yaml#/components/responses/Ok'
+      400:
+        $ref: 'components.yaml#/components/responses/BadRequest'
+      401:
+        $ref: 'components.yaml#/components/responses/Unauthorized'
+      403:
+        $ref: 'components.yaml#/components/responses/Forbidden'
       404:
         $ref: 'components.yaml#/components/responses/NotFound'
\ No newline at end of file
index 8d8684a..12356b5 100755 (executable)
@@ -45,4 +45,7 @@ paths:
     $ref: 'ncmproxy.yml#/getResourceDataForPassthroughOperational'
 
   /v1/ch/{cm-handle}/data/ds/ncmp-datastore:passthrough-running/{resourceIdentifier}:
-    $ref: 'ncmproxy.yml#/resourceDataForPassthroughRunning'
\ No newline at end of file
+    $ref: 'ncmproxy.yml#/resourceDataForPassthroughRunning'
+
+  /v1/ch/{cm-handle}/modules:
+    $ref: 'ncmproxy.yml#/fetchModuleReferencesByCmHandle'
\ No newline at end of file
index f5ffdbe..b782416 100755 (executable)
@@ -35,6 +35,7 @@ import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi;
 import org.onap.cps.ncmp.rest.model.RestDmiPluginRegistration;
 import org.onap.cps.spi.FetchDescendantsOption;
 import org.onap.cps.spi.model.DataNode;
+import org.onap.cps.spi.model.ModuleReference;
 import org.onap.cps.utils.DataMapUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -220,6 +221,13 @@ public class NetworkCmProxyController implements NetworkCmProxyApi {
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
 
+    @Override
+    public ResponseEntity<Object> getModuleReferencesByCmHandle(final String cmHandle) {
+        final Collection<ModuleReference>
+            moduleReferences = networkCmProxyDataService.getYangResourcesModuleReferences(cmHandle);
+        return new ResponseEntity<>(new Gson().toJson(moduleReferences), HttpStatus.OK);
+    }
+
     private DmiPluginRegistration convertRestObjectToJavaApiObject(
         final RestDmiPluginRegistration restDmiPluginRegistration) {
         return objectMapper.convertValue(restDmiPluginRegistration, DmiPluginRegistration.class);
index 73ccd6e..613243e 100644 (file)
@@ -22,6 +22,8 @@
 
 package org.onap.cps.ncmp.rest.controller
 
+import org.onap.cps.spi.model.ModuleReference
+
 import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS
 import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
@@ -246,5 +248,19 @@ class NetworkCmProxyControllerSpec extends Specification {
         and: 'resource is created'
             response.status == HttpStatus.CREATED.value()
     }
+
+    def 'Get module references for the given dataspace and cm handle.' () {
+        given: 'get module references url'
+            def getUrl = "$ncmpBasePathV1/ch/some-cmhandle/modules"
+        when: 'get module resource request is performed'
+            def response =mvc.perform(get(getUrl)).andReturn().response
+        then: 'ncmp service method to get yang resource module references is called'
+            mockNetworkCmProxyDataService.getYangResourcesModuleReferences('some-cmhandle')
+                    >> [new ModuleReference(moduleName: 'some-name1',revision: 'some-revision1')]
+        and: 'response contains an array with the module name and revision'
+            response.getContentAsString() == '[{"moduleName":"some-name1","revision":"some-revision1"}]'
+        and: 'response returns an OK http code'
+            response.status == HttpStatus.OK.value()
+    }
 }
 
index 0693f61..60669b9 100644 (file)
@@ -28,6 +28,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
 import org.onap.cps.ncmp.api.models.DmiPluginRegistration;
 import org.onap.cps.spi.FetchDescendantsOption;
 import org.onap.cps.spi.model.DataNode;
+import org.onap.cps.spi.model.ModuleReference;
 
 /*
  * Datastore interface for handling CPS data.
@@ -154,4 +155,12 @@ public interface NetworkCmProxyDataService {
                                                          @NotNull String resourceIdentifier,
                                                          @NotNull Object requestBody,
                                                          String contentType);
+
+    /**
+     * Retrieve module references for the given cm handle.
+     *
+     * @param cmHandle cm handle
+     * @return a collection of modules names and revisions
+     */
+    Collection<ModuleReference> getYangResourcesModuleReferences(@NotNull String cmHandle);
 }
index 6e1e727..871d880 100755 (executable)
@@ -223,6 +223,11 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
         handleResponseForPost(responseEntity);
     }
 
+    @Override
+    public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandle) {
+        return cpsModuleService.getYangResourcesModuleReferences(NF_PROXY_DATASPACE_NAME, cmHandle);
+    }
+
     private DataNode fetchDataNodeFromDmiRegistryForCmHandle(final String cmHandle) {
         final String xpathForDmiRegistryToFetchCmHandle = "/dmi-registry/cm-handles[@id='" + cmHandle + "']";
         return cpsDataService.getDataNode(NCMP_DATASPACE_NAME,
@@ -352,7 +357,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
         final List<ModuleReference> moduleReferencesFromDmiForCmHandle =
             getModuleReferences(modulesForCmHandle);
         final var knownModuleReferencesInCps =
-            cpsModuleService.getAllYangResourceModuleReferences(NF_PROXY_DATASPACE_NAME);
+            cpsModuleService.getYangResourceModuleReferences(NF_PROXY_DATASPACE_NAME);
         final List<ModuleReference> existingModuleReferences = new ArrayList<>();
         for (final ModuleReference moduleReferenceFromDmiForCmHandle :
             moduleReferencesFromDmiForCmHandle) {
index ff3e0cd..e945442 100644 (file)
@@ -360,7 +360,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             def knownModule1 = new ModuleReference('module1', '1')
             def knownOtherModule = new ModuleReference('some other module', 'some revision')
         and: 'CPS-Core returns list of known modules'
-            mockCpsModuleService.getAllYangResourceModuleReferences(_) >> [knownModule1, knownOtherModule]
+            mockCpsModuleService.getYangResourceModuleReferences(_) >> [knownModule1, knownOtherModule]
         and: 'DMI-Plugin returns resource(s) for "new" module(s)'
             def moduleResources = new ResponseEntity<String>(sdncReponseBody, HttpStatus.OK)
             mockDmiOperations.getResourceFromDmi(_, cmHandleForModelSync.getId(), 'moduleResources') >> moduleResources
index d7b882f..e0f5426 100755 (executable)
@@ -116,7 +116,7 @@ public class CpsModulePersistenceServiceImpl implements CpsModulePersistenceServ
     }
 
     @Override
-    public Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName) {
+    public Collection<ModuleReference> getYangResourceModuleReferences(final String dataspaceName) {
         final Set<YangResourceModuleReference> yangResourceModuleReferenceList =
             yangResourceRepository.findAllModuleReferences(dataspaceName);
         return yangResourceModuleReferenceList.stream().map(CpsModulePersistenceServiceImpl::toModuleReference)
@@ -124,7 +124,7 @@ public class CpsModulePersistenceServiceImpl implements CpsModulePersistenceServ
     }
 
     @Override
-    public Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName,
+    public Collection<ModuleReference> getYangResourceModuleReferences(final String dataspaceName,
         final String anchorName) {
         final Set<YangResourceModuleReference> yangResourceModuleReferenceList =
             yangResourceRepository
index a139830..7e42200 100644 (file)
@@ -140,7 +140,7 @@ class CpsModulePersistenceServiceIntegrationSpec extends CpsPersistenceSpecBase
         given: 'a dataspace name'
             def dataspaceName = 'DATASPACE-002'
         when: 'all yang resources module references are retrieved for the given dataspace name'
-            def result = objectUnderTest.getAllYangResourceModuleReferences(dataspaceName)
+            def result = objectUnderTest.getYangResourceModuleReferences(dataspaceName)
         then: 'the correct resources are returned'
             result.sort() == [new ModuleReference(moduleName: 'MODULE-NAME-005', revision: 'REVISION-002'),
                               new ModuleReference(moduleName: 'MODULE-NAME-006', revision: 'REVISION-006')]
@@ -152,7 +152,7 @@ class CpsModulePersistenceServiceIntegrationSpec extends CpsPersistenceSpecBase
             def dataspaceName = 'DATASPACE-001'
             def anchorName = 'ANCHOR1'
         when: 'all yang resources module references are retrieved for the given anchor'
-            def result = objectUnderTest.getAllYangResourceModuleReferences(dataspaceName, anchorName)
+            def result = objectUnderTest.getYangResourceModuleReferences(dataspaceName, anchorName)
         then: 'the correct module names and revisions are returned'
             result.sort() == [new ModuleReference(moduleName: null, revision: null), new ModuleReference(moduleName: 'MODULE-NAME-002', revision: 'REVISION-002'),
                               new ModuleReference(moduleName: 'MODULE-NAME-003', revision: 'REVISION-002'),
index 218a236..1dccf49 100644 (file)
@@ -81,10 +81,19 @@ public interface CpsModuleService {
         @NonNull CascadeDeleteAllowed cascadeDeleteAllowed);
 
     /**
-     * Retrieve all modules and revisions known by CPS for all Yang Resources.
+     * Retrieve module references for the given dataspace name.
      *
      * @param dataspaceName        dataspace name
      * @return a list of ModuleReference objects
      */
-    Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName);
+    Collection<ModuleReference> getYangResourceModuleReferences(String dataspaceName);
+
+    /**
+     * Retrieve module references for the given dataspace name and anchor name.
+     *
+     * @param dataspaceName dataspace name
+     * @param anchorName    anchor name
+     * @return a list of ModuleReference objects
+     */
+    Collection<ModuleReference> getYangResourcesModuleReferences(String dataspaceName, String anchorName);
 }
index 17ad78c..1032641 100644 (file)
@@ -75,8 +75,13 @@ public class CpsModuleServiceImpl implements CpsModuleService {
     }
 
     @Override
-    public Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName) {
-        return cpsModulePersistenceService.getAllYangResourceModuleReferences(dataspaceName);
+    public Collection<ModuleReference> getYangResourceModuleReferences(final String dataspaceName) {
+        return cpsModulePersistenceService.getYangResourceModuleReferences(dataspaceName);
     }
 
+    @Override
+    public Collection<ModuleReference> getYangResourcesModuleReferences(final String dataspaceName,
+        final String anchorName) {
+        return cpsModulePersistenceService.getYangResourceModuleReferences(dataspaceName, anchorName);
+    }
 }
index 4f46c0d..9b50f9e 100755 (executable)
@@ -90,20 +90,19 @@ public interface CpsModulePersistenceService {
         @NonNull String anchorName);
 
     /**
-     * Returns all YANG resources module references for the given dataspace name.
+     * Returns YANG resources module references for the given dataspace name.
      *
      * @param dataspaceName dataspace name
      * @return Collection of all YANG resources module information in the database
      */
-    Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName);
+    Collection<ModuleReference> getYangResourceModuleReferences(String dataspaceName);
 
     /**
-     * Get all YANG resource module references for the given anchor name and dataspace name.
+     * Get YANG resource module references for the given anchor name and dataspace name.
      *
      * @param dataspaceName dataspace name
      * @param anchorName    anchor name
      * @return a collection of module names and revisions
      */
-    Collection<ModuleReference> getAllYangResourceModuleReferences(final String dataspaceName,
-        final String anchorName);
+    Collection<ModuleReference> getYangResourceModuleReferences(String dataspaceName, String anchorName);
 }
index 31df479..2c23aa1 100644 (file)
@@ -26,6 +26,7 @@ import org.onap.cps.TestUtils
 import org.onap.cps.spi.CpsModulePersistenceService
 import org.onap.cps.spi.exceptions.ModelValidationException
 import org.onap.cps.spi.model.ExtendedModuleReference
+import org.onap.cps.spi.model.ModuleReference
 import org.spockframework.spring.SpringBean
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.boot.test.context.SpringBootTest
@@ -118,8 +119,17 @@ class CpsModuleServiceImplSpec extends Specification {
     def 'Get all yang resources module references.'(){
         given: 'an already present module reference'
             def moduleReferences = [new ExtendedModuleReference()]
-            mockModuleStoreService.getAllYangResourceModuleReferences('someDataspaceName') >> moduleReferences
+            mockModuleStoreService.getYangResourceModuleReferences('someDataspaceName') >> moduleReferences
         expect: 'the list provided by persistence service is returned as result'
-            objectUnderTest.getAllYangResourceModuleReferences('someDataspaceName') == moduleReferences
+            objectUnderTest.getYangResourceModuleReferences('someDataspaceName') == moduleReferences
+    }
+
+
+    def 'Get all yang resources module references for the given dataspace name and anchor name.'(){
+        given: 'the module store service service returns a list module references'
+            def moduleReferences = [new ModuleReference()]
+            mockModuleStoreService.getYangResourceModuleReferences('someDataspaceName', 'someAnchorName') >> moduleReferences
+        expect: 'the list provided by persistence service is returned as result'
+            objectUnderTest.getYangResourcesModuleReferences('someDataspaceName', 'someAnchorName') == moduleReferences
     }
 }