aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcps-rest/docs/api/swagger/openapi.yml43
-rwxr-xr-xcps-rest/src/main/java/org/onap/cps/rest/controller/CpsRestController.java104
-rw-r--r--cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy10
-rwxr-xr-xcps-service/src/main/java/org/onap/cps/api/CpService.java51
-rw-r--r--cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java17
-rwxr-xr-xcps-service/src/main/java/org/onap/cps/api/impl/CpServiceImpl.java49
-rw-r--r--cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java32
-rwxr-xr-xcps-service/src/test/groovy/org/onap/cps/api/impl/CpServiceImplSpec.groovy75
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModulePersistenceServiceImplSpec.groovy28
9 files changed, 5 insertions, 404 deletions
diff --git a/cps-rest/docs/api/swagger/openapi.yml b/cps-rest/docs/api/swagger/openapi.yml
index 441d5e52cd..2eed7e633d 100755
--- a/cps-rest/docs/api/swagger/openapi.yml
+++ b/cps-rest/docs/api/swagger/openapi.yml
@@ -252,49 +252,6 @@ paths:
404:
description: Not Found
content: {}
- post:
- tags:
- - cps-rest
- summary: Create modules for the given dataspace
- operationId: createModules
- parameters:
- - name: dataspace-name
- in: path
- description: dataspace-name
- required: true
- schema:
- type: string
- requestBody:
- content:
- multipart/form-data:
- schema:
- required:
- - file
- properties:
- multipartFile:
- type: string
- description: multipartFile
- format: binary
- required: true
- responses:
- 200:
- description: OK
- content:
- application/json:
- schema:
- type: object
- 201:
- description: Created
- content: {}
- 401:
- description: Unauthorized
- content: {}
- 403:
- description: Forbidden
- content: {}
- 404:
- description: Not Found
- content: {}
/v1/dataspaces/{dataspace-name}/nodes:
get:
tags:
diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/CpsRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/CpsRestController.java
index 32ea35c5e0..1802ce7a79 100755
--- a/cps-rest/src/main/java/org/onap/cps/rest/controller/CpsRestController.java
+++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/CpsRestController.java
@@ -20,31 +20,15 @@
package org.onap.cps.rest.controller;
-import com.google.gson.Gson;
-import com.google.gson.JsonSyntaxException;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
import java.util.Collection;
import javax.validation.Valid;
import org.modelmapper.ModelMapper;
-import org.onap.cps.api.CpService;
import org.onap.cps.api.CpsAdminService;
-import org.onap.cps.api.CpsModuleService;
import org.onap.cps.rest.api.CpsRestApi;
-import org.onap.cps.spi.exceptions.CpsException;
-import org.onap.cps.spi.exceptions.DataValidationException;
import org.onap.cps.spi.model.Anchor;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@@ -52,12 +36,6 @@ import org.springframework.web.multipart.MultipartFile;
public class CpsRestController implements CpsRestApi {
@Autowired
- private CpService cpService;
-
- @Autowired
- private CpsModuleService cpsModuleService;
-
- @Autowired
private CpsAdminService cpsAdminService;
@Autowired
@@ -80,14 +58,6 @@ public class CpsRestController implements CpsRestApi {
}
@Override
- public ResponseEntity<Object> createModules(@Valid final MultipartFile multipartFile, final String dataspaceName) {
- final File fileToParse = saveToFile(multipartFile);
- final SchemaContext schemaContext = cpsModuleService.parseAndValidateModel(fileToParse);
- cpsModuleService.storeSchemaContext(schemaContext, dataspaceName);
- return new ResponseEntity<>("Resource successfully created", HttpStatus.CREATED);
- }
-
- @Override
public ResponseEntity<Object> createNode(@Valid final MultipartFile multipartFile, final String dataspaceName) {
return null;
}
@@ -129,78 +99,4 @@ public class CpsRestController implements CpsRestApi {
public ResponseEntity<Object> getNodeByDataspaceAndAnchor(final String dataspaceName, final String anchorName) {
return null;
}
-
- /*
- Old rest endpoints before contract first approach (Need to be removed).
- */
-
- /**
- * Upload a JSON file.
- *
- * @param uploadedFile the JSON Multipart file.
- * @return a ResponseEntity.
- */
- @PostMapping("/upload-yang-json-data-file")
- public final ResponseEntity<String> uploadYangJsonDataFile(@RequestParam("file") final MultipartFile uploadedFile) {
- validateJsonStructure(uploadedFile);
- final int persistenceObjectId = cpService.storeJsonStructure(getJsonString(uploadedFile));
- return new ResponseEntity<>(
- "Object stored in CPS with identity: " + persistenceObjectId, HttpStatus.OK);
- }
-
- /**
- * Read a JSON Object using the object identifier.
- *
- * @param jsonObjectId the JSON object identifier.
- * @return a ResponseEntity.
- */
- @GetMapping("/json-object/{id}")
- public final ResponseEntity<String> getJsonObjectById(
- @PathVariable("id") final int jsonObjectId) {
- return new ResponseEntity<>(cpService.getJsonById(jsonObjectId), HttpStatus.OK);
- }
-
- /**
- * Delete a JSON Object using the object identifier.
- *
- * @param jsonObjectId the JSON object identifier.
- * @return a ResponseEntity.
- */
- @DeleteMapping("json-object/{id}")
- public final ResponseEntity<Object> deleteJsonObjectById(
- @PathVariable("id") final int jsonObjectId) {
- cpService.deleteJsonById(jsonObjectId);
- return new ResponseEntity<>(HttpStatus.NO_CONTENT);
- }
-
- private static void validateJsonStructure(final MultipartFile multipartFile) {
- try {
- final Gson gson = new Gson();
- gson.fromJson(getJsonString(multipartFile), Object.class);
- } catch (final JsonSyntaxException e) {
- throw new DataValidationException("Not a valid JSON file.", e.getMessage(), e);
- }
- }
-
- private static File saveToFile(final MultipartFile multipartFile) {
- try {
- final File file = File.createTempFile("tempFile", ".yang");
- file.deleteOnExit();
- try (final OutputStream outputStream = new FileOutputStream(file)) {
- outputStream.write(multipartFile.getBytes());
- }
- return file;
-
- } catch (final IOException e) {
- throw new CpsException(e);
- }
- }
-
- private static String getJsonString(final MultipartFile multipartFile) {
- try {
- return new String(multipartFile.getBytes());
- } catch (final IOException e) {
- throw new CpsException(e);
- }
- }
}
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy
index d951cbeb69..e427c6063e 100644
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy
@@ -20,7 +20,7 @@
package org.onap.cps.rest.exceptions
import groovy.json.JsonSlurper
-import org.onap.cps.api.CpService
+import org.onap.cps.api.CpsAdminService
import org.onap.cps.spi.exceptions.AnchorAlreadyDefinedException
import org.onap.cps.spi.exceptions.CpsException
import org.onap.cps.spi.exceptions.DataValidationException
@@ -50,12 +50,12 @@ class CpsRestExceptionHandlerSpec extends Specification {
def existingObjectName = 'MyAdminObject'
def cpsRestController = new CpsRestController()
- def mockCpService = Mock(CpService.class)
+ def mockCpsAdminService = Mock(CpsAdminService.class)
def objectUnderTest = new CpsRestExceptionHandler()
def mockMvc = standaloneSetup(cpsRestController).setControllerAdvice(objectUnderTest).build()
def setup() {
- cpsRestController.cpService = mockCpService
+ cpsRestController.cpsAdminService = mockCpsAdminService
}
def 'Get request with runtime exception returns HTTP Status Internal Server Error'() {
@@ -130,11 +130,11 @@ class CpsRestExceptionHandlerSpec extends Specification {
*/
def setupTestException(exception) {
- mockCpService.getJsonById(_) >> { throw exception }
+ mockCpsAdminService.getAnchors(_) >> { throw exception}
}
def performTestRequest() {
- return mockMvc.perform(get('/json-object/1')).andReturn().response
+ return mockMvc.perform(get('/v1/dataspaces/dataspace-name/anchors')).andReturn().response
}
void assertTestResponse(response, expectedStatus, expectedErrorMessage, expectedErrorDetails) {
diff --git a/cps-service/src/main/java/org/onap/cps/api/CpService.java b/cps-service/src/main/java/org/onap/cps/api/CpService.java
deleted file mode 100755
index 29e164d621..0000000000
--- a/cps-service/src/main/java/org/onap/cps/api/CpService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation
- * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
- * ================================================================================
- * 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;
-
-/**
- * Configuration and persistency service interface which holds methods for parsing and storing yang models and data.
- */
-public interface CpService {
-
- /**
- * Store the JSON structure in the database.
- *
- * @param jsonStructure the JSON structure.
- * @return entity ID.
- */
- Integer storeJsonStructure(String jsonStructure);
-
- /**
- * Read a JSON Object using the object identifier.
- *
- * @param jsonObjectId the JSON object identifier.
- * @return the JSON structure.
- */
- String getJsonById(int jsonObjectId);
-
- /**
- * Delete a JSON Object using the object identifier.
- *
- * @param jsonObjectId the JSON object identifier.
- */
- void deleteJsonById(int jsonObjectId);
-
-}
diff --git a/cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java b/cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java
index 94ebea2fc2..325893d6fd 100644
--- a/cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java
+++ b/cps-service/src/main/java/org/onap/cps/api/CpsModuleService.java
@@ -19,7 +19,6 @@
package org.onap.cps.api;
-import java.io.File;
import org.onap.cps.spi.exceptions.CpsException;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -29,22 +28,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
public interface CpsModuleService {
/**
- * Parse and validate a string representing a yang model to generate a schema context.
- *
- * @param yangModelContent the input stream
- * @return the schema context
- */
- SchemaContext parseAndValidateModel(String yangModelContent);
-
- /**
- * Parse and validate a file representing a yang model to generate a schema context.
- *
- * @param yangModelFile the yang file
- * @return the schema context
- */
- SchemaContext parseAndValidateModel(File yangModelFile);
-
- /**
* Store schema context for a yang model.
*
* @param schemaContext the schema context
diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpServiceImpl.java
deleted file mode 100755
index 3ec08cd733..0000000000
--- a/cps-service/src/main/java/org/onap/cps/api/impl/CpServiceImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation
- * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
- * ================================================================================
- * 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 org.onap.cps.api.CpService;
-import org.onap.cps.spi.DataPersistenceService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CpServiceImpl implements CpService {
-
- @Autowired
- private DataPersistenceService dataPersistenceService;
-
-
- @Override
- public final Integer storeJsonStructure(final String jsonStructure) {
- return dataPersistenceService.storeJsonStructure(jsonStructure);
- }
-
- @Override
- public final String getJsonById(final int jsonObjectId) {
- return dataPersistenceService.getJsonById(jsonObjectId);
- }
-
- @Override
- public void deleteJsonById(final int jsonObjectId) {
- dataPersistenceService.deleteJsonById(jsonObjectId);
- }
-} \ No newline at end of file
diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java
index c7fa04759a..2c600b5571 100644
--- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java
+++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsModuleServiceImpl.java
@@ -20,20 +20,12 @@
package org.onap.cps.api.impl;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
import java.util.Optional;
import org.onap.cps.api.CpsModuleService;
import org.onap.cps.spi.CpsModulePersistenceService;
-import org.onap.cps.spi.exceptions.CpsException;
-import org.onap.cps.spi.exceptions.ModelValidationException;
-import org.onap.cps.utils.YangUtils;
import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.parser.api.YangParserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -44,30 +36,6 @@ public class CpsModuleServiceImpl implements CpsModuleService {
private CpsModulePersistenceService cpsModulePersistenceService;
@Override
- public SchemaContext parseAndValidateModel(final String yangModelContent) {
- try {
- final File tempFile = File.createTempFile("yang", ".yang");
- try (final BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile))) {
- writer.write(yangModelContent);
- }
- return parseAndValidateModel(tempFile);
- } catch (final IOException e) {
- throw new CpsException(e);
- }
- }
-
- @Override
- public SchemaContext parseAndValidateModel(final File yangModelFile) {
- try {
- return YangUtils.parseYangModelFile(yangModelFile);
- } catch (final YangParserException e) {
- throw new ModelValidationException("Yang file validation failed", e.getMessage(), e);
- } catch (final IOException e) {
- throw new CpsException(e);
- }
- }
-
- @Override
public void storeSchemaContext(final SchemaContext schemaContext, final String dataspaceName) {
for (final Module module : schemaContext.getModules()) {
final Optional<Revision> optionalRevision = module.getRevision();
diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpServiceImplSpec.groovy
deleted file mode 100755
index 873aba78ab..0000000000
--- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpServiceImplSpec.groovy
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation
- * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
- * ================================================================================
- * 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 org.onap.cps.spi.DataPersistenceService
-import spock.lang.Specification
-
-class CpServiceImplSpec extends Specification {
-
- def mockDataPersistenceService = Mock(DataPersistenceService)
- def objectUnderTest = new CpServiceImpl()
-
- def setup() {
- objectUnderTest.dataPersistenceService = mockDataPersistenceService
- }
-
- def 'Cps Service provides to its client the id assigned by the system when storing a data structure'() {
- given: 'that data persistence service is giving id 123 to a data structure it is asked to store'
- mockDataPersistenceService.storeJsonStructure(_) >> 123
- expect: 'Cps service returns the same id when storing data structure'
- objectUnderTest.storeJsonStructure('') == 123
- }
-
- def 'Read a JSON object with a valid identifier'(){
- given: 'that the data persistence service returns a JSON structure for identifier 1'
- mockDataPersistenceService.getJsonById(1) >> '{name : hello}'
- expect: 'that the same JSON structure is returned by CPS'
- objectUnderTest.getJsonById(1) == '{name : hello}'
- }
-
- def 'Read a JSON object with an identifier that does not exist'(){
- given: 'that the data persistence service throws an exception'
- def exceptionThrownByPersistenceService = new IllegalStateException()
- mockDataPersistenceService.getJsonById(_) >> {throw exceptionThrownByPersistenceService}
- when: 'we try to get the JSON structure'
- objectUnderTest.getJsonById(1);
- then: 'the same exception is thrown by CPS'
- thrown(IllegalStateException)
- }
-
- def 'Delete a JSON object with a valid identifier'(){
- given: 'that the data persistence service can delete a JSON structure for identifier 1'
- mockDataPersistenceService.deleteJsonById(1)
- expect: 'No exception is thrown when we delete a JSON structure with identifier 1'
- objectUnderTest.deleteJsonById(1)
- }
-
- def 'Delete a JSON object with an identifier that does not exist'(){
- given: 'that the data persistence service throws an exception'
- mockDataPersistenceService.deleteJsonById(_) >> {throw new IllegalStateException()}
- when: 'we try to delete a JSON structure'
- objectUnderTest.deleteJsonById(100);
- then: 'the same exception is thrown by CPS'
- thrown(IllegalStateException)
- }
-}
diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModulePersistenceServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModulePersistenceServiceImplSpec.groovy
index da2df404eb..d2a69d6552 100644
--- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModulePersistenceServiceImplSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsModulePersistenceServiceImplSpec.groovy
@@ -35,39 +35,11 @@ class CpsModulePersistenceServiceImplSpec extends Specification {
objectUnderTest.cpsModulePersistenceService = mockModuleStoreService
}
- def 'Parse and Validate a Yang Model with a Valid Yang Model'() {
- given: 'a yang model (file)'
- def yangModel = TestUtils.getResourceFileContent('bookstore.yang')
- when: 'a valid model is parsed and validated'
- def result = objectUnderTest.parseAndValidateModel(yangModel)
- then: 'Verify a schema context for that model is created with the correct identity'
- assertModule(result)
- }
-
- def 'Parse and Validate a Yang Model Using a File'() {
- given: 'a yang file that contains a yang model'
- File file = new File(ClassLoader.getSystemClassLoader().getResource('bookstore.yang').getFile())
- when: 'a model is parsed and validated'
- def result = objectUnderTest.parseAndValidateModel(file)
- then: 'Verify a schema context for that model is created with the correct identity'
- assertModule(result)
-
- }
-
def assertModule(SchemaContext schemaContext) {
def optionalModule = schemaContext.findModule('stores', Revision.of('2020-09-15'))
return schemaContext.modules.size() == 1 && optionalModule.isPresent()
}
- def 'Parse and Validate an Invalid Model'() {
- given: 'a yang file that contains a invalid yang model'
- File file = new File(ClassLoader.getSystemClassLoader().getResource('invalid.yang').getFile())
- when: 'the model is parsed and validated'
- objectUnderTest.parseAndValidateModel(file)
- then: 'a CpsValidationException is thrown'
- thrown(CpsException)
- }
-
def 'Store a SchemaContext'() {
expect: 'No exception to be thrown when a valid model (schema) is stored'
objectUnderTest.storeSchemaContext(Stub(SchemaContext.class), "sampleDataspace")