From dbe68d7e74c70029402d9918a128b826969e083a Mon Sep 17 00:00:00 2001 From: seanbeirne Date: Tue, 8 Jul 2025 09:55:56 +0100 Subject: [PATCH] Create controller for ProvMnS interface on NCMP - New endpoints return 501 Not Implemented. Full implementation to be completed in later patch - Parameter descriptions pulled from 3GPP documentation (ref to wiki) - TODO: implement southbound interface forwarding in NCMP Issue-ID: CPS-2702 Change-Id: I38e1c518e166991ee1f78858edbcbea63ba744cc Signed-off-by: seanbeirne --- cps-application/src/main/resources/application.yml | 1 + cps-application/src/test/resources/application.yml | 1 + cps-ncmp-rest/.openapi-generator-ignore-provmns | 1 - cps-ncmp-rest/pom.xml | 1 + .../ncmp/rest/controller/ProvMnsController.java | 107 +++++++++++++++++ .../ClassNameIdGetDataNodeSelectorParameter.java | 36 ++++++ .../onap/cps/ncmp/rest/provmns/model/Resource.java | 5 + .../rest/controller/ProvMnsControllerSpec.groovy | 97 ++++++++++++++++ cps-ncmp-rest/src/test/resources/application.yml | 1 + .../ncmp/provmns/ProvMnSRestApiSpec.groovy | 66 +++++++++++ .../src/test/resources/application.yml | 1 + postman-collections/CPS.postman_collection.json | 129 ++++++++++++++++++++- 12 files changed, 442 insertions(+), 4 deletions(-) create mode 100644 cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/ProvMnsController.java create mode 100644 cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java create mode 100644 cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/ProvMnsControllerSpec.groovy create mode 100644 integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/provmns/ProvMnSRestApiSpec.groovy diff --git a/cps-application/src/main/resources/application.yml b/cps-application/src/main/resources/application.yml index 26cc9e034a..d95e69e840 100644 --- a/cps-application/src/main/resources/application.yml +++ b/cps-application/src/main/resources/application.yml @@ -27,6 +27,7 @@ rest: cps-base-path: /cps/api ncmp-base-path: /ncmp ncmp-inventory-base-path: /ncmpInventory + provmns-base-path: /ProvMnS spring: main: diff --git a/cps-application/src/test/resources/application.yml b/cps-application/src/test/resources/application.yml index e20aa0c4ed..e0c827bb52 100644 --- a/cps-application/src/test/resources/application.yml +++ b/cps-application/src/test/resources/application.yml @@ -25,6 +25,7 @@ rest: cps-base-path: /cps/api ncmp-base-path: /ncmp ncmp-inventory-base-path: /ncmpInventory + provmns-base-path: /ProvMnS spring: main: diff --git a/cps-ncmp-rest/.openapi-generator-ignore-provmns b/cps-ncmp-rest/.openapi-generator-ignore-provmns index 6c9fb321e9..1f910ae19b 100644 --- a/cps-ncmp-rest/.openapi-generator-ignore-provmns +++ b/cps-ncmp-rest/.openapi-generator-ignore-provmns @@ -2,7 +2,6 @@ target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/rest/provmns/model/*.java # Allow generation of the below model for ProvMns -!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java !target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdPatchDefaultResponse.java !target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/rest/provmns/model/ErrorResponseDefault.java !target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/rest/provmns/model/ErrorResponseDefaultOtherProblemsInner.java diff --git a/cps-ncmp-rest/pom.xml b/cps-ncmp-rest/pom.xml index 19eb73a647..58e0458241 100644 --- a/cps-ncmp-rest/pom.xml +++ b/cps-ncmp-rest/pom.xml @@ -203,6 +203,7 @@ Resource=org.onap.cps.ncmp.rest.provmns.model.Resource + ClassNameIdGetDataNodeSelectorParameter=org.onap.cps.ncmp.rest.provmns.model.ClassNameIdGetDataNodeSelectorParameter ${project.basedir}/.openapi-generator-ignore-provmns diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/ProvMnsController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/ProvMnsController.java new file mode 100644 index 0000000000..042254462a --- /dev/null +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/ProvMnsController.java @@ -0,0 +1,107 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * 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.ncmp.rest.controller; + + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.onap.cps.ncmp.rest.provmns.api.DefaultApi; +import org.onap.cps.ncmp.rest.provmns.model.ClassNameIdGetDataNodeSelectorParameter; +import org.onap.cps.ncmp.rest.provmns.model.Resource; +import org.onap.cps.ncmp.rest.provmns.model.Scope; +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.provmns-base-path}") +@RequiredArgsConstructor +public class ProvMnsController implements DefaultApi { + + /** + * Replaces a complete single resource or creates it if it does not exist. + * + * @param className Class name of the targeted resource + * @param id Identifier of the targeted resource + * @param resource Resource representation of the resource to be created or replaced + * @return {@code ResponseEntity} The representation of the updated resource is returned in the response + * message body. + */ + @Override + public ResponseEntity classNameidPut(final String className, final String id, final Resource resource) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + /** + * Reads one or multiple resources. + * + * @param className Class name of the targeted resource + * @param id Identifier of the targeted resource + * @param scope Extends the set of targeted resources beyond the base + * resource identified with the authority and path component of + * the URI. + * @param filter Reduces the targeted set of resources by applying a filter to + * the scoped set of resource representations. Only resources + * representations for which the filter construct evaluates to + * "true" are targeted. + * @param attributes Attributes of the scoped resources to be returned. The + * value is a comma-separated list of attribute names. + * @param fields Attribute fields of the scoped resources to be returned. The + * value is a comma-separated list of JSON pointers to the + * attribute fields. + * @param dataNodeSelector dataNodeSelector object + * @return {@code ResponseEntity} The resources identified in the request for retrieval are returned + * in the response message body. + */ + @Override + public ResponseEntity classNameidGet(final String className, final String id, final Scope scope, + final String filter, final List attributes, + final List fields, + final ClassNameIdGetDataNodeSelectorParameter dataNodeSelector) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + /** + * Patches (Create, Update or Delete) one or multiple resources. + * + * @param className Class name of the targeted resource + * @param id Identifier of the targeted resource + * @param resource Resource representation of the resource to be created or replaced + * @return {@code ResponseEntity} The updated resource representations are returned in the response message body. + */ + @Override + public ResponseEntity classNameidPatch(final String className, final String id, final Resource resource) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + /** + * Delete one or multiple resources. + * + * @param className Class name of the targeted resource + * @param id Identifier of the targeted resource + * @return {@code ResponseEntity} The response body is empty, HTTP status returned. + */ + @Override + public ResponseEntity classNameidDelete(final String className, final String id) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } +} diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java new file mode 100644 index 0000000000..4b4975fd2d --- /dev/null +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * 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.ncmp.rest.provmns.model; + +import lombok.Getter; +import lombok.Setter; + +/** + * This class serves as a replacement for the generated ClassNameIdGetDataNodeSelector class which contains dependencies + * that cause code generation issues. + */ +@Getter +@Setter +public class ClassNameIdGetDataNodeSelectorParameter { + + private String dataNodeSelector; + +} diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/Resource.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/Resource.java index 29b3783da6..ab85bab1a2 100644 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/Resource.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/provmns/model/Resource.java @@ -20,8 +20,13 @@ package org.onap.cps.ncmp.rest.provmns.model; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + /** * This interface serves as a replacement for the generated Resource class, which has dependencies on the NRM-related * models that we want to avoid for our implementation of Provisioning and Management Services (ProvMnS) API. */ +@JsonSerialize(as = ResourceOneOf.class) +@JsonDeserialize(as = ResourceOneOf.class) public interface Resource { } diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/ProvMnsControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/ProvMnsControllerSpec.groovy new file mode 100644 index 0000000000..fbaa0c1bec --- /dev/null +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/ProvMnsControllerSpec.groovy @@ -0,0 +1,97 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 OpenInfra Foundation Europe. 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.ncmp.rest.controller + +import com.fasterxml.jackson.databind.ObjectMapper +import org.onap.cps.ncmp.rest.provmns.model.ResourceOneOf +import org.onap.cps.utils.JsonObjectMapper +import org.spockframework.spring.SpringBean +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.test.web.servlet.MockMvc +import spock.lang.Specification + +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.patch +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put + +@WebMvcTest(ProvMnsController) +class ProvMnsControllerSpec extends Specification { + + @Autowired + MockMvc mvc + + def jsonObjectMapper = new JsonObjectMapper(new ObjectMapper()) + + @Value('${rest.api.provmns-base-path}') + def provMnSBasePath + + def 'Get Resource Data from provmns interface.'() { + given: 'resource data url' + def getUrl = "$provMnSBasePath/test=another" + when: 'get data resource request is performed' + def response = mvc.perform(get(getUrl).contentType(MediaType.APPLICATION_JSON)).andReturn().response + then: 'response status is Not Implemented (501)' + assert response.status == HttpStatus.NOT_IMPLEMENTED.value() + } + + def 'Put Resource Data from provmns interface.'() { + given: 'resource data url' + def putUrl = "$provMnSBasePath/test=another" + and: 'an example resource json object' + def jsonBody = jsonObjectMapper.asJsonString(new ResourceOneOf('test')) + when: 'put data resource request is performed' + def response = mvc.perform(put(putUrl) + .contentType(MediaType.APPLICATION_JSON) + .content(jsonBody)) + .andReturn().response + then: 'response status is Not Implemented (501)' + assert response.status == HttpStatus.NOT_IMPLEMENTED.value() + } + + def 'Patch Resource Data from provmns interface.'() { + given: 'resource data url' + def patchUrl = "$provMnSBasePath/test=another" + and: 'an example resource json object' + def jsonBody = jsonObjectMapper.asJsonString(new ResourceOneOf('test')) + when: 'patch data resource request is performed' + def response = mvc.perform(patch(patchUrl) + .contentType(new MediaType('application', 'json-patch+json')) + .content(jsonBody)) + .andReturn().response + then: 'response status is Not Implemented (501)' + assert response.status == HttpStatus.NOT_IMPLEMENTED.value() + } + + def 'Delete Resource Data from provmns interface.'() { + given: 'resource data url' + def deleteUrl = "$provMnSBasePath/test=another" + when: 'delete data resource request is performed' + def response = mvc.perform(delete(deleteUrl)).andReturn().response + then: 'response status is Not Implemented (501)' + assert response.status == HttpStatus.NOT_IMPLEMENTED.value() + } + +} diff --git a/cps-ncmp-rest/src/test/resources/application.yml b/cps-ncmp-rest/src/test/resources/application.yml index aa5716716b..aa7f53a48b 100644 --- a/cps-ncmp-rest/src/test/resources/application.yml +++ b/cps-ncmp-rest/src/test/resources/application.yml @@ -21,6 +21,7 @@ rest: api: ncmp-base-path: /ncmp ncmp-inventory-base-path: /ncmpInventory + provmns-base-path: /ProvMnS notification: enabled: true diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/provmns/ProvMnSRestApiSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/provmns/ProvMnSRestApiSpec.groovy new file mode 100644 index 0000000000..29222a9dd2 --- /dev/null +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/provmns/ProvMnSRestApiSpec.groovy @@ -0,0 +1,66 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2025 OpenInfra Foundation Europe. 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.integration.functional.ncmp.provmns + +import org.onap.cps.integration.base.CpsIntegrationSpecBase +import org.onap.cps.ncmp.rest.provmns.model.ResourceOneOf +import org.springframework.http.MediaType + +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.patch +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status + +class ProvMnSRestApiSpec extends CpsIntegrationSpecBase{ + + def 'Get Resource Data from provmns interface.'() { + expect: 'not implemented response on GET endpoint' + mvc.perform(get("/ProvMnS/SampleClassName=SampleId")) + .andExpect(status().isNotImplemented()) + } + + def 'Put Resource Data from provmns interface.'() { + given: 'an example resource json body' + def jsonBody = jsonObjectMapper.asJsonString(new ResourceOneOf('test')) + expect: 'not implemented response on PUT endpoint' + mvc.perform(put("/ProvMnS/SampleClassName=SampleId") + .contentType(MediaType.APPLICATION_JSON) + .content(jsonBody)) + .andExpect(status().isNotImplemented()) + } + + def 'Patch Resource Data from provmns interface.'() { + given: 'an example resource json body' + def jsonBody = jsonObjectMapper.asJsonString(new ResourceOneOf('test')) + expect: 'not implemented response on PATCH endpoint' + mvc.perform(patch("/ProvMnS/SampleClassName=SampleId") + .contentType(new MediaType('application', 'json-patch+json')) + .content(jsonBody)) + .andExpect(status().isNotImplemented()) + } + + def 'Delete Resource Data from provmns interface.'() { + expect: 'not implemented response on DELETE endpoint' + mvc.perform(delete("/ProvMnS/SampleClassName=SampleId")) + .andExpect(status().isNotImplemented()) + } +} diff --git a/integration-test/src/test/resources/application.yml b/integration-test/src/test/resources/application.yml index 104034a92e..f1ae7efdc4 100644 --- a/integration-test/src/test/resources/application.yml +++ b/integration-test/src/test/resources/application.yml @@ -20,6 +20,7 @@ rest: cps-base-path: /cps/api ncmp-base-path: /ncmp ncmp-inventory-base-path: /ncmpInventory + provmns-base-path: /ProvMnS spring: main: diff --git a/postman-collections/CPS.postman_collection.json b/postman-collections/CPS.postman_collection.json index eab8605b26..9f335d6d4d 100644 --- a/postman-collections/CPS.postman_collection.json +++ b/postman-collections/CPS.postman_collection.json @@ -1,11 +1,10 @@ { "info": { - "_postman_id": "972d83a9-62bc-4cdb-aa41-9c6e17cb9846", + "_postman_id": "1a955ed1-f754-4206-a3dd-b2b975b3098f", "name": "CPS", "description": "\n\n# [CPS ONAP Documentation](https://docs.onap.org/projects/onap-cps/en/latest/index.html)\n\n# [DMI ONAP Documentation](https://docs.onap.org/projects/onap-cps-ncmp-dmi-plugin/en/latest/index.html)\n\n### How-to\n\nBuild CPS docker images with maven:\n\n`mvn clean install`\n\nor\n\n`mvn clean install -DskipTests`\n\nNavigate to docker-compose folder:\n\n`cd .\\docker-compose\\`\n\nBring up docker containers using commands found in docker-compose.yaml or run CPS services including dmi plugin\n\n`docker-compose --profile dmi-service up -d`\n\n### CPS-Enviroment\n\nTo enable the CPS enviroment, go to the top right of the screen in Postman and click envrioments. Import the CPS-envrioment file from the Postman Collections file in CPS.\n\n**To utilise NCMP-DMI-Stub endpoints begin the docker containers with:**\n\n`docker-compose --profile dmi-stub --profile monitoring up -d`\n\n# CPS Core Example\n\n- Create dataspace\n \n- Verify dataspace exists\n \n- etc...\n \n\n# CPS-NCMP Example\n\n- Create CM handles\n \n- Verify CM handles exist\n \n- etc...", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "16927565", - "_collection_link": "https://cps555.postman.co/workspace/CPS-Workspace~388a7e32-81fe-4932-8636-02ccf8b51aca/collection/16927565-972d83a9-62bc-4cdb-aa41-9c6e17cb9846?action=share&source=collection_link&creator=16927565" + "_exporter_id": "26733783" }, "item": [ { @@ -1093,6 +1092,130 @@ { "name": "Northbound (rApps)", "item": [ + { + "name": "ProvMnS", + "item": [ + { + "name": "Get Resource Data", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "" + }, + "url": { + "raw": "http://{{CPS_HOST}}:{{CPS_PORT}}/ProvMnS/test=another", + "protocol": "http", + "host": [ + "{{CPS_HOST}}" + ], + "port": "{{CPS_PORT}}", + "path": [ + "ProvMnS", + "test=another" + ] + } + }, + "response": [] + }, + { + "name": "Patch Resource Data", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "content-type": true + } + }, + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json-patch+json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"test\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{CPS_HOST}}:{{CPS_PORT}}/ProvMnS/test=another", + "protocol": "http", + "host": [ + "{{CPS_HOST}}" + ], + "port": "{{CPS_PORT}}", + "path": [ + "ProvMnS", + "test=another" + ] + } + }, + "response": [] + }, + { + "name": "Put Resource Data", + "protocolProfileBehavior": { + "disabledSystemHeaders": {} + }, + "request": { + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"test\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://{{CPS_HOST}}:{{CPS_PORT}}/ProvMnS/test=another", + "protocol": "http", + "host": [ + "{{CPS_HOST}}" + ], + "port": "{{CPS_PORT}}", + "path": [ + "ProvMnS", + "test=another" + ] + } + }, + "response": [] + }, + { + "name": "Delete Resource Data", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "http://{{CPS_HOST}}:{{CPS_PORT}}/ProvMnS/test=another", + "protocol": "http", + "host": [ + "{{CPS_HOST}}" + ], + "port": "{{CPS_PORT}}", + "path": [ + "ProvMnS", + "test=another" + ] + } + }, + "response": [] + } + ] + }, { "name": "Get module references", "protocolProfileBehavior": { -- 2.16.6