From: seanbeirne Date: Mon, 21 Jul 2025 15:14:20 +0000 (+0100) Subject: Include ProvMnS interface on ONAP-DMI X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=b8da8a49fbf86817e99bd98e7ef3c1a5641b60c2;p=cps%2Fncmp-dmi-plugin.git Include ProvMnS interface on ONAP-DMI - DMI-stub will be completed on seperate patch - ONAP-DMI will only return 501 NOT_IMPLEMENTED Issue-ID: CPS-2737 Change-Id: Ibf76130734c7293b4b063a9ab6319796fb023771 Signed-off-by: seanbeirne --- diff --git a/dmi-service/.openapi-generator-ignore-provmns b/dmi-service/.openapi-generator-ignore-provmns new file mode 100644 index 00000000..b69e17bd --- /dev/null +++ b/dmi-service/.openapi-generator-ignore-provmns @@ -0,0 +1,16 @@ +# Ignore generation of all the models for ProvMns +target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/*.java + +# Allow generation of the below model for ProvMns +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ClassNameIdPatchDefaultResponse.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponseDefault.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponseDefaultOtherProblemsInner.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponseGet.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponseGetOtherProblemsInner.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponsePatch.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ErrorResponsePatchOtherProblemsInner.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/PatchItem.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/PatchOperation.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ResourceOneOf.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/Scope.java +!target/generated-sources/openapi/src/gen/java/org/onap/cps/ncmp/dmi/provmns/model/ScopeType.java \ No newline at end of file diff --git a/dmi-service/pom.xml b/dmi-service/pom.xml index 463b14fc..8ea98b22 100644 --- a/dmi-service/pom.xml +++ b/dmi-service/pom.xml @@ -423,6 +423,34 @@ + + dmi-code-gen-provmns + + generate + + + https://forge.3gpp.org/rep/all/5G_APIs/-/raw/REL-18/TS28532_ProvMnS.yaml + org.onap.cps.ncmp.dmi.provmns.rest.controller + org.onap.cps.ncmp.dmi.provmns.model + org.onap.cps.ncmp.dmi.provmns.api + spring + false + + src/gen/java + java11 + true + true + true + false + true + + + Resource=org.onap.cps.ncmp.dmi.provmns.model.Resource + ClassNameIdGetDataNodeSelectorParameter=org.onap.cps.ncmp.dmi.provmns.model.ClassNameIdGetDataNodeSelectorParameter + + ${project.basedir}/.openapi-generator-ignore-provmns + + @@ -524,7 +552,7 @@ Low true spotbugs-exclude.xml - true + true true ${basedir}/target/spotbugs @@ -537,6 +565,7 @@ org/onap/cps/ncmp/dmi/model/* org/onap/cps/ncmp/dmi/datajobs/model/* + org/onap/cps/ncmp/dmi/provmns/model/* **/pom.xml diff --git a/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/provmns/model/ClassNameIdGetDataNodeSelectorParameter.java new file mode 100644 index 00000000..56d10740 --- /dev/null +++ b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/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.dmi.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/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/provmns/model/Resource.java b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/provmns/model/Resource.java new file mode 100644 index 00000000..470c7aeb --- /dev/null +++ b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/provmns/model/Resource.java @@ -0,0 +1,32 @@ +/* + * ============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.dmi.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/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/ProvMnsController.java b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/ProvMnsController.java new file mode 100644 index 00000000..1fe5d3de --- /dev/null +++ b/dmi-service/src/main/java/org/onap/cps/ncmp/dmi/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.dmi.rest.controller; + + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.onap.cps.ncmp.dmi.provmns.api.DefaultApi; +import org.onap.cps.ncmp.dmi.provmns.model.ClassNameIdGetDataNodeSelectorParameter; +import org.onap.cps.ncmp.dmi.provmns.model.Resource; +import org.onap.cps.ncmp.dmi.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/dmi-service/src/main/resources/application.yml b/dmi-service/src/main/resources/application.yml index 7ba9b256..285a8bf4 100644 --- a/dmi-service/src/main/resources/application.yml +++ b/dmi-service/src/main/resources/application.yml @@ -28,9 +28,10 @@ dmi: rest: api: dmi-base-path: /dmi + provmns-base-path: /ProvMnS security: - permit-uri: /actuator/**,/swagger-ui.html,/swagger-ui/**,/swagger-resources/**,/api-docs/**,/v3/api-docs/** + permit-uri: /actuator/**,/swagger-ui.html,/swagger-ui/**,/swagger-resources/**,/api-docs/**,/v3/api-docs/**,/ProvMnS/** auth: username: ${DMI_USERNAME} password: ${DMI_PASSWORD} diff --git a/dmi-service/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/ProvMnsControllerSpec.groovy b/dmi-service/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/ProvMnsControllerSpec.groovy new file mode 100644 index 00000000..0c97f671 --- /dev/null +++ b/dmi-service/src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/ProvMnsControllerSpec.groovy @@ -0,0 +1,98 @@ +/* + * ============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.dmi.rest.controller + +import com.fasterxml.jackson.databind.ObjectMapper +import org.onap.cps.ncmp.dmi.config.WebSecurityConfig +import org.onap.cps.ncmp.dmi.provmns.model.ResourceOneOf +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.context.annotation.Import +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) +@Import(WebSecurityConfig) +class ProvMnsControllerSpec extends Specification { + + @Autowired + MockMvc mvc + + def objectMapper = 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 = objectMapper.writeValueAsString((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 = objectMapper.writeValueAsString((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/dmi-service/src/test/resources/application.yml b/dmi-service/src/test/resources/application.yml index 2a6269a1..f3dda8b8 100644 --- a/dmi-service/src/test/resources/application.yml +++ b/dmi-service/src/test/resources/application.yml @@ -19,9 +19,10 @@ rest: api: dmi-base-path: /dmi + provmns-base-path: /ProvMnS security: - permit-uri: /actuator/**,/swagger-ui/**,/swagger-resources/**,/v3/api-docs + permit-uri: /actuator/**,/swagger-ui/**,/swagger-resources/**,/v3/api-docs,/ProvMnS/** auth: username: cpsuser password: cpsr0cks!