aboutsummaryrefslogtreecommitdiffstats
path: root/cps-rest
diff options
context:
space:
mode:
Diffstat (limited to 'cps-rest')
-rw-r--r--cps-rest/docs/openapi/cpsAdmin.yml22
-rw-r--r--cps-rest/docs/openapi/openapi.yml5
-rw-r--r--cps-rest/pom.xml4
-rwxr-xr-xcps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java16
-rwxr-xr-xcps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy65
-rwxr-xr-xcps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy4
-rw-r--r--cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy2
7 files changed, 80 insertions, 38 deletions
diff --git a/cps-rest/docs/openapi/cpsAdmin.yml b/cps-rest/docs/openapi/cpsAdmin.yml
index f394270dd5..6cfffa48f3 100644
--- a/cps-rest/docs/openapi/cpsAdmin.yml
+++ b/cps-rest/docs/openapi/cpsAdmin.yml
@@ -1,6 +1,6 @@
# ============LICENSE_START=======================================================
# Copyright (c) 2021 Bell Canada.
-# Modifications Copyright (C) 2021-2022 Nordix Foundation
+# Modifications Copyright (C) 2021-2025 Nordix Foundation
# Modifications Copyright (C) 2022 TechMahindra Ltd.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -230,3 +230,23 @@ adminDataspace:
$ref: 'components.yml#/components/responses/Forbidden'
'500':
$ref: 'components.yml#/components/responses/InternalServerError'
+
+adminCleanDataspace:
+ post:
+ description: Clean the dataspace (remove orphaned schema sets and modules)
+ tags:
+ - cps-admin
+ summary: Clean the dataspace
+ operationId: cleanDataspace
+ parameters:
+ - $ref: 'components.yml#/components/parameters/apiVersionInPath'
+ - $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
+ responses:
+ '204':
+ $ref: 'components.yml#/components/responses/NoContent'
+ '400':
+ $ref: 'components.yml#/components/responses/BadRequest'
+ '403':
+ $ref: 'components.yml#/components/responses/Forbidden'
+ '500':
+ $ref: 'components.yml#/components/responses/InternalServerError'
diff --git a/cps-rest/docs/openapi/openapi.yml b/cps-rest/docs/openapi/openapi.yml
index f4eab61875..c85bf7cac7 100644
--- a/cps-rest/docs/openapi/openapi.yml
+++ b/cps-rest/docs/openapi/openapi.yml
@@ -1,5 +1,5 @@
# ============LICENSE_START=======================================================
-# Copyright (C) 2021-2024 Nordix Foundation
+# Copyright (C) 2021-2025 Nordix Foundation
# Modifications Copyright (C) 2021 Pantheon.tech
# Modifications Copyright (C) 2021 Bell Canada.
# Modifications Copyright (C) 2022-2024 TechMahindra Ltd.
@@ -61,6 +61,9 @@ paths:
/{apiVersion}/admin/dataspaces/{dataspace-name}:
$ref: 'cpsAdmin.yml#/adminDataspace'
+ /{apiVersion}/admin/dataspaces/{dataspace-name}/actions/clean:
+ $ref: 'cpsAdmin.yml#/adminCleanDataspace'
+
/v1/dataspaces/{dataspace-name}/anchors:
$ref: 'cpsAdminV1Deprecated.yml#/anchorsByDataspace'
diff --git a/cps-rest/pom.xml b/cps-rest/pom.xml
index b04daf03bd..f72cef9f28 100644
--- a/cps-rest/pom.xml
+++ b/cps-rest/pom.xml
@@ -62,10 +62,6 @@
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
- <groupId>org.springframework.retry</groupId>
- <artifactId>spring-retry</artifactId>
- </dependency>
- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java
index 675c0eaec4..4c6bd6cdc5 100755
--- a/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java
+++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/AdminRestController.java
@@ -1,6 +1,6 @@
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2020-2023 Nordix Foundation
+ * Copyright (C) 2020-2025 Nordix Foundation
* Modifications Copyright (C) 2020-2021 Bell Canada.
* Modifications Copyright (C) 2021 Pantheon.tech
* Modifications Copyright (C) 2022 TechMahindra Ltd.
@@ -176,6 +176,20 @@ public class AdminRestController implements CpsAdminApi {
}
/**
+ * Clean the given dataspace of any orphaned (module) data.
+ *
+ * @param apiVersion api version
+ * @param dataspaceName dataspace name
+ *
+ * @return a {@Link ResponseEntity} of {@link HttpStatus} NO_CONTENT
+ */
+ @Override
+ public ResponseEntity<Void> cleanDataspace(final String apiVersion, final String dataspaceName) {
+ cpsModuleService.deleteAllUnusedYangModuleData(dataspaceName);
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+ }
+
+ /**
* Create a new anchor.
*
* @param dataspaceName dataspace name
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy
index 2335a5e770..0d189783fd 100755
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/AdminRestControllerSpec.groovy
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* Copyright (C) 2020-2021 Pantheon.tech
* Modifications Copyright (C) 2020-2021 Bell Canada.
- * Modifications Copyright (C) 2021-2022 Nordix Foundation
+ * Modifications Copyright (C) 2021-2025 Nordix Foundation
* Modifications Copyright (C) 2022 TechMahindra Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,15 +23,8 @@
package org.onap.cps.rest.controller
-import org.onap.cps.api.CpsAnchorService
-
-import static org.onap.cps.api.parameters.CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
-
import org.mapstruct.factory.Mappers
+import org.onap.cps.api.CpsAnchorService
import org.onap.cps.api.CpsDataspaceService
import org.onap.cps.api.CpsModuleService
import org.onap.cps.api.exceptions.AlreadyDefinedException
@@ -51,6 +44,12 @@ import org.springframework.util.LinkedMultiValueMap
import org.springframework.util.MultiValueMap
import spock.lang.Specification
+import static org.onap.cps.api.parameters.CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
+
@WebMvcTest(AdminRestController)
class AdminRestControllerSpec extends Specification {
@@ -79,7 +78,7 @@ class AdminRestControllerSpec extends Specification {
def dataspace = new Dataspace(name: dataspaceName)
def 'Create new dataspace with #scenario.'() {
- when: 'post is invoked'
+ when: 'post is invoked on endpoint for creating a dataspace'
def response =
mvc.perform(
post("/cps/api/${apiVersion}/dataspaces")
@@ -97,7 +96,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Create dataspace over existing with same name.'() {
- given: 'an endpoint'
+ given: 'the endpoint to create a dataspace'
def createDataspaceEndpoint = "$basePath/v1/dataspaces"
and: 'the service method throws an exception indicating the dataspace is already defined'
def thrownException = new AlreadyDefinedException(dataspaceName, new RuntimeException())
@@ -115,7 +114,7 @@ class AdminRestControllerSpec extends Specification {
def 'Get a dataspace.'() {
given: 'service method returns a dataspace'
mockCpsDataspaceService.getDataspace(dataspaceName) >> dataspace
- and: 'an endpoint'
+ and: 'the endpoint for getting a dataspace by name'
def getDataspaceEndpoint = "$basePath/v1/admin/dataspaces/$dataspaceName"
when: 'get dataspace API is invoked'
def response = mvc.perform(get(getDataspaceEndpoint)).andReturn().response
@@ -124,6 +123,17 @@ class AdminRestControllerSpec extends Specification {
response.getContentAsString().contains(dataspaceName)
}
+ def 'Clean a dataspace.'() {
+ given: 'service method returns a dataspace'
+ mockCpsDataspaceService.getDataspace(dataspaceName) >> dataspace
+ and: 'the endpoint for cleaning a dataspace'
+ def postCleanDataspaceEndpoint = "$basePath/v1/admin/dataspaces/$dataspaceName/actions/clean"
+ when: 'post is invoked on the clean dataspace endpoint'
+ def response = mvc.perform(post(postCleanDataspaceEndpoint)).andReturn().response
+ then: 'no content is returned'
+ response.status == HttpStatus.NO_CONTENT.value()
+ }
+
def 'Get all dataspaces.'() {
given: 'service method returns all dataspace'
mockCpsDataspaceService.getAllDataspaces() >> [dataspace, new Dataspace(name: "dataspace-test2")]
@@ -173,8 +183,7 @@ class AdminRestControllerSpec extends Specification {
.param('schema-set-name', schemaSetName))
.andReturn().response
then: 'associated service method is invoked with expected parameters'
- 1 * mockCpsModuleService.createSchemaSet(dataspaceName, schemaSetName, _) >>
- { args -> yangResourceMapCapture = args[2] }
+ 1 * mockCpsModuleService.createSchemaSet(dataspaceName, schemaSetName, _) >> { args -> yangResourceMapCapture = args[2] }
yangResourceMapCapture['assembly.yang'] == "fake assembly content 1\n"
yangResourceMapCapture['component.yang'] == "fake component content 1\n"
and: 'response code indicates success'
@@ -208,7 +217,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Create schema set from zip archive having #caseDescriptor.'() {
- given: 'an endpoint'
+ given: 'the endpoint to create a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets"
when: 'zip archive having #caseDescriptor is uploaded with create schema set request'
def response =
@@ -228,7 +237,7 @@ class AdminRestControllerSpec extends Specification {
def 'Create schema set from file with unsupported filename extension.'() {
given: 'file with unsupported filename extension (.doc)'
def multipartFile = createMultipartFile("filename.doc", "content")
- and: 'an endpoint'
+ and: 'the endpoint to create a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets"
when: 'file uploaded with schema set create request'
def response =
@@ -242,7 +251,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Create schema set from #fileType file with IOException occurrence on processing.'() {
- given: 'an endpoint'
+ given: 'the endpoint to create a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets"
when: 'file uploaded with schema set create request'
def multipartFile = createMultipartFileForIOException(fileType)
@@ -259,7 +268,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Delete schema set.'() {
- given: 'an endpoint'
+ given: 'the endpoint for deleting a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets/$schemaSetName"
when: 'delete schema set endpoint is invoked'
def response = mvc.perform(delete(schemaSetEndpoint)).andReturn().response
@@ -274,7 +283,7 @@ class AdminRestControllerSpec extends Specification {
def thrownException = new SchemaSetInUseException(dataspaceName, schemaSetName)
mockCpsModuleService.deleteSchemaSet(dataspaceName, schemaSetName, CASCADE_DELETE_PROHIBITED) >>
{ throw thrownException }
- and: 'an endpoint'
+ and: 'the endpoint for deleting a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets/$schemaSetName"
when: 'delete schema set endpoint is invoked'
def response = mvc.perform(delete(schemaSetEndpoint)).andReturn().response
@@ -286,7 +295,7 @@ class AdminRestControllerSpec extends Specification {
given: 'service method returns a new schema set'
mockCpsModuleService.getSchemaSet(dataspaceName, schemaSetName) >>
new SchemaSet(name: schemaSetName, dataspaceName: dataspaceName)
- and: 'an endpoint'
+ and: 'the endpoint for getting a schema set'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets/$schemaSetName"
when: 'get schema set API is invoked'
def response = mvc.perform(get(schemaSetEndpoint)).andReturn().response
@@ -300,7 +309,7 @@ class AdminRestControllerSpec extends Specification {
mockCpsModuleService.getSchemaSets(dataspaceName) >>
[new SchemaSet(name: schemaSetName, dataspaceName: dataspaceName),
new SchemaSet(name: "test-schemaset", dataspaceName: dataspaceName)]
- and: 'an endpoint'
+ and: 'the endpoint for getting all schema sets'
def schemaSetEndpoint = "$basePath/v1/dataspaces/$dataspaceName/schema-sets"
when: 'get schema sets API is invoked'
def response = mvc.perform(get(schemaSetEndpoint)).andReturn().response
@@ -315,7 +324,7 @@ class AdminRestControllerSpec extends Specification {
def requestParams = new LinkedMultiValueMap<>()
requestParams.add('schema-set-name', schemaSetName)
requestParams.add('anchor-name', anchorName)
- when: 'post is invoked'
+ when: 'post is invoked on the create anchors endpoint'
def response =
mvc.perform(
post("/cps/api/${apiVersion}/dataspaces/my_dataspace/anchors")
@@ -332,10 +341,10 @@ class AdminRestControllerSpec extends Specification {
'V2 API' | 'v2' || ''
}
- def 'Get existing anchor.'() {
- given: 'service method returns a list of anchors'
+ def 'Get existing anchors.'() {
+ given: 'service method returns a list of (one) anchors'
mockCpsAnchorService.getAnchors(dataspaceName) >> [anchor]
- and: 'an endpoint'
+ and: 'the endpoint for getting all anchors'
def anchorEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors"
when: 'get all anchors API is invoked'
def response = mvc.perform(get(anchorEndpoint)).andReturn().response
@@ -348,7 +357,7 @@ class AdminRestControllerSpec extends Specification {
given: 'service method returns an anchor'
mockCpsAnchorService.getAnchor(dataspaceName, anchorName) >>
new Anchor(name: anchorName, dataspaceName: dataspaceName, schemaSetName: schemaSetName)
- and: 'an endpoint'
+ and: 'the endpoint for getting an anchor'
def anchorEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors/$anchorName"
when: 'get anchor API is invoked'
def response = mvc.perform(get(anchorEndpoint)).andReturn().response
@@ -361,7 +370,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Delete anchor.'() {
- given: 'an endpoint'
+ given: 'the endpoint for deleting an anchor'
def anchorEndpoint = "$basePath/v1/dataspaces/$dataspaceName/anchors/$anchorName"
when: 'delete method is invoked on anchor endpoint'
def response = mvc.perform(delete(anchorEndpoint)).andReturn().response
@@ -372,7 +381,7 @@ class AdminRestControllerSpec extends Specification {
}
def 'Delete dataspace.'() {
- given: 'an endpoint'
+ given: 'the endpoint for deleting a dataspace'
def dataspaceEndpoint = "$basePath/v1/dataspaces"
when: 'delete dataspace endpoint is invoked'
def response = mvc.perform(delete(dataspaceEndpoint)
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
index ca89fafe83..f2f962422f 100755
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
@@ -30,8 +30,8 @@ import org.onap.cps.api.CpsAnchorService
import org.onap.cps.api.CpsDataService
import org.onap.cps.api.parameters.FetchDescendantsOption
import org.onap.cps.api.model.DataNode
-import org.onap.cps.api.model.DataNodeBuilder
-import org.onap.cps.api.model.DeltaReportBuilder
+import org.onap.cps.impl.DataNodeBuilder
+import org.onap.cps.impl.DeltaReportBuilder
import org.onap.cps.utils.ContentType
import org.onap.cps.utils.DateTimeUtility
import org.onap.cps.utils.JsonObjectMapper
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
index f29654c99f..2b5c471287 100644
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
@@ -27,7 +27,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import org.onap.cps.api.CpsAnchorService
import org.onap.cps.api.CpsQueryService
import org.onap.cps.api.parameters.PaginationOption
-import org.onap.cps.api.model.DataNodeBuilder
+import org.onap.cps.impl.DataNodeBuilder
import org.onap.cps.utils.JsonObjectMapper
import org.onap.cps.utils.PrefixResolver
import org.spockframework.spring.SpringBean