aboutsummaryrefslogtreecommitdiffstats
path: root/cps-ncmp-rest
diff options
context:
space:
mode:
authorDylanB95EST <dylan.byrne@est.tech>2021-07-02 13:30:42 +0100
committerDylanB95EST <dylan.byrne@est.tech>2021-08-03 16:47:24 +0100
commit4f4178c7af4ca5571a0813a5c79f35b11c825d35 (patch)
tree0167aaaf7f51498499acb572c8e7995474b9ac9f /cps-ncmp-rest
parent15b93e7ad7db7372d51c4c1ad45f95d463aaaffc (diff)
Implement DMI Registration (NCMP-Side)
Implementing registration of CM-Handles to NCMP from DMI CM Handles are Written to fragment tables Moved NetworkCmProxyDataServiceImplSpec.groovy as it was not in the same package as the class it was testing. Meaning it didn't cover this when it came to code coverage Have included Json structure validation also within open api Deprecating old API's along with old API Methods Issue-ID: CPS-442 Change-Id: I819b9bf65280b1d968d3b75ca5ef2f9eb5617579 Signed-off-by: DylanB95EST <dylan.byrne@est.tech>
Diffstat (limited to 'cps-ncmp-rest')
-rw-r--r--cps-ncmp-rest/docs/openapi/components.yaml34
-rwxr-xr-xcps-ncmp-rest/docs/openapi/ncmproxy.yml29
-rwxr-xr-xcps-ncmp-rest/docs/openapi/openapi.yml3
-rwxr-xr-xcps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java76
-rw-r--r--cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy40
-rw-r--r--cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java54
-rw-r--r--cps-ncmp-rest/src/test/resources/dmi-registration.json11
7 files changed, 224 insertions, 23 deletions
diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml
index 26d55bf65..9921041cf 100644
--- a/cps-ncmp-rest/docs/openapi/components.yaml
+++ b/cps-ncmp-rest/docs/openapi/components.yaml
@@ -29,14 +29,33 @@ components:
type: string
details:
type: string
- MultipartFile:
+
+ RestDmiPluginRegistration:
+ type: object
+ properties:
+ dmiPlugin:
+ type: string
+ example: onap-dmi-plugin
+ createdCmHandles:
+ type: array
+ items:
+ $ref: '#/components/schemas/RestCmHandle'
+
+ RestCmHandle:
required:
- - file
+ - cmHandle
+ type: object
properties:
- multipartFile:
+ cmHandle:
type: string
- description: multipartFile
- format: binary
+ example: cmHandle123
+ cmHandleProperties:
+ $ref: '#/components/schemas/RestCmHandleAdditionalProperties'
+ RestCmHandleAdditionalProperties:
+ type: object
+ additionalProperties:
+ type: string
+ example: system-001
parameters:
cmHandleInPath:
@@ -124,10 +143,7 @@ components:
type: object
Created:
description: Created
- content:
- text/plain:
- schema:
- type: string
+ content: {}
NoContent:
description: No Content
content: {}
diff --git a/cps-ncmp-rest/docs/openapi/ncmproxy.yml b/cps-ncmp-rest/docs/openapi/ncmproxy.yml
index 6ed4f0223..3ec7bfd11 100755
--- a/cps-ncmp-rest/docs/openapi/ncmproxy.yml
+++ b/cps-ncmp-rest/docs/openapi/ncmproxy.yml
@@ -20,6 +20,7 @@
nodeByCmHandleAndXpath:
get:
description: Get a node with an option to retrieve all the children for a given cm Handle
+ deprecated: true
tags:
- network-cm-proxy
summary: Get a node given a cm Handle and xpath
@@ -43,6 +44,7 @@ nodeByCmHandleAndXpath:
nodesByCmHandleAndCpsPath:
get:
description: Query nodes for the given cps path and cm Handle
+ deprecated: true
tags:
- network-cm-proxy
summary: Query data nodes
@@ -66,6 +68,7 @@ nodesByCmHandleAndCpsPath:
nodesByCmHandleAndXpath:
post:
description: Create a node with descendants for the given CM Handle; top level or under existing node (requires xpath)
+ deprecated: true
tags:
- network-cm-proxy
summary: Create a node with descendants
@@ -93,6 +96,7 @@ nodesByCmHandleAndXpath:
patch:
description: Update node leaves for the given cps path and cm Handle
+ deprecated: true
tags:
- network-cm-proxy
summary: Update node leaves
@@ -120,6 +124,7 @@ nodesByCmHandleAndXpath:
put:
description: Replace a node with descendants for the given cps path and cm Handle
+ deprecated: true
tags:
- network-cm-proxy
summary: Replace a node with descendants
@@ -148,6 +153,7 @@ nodesByCmHandleAndXpath:
listNodeByCmHandleAndXpath:
post:
description: Add one or more list-node child elements under existing node for the given CM Handle
+ deprecated: true
tags:
- network-cm-proxy
summary: Add list-node child element(s)
@@ -172,3 +178,26 @@ listNodeByCmHandleAndXpath:
$ref: 'components.yaml#/components/responses/Forbidden'
404:
$ref: 'components.yaml#/components/responses/NotFound'
+
+updateDmiRegistration:
+ post:
+ description: Register a DMI Plugin with any new CM Handles.
+ tags:
+ - network-cm-proxy
+ summary: DMI notifies NCMP of new CM Handles
+ operationId: updateDmiPluginRegistration
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: 'components.yaml#/components/schemas/RestDmiPluginRegistration'
+ responses:
+ 201:
+ $ref: 'components.yaml#/components/responses/Created'
+ 400:
+ $ref: 'components.yaml#/components/responses/BadRequest'
+ 401:
+ $ref: 'components.yaml#/components/responses/Unauthorized'
+ 403:
+ $ref: 'components.yaml#/components/responses/Forbidden' \ No newline at end of file
diff --git a/cps-ncmp-rest/docs/openapi/openapi.yml b/cps-ncmp-rest/docs/openapi/openapi.yml
index c77f9a7bc..64de9223f 100755
--- a/cps-ncmp-rest/docs/openapi/openapi.yml
+++ b/cps-ncmp-rest/docs/openapi/openapi.yml
@@ -36,3 +36,6 @@ paths:
/v1/cm-handles/{cm-handle}/nodes:
$ref: 'ncmproxy.yml#/nodesByCmHandleAndXpath'
+
+ /ncmp-dmi/v1/ch:
+ $ref: 'ncmproxy.yml#/updateDmiRegistration' \ No newline at end of file
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
index 484a21ae6..e9e022345 100755
--- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
@@ -21,46 +21,75 @@
package org.onap.cps.ncmp.rest.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Collection;
import javax.validation.Valid;
import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
+import org.onap.cps.ncmp.api.models.DmiPluginRegistration;
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.utils.DataMapUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-
@RestController
@RequestMapping("${rest.api.ncmp-base-path}")
public class NetworkCmProxyController implements NetworkCmProxyApi {
private static final Gson GSON = new GsonBuilder().create();
- @Autowired
- private NetworkCmProxyDataService networkCmProxyDataService;
+ private final NetworkCmProxyDataService networkCmProxyDataService;
+ private final ObjectMapper objectMapper;
+
+ /**
+ * Constructor Injection for Dependencies.
+ * @param networkCmProxyDataService Data Service Interface
+ * @param objectMapper Object Mapper
+ */
+ public NetworkCmProxyController(final NetworkCmProxyDataService networkCmProxyDataService,
+ final ObjectMapper objectMapper) {
+ this.networkCmProxyDataService = networkCmProxyDataService;
+ this.objectMapper = objectMapper;
+ }
+
+ /**
+ * Create Node.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
@Override
- public ResponseEntity<String> createNode(final String jsonData, final String cmHandle,
+ @Deprecated(forRemoval = false)
+ public ResponseEntity<Void> createNode(final String jsonData, final String cmHandle,
final String parentNodeXpath) {
networkCmProxyDataService.createDataNode(cmHandle, parentNodeXpath, jsonData);
return new ResponseEntity<>(HttpStatus.CREATED);
}
+ /**
+ * Add List-node Child Element.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
@Override
- public ResponseEntity<String> addListNodeElements(final String jsonData, final String parentNodeXpath,
+ @Deprecated(forRemoval = false)
+ public ResponseEntity<Void> addListNodeElements(final String jsonData, final String parentNodeXpath,
final String cmHandle) {
networkCmProxyDataService.addListNodeElements(cmHandle, parentNodeXpath, jsonData);
return new ResponseEntity<>(HttpStatus.CREATED);
}
+ /**
+ * Get Node By CM Handle and X-Path.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
@Override
+ @Deprecated(forRemoval = false)
public ResponseEntity<Object> getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath,
@Valid final Boolean includeDescendants) {
final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
@@ -69,7 +98,25 @@ public class NetworkCmProxyController implements NetworkCmProxyApi {
return new ResponseEntity<>(DataMapUtils.toDataMap(dataNode), HttpStatus.OK);
}
+ /**
+ * Update DMI Plugin Registration (used for first registration also).
+ * @param restDmiPluginRegistration the registration data
+ */
@Override
+ public ResponseEntity<Void> updateDmiPluginRegistration(
+ final @Valid RestDmiPluginRegistration restDmiPluginRegistration) {
+ final DmiPluginRegistration dmiPluginRegistration =
+ convertRestObjectToJavaApiObject(restDmiPluginRegistration);
+ networkCmProxyDataService.updateDmiPluginRegistration(dmiPluginRegistration);
+ return new ResponseEntity<>(HttpStatus.CREATED);
+ }
+
+ /**
+ * Query Data Nodes.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
+ @Override
+ @Deprecated(forRemoval = false)
public ResponseEntity<Object> queryNodesByCmHandleAndCpsPath(final String cmHandle, @Valid final String cpsPath,
@Valid final Boolean includeDescendants) {
final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
@@ -79,17 +126,34 @@ public class NetworkCmProxyController implements NetworkCmProxyApi {
return new ResponseEntity<>(GSON.toJson(dataNodes), HttpStatus.OK);
}
+ /**
+ * Replace Node With Descendants.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
@Override
+ @Deprecated(forRemoval = false)
public ResponseEntity<Object> replaceNode(@Valid final String jsonData, final String cmHandle,
@Valid final String parentNodeXpath) {
networkCmProxyDataService.replaceNodeTree(cmHandle, parentNodeXpath, jsonData);
return new ResponseEntity<>(HttpStatus.OK);
}
+ /**
+ * Update Node Leaves.
+ * @deprecated This Method is no longer used as part of NCMP.
+ */
@Override
+ @Deprecated(forRemoval = false)
public ResponseEntity<Object> updateNodeLeaves(@Valid final String jsonData, final String cmHandle,
@Valid final String parentNodeXpath) {
networkCmProxyDataService.updateNodeLeaves(cmHandle, parentNodeXpath, jsonData);
return new ResponseEntity<>(HttpStatus.OK);
}
+
+
+ private DmiPluginRegistration convertRestObjectToJavaApiObject(
+ final RestDmiPluginRegistration restDmiPluginRegistration) {
+ return objectMapper.convertValue(restDmiPluginRegistration, DmiPluginRegistration.class);
+ }
+
}
diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
index 45e8f1194..f537980ac 100644
--- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
+++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy
@@ -28,7 +28,9 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put
+import com.fasterxml.jackson.databind.ObjectMapper
import com.google.gson.Gson
+import org.onap.cps.TestUtils
import org.onap.cps.ncmp.api.NetworkCmProxyDataService
import org.onap.cps.spi.model.DataNodeBuilder
import org.spockframework.spring.SpringBean
@@ -49,13 +51,19 @@ class NetworkCmProxyControllerSpec extends Specification {
@SpringBean
NetworkCmProxyDataService mockNetworkCmProxyDataService = Mock()
+ @SpringBean
+ ObjectMapper objectMapper = new ObjectMapper()
+
@Value('${rest.api.ncmp-base-path}')
def basePath
- def dataNodeBaseEndpoint
+ def deprecatedDataNodeBaseEndPoint
+
+ def ncmpDmiEndpoint
def setup() {
- dataNodeBaseEndpoint = "$basePath/v1"
+ deprecatedDataNodeBaseEndPoint = "$basePath/v1"
+ ncmpDmiEndpoint = "$basePath/ncmp-dmi/v1"
}
def cmHandle = 'some handle'
@@ -67,7 +75,7 @@ class NetworkCmProxyControllerSpec extends Specification {
def cpsPath = 'some cps-path'
mockNetworkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, expectedCpsDataServiceOption) >> [dataNode]
and: 'the query endpoint'
- def dataNodeEndpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes/query"
+ def dataNodeEndpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes/query"
when: 'query data nodes API is invoked'
def response = mvc.perform(get(dataNodeEndpoint)
.param('cps-path', cpsPath)
@@ -89,7 +97,7 @@ class NetworkCmProxyControllerSpec extends Specification {
def jsonData = 'json data'
when: 'post request is performed'
def response = mvc.perform(
- post("$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes")
+ post("$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes")
.contentType(MediaType.APPLICATION_JSON)
.content(jsonData)
.param('xpath', reqXpath)
@@ -111,7 +119,7 @@ class NetworkCmProxyControllerSpec extends Specification {
def parentNodeXpath = 'parent node xpath'
when: 'post request is performed'
def response = mvc.perform(
- post("$dataNodeBaseEndpoint/cm-handles/$cmHandle/list-node")
+ post("$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/list-node")
.contentType(MediaType.APPLICATION_JSON)
.content(jsonData)
.param('xpath', parentNodeXpath)
@@ -126,7 +134,7 @@ class NetworkCmProxyControllerSpec extends Specification {
given: 'json data'
def jsonData = 'json data'
and: 'the query endpoint'
- def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+ def endpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes"
when: 'patch request is performed'
def response = mvc.perform(
patch(endpoint)
@@ -144,7 +152,7 @@ class NetworkCmProxyControllerSpec extends Specification {
given: 'json data'
def jsonData = 'json data'
and: 'the query endpoint'
- def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/nodes"
+ def endpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/nodes"
when: 'put request is performed'
def response = mvc.perform(
put(endpoint)
@@ -164,7 +172,7 @@ class NetworkCmProxyControllerSpec extends Specification {
def dataNode = new DataNodeBuilder().withXpath(xpath).withLeaves(["leaf": "value"]).build()
mockNetworkCmProxyDataService.getDataNode(cmHandle, xpath, OMIT_DESCENDANTS) >> dataNode
and: 'the query endpoint'
- def endpoint = "$dataNodeBaseEndpoint/cm-handles/$cmHandle/node"
+ def endpoint = "$deprecatedDataNodeBaseEndPoint/cm-handles/$cmHandle/node"
when: 'get request is performed through REST API'
def response = mvc.perform(get(endpoint).param('xpath', xpath)).andReturn().response
then: 'a success response is returned'
@@ -172,5 +180,21 @@ class NetworkCmProxyControllerSpec extends Specification {
and: 'response contains expected leaf and value'
response.contentAsString.contains('"leaf":"value"')
}
+
+ def 'Register CM Handle Event' () {
+ given: 'jsonData'
+ def jsonData = TestUtils.getResourceFileContent('dmi-registration.json')
+ when: 'post request is performed'
+ def response = mvc.perform(
+ post("$ncmpDmiEndpoint/ch")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(jsonData)
+ ).andReturn().response
+ then: 'the cm handles are registered with the service'
+ 1 * mockNetworkCmProxyDataService.updateDmiPluginRegistration(_)
+ and: 'response status is created'
+ response.status == HttpStatus.CREATED.value()
+ }
+
}
diff --git a/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java b/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java
new file mode 100644
index 000000000..4a6f5e516
--- /dev/null
+++ b/cps-ncmp-rest/src/test/java/org/onap/cps/TestUtils.java
@@ -0,0 +1,54 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation
+ * ================================================================================
+ * 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;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+/**
+ * Common convenience methods for testing.
+ */
+public class TestUtils {
+
+ /**
+ * Convert a file in the test resource folder to file.
+ *
+ * @param filename to name of the file in test/resources
+ * @return the file
+ * @throws IOException when there is an IO issue
+ */
+ public static File readFile(final String filename) {
+ return new File(ClassLoader.getSystemClassLoader().getResource(filename).getFile());
+ }
+
+ /**
+ * Convert a file in the test resource folder to a string.
+ *
+ * @param filename to name of the file in test/resources
+ * @return the content of the file as a String
+ * @throws IOException when there is an IO issue
+ */
+ public static String getResourceFileContent(final String filename) throws IOException {
+ final File file = readFile(filename);
+ return new String(Files.readAllBytes(file.toPath()));
+ }
+}
diff --git a/cps-ncmp-rest/src/test/resources/dmi-registration.json b/cps-ncmp-rest/src/test/resources/dmi-registration.json
new file mode 100644
index 000000000..24bc9f963
--- /dev/null
+++ b/cps-ncmp-rest/src/test/resources/dmi-registration.json
@@ -0,0 +1,11 @@
+{
+ "dmiPlugin": "onap-dmi-plugin",
+ "createdCmHandles": [
+ {
+ "cmHandle": "example-name",
+ "cmHandleProperties": {
+ "subSystemId" : "system-001"
+ }
+ }
+ ]
+} \ No newline at end of file