diff options
author | brunomilitzer <bruno.militzer@est.tech> | 2021-08-30 18:40:01 +0100 |
---|---|---|
committer | brunomilitzer <bruno.militzer@est.tech> | 2021-09-09 17:19:54 +0100 |
commit | 09d8a86e2126ccc9a12456ddead12a5fe8f58697 (patch) | |
tree | 3bdd01daa29a0852453c789d1ee1c2d5593ac36a /runtime-controlloop/src | |
parent | f16d42aec838b7e8faf39af2a3f46dfb5fed0605 (diff) |
Fixed Delete Instance Properties Endpoint
Fixed issue regarding that control loops was not getting instantiated
Fixed issue regarding state change that was not receiving paramaters
Added appropriate Camel Endpoints
Unit tests will be applied on POLICY-3568 and POLICY-3567
Issue-ID: POLICY-3558
Change-Id: I11a1093bdb16651fe1c0ad8e267ded5390267a30
Signed-off-by: brunomilitzer <bruno.militzer@est.tech>
Diffstat (limited to 'runtime-controlloop/src')
5 files changed, 340 insertions, 63 deletions
diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java index fbfc1de69..0b7bc9a26 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/commissioning/CommissioningProvider.java @@ -34,7 +34,6 @@ import java.util.stream.Collectors; import javax.ws.rs.core.Response.Status; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; -import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider; @@ -64,6 +63,7 @@ import org.springframework.stereotype.Component; @Component public class CommissioningProvider { public static final String CONTROL_LOOP_NODE_TYPE = "org.onap.policy.clamp.controlloop.ControlLoop"; + private static final String INSTANCE_TEXT = "_Instance"; private final PolicyModelsProvider modelsProvider; private final ControlLoopProvider clProvider; @@ -98,10 +98,10 @@ public class CommissioningProvider { * @throws PfModelException on creation errors */ public CommissioningResponse createControlLoopDefinitions(ToscaServiceTemplate serviceTemplate) - throws PfModelException, ControlLoopException { + throws PfModelException { if (verifyIfInstancePropertiesExists()) { - throw new ControlLoopException(Status.BAD_REQUEST, + throw new PfModelException(Status.BAD_REQUEST, "Delete instances, to commission control loop definitions"); } @@ -148,10 +148,10 @@ public class CommissioningProvider { * @throws PfModelException on deletion errors */ public CommissioningResponse deleteControlLoopDefinition(String name, String version) - throws PfModelException, ControlLoopException { + throws PfModelException { if (verifyIfInstancePropertiesExists()) { - throw new ControlLoopException(Status.BAD_REQUEST, + throw new PfModelException(Status.BAD_REQUEST, "Delete instances, to commission control loop definitions"); } @@ -395,10 +395,17 @@ public class CommissioningProvider { public Map<String, ToscaNodeTemplate> getNodeTemplatesWithCommonOrInstanceProperties(boolean common, String name, String version) throws PfModelException { - var commonOrInstanceNodeTypeProps = this.getCommonOrInstancePropertiesFromNodeTypes(common, name, version); + if (common && verifyIfInstancePropertiesExists()) { + throw new PfModelException(Status.BAD_REQUEST, + "Cannot create or edit common properties, delete all the instantiations first"); + } + + var commonOrInstanceNodeTypeProps = + this.getCommonOrInstancePropertiesFromNodeTypes(common, name, version); var serviceTemplates = new ToscaServiceTemplates(); - serviceTemplates.setServiceTemplates(modelsProvider.getServiceTemplateList(name, version)); + serviceTemplates.setServiceTemplates(filterToscaNodeTemplateInstance( + modelsProvider.getServiceTemplateList(name, version))); return this.getDerivedCommonOrInstanceNodeTemplates( serviceTemplates.getServiceTemplates().get(0).getToscaTopologyTemplate().getNodeTemplates(), @@ -433,7 +440,8 @@ public class CommissioningProvider { var serviceTemplates = new ToscaServiceTemplates(); serviceTemplates.setServiceTemplates(modelsProvider.getServiceTemplateList(name, version)); - ToscaServiceTemplate fullTemplate = serviceTemplates.getServiceTemplates().get(0); + ToscaServiceTemplate fullTemplate = filterToscaNodeTemplateInstance( + serviceTemplates.getServiceTemplates()).get(0); var template = new HashMap<String, Object>(); template.put("tosca_definitions_version", fullTemplate.getToscaDefinitionsVersion()); @@ -496,6 +504,29 @@ public class CommissioningProvider { } } + private List<ToscaServiceTemplate> filterToscaNodeTemplateInstance(List<ToscaServiceTemplate> serviceTemplates) { + + List<ToscaServiceTemplate> toscaServiceTemplates = new ArrayList<>(); + + serviceTemplates.stream().forEach(serviceTemplate -> { + + Map<String, ToscaNodeTemplate> toscaNodeTemplates = new HashMap<>(); + + serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().forEach((key, nodeTemplate) -> { + if (!nodeTemplate.getName().contains(INSTANCE_TEXT)) { + toscaNodeTemplates.put(key, nodeTemplate); + } + }); + + serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().clear(); + serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(toscaNodeTemplates); + + toscaServiceTemplates.add(serviceTemplate); + }); + + return toscaServiceTemplates; + } + /** * Validates to see if there is any instance properties saved. * @@ -503,7 +534,7 @@ public class CommissioningProvider { */ private boolean verifyIfInstancePropertiesExists() { return clProvider.getNodeTemplates(null, null).stream() - .anyMatch(nodeTemplate -> nodeTemplate.getKey().getName().contains("_Instance")); + .anyMatch(nodeTemplate -> nodeTemplate.getKey().getName().contains(INSTANCE_TEXT)); } } diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java index a71772624..dc40cc274 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProvider.java @@ -21,18 +21,27 @@ package org.onap.policy.clamp.controlloop.runtime.instantiation; +import com.google.gson.Gson; +import com.google.gson.internal.LinkedTreeMap; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.function.UnaryOperator; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import lombok.AllArgsConstructor; import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider; @@ -49,6 +58,7 @@ import org.onap.policy.common.parameters.ValidationResult; import org.onap.policy.common.parameters.ValidationStatus; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNameVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.springframework.stereotype.Component; @@ -59,48 +69,102 @@ import org.springframework.stereotype.Component; @Component @AllArgsConstructor public class ControlLoopInstantiationProvider { + private static final String CONTROL_LOOP_NODE_TYPE = "org.onap.policy.clamp.controlloop.ControlLoop"; + private static final String CONTROL_LOOP_NODE_ELEMENT_TYPE = "ControlLoopElement"; + private static final String PARTICIPANT_ID_PROPERTY_KEY = "participant_id"; + private static final String CL_ELEMENT_NAME = "name"; + private static final String CL_ELEMENT_VERSION = "version"; private static final String INSTANCE_TEXT = "_Instance"; + private static final Gson GSON = new Gson(); + private final ControlLoopProvider controlLoopProvider; private final CommissioningProvider commissioningProvider; private final SupervisionHandler supervisionHandler; private static final Object lockit = new Object(); - private static final String CL_ELEMENT_NAME = "name"; - /** - * Create Instance Properties. + * Creates Instance Properties and Control Loop. * * @param serviceTemplate the service template * @return the result of the instantiation operation * @throws PfModelException on creation errors */ - public InstancePropertiesResponse saveInstanceProperties(ToscaServiceTemplate serviceTemplate) { + public InstancePropertiesResponse createInstanceProperties(ToscaServiceTemplate serviceTemplate) + throws PfModelException { String instanceName = generateSequentialInstanceName(); + ControlLoop controlLoop = new ControlLoop(); + Map<UUID, ControlLoopElement> controlLoopElements = new HashMap<>(); + + ToscaServiceTemplate toscaServiceTemplate = commissioningProvider + .getToscaServiceTemplate(null, null); - Map<String, ToscaNodeTemplate> nodeTemplates = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates(); + Map<String, ToscaNodeTemplate> persistedNodeTemplateMap = toscaServiceTemplate + .getToscaTopologyTemplate().getNodeTemplates(); + + Map<String, ToscaNodeTemplate> nodeTemplates = + deepCloneNodeTemplate(serviceTemplate); nodeTemplates.forEach((key, template) -> { + ToscaNodeTemplate newNodeTemplate = new ToscaNodeTemplate(); String name = key + instanceName; + String version = template.getVersion(); String description = template.getDescription() + instanceName; - template.setName(name); - template.setDescription(description); + newNodeTemplate.setName(name); + newNodeTemplate.setVersion(version); + newNodeTemplate.setDescription(description); + newNodeTemplate.setProperties(new HashMap<>(template.getProperties())); + newNodeTemplate.setType(template.getType()); + newNodeTemplate.setTypeVersion(template.getTypeVersion()); + newNodeTemplate.setMetadata(template.getMetadata()); - changeInstanceElementsName(template, instanceName); + crateNewControlLoopInstance(instanceName, controlLoop, controlLoopElements, template, newNodeTemplate); + persistedNodeTemplateMap.put(name, newNodeTemplate); }); - Map<String, ToscaNodeTemplate> toscaSavedNodeTemplate = controlLoopProvider - .saveInstanceProperties(serviceTemplate); + ControlLoops controlLoops = new ControlLoops(); - var response = new InstancePropertiesResponse(); + serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().putAll(persistedNodeTemplateMap); + + controlLoop.setElements(controlLoopElements); + controlLoops.getControlLoopList().add(controlLoop); + + return saveInstancePropertiesAndControlLoop(serviceTemplate, controlLoops); + } + + /** + * Deletes Instance Properties. + * + * @param name the name of the control loop to delete + * @param version the version of the control loop to delete + * @return the result of the deletion + * @throws PfModelException on deletion errors + */ + public InstantiationResponse deleteInstanceProperties(String name, String version) throws PfModelException { + + String instanceName = getInstancePropertyName(name, version); + + Map<String, ToscaNodeTemplate> filteredToscaNodeTemplateMap = new HashMap<>(); - // @formatter:off - response.setAffectedInstanceProperties(toscaSavedNodeTemplate.values().stream().map(template -> - template.getKey().asIdentifier()).collect(Collectors.toList())); - // @formatter:on + ToscaServiceTemplate toscaServiceTemplate = commissioningProvider.getToscaServiceTemplate(name, version); + + toscaServiceTemplate.getToscaTopologyTemplate() + .getNodeTemplates().forEach((key, nodeTemplate) -> { + if (!nodeTemplate.getName().contains(instanceName)) { + filteredToscaNodeTemplateMap.put(key, nodeTemplate); + } + }); + + List<ToscaNodeTemplate> filteredToscaNodeTemplateList = + toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().values().stream() + .filter(nodeTemplate -> nodeTemplate.getName().contains(instanceName)).collect(Collectors.toList()); + + InstantiationResponse response = this.deleteControlLoop(name, version); + + controlLoopProvider.deleteInstanceProperties(filteredToscaNodeTemplateMap, filteredToscaNodeTemplateList); return response; } @@ -116,7 +180,8 @@ public class ControlLoopInstantiationProvider { synchronized (lockit) { for (ControlLoop controlLoop : controlLoops.getControlLoopList()) { - var checkControlLoop = controlLoopProvider.getControlLoop(controlLoop.getKey().asIdentifier()); + var checkControlLoop = controlLoopProvider + .getControlLoop(controlLoop.getKey().asIdentifier()); if (checkControlLoop != null) { throw new PfModelException(Response.Status.BAD_REQUEST, controlLoop.getKey().asIdentifier() + " already defined"); @@ -323,27 +388,102 @@ public class ControlLoopInstantiationProvider { } /** - * Creates instance element name. + * Saves Instance Properties and Control Loop. * - * @param serviceTemplate the service serviceTemplate - * @param instanceName to amend to the element name + * @param serviceTemplate the service template + * @param controlLoops a list of control loops + * @return the result of the instance properties and instantiation operation + * @throws PfModelException on creation errors */ - private void changeInstanceElementsName(ToscaNodeTemplate serviceTemplate, String instanceName) { + private InstancePropertiesResponse saveInstancePropertiesAndControlLoop( + ToscaServiceTemplate serviceTemplate, ControlLoops controlLoops) throws PfModelException { - @SuppressWarnings("unchecked") - List<Map<String, String>> controlLoopElements = (List<Map<String, String>>) serviceTemplate.getProperties() - .get("elements"); + var response = new InstancePropertiesResponse(); - if (controlLoopElements != null) { - controlLoopElements.forEach(clElement -> { - String name = clElement.get(CL_ELEMENT_NAME) + instanceName; - clElement.replace(CL_ELEMENT_NAME, name); - }); + Map<String, ToscaNodeTemplate> toscaSavedNodeTemplate; + + synchronized (lockit) { + for (ControlLoop controlLoop : controlLoops.getControlLoopList()) { + var checkControlLoop = controlLoopProvider.getControlLoop(controlLoop.getKey().asIdentifier()); + if (checkControlLoop != null) { + throw new PfModelException(Response.Status.BAD_REQUEST, + controlLoop.getKey().asIdentifier() + " already defined"); + } + } + + toscaSavedNodeTemplate = controlLoopProvider.saveInstanceProperties(serviceTemplate); + + controlLoopProvider.createControlLoops(controlLoops.getControlLoopList()); + + } + + List<ToscaConceptIdentifier> affectedControlLoops = controlLoops.getControlLoopList().stream() + .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()); + + List<ToscaConceptIdentifier> toscaAffectedProperties = toscaSavedNodeTemplate.values().stream() + .map(template -> template.getKey().asIdentifier()).collect(Collectors.toList()); + + response.setAffectedInstanceProperties(Stream.of(affectedControlLoops, toscaAffectedProperties) + .flatMap(Collection::stream).collect(Collectors.toList())); + + return response; + } + + /** + * Crates a new Control Loop instance. + * @param instanceName Control Loop Instance name + * @param controlLoop empty Control Loop + * @param controlLoopElements new Control Loop Element map + * @param template original Cloned Tosca Node Template + * @param newNodeTemplate new Tosca Node Template + */ + private void crateNewControlLoopInstance(String instanceName, ControlLoop controlLoop, + Map<UUID, ControlLoopElement> controlLoopElements, + ToscaNodeTemplate template, + ToscaNodeTemplate newNodeTemplate) { + if (template.getType().equals(CONTROL_LOOP_NODE_TYPE)) { + controlLoop.setDefinition(getControlLoopDefinition(newNodeTemplate)); + } + + if (template.getType().contains(CONTROL_LOOP_NODE_ELEMENT_TYPE)) { + ControlLoopElement controlLoopElement = getControlLoopElement(instanceName, newNodeTemplate); + controlLoopElements.put(controlLoopElement.getId(), controlLoopElement); } + + controlLoop.setName("PMSH" + instanceName); + controlLoop.setVersion(template.getVersion()); + controlLoop.setDescription("PMSH control loop " + instanceName); + controlLoop.setState(ControlLoopState.UNINITIALISED); + controlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED); } /** + * Get's the instance property name of the control loop. + * + * @param name the name of the control loop to get, null for all control loops + * @param version the version of the control loop to get, null for all control loops + * @return the instance name of the control loop instance properties + * @throws PfModelException on errors getting control loops + */ + private String getInstancePropertyName(String name, String version) throws PfModelException { + List<String> toscaDefinitionsNames = + controlLoopProvider.getControlLoops(name, version).stream().map(ControlLoop::getDefinition) + .map(ToscaNameVersion::getName).collect(Collectors.toList()); + + return toscaDefinitionsNames.stream().reduce("", (s1, s2) -> { + + if (s2.contains(INSTANCE_TEXT)) { + String[] instances = s2.split(INSTANCE_TEXT); + + return INSTANCE_TEXT + instances[1]; + } + + return s1; + }); + } + + /** * Generates Instance Name in sequential order and return it to append to the Node Template Name. * * @return instanceName @@ -361,4 +501,61 @@ public class ControlLoopInstantiationProvider { return INSTANCE_TEXT + (instanceNumber + 1); } + + /** + * Retrieves Control Loop Definition. + * + * @param template tosca node template + * @return control loop definition + */ + private ToscaConceptIdentifier getControlLoopDefinition(ToscaNodeTemplate template) { + ToscaConceptIdentifier definition = new ToscaConceptIdentifier(); + definition.setName(template.getName()); + definition.setVersion(template.getVersion()); + + return definition; + } + + /** + * Retrieves Control Loop Element. + * + * @param instanceName instance name to be appended to participant name + * @param template tosca node template + * @return a control loop element + */ + @SuppressWarnings("unchecked") + private ControlLoopElement getControlLoopElement(String instanceName, ToscaNodeTemplate template) { + ControlLoopElement controlLoopElement = new ControlLoopElement(); + ToscaConceptIdentifier definition = new ToscaConceptIdentifier(); + definition.setName(template.getName()); + definition.setVersion(template.getVersion()); + controlLoopElement.setDefinition(definition); + + LinkedTreeMap<String, Object> participantId = (LinkedTreeMap<String, Object>) template.getProperties() + .get(PARTICIPANT_ID_PROPERTY_KEY); + + ToscaConceptIdentifier participantIdAndType = new ToscaConceptIdentifier(); + participantIdAndType.setName(participantId.get(CL_ELEMENT_NAME) + instanceName); + participantIdAndType.setVersion(String.valueOf(participantId.get(CL_ELEMENT_VERSION))); + + controlLoopElement.setParticipantType(participantIdAndType); + controlLoopElement.setParticipantId(participantIdAndType); + + return controlLoopElement; + } + + /** + * Deep clones ToscaNodeTemplate. + * + * @param serviceTemplate ToscaServiceTemplate + * @return a cloned Hash Map of ToscaNodeTemplate + */ + private Map<String, ToscaNodeTemplate> deepCloneNodeTemplate(ToscaServiceTemplate serviceTemplate) { + String jsonString = GSON.toJson(serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()); + + Type type = new TypeToken<HashMap<String, ToscaNodeTemplate>>() {}.getType(); + + return GSON.fromJson(jsonString, type); + } + } diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java index 2c3a41e26..fcb5aed97 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/CommissioningController.java @@ -121,7 +121,7 @@ public class CommissioningController extends AbstractRestController { name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, @ApiParam(value = "Entity Body of Control Loop", required = true) @RequestBody ToscaServiceTemplate body) - throws PfModelException, ControlLoopException { + throws PfModelException { return ResponseEntity.ok().body(provider.createControlLoopDefinitions(body)); } @@ -188,7 +188,7 @@ public class CommissioningController extends AbstractRestController { @ApiParam( value = "Control Loop definition version", required = true) @RequestParam("version") String version) - throws PfModelException, ControlLoopException { + throws PfModelException { return ResponseEntity.ok().body(provider.deleteControlLoopDefinition(name, version)); } @@ -385,6 +385,7 @@ public class CommissioningController extends AbstractRestController { * @param version the version of the tosca service template to get * @return the specified tosca service template or section Json Schema * @throws PfModelException on errors getting the Common or Instance Properties + * @throws ControlLoopException on error getting the Common or Instance Properties */ // @formatter:off @GetMapping(value = "/commission/getCommonOrInstanceProperties", @@ -438,7 +439,7 @@ public class CommissioningController extends AbstractRestController { @ApiParam(value = "Tosca service template version", required = false) @RequestParam( value = "version", required = false) String version) - throws PfModelException { + throws PfModelException { return ResponseEntity.ok().body(provider.getNodeTemplatesWithCommonOrInstanceProperties(common, name, version)); } diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/InstantiationController.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/InstantiationController.java index 5a8275f8a..91958f97a 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/InstantiationController.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/main/rest/InstantiationController.java @@ -187,9 +187,76 @@ public class InstantiationController extends AbstractRestController { @RequestHeader( name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Body of instance properties", required = true) @RequestBody ToscaServiceTemplate body) { + @ApiParam(value = "Body of instance properties", required = true) @RequestBody ToscaServiceTemplate body) + throws PfModelException { + + return ResponseEntity.ok().body(provider.createInstanceProperties(body)); + } + + /** + * Deletes a control loop definition and instance properties. + * + * @param requestId request ID used in ONAP logging + * @param name the name of the control loop to delete + * @param version the version of the control loop to delete + * @return a response + * @throws PfModelException on errors deleting of control loop and instance properties + */ + // @formatter:off + @DeleteMapping(value = "/instanceProperties", + produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) + @ApiOperation(value = "Delete a control loop and instance properties", + notes = "Deletes a control loop and instance properties, returning optional error details", + response = InstantiationResponse.class, + tags = {TAGS}, + authorizations = @Authorization(value = AUTHORIZATION_TYPE), + responseHeaders = { + @ResponseHeader( + name = VERSION_MINOR_NAME, + description = VERSION_MINOR_DESCRIPTION, + response = String.class), + @ResponseHeader( + name = VERSION_PATCH_NAME, + description = VERSION_PATCH_DESCRIPTION, + response = String.class), + @ResponseHeader( + name = VERSION_LATEST_NAME, + description = VERSION_LATEST_DESCRIPTION, + response = String.class), + @ResponseHeader( + name = REQUEST_ID_NAME, + description = REQUEST_ID_HDR_DESCRIPTION, + response = UUID.class)}, + extensions = { + @Extension + ( + name = EXTENSION_NAME, + properties = { + @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), + @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) + } + ) + } + ) + @ApiResponses( + value = { + @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), + @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), + @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) + } + ) + // @formatter:on + + public ResponseEntity<InstantiationResponse> deleteInstanceProperties( + @RequestHeader( + name = REQUEST_ID_NAME, + required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, + @ApiParam(value = "Control Loop definition name", required = true) @RequestParam("name") String name, + @ApiParam(value = "Control Loop definition version") @RequestParam( + value = "version", + required = true) String version) throws PfModelException { - return ResponseEntity.ok().body(provider.saveInstanceProperties(body)); + return ResponseEntity.ok().body(provider.deleteInstanceProperties(name, version)); } /** @@ -494,10 +561,10 @@ public class InstantiationController extends AbstractRestController { @RequestHeader( name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Control Loop definition name", required = false) @RequestParam( + @ApiParam(value = "Control Loop name", required = false) @RequestParam( value = "name", required = false) String name, - @ApiParam(value = "Control Loop definition version", required = false) @RequestParam( + @ApiParam(value = "Control Loop version", required = false) @RequestParam( value = "version", required = false) String version) throws PfModelException { diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java index 8529c0c9b..c107986a5 100644 --- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java +++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/InstantiationUtils.java @@ -144,23 +144,4 @@ public class InstantiationUtils { commissioningProvider.createControlLoopDefinitions(template); } - - /** - * Assert that instance properties has been properly saved. - * - * @param response InstancePropertiesResponse - * @throws PfModelException if an error occurs - */ - public static void assertInstancePropertiesResponse(InstancePropertiesResponse response) throws PfModelException { - - assertThat(response).isNotNull(); - assertThat(response.getErrorDetails()).isNull(); - assertThat(response.getAffectedInstanceProperties()).hasSize(8); - - boolean containsInstance = response.getAffectedInstanceProperties().stream() - .anyMatch(identifier -> identifier.getName().contains("_Instance")); - - assertThat(containsInstance).isTrue(); - - } } |