Refactor Post compositions to create and update ACM definitions 48/132848/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Tue, 3 Jan 2023 10:48:36 +0000 (10:48 +0000)
committerFrancesco Fiora <francesco.fiora@est.tech>
Wed, 4 Jan 2023 09:54:47 +0000 (09:54 +0000)
Issue-ID: POLICY-4492
Change-Id: Ica3885c7e2a048500a86abc194624ac22efd6bc2
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java

index 12a0594..0542715 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.clamp.models.acm.persistence.provider;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
@@ -52,7 +53,12 @@ public class AcDefinitionProvider {
     public AutomationCompositionDefinition createAutomationCompositionDefinition(
             final ToscaServiceTemplate serviceTemplate) {
         var acmDefinition = new AutomationCompositionDefinition();
-        acmDefinition.setCompositionId(UUID.randomUUID());
+        var compositionId = UUID.randomUUID();
+        acmDefinition.setCompositionId(compositionId);
+        if (serviceTemplate.getMetadata() == null) {
+            serviceTemplate.setMetadata(new HashMap<>());
+        }
+        serviceTemplate.getMetadata().put("compositionId", compositionId);
         acmDefinition.setServiceTemplate(serviceTemplate);
         var jpaAcmDefinition = ProviderUtils.getJpaAndValidate(acmDefinition, JpaAutomationCompositionDefinition::new,
                 "AutomationCompositionDefinition");
index 1d3b299..9f898d8 100644 (file)
@@ -25,13 +25,10 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 import javax.ws.rs.core.Response.Status;
 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -61,9 +58,8 @@ public class CommissioningProvider {
      * @param supervisionHandler the Supervision Handler
      * @param participantProvider the Participant Provider
      */
-    public CommissioningProvider(AcDefinitionProvider acDefinitionProvider,
-            AutomationCompositionProvider acProvider, SupervisionHandler supervisionHandler,
-            ParticipantProvider participantProvider) {
+    public CommissioningProvider(AcDefinitionProvider acDefinitionProvider, AutomationCompositionProvider acProvider,
+            SupervisionHandler supervisionHandler, ParticipantProvider participantProvider) {
         this.acDefinitionProvider = acDefinitionProvider;
         this.acProvider = acProvider;
         this.supervisionHandler = supervisionHandler;
@@ -113,19 +109,10 @@ public class CommissioningProvider {
     public CommissioningResponse updateCompositionDefinition(UUID compositionId, ToscaServiceTemplate serviceTemplate) {
 
         var automationCompositions = acProvider.getAcInstancesByCompositionId(compositionId);
-        var result = new BeanValidationResult("AutomationCompositions", automationCompositions);
-        for (var automationComposition : automationCompositions) {
-            if (!AutomationCompositionState.UNINITIALISED.equals(automationComposition.getState())) {
-                throw new PfModelRuntimeException(Status.BAD_REQUEST,
-                        "There is an Automation Composition instantioation with state in "
-                                + automationComposition.getState());
-            }
-            result.addResult(AcmUtils.validateAutomationComposition(automationComposition, serviceTemplate));
-        }
-        if (!result.isValid()) {
-            throw new PfModelRuntimeException(Status.BAD_REQUEST, "Service template non valid: " + result.getMessage());
+        if (!automationCompositions.isEmpty()) {
+            throw new PfModelRuntimeException(Status.BAD_REQUEST,
+                    "There are ACM instances, Update of ACM Definition not allowed");
         }
-
         acDefinitionProvider.updateServiceTemplate(compositionId, serviceTemplate);
 
         return createCommissioningResponse(compositionId, serviceTemplate);
index a6b1ab3..7f9dc8d 100644 (file)
@@ -28,7 +28,6 @@ import org.onap.policy.clamp.acm.runtime.main.rest.gen.AutomationCompositionDefi
 import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.AcTypeStateUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse;
-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;
@@ -54,10 +53,15 @@ public class CommissioningController extends AbstractRestController implements A
      */
     @Override
     public ResponseEntity<CommissioningResponse> createCompositionDefinitions(ToscaServiceTemplate body,
-        UUID requestId) {
-
-        var response = provider.createAutomationCompositionDefinitions(body);
-        return ResponseEntity.created(createUri("/compositions/" + response.getCompositionId())).body(response);
+            UUID requestId) {
+        var compositionId = body.getMetadata() != null ? body.getMetadata().get("compositionId") : null;
+        if (compositionId == null) {
+            var response = provider.createAutomationCompositionDefinitions(body);
+            return ResponseEntity.created(createUri("/compositions/" + response.getCompositionId())).body(response);
+        } else {
+            return ResponseEntity.ok()
+                    .body(provider.updateCompositionDefinition(UUID.fromString(compositionId.toString()), body));
+        }
     }
 
     /**
@@ -79,7 +83,6 @@ public class CommissioningController extends AbstractRestController implements A
      * @param version the version of the automation composition definition to get, null for all definitions
      * @param requestId request ID used in ONAP logging
      * @return the automation composition definitions
-     * @throws PfModelException on errors getting details of all or specific automation composition definitions
      */
     @Override
     public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions(String name, String version,
@@ -92,11 +95,6 @@ public class CommissioningController extends AbstractRestController implements A
         return ResponseEntity.ok().body(provider.getAutomationCompositionDefinitions(compositionId));
     }
 
-    public ResponseEntity<CommissioningResponse> updateCompositionDefinition(UUID compositionId,
-        ToscaServiceTemplate body, UUID requestId) {
-        return ResponseEntity.ok().body(provider.updateCompositionDefinition(compositionId, body));
-    }
-
     @Override
     public ResponseEntity<Void> compositionDefinitionPriming(UUID compositionId, UUID requestId,
         @Valid AcTypeStateUpdate body) {
index da43b1f..c84d7ea 100644 (file)
@@ -29,12 +29,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
 import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Response;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
@@ -128,7 +128,6 @@ class CommissioningControllerTest extends CommonRestController {
         }
     }
 
-    @Disabled
     @Test
     void testUpdate() {
         var toscaDataType = new ToscaDataType();
@@ -143,8 +142,9 @@ class CommissioningControllerTest extends CommonRestController {
         var compositionId = createEntryInDB("forUpdate");
         var serviceTemplateUpdate = new ToscaServiceTemplate(serviceTemplate);
         serviceTemplateUpdate.getDataTypes().put(toscaDataType.getName(), toscaDataType);
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
-        var resp = invocationBuilder.put(Entity.json(serviceTemplateUpdate));
+        serviceTemplateUpdate.setMetadata(Map.of("compositionId", compositionId));
+        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        var resp = invocationBuilder.post(Entity.json(serviceTemplateUpdate));
         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
         var commissioningResponse = resp.readEntity(CommissioningResponse.class);
         assertNotNull(commissioningResponse);