From 09d8a86e2126ccc9a12456ddead12a5fe8f58697 Mon Sep 17 00:00:00 2001 From: brunomilitzer Date: Mon, 30 Aug 2021 18:40:01 +0100 Subject: 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 --- .../commissioning/CommissioningProvider.java | 49 +++- .../ControlLoopInstantiationProvider.java | 253 ++++++++++++++++++--- .../runtime/main/rest/CommissioningController.java | 7 +- .../runtime/main/rest/InstantiationController.java | 75 +++++- 4 files changed, 340 insertions(+), 44 deletions(-) (limited to 'runtime-controlloop/src/main') 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 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(); template.put("tosca_definitions_version", fullTemplate.getToscaDefinitionsVersion()); @@ -496,6 +504,29 @@ public class CommissioningProvider { } } + private List filterToscaNodeTemplateInstance(List serviceTemplates) { + + List toscaServiceTemplates = new ArrayList<>(); + + serviceTemplates.stream().forEach(serviceTemplate -> { + + Map 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 controlLoopElements = new HashMap<>(); + + ToscaServiceTemplate toscaServiceTemplate = commissioningProvider + .getToscaServiceTemplate(null, null); - Map nodeTemplates = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates(); + Map persistedNodeTemplateMap = toscaServiceTemplate + .getToscaTopologyTemplate().getNodeTemplates(); + + Map 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 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 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 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,26 +388,101 @@ 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> controlLoopElements = (List>) 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 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 affectedControlLoops = controlLoops.getControlLoopList().stream() + .map(cl -> cl.getKey().asIdentifier()).collect(Collectors.toList()); + + List 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 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 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. * @@ -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 participantId = (LinkedTreeMap) 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 deepCloneNodeTemplate(ToscaServiceTemplate serviceTemplate) { + String jsonString = GSON.toJson(serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()); + + Type type = new TypeToken>() {}.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 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 { -- cgit 1.2.3-korg