diff options
author | lapentafd <francesco.lapenta@est.tech> | 2022-12-12 14:28:41 +0000 |
---|---|---|
committer | lapentafd <francesco.lapenta@est.tech> | 2022-12-14 10:13:06 +0000 |
commit | c92368c89f334c3a6a84c3c67aea05dce1db66f8 (patch) | |
tree | 6b37b335ffd57baa200b37e801a209d87a4d1ceb /runtime-acm/src/main | |
parent | 06d4bbe578678619be4d948fde42223719e82cf1 (diff) |
Server stubs for acm runtime
- Added spring profile "stub"
- Added Commission and Instantiation stub controllers
- Added util function that decodes the object from the openapi/examples
- Added 2 missing examples
- Added Unit Test for stub controllers
Issue-ID: POLICY-4143
Change-Id: Ife91a74e93df4e9db55e17ca9d1793a7ed289e92
Signed-off-by: lapentafd <francesco.lapenta@est.tech>
Diffstat (limited to 'runtime-acm/src/main')
9 files changed, 443 insertions, 0 deletions
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java index 4247a5b31..653bb9daf 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java @@ -29,6 +29,7 @@ import org.onap.policy.clamp.models.acm.messages.rest.commissioning.Commissionin import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates; +import org.springframework.context.annotation.Profile; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -37,6 +38,7 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequiredArgsConstructor +@Profile("default") public class CommissioningController extends AbstractRestController implements AutomationCompositionDefinitionApi { private final CommissioningProvider provider; diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java index e828843a6..92651bc91 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java @@ -30,6 +30,7 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; +import org.springframework.context.annotation.Profile; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -38,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequiredArgsConstructor +@Profile("default") public class InstantiationController extends AbstractRestController implements AutomationCompositionInstanceApi { // The Automation Composition provider for instantiation requests diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java new file mode 100644 index 000000000..f03cc4ecd --- /dev/null +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 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.policy.clamp.acm.runtime.main.rest.stub; + +import java.util.UUID; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.onap.policy.clamp.acm.runtime.main.rest.gen.AutomationCompositionDefinitionApi; +import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController; +import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse; +import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Profile("stub") +public class CommissioningControllerStub extends AbstractRestController + implements AutomationCompositionDefinitionApi { + + private static final Logger log = LoggerFactory.getLogger(CommissioningControllerStub.class); + + @Autowired + private HttpServletRequest request; + + @Autowired + private StubUtils stubUtils; + + @Value("${stub.deleteCompositionDefinitionResponse}") + private String pathToResponseFile; + + @Value("${stub.getAllCompositionDefinitions}") + private String pathToAllDefinitions; + + @Value("${stub.getSingleCompositionDefinition}") + private String pathToSingleDefinition; + + @Value("${stub.postCommissionResponse}") + private String pathToPostResponse; + + @Value("${stub.putCompositionDefinitionUpdateResponse}") + private String pathToPutUpdate; + + @Override + public ResponseEntity<CommissioningResponse> createCompositionDefinitions( + @Valid @RequestBody ToscaServiceTemplate body, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToPostResponse, CommissioningResponse.class, request, log); + } + + @Override + public ResponseEntity<CommissioningResponse> deleteCompositionDefinition( + @PathVariable("compositionId") UUID compositionId, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToResponseFile, CommissioningResponse.class, request, log); + } + + @Override + public ResponseEntity<ToscaServiceTemplate> getCompositionDefinition( + @PathVariable("compositionId") UUID compositionId, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToSingleDefinition, ToscaServiceTemplate.class, request, log); + } + + @Override + public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions( + @Valid @RequestParam(value = "name", required = false) String name, + @Valid @RequestParam(value = "version", required = false) String version, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToAllDefinitions, ToscaServiceTemplates.class, request, log); + } + + @Override + public ResponseEntity<CommissioningResponse> updateCompositionDefinition( + @PathVariable("compositionId") UUID compositionId, + @Valid @RequestBody ToscaServiceTemplate body, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToPutUpdate, CommissioningResponse.class, request, log); + } +} diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/InstantiationControllerStub.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/InstantiationControllerStub.java new file mode 100644 index 000000000..40152683d --- /dev/null +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/InstantiationControllerStub.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 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.policy.clamp.acm.runtime.main.rest.stub; + +import java.util.UUID; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.onap.policy.clamp.acm.runtime.main.rest.gen.AutomationCompositionInstanceApi; +import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController; +import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Profile("stub") +public class InstantiationControllerStub extends AbstractRestController implements AutomationCompositionInstanceApi { + + private static final Logger log = LoggerFactory.getLogger(InstantiationControllerStub.class); + + @Autowired + private StubUtils stubUtils; + + @Autowired + private HttpServletRequest request; + + @Value("${stub.deleteCompositionInstanceResponse}") + private String pathToResponseFile; + + @Value("${stub.getCompositionInstancesResponse}") + private String pathToSingleIntance; + + @Value("${stub.getAllCompositionInstancesResponse}") + private String pathToAllIntances; + + @Value("${stub.postInstanceResponse}") + private String pathPostIntance; + + @Value("${stub.putCompositionInstanceUpdateResponse}") + private String pathToPutUpdate; + + @Override + public ResponseEntity<InstantiationResponse> createCompositionInstance( + @PathVariable("compositionId") UUID compositionId, + @Valid @RequestBody AutomationComposition body, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathPostIntance, InstantiationResponse.class, request, log); + } + + @Override + public ResponseEntity<InstantiationResponse> deleteCompositionInstance( + @PathVariable("compositionId") UUID compositionId, + @PathVariable("instanceId") UUID instanceId, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToResponseFile, InstantiationResponse.class, request, log); + } + + @Override + public ResponseEntity<AutomationComposition> getCompositionInstance( + @PathVariable("compositionId") UUID compositionId, + @PathVariable("instanceId") UUID instanceId, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToSingleIntance, AutomationComposition.class, request, log); + } + + @Override + public ResponseEntity<AutomationCompositions> queryCompositionInstances( + @PathVariable("compositionId") UUID compositionId, + @Valid @RequestParam(value = "name", required = false) String name, + @Valid @RequestParam(value = "version", required = false) String version, + @RequestHeader(value = "X-onap-RequestId", required = false) UUID xonaprequestid) { + return stubUtils.getResponse(pathToAllIntances, AutomationCompositions.class, request, log); + } + + @Override + public ResponseEntity<InstantiationResponse> updateCompositionInstance( + UUID compositionId, + UUID instanceId, + InstantiationUpdate body, + UUID xonaprequestid) { + return stubUtils.getResponse(pathToResponseFile, InstantiationResponse.class, request, log); + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/StubUtils.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/StubUtils.java new file mode 100644 index 000000000..285365d9b --- /dev/null +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/StubUtils.java @@ -0,0 +1,71 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 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.policy.clamp.acm.runtime.main.rest.stub; + +import com.google.gson.Gson; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardYamlCoder; +import org.slf4j.Logger; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +@Service +@Profile("stub") +public class StubUtils { + + private static final StandardYamlCoder YAML_TRANSLATOR = new StandardYamlCoder(); + private static final Gson JSON_TRANSLATOR = new Gson(); + private static final String YAML = "application/yaml"; + private static final String ACCEPT = "Accept"; + + <T> ResponseEntity<T> getResponse(String path, Class<T> clazz, + HttpServletRequest request, Logger log) { + String accept = request.getHeader(ACCEPT); + if (accept.contains(YAML)) { + path = path.replace("json", "yaml"); + final ClassPathResource resourceY = new ClassPathResource(path); + try (InputStream inputStreamY = resourceY.getInputStream()) { + var targetObj = YAML_TRANSLATOR.decode(inputStreamY, clazz); + return new ResponseEntity<>(targetObj, HttpStatus.OK); + } catch (IOException | CoderException e) { + log.error("Error reading the file.", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } else { + final ClassPathResource resource = new ClassPathResource(path); + try (InputStream inputStream = resource.getInputStream()) { + final String string = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + var targetObject = JSON_TRANSLATOR.fromJson(string, clazz); + return new ResponseEntity<>(targetObject, HttpStatus.OK); + } catch (final IOException exception) { + log.error("Error reading the file.", exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + } +} diff --git a/runtime-acm/src/main/resources/application-stub.yaml b/runtime-acm/src/main/resources/application-stub.yaml new file mode 100644 index 000000000..e752df3fd --- /dev/null +++ b/runtime-acm/src/main/resources/application-stub.yaml @@ -0,0 +1,21 @@ +spring: + application: + name: "policy-clamp-runtime-acm-stub" +stub: + deleteCompositionDefinitionResponse: "/openapi/examples/deleteCompositionDefinitionResponse.json" + deleteCompositionInstanceResponse: "/openapi/examples/deleteCompositionInstanceResponse.json" + getAllCompositionDefinitions: "/openapi/examples/getAllCompositionDefinitions.json" + getAllCompositionInstancesResponse: "/openapi/examples/getAllCompositionInstancesResponse.json" + getCompositionInstancesResponse: "/openapi/examples/getCompositionInstancesResponse.json" + getSingleCompositionDefinition: "/openapi/examples/getSingleCompositionDefinition.json" + postCommissionResponse: "/openapi/examples/postCommissionCompositionDefinitionsResponse.json" + postCompositionDefinitions: "/openapi/examples/postCompositionDefinitions.json" + postCompositionInstance: "/openapi/examples/postCompositionInstance.json" + postInstanceResponse: "/openapi/examples/postCompositionInstancesResponse.json" + putCompositionDefinitionUpdate: "/openapi/examples/putCompositionDefinitionUpdate.json" + putCompositionDefinitionUpdateResponse: "/openapi/examples/putCompositionDefinitionUpdateResponse.json" + putCompositionInstanceUpdate: "/openapi/examples/putCompositionInstanceUpdate.json" + putCompositionInstanceUpdateResponse: " /openapi/examples/putCompositionInstanceUpdateResponse.json" + + + diff --git a/runtime-acm/src/main/resources/application.yaml b/runtime-acm/src/main/resources/application.yaml index df1310d0a..771d7006a 100644 --- a/runtime-acm/src/main/resources/application.yaml +++ b/runtime-acm/src/main/resources/application.yaml @@ -1,4 +1,6 @@ spring: + profiles: + active: default security: user: name: runtimeUser diff --git a/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.json b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.json new file mode 100644 index 000000000..55b99b28c --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.json @@ -0,0 +1,72 @@ +{ + "automationCompositionList": [ + { + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c23": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c23", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Sink Automation Composition Element for the Demo", + "propertiesMap": {} + }, + "709c62b3-8918-41b9-a747-d21eb79c6c25": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c25", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Bridge Automation Composition Element for the Demo", + "propertiesMap": {} + }, + "709c62b3-8918-41b9-a747-d21eb79c6c24": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c24", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Starter Automation Composition Element for the Demo", + "propertiesMap": {} + } + }, + "primed": false, + "name": "InstanceHttp", + "version": "1.0.1", + "description": "Demo automation composition instance Http" + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.yaml new file mode 100644 index 000000000..3fa6506ea --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionInstancesResponse.yaml @@ -0,0 +1,54 @@ +automationCompositionList: +- compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f + state: UNINITIALISED + orderedState: UNINITIALISED + elements: + 709c62b3-8918-41b9-a747-d21eb79c6c23: + id: 709c62b3-8918-41b9-a747-d21eb79c6c23 + definition: + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Sink Automation Composition Element for the Demo + propertiesMap: {} + 709c62b3-8918-41b9-a747-d21eb79c6c25: + id: 709c62b3-8918-41b9-a747-d21eb79c6c25 + definition: + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Bridge Automation Composition Element for the Demo + propertiesMap: {} + 709c62b3-8918-41b9-a747-d21eb79c6c24: + id: 709c62b3-8918-41b9-a747-d21eb79c6c24 + definition: + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Starter Automation Composition Element for the Demo + propertiesMap: {} + primed: false + name: InstanceHttp + version: 1.0.1 + description: Demo automation composition instance Http |