Add automatic sync up support in ACM-runtime 69/141569/2
authorFrancescoFioraEst <francesco.fiora@est.tech>
Tue, 22 Jul 2025 09:58:31 +0000 (10:58 +0100)
committerFrancescoFioraEst <francesco.fiora@est.tech>
Tue, 22 Jul 2025 16:05:29 +0000 (17:05 +0100)
Issue-ID: POLICY-5418
Change-Id: Idd889dac2d8afa79745c96fcbe1ffd0ed23faffa
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
27 files changed:
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/instantiation/AutomationCompositionInstantiationProvider.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtils.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandler.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcPreparePublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionMigrationPublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantPrimePublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java [new file with mode: 0644]
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/AbstractScanner.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/AcDefinitionScanner.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/MonitoringScanner.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScanner.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScanner.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtilTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandlerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScannerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScannerTest.java

index 0d3375b..a1540d3 100644 (file)
@@ -215,7 +215,8 @@ public class CommissioningProvider {
                 acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName());
 
         executor.execute(
-                () -> participantPrimePublisher.sendPriming(preparation, acmDefinition.getCompositionId(), null));
+                () -> participantPrimePublisher.sendPriming(
+                        preparation, acmDefinition.getCompositionId(), acmDefinition.getRevisionId()));
     }
 
     private void deprime(AutomationCompositionDefinition acmDefinition) {
@@ -236,7 +237,7 @@ public class CommissioningProvider {
         acDefinitionProvider.updateAcDefinition(acmDefinition,
                 acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName());
 
-        executor.execute(() -> participantPrimePublisher.sendDepriming(acmDefinition.getCompositionId()));
+        executor.execute(() -> participantPrimePublisher.sendDepriming(
+                acmDefinition.getCompositionId(), participantIds, acmDefinition.getRevisionId()));
     }
-
 }
index 389f555..4e9ca3d 100644 (file)
@@ -31,14 +31,12 @@ import lombok.RequiredArgsConstructor;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
-import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
-import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
@@ -53,8 +51,6 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositi
 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.common.parameters.ObjectValidationResult;
-import org.onap.policy.common.parameters.ValidationStatus;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -96,7 +92,9 @@ public class AutomationCompositionInstantiationProvider {
         AutomationCompositionProvider.validateInstanceEndpoint(compositionId, automationComposition);
         automationCompositionProvider.validateNameVersion(automationComposition.getKey().asIdentifier());
 
-        var validationResult = validateAutomationComposition(automationComposition);
+        var acDefinition = acDefinitionProvider.getAcDefinition(compositionId);
+        AcDefinitionProvider.checkPrimedComposition(acDefinition);
+        var validationResult = validateAutomationComposition(automationComposition, acDefinition);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         }
@@ -125,13 +123,15 @@ public class AutomationCompositionInstantiationProvider {
         var instanceId = automationComposition.getInstanceId();
         var acToUpdate = automationCompositionProvider.getAutomationComposition(instanceId);
         AutomationCompositionProvider.validateInstanceEndpoint(compositionId, acToUpdate);
+        var acDefinition = acDefinitionProvider.getAcDefinition(compositionId);
+        AcDefinitionProvider.checkPrimedComposition(acDefinition);
         if (DeployState.UNDEPLOYED.equals(acToUpdate.getDeployState())) {
             acToUpdate.setElements(automationComposition.getElements());
             acToUpdate.setName(automationComposition.getName());
             acToUpdate.setVersion(automationComposition.getVersion());
             acToUpdate.setDescription(automationComposition.getDescription());
             acToUpdate.setDerivedFrom(automationComposition.getDerivedFrom());
-            var validationResult = validateAutomationComposition(acToUpdate);
+            var validationResult = validateAutomationComposition(acToUpdate, acDefinition);
             if (!validationResult.isValid()) {
                 throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
             }
@@ -157,11 +157,11 @@ public class AutomationCompositionInstantiationProvider {
             acToUpdate.getDeployState(), acToUpdate.getLockState(), acToUpdate.getSubState(),
             acToUpdate.getStateChangeResult());
         return switch (result) {
-            case "UPDATE" -> updateDeployedAutomationComposition(automationComposition, acToUpdate);
+            case "UPDATE" -> updateDeployedAutomationComposition(automationComposition, acToUpdate, acDefinition);
 
-            case "MIGRATE" -> migrateAutomationComposition(automationComposition, acToUpdate);
+            case "MIGRATE" -> migrateAutomationComposition(automationComposition, acToUpdate, acDefinition);
 
-            case "MIGRATE_PRECHECK" -> migratePrecheckAc(automationComposition, acToUpdate);
+            case "MIGRATE_PRECHECK" -> migratePrecheckAc(automationComposition, acToUpdate, acDefinition);
 
             default -> throw new PfModelRuntimeException(Status.BAD_REQUEST,
                 "Not allowed to " + deployOrder + " in the state " + acToUpdate.getDeployState());
@@ -176,7 +176,8 @@ public class AutomationCompositionInstantiationProvider {
      * @return the result of the update
      */
     private InstantiationResponse updateDeployedAutomationComposition(
-        AutomationComposition automationComposition, AutomationComposition acToBeUpdated) {
+            AutomationComposition automationComposition, AutomationComposition acToBeUpdated,
+            AutomationCompositionDefinition acDefinition) {
         // save copy in case of a rollback
         automationCompositionProvider.copyAcElementsBeforeUpdate(acToBeUpdated);
 
@@ -190,24 +191,24 @@ public class AutomationCompositionInstantiationProvider {
             AcmUtils.recursiveMerge(dbAcElement.getProperties(), element.getValue().getProperties());
         }
 
-        var validationResult = validateAutomationComposition(acToBeUpdated);
+        var validationResult = validateAutomationComposition(acToBeUpdated, acDefinition);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         }
         updateAcForProperties(acToBeUpdated);
 
         var acToPublish = new AutomationComposition(acToBeUpdated);
-
         encryptInstanceProperties(acToBeUpdated, acToBeUpdated.getCompositionId());
 
         automationComposition = automationCompositionProvider.updateAutomationComposition(acToBeUpdated);
         // Publish property update event to the participants
-        supervisionAcHandler.update(acToPublish);
+        supervisionAcHandler.update(acToPublish, acDefinition.getRevisionId());
         return createInstantiationResponse(automationComposition);
     }
 
     private InstantiationResponse migrateAutomationComposition(
-        AutomationComposition automationComposition, AutomationComposition acToBeUpdated) {
+            AutomationComposition automationComposition, AutomationComposition acToBeUpdated,
+            AutomationCompositionDefinition acDefinition) {
 
         if (!DeployState.DEPLOYED.equals(acToBeUpdated.getDeployState())) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST,
@@ -216,21 +217,21 @@ public class AutomationCompositionInstantiationProvider {
         // make copy for rollback
         automationCompositionProvider.copyAcElementsBeforeUpdate(acToBeUpdated);
 
+        var acDefinitionTarget = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
+        AcDefinitionProvider.checkPrimedComposition(acDefinitionTarget);
         // Iterate and update the element property values
-        var elementsRemoved = updateElementsProperties(automationComposition, acToBeUpdated);
-        var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
+        var elementsRemoved = updateElementsProperties(automationComposition, acToBeUpdated, acDefinitionTarget);
 
-        updateAcForMigration(acToBeUpdated, acDefinition, DeployState.MIGRATING);
+        updateAcForMigration(acToBeUpdated, acDefinitionTarget, DeployState.MIGRATING);
 
         var acToPublish = new AutomationComposition(acToBeUpdated);
-
         encryptInstanceProperties(acToBeUpdated, acToBeUpdated.getCompositionTargetId());
 
         var ac = automationCompositionProvider.updateAutomationComposition(acToBeUpdated);
         elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement);
 
         // Publish migrate event to the participants
-        supervisionAcHandler.migrate(acToPublish);
+        supervisionAcHandler.migrate(acToPublish, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
         return createInstantiationResponse(ac);
     }
 
@@ -252,16 +253,20 @@ public class AutomationCompositionInstantiationProvider {
             .filter(id -> acFromMigration.getElements().get(id) == null).toList();
     }
 
+
     private InstantiationResponse migratePrecheckAc(
-        AutomationComposition automationComposition, AutomationComposition acToBeUpdated) {
+            AutomationComposition automationComposition, AutomationComposition acToBeUpdated,
+            AutomationCompositionDefinition acDefinition) {
 
         acToBeUpdated.setPrecheck(true);
         var copyAc = new AutomationComposition(acToBeUpdated);
+        var acDefinitionTarget = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
+        AcDefinitionProvider.checkPrimedComposition(acDefinitionTarget);
         // Iterate and update the element property values
-        updateElementsProperties(automationComposition, copyAc);
+        updateElementsProperties(automationComposition, copyAc, acDefinitionTarget);
 
         // Publish migrate event to the participants
-        supervisionAcHandler.migratePrecheck(copyAc);
+        supervisionAcHandler.migratePrecheck(copyAc, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
 
         AcmUtils.setCascadedState(acToBeUpdated, DeployState.DEPLOYED, LockState.LOCKED,
             SubState.MIGRATION_PRECHECKING);
@@ -270,39 +275,19 @@ public class AutomationCompositionInstantiationProvider {
         return createInstantiationResponse(automationCompositionProvider.updateAutomationComposition(acToBeUpdated));
     }
 
-    private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition) {
-        return validateAutomationComposition(automationComposition, automationComposition.getCompositionId());
-    }
-
     /**
      * Validate AutomationComposition.
      *
      * @param automationComposition AutomationComposition to validate
-     * @param compositionId         the composition id
+     * @param acDefinition         the Composition Definition
      * @return the result of validation
      */
     private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition,
-                                                               UUID compositionId) {
-
+            AutomationCompositionDefinition acDefinition) {
         var result = new BeanValidationResult("AutomationComposition", automationComposition);
-        var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId);
-        if (acDefinitionOpt.isEmpty()) {
-            result.addResult(new ObjectValidationResult("ServiceTemplate", compositionId, ValidationStatus.INVALID,
-                "Commissioned automation composition definition not found"));
-            return result;
-        }
-        if (!AcTypeState.PRIMED.equals(acDefinitionOpt.get().getState())) {
-            result.addResult(new ObjectValidationResult("ServiceTemplate.state", acDefinitionOpt.get().getState(),
-                ValidationStatus.INVALID, "Commissioned automation composition definition not primed"));
-            return result;
-        }
-        var participantIds = acDefinitionOpt.get().getElementStateMap().values().stream()
-            .map(NodeTemplateState::getParticipantId).collect(Collectors.toSet());
-
-        participantProvider.verifyParticipantState(participantIds);
-
+        participantProvider.checkRegisteredParticipant(acDefinition);
         result.addResult(AcmUtils.validateAutomationComposition(automationComposition,
-            acDefinitionOpt.get().getServiceTemplate(),
+                acDefinition.getServiceTemplate(),
             acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName()));
 
         result.addResult(automationCompositionProvider.validateElementIds(automationComposition));
@@ -310,7 +295,7 @@ public class AutomationCompositionInstantiationProvider {
         if (result.isValid()) {
             for (var element : automationComposition.getElements().values()) {
                 var name = element.getDefinition().getName();
-                var participantId = acDefinitionOpt.get().getElementStateMap().get(name).getParticipantId();
+                var participantId = acDefinition.getElementStateMap().get(name).getParticipantId();
                 element.setParticipantId(participantId);
             }
         }
@@ -425,7 +410,7 @@ public class AutomationCompositionInstantiationProvider {
                 break;
 
             case "REVIEW":
-                supervisionAcHandler.review(automationComposition);
+                supervisionAcHandler.review(automationComposition, acDefinition);
                 break;
 
             default:
@@ -460,22 +445,22 @@ public class AutomationCompositionInstantiationProvider {
         acToBeUpdated.setElements(automationCompositionToRollback.getElements().values().stream()
                 .collect(Collectors.toMap(AutomationCompositionElement::getId, AutomationCompositionElement::new)));
 
-        var acDefinition = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionTargetId());
-        var validationResult =
-                validateAutomationComposition(acToBeUpdated, acToBeUpdated.getCompositionTargetId());
+        var acDefinitionTarget = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionTargetId());
+        var validationResult = validateAutomationComposition(acToBeUpdated, acDefinitionTarget);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         }
 
-        updateAcForMigration(acToBeUpdated, acDefinition, DeployState.MIGRATION_REVERTING);
+        updateAcForMigration(acToBeUpdated, acDefinitionTarget, DeployState.MIGRATION_REVERTING);
         var elementsRemoved = getElementRemoved(automationComposition, acToBeUpdated);
         automationCompositionProvider.updateAutomationComposition(acToBeUpdated);
         elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement);
-        supervisionAcHandler.migrate(acToBeUpdated);
+        var acDefinition = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionId());
+        supervisionAcHandler.migrate(acToBeUpdated, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
     }
 
     private List<UUID> updateElementsProperties(AutomationComposition automationComposition,
-                                                AutomationComposition acToBeUpdated) {
+            AutomationComposition acToBeUpdated, AutomationCompositionDefinition acDefinitionTarget) {
         for (var element : automationComposition.getElements().entrySet()) {
             var elementId = element.getKey();
             var dbAcElement = acToBeUpdated.getElements().get(elementId);
@@ -487,8 +472,8 @@ public class AutomationCompositionInstantiationProvider {
                 AcmUtils.recursiveMerge(dbAcElement.getProperties(), element.getValue().getProperties());
                 var newDefinition = element.getValue().getDefinition().asConceptKey();
                 var dbElementDefinition = dbAcElement.getDefinition().asConceptKey();
-                AutomationCompositionProvider
-                        .checkCompatibility(newDefinition, dbElementDefinition, automationComposition.getInstanceId());
+                AutomationCompositionProvider.checkCompatibility(
+                        newDefinition, dbElementDefinition, automationComposition.getInstanceId());
                 dbAcElement.setDefinition(element.getValue().getDefinition());
             }
         }
@@ -496,8 +481,7 @@ public class AutomationCompositionInstantiationProvider {
         var elementsRemoved = getElementRemoved(acToBeUpdated, automationComposition);
         elementsRemoved.forEach(uuid -> acToBeUpdated.getElements().remove(uuid));
 
-        var validationResult =
-            validateAutomationComposition(acToBeUpdated, automationComposition.getCompositionTargetId());
+        var validationResult = validateAutomationComposition(acToBeUpdated, acDefinitionTarget);
         if (!validationResult.isValid()) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult());
         }
index a0226e8..7a77aa1 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2025 Nordix Foundation.
+ *  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.
@@ -141,12 +141,7 @@ public class EncryptionUtils {
         }
     }
 
-
-    /**
-     * Find and decrypt sensitive fields in an AC instance.
-     * @param automationComposition acInstance
-     */
-    public void findAndDecryptSensitiveData(AutomationComposition automationComposition) {
+    private void findAndDecryptSensitiveData(AutomationComposition automationComposition) {
         for (var acInstanceElement: automationComposition.getElements().values()) {
             for (var property : acInstanceElement.getProperties().entrySet()) {
                 var propertyVal = property.getValue();
@@ -309,4 +304,26 @@ public class EncryptionUtils {
         }
 
     }
+
+    /**
+     * Find and decrypt sensitive fields in an AC instance.
+     *
+     * @param automationComposition acInstance
+     */
+    public void decryptInstanceProperties(AutomationComposition automationComposition) {
+        if (encryptionEnabled()) {
+            findAndDecryptSensitiveData(automationComposition);
+        }
+    }
+
+    /**
+     * Find and decrypt sensitive fields in an AC instance list.
+     *
+     * @param automationCompositionList acInstance list
+     */
+    public void decryptInstanceProperties(List<AutomationComposition> automationCompositionList) {
+        if (encryptionEnabled()) {
+            automationCompositionList.forEach(this::findAndDecryptSensitiveData);
+        }
+    }
 }
index 991a653..37c3866 100644 (file)
@@ -24,6 +24,7 @@ import io.micrometer.core.annotation.Timed;
 import io.opentelemetry.context.Context;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import lombok.AllArgsConstructor;
@@ -100,8 +101,8 @@ public class SupervisionAcHandler {
         executor.execute(
             () -> {
                 var acToSend = new AutomationComposition(automationComposition);
-                decryptInstanceProperties(acToSend);
-                automationCompositionDeployPublisher.send(acToSend, startPhase, true);
+                encryptionUtils.decryptInstanceProperties(acToSend);
+                automationCompositionDeployPublisher.send(acToSend, startPhase, true, acDefinition.getRevisionId());
             });
     }
 
@@ -131,7 +132,8 @@ public class SupervisionAcHandler {
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
-            () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true));
+            () -> automationCompositionStateChangePublisher.send(
+                    automationComposition, startPhase, true, acDefinition.getRevisionId()));
     }
 
     /**
@@ -158,7 +160,8 @@ public class SupervisionAcHandler {
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
-            () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true));
+            () -> automationCompositionStateChangePublisher.send(
+                    automationComposition, startPhase, true, acDefinition.getRevisionId()));
     }
 
     /**
@@ -175,8 +178,8 @@ public class SupervisionAcHandler {
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(() -> {
             var acToSend = new AutomationComposition(automationComposition);
-            decryptInstanceProperties(acToSend);
-            acPreparePublisher.sendPrepare(acToSend, stage);
+            encryptionUtils.decryptInstanceProperties(acToSend);
+            acPreparePublisher.sendPrepare(acToSend, stage, acDefinition.getRevisionId());
         });
     }
 
@@ -184,12 +187,13 @@ public class SupervisionAcHandler {
      * Handle prepare Post Deploy an AutomationComposition instance.
      *
      * @param automationComposition the AutomationComposition
+     * @param acDefinition the AutomationCompositionDefinition
      */
-    public void review(AutomationComposition automationComposition) {
+    public void review(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
         AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED, SubState.REVIEWING);
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
-        executor.execute(() -> acPreparePublisher.sendRevew(automationComposition));
+        executor.execute(() -> acPreparePublisher.sendReview(automationComposition, acDefinition.getRevisionId()));
     }
 
     /**
@@ -216,19 +220,21 @@ public class SupervisionAcHandler {
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
-            () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true));
+            () -> automationCompositionStateChangePublisher.send(
+                    automationComposition, startPhase, true, acDefinition.getRevisionId()));
     }
 
     /**
      * Handle Element property update on a deployed instance.
      *
      * @param automationComposition the AutomationComposition
+     * @param revisionIdComposition the last Update from Composition
      */
-    public void update(AutomationComposition automationComposition) {
+    public void update(AutomationComposition automationComposition, UUID revisionIdComposition) {
         executor.execute(
             () -> {
-                decryptInstanceProperties(automationComposition);
-                acElementPropertiesPublisher.send(automationComposition);
+                encryptionUtils.decryptInstanceProperties(automationComposition);
+                acElementPropertiesPublisher.send(automationComposition, revisionIdComposition);
             });
     }
 
@@ -245,7 +251,8 @@ public class SupervisionAcHandler {
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAutomationComposition(automationComposition);
         executor.execute(
-            () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true));
+            () -> automationCompositionStateChangePublisher.send(
+                    automationComposition, startPhase, true, acDefinition.getRevisionId()));
     }
 
     /**
@@ -334,11 +341,15 @@ public class SupervisionAcHandler {
      * Handle Migration of an AutomationComposition instance to other ACM Definition.
      *
      * @param automationComposition the AutomationComposition
+     * @param revisionIdComposition the last Update from Composition
+     * @param revisionIdCompositionTarget the last Update from Composition Target
      */
-    public void migrate(AutomationComposition automationComposition) {
+    public void migrate(AutomationComposition automationComposition, UUID revisionIdComposition,
+            UUID revisionIdCompositionTarget) {
         executor.execute(() -> {
-            decryptInstanceProperties(automationComposition);
-            acCompositionMigrationPublisher.send(automationComposition, automationComposition.getPhase());
+            encryptionUtils.decryptInstanceProperties(automationComposition);
+            acCompositionMigrationPublisher.send(automationComposition, automationComposition.getPhase(),
+                    revisionIdComposition, revisionIdCompositionTarget);
         });
     }
 
@@ -346,14 +357,12 @@ public class SupervisionAcHandler {
      * Handle Migration precheck of an AutomationComposition instance to other ACM Definition.
      *
      * @param automationComposition the AutomationComposition
+     * @param revisionIdComposition the last Update from Composition
+     * @param revisionIdCompositionTarget the last Update from Composition Target
      */
-    public void migratePrecheck(AutomationComposition automationComposition) {
-        executor.execute(() -> acCompositionMigrationPublisher.send(automationComposition, 0));
-    }
-
-    private void decryptInstanceProperties(AutomationComposition automationComposition) {
-        if (encryptionUtils.encryptionEnabled()) {
-            encryptionUtils.findAndDecryptSensitiveData(automationComposition);
-        }
+    public void migratePrecheck(AutomationComposition automationComposition, UUID revisionIdComposition,
+            UUID revisionIdCompositionTarget) {
+        executor.execute(() -> acCompositionMigrationPublisher.send(automationComposition, 0,
+                revisionIdComposition, revisionIdCompositionTarget));
     }
 }
index 5627bea..26374c1 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2023-2025 Nordix Foundation.
+ *  Copyright (C) 2023-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.
@@ -29,19 +29,24 @@ import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
 import org.onap.policy.clamp.models.acm.concepts.Participant;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
+import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
@@ -67,6 +72,7 @@ public class SupervisionParticipantHandler {
     private final AcDefinitionProvider acDefinitionProvider;
     private final ParticipantSyncPublisher participantSyncPublisher;
     private final MessageProvider messageProvider;
+    private final EncryptionUtils encryptionUtils;
 
     /**
      * Handle a ParticipantRegister message from a participant.
@@ -75,8 +81,7 @@ public class SupervisionParticipantHandler {
      */
     @Timed(value = "listener.participant_register", description = "PARTICIPANT_REGISTER messages received")
     public void handleParticipantMessage(ParticipantRegister participantRegisterMsg) {
-        saveIfNotPresent(participantRegisterMsg.getReplicaId(),
-                participantRegisterMsg.getParticipantId(),
+        saveIfNotPresent(participantRegisterMsg.getReplicaId(), participantRegisterMsg.getParticipantId(),
                 participantRegisterMsg.getParticipantSupportedElementType(), true);
 
         participantRegisterAckPublisher.send(participantRegisterMsg.getMessageId(),
@@ -118,9 +123,8 @@ public class SupervisionParticipantHandler {
                 && participantStatusMsg.getCompositionId() != null) {
             var acDefinition = acDefinitionProvider.findAcDefinition(participantStatusMsg.getCompositionId());
             if (acDefinition.isPresent()) {
-                var map = acDefinition.get().getElementStateMap()
-                        .values().stream().collect(Collectors.toMap(NodeTemplateState::getNodeTemplateId,
-                                UnaryOperator.identity()));
+                var map = acDefinition.get().getElementStateMap().values().stream()
+                        .collect(Collectors.toMap(NodeTemplateState::getNodeTemplateId, UnaryOperator.identity()));
                 messageProvider.saveCompositionOutProperties(participantStatusMsg, map);
             } else {
                 LOGGER.error("Not valid ParticipantStatus message");
@@ -186,8 +190,9 @@ public class SupervisionParticipantHandler {
         LOGGER.debug("Composition to be send in Restart message {}", acDefinition.getCompositionId());
         var automationCompositionList =
                 automationCompositionProvider.getAcInstancesByCompositionId(acDefinition.getCompositionId());
-        var automationCompositions = automationCompositionList.stream()
-                .filter(ac -> isAcToBeSyncRestarted(participantId, ac)).toList();
+        encryptionUtils.decryptInstanceProperties(automationCompositionList);
+        var automationCompositions =
+                automationCompositionList.stream().filter(ac -> isAcToBeSyncRestarted(participantId, ac)).toList();
         participantSyncPublisher.sendRestartMsg(participantId, replicaId, acDefinition, automationCompositions);
     }
 
@@ -213,4 +218,51 @@ public class SupervisionParticipantHandler {
         MapUtils.populateMap(map, elementList, ParticipantSupportedElementType::getId);
         return map;
     }
+
+    /**
+     * Handle a participantReqSync message from a participant.
+     *
+     * @param participantReqSync the message received from a participant
+     */
+    @Timed(value = "listener.participant_req_sync", description = "PARTICIPANT_REQ_SYNC_MSG messages received")
+    public void handleParticipantReqSync(ParticipantReqSync participantReqSync) {
+        if (participantReqSync.getCompositionTargetId() != null) {
+            // outdated Composition Target
+            var acDefinition = acDefinitionProvider.getAcDefinition(participantReqSync.getCompositionTargetId());
+            participantSyncPublisher.sendRestartMsg(participantReqSync.getParticipantId(),
+                    participantReqSync.getReplicaId(), acDefinition, List.of());
+        }
+        if (participantReqSync.getCompositionId() == null
+                && participantReqSync.getAutomationCompositionId() != null) {
+            // outdated AutomationComposition
+            var automationComposition =
+                    getAutomationCompositionForSync(participantReqSync.getAutomationCompositionId());
+            participantSyncPublisher.sendSync(automationComposition);
+        }
+        if (participantReqSync.getCompositionId() != null) {
+            // outdated Composition
+            var acDefinition = acDefinitionProvider.getAcDefinition(participantReqSync.getCompositionId());
+            var automationCompositions = participantReqSync.getAutomationCompositionId() != null
+                    ? List.of(getAutomationCompositionForSync(participantReqSync.getAutomationCompositionId())) :
+                    List.<AutomationComposition>of();
+            participantSyncPublisher.sendRestartMsg(participantReqSync.getParticipantId(),
+                    participantReqSync.getReplicaId(), acDefinition, automationCompositions);
+        }
+    }
+
+    private AutomationComposition getAutomationCompositionForSync(UUID automationCompositionId) {
+        var automationComposition = automationCompositionProvider.getAutomationComposition(automationCompositionId);
+        encryptionUtils.decryptInstanceProperties(automationComposition);
+        if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
+            var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
+            var stage = ParticipantUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate());
+            if (automationComposition.getPhase().equals(stage)) {
+                // scenario first stage migration
+                var rollback = automationCompositionProvider.getAutomationCompositionRollback(automationCompositionId);
+                automationComposition.setElements(rollback.getElements().values().stream()
+                    .collect(Collectors.toMap(AutomationCompositionElement::getId, AutomationCompositionElement::new)));
+            }
+        }
+        return automationComposition;
+    }
 }
index cc5d146..68a70fa 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2023-2024 Nordix Foundation.
+ * Copyright (C) 2023-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.
@@ -23,8 +23,10 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm;
 import io.micrometer.core.annotation.Timed;
 import java.time.Instant;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
@@ -45,17 +47,21 @@ public class AcElementPropertiesPublisher extends AbstractParticipantPublisher<P
      * Send ACElementPropertiesUpdate to Participant.
      *
      * @param automationComposition the AutomationComposition
+     * @param revisionIdComposition the last Update from Composition
      */
     @Timed(value = "publisher.properties_update", description = "AC Element Properties Update published")
-    public void send(AutomationComposition automationComposition) {
+    public void send(AutomationComposition automationComposition, UUID revisionIdComposition) {
         var propertiesUpdate = new PropertiesUpdate();
         propertiesUpdate.setCompositionId(automationComposition.getCompositionId());
         propertiesUpdate.setAutomationCompositionId(automationComposition.getInstanceId());
         propertiesUpdate.setMessageId(UUID.randomUUID());
         propertiesUpdate.setTimestamp(Instant.now());
-        propertiesUpdate.setParticipantUpdatesList(
-                AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.UPDATE));
-
+        propertiesUpdate.setRevisionIdInstance(automationComposition.getRevisionId());
+        propertiesUpdate.setRevisionIdComposition(revisionIdComposition);
+        var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.UPDATE);
+        propertiesUpdate.setParticipantUpdatesList(participantUpdatesList);
+        propertiesUpdate.setParticipantIdList(participantUpdatesList.stream()
+                .map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
         LOGGER.debug("AC Element properties update sent {}", propertiesUpdate.getMessageId());
         super.send(propertiesUpdate);
     }
index fd465b7..2f1eaf7 100644 (file)
@@ -23,8 +23,11 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm;
 import io.micrometer.core.annotation.Timed;
 import java.time.Instant;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionPrepare;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
@@ -43,14 +46,19 @@ public class AcPreparePublisher extends AbstractParticipantPublisher<AutomationC
      *
      * @param automationComposition the AutomationComposition
      * @param stage the stage
+     * @param revisionIdComposition the last Update from Composition
      */
     @Timed(value = "publisher.prepare", description = "AC Prepare Pre Deploy published")
-    public void sendPrepare(AutomationComposition automationComposition, int stage) {
+    public void sendPrepare(AutomationComposition automationComposition, int stage, UUID revisionIdComposition) {
         var acPrepare = createAutomationCompositionPrepare(automationComposition.getCompositionId(),
             automationComposition.getInstanceId());
         acPrepare.setStage(stage);
-        acPrepare.setParticipantList(
-            AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.NONE));
+        var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.NONE);
+        acPrepare.setParticipantList(participantUpdatesList);
+        acPrepare.setParticipantIdList(participantUpdatesList.stream()
+                .map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
+        acPrepare.setRevisionIdInstance(automationComposition.getRevisionId());
+        acPrepare.setRevisionIdComposition(revisionIdComposition);
         LOGGER.debug("AC Prepare sent {}", acPrepare);
         super.send(acPrepare);
     }
@@ -59,12 +67,17 @@ public class AcPreparePublisher extends AbstractParticipantPublisher<AutomationC
      * Send AutomationCompositionPrepare Review message to Participant.
      *
      * @param automationComposition the AutomationComposition
+     * @param revisionIdComposition the last Update from Composition
      */
     @Timed(value = "publisher.review", description = "AC Review Post Deploy published")
-    public void sendRevew(AutomationComposition automationComposition) {
+    public void sendReview(AutomationComposition automationComposition, UUID revisionIdComposition) {
         var acPrepare = createAutomationCompositionPrepare(automationComposition.getCompositionId(),
             automationComposition.getInstanceId());
         acPrepare.setPreDeploy(false);
+        acPrepare.setParticipantIdList(automationComposition.getElements().values().stream()
+                .map(AutomationCompositionElement::getParticipantId).collect(Collectors.toSet()));
+        acPrepare.setRevisionIdComposition(revisionIdComposition);
+        acPrepare.setRevisionIdInstance(automationComposition.getRevisionId());
         LOGGER.debug("AC Review sent {}", acPrepare);
         super.send(acPrepare);
     }
index d6d38dd..9f39430 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021,2023-2024 Nordix Foundation.
+ * Copyright (C) 2021,2023-2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
@@ -55,10 +55,12 @@ public class AutomationCompositionDeployPublisher extends AbstractParticipantPub
      * @param automationComposition the AutomationComposition
      * @param startPhase the Start Phase
      * @param firstStartPhase true if the first StartPhase
+     * @param revisionIdComposition the last Update from Composition
      */
     @Timed(value = "publisher.automation_composition_deploy",
             description = "AUTOMATION_COMPOSITION_DEPLOY messages published")
-    public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) {
+    public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase,
+            UUID revisionIdComposition) {
         Map<UUID, List<AcElementDeploy>> map = new HashMap<>();
         for (var element : automationComposition.getElements().values()) {
             var acElementDeploy = AcmUtils.createAcElementDeploy(element, DeployOrder.DEPLOY);
@@ -66,20 +68,23 @@ public class AutomationCompositionDeployPublisher extends AbstractParticipantPub
             map.get(element.getParticipantId()).add(acElementDeploy);
         }
         List<ParticipantDeploy> participantDeploys = new ArrayList<>();
+        var acDeployMsg = new AutomationCompositionDeploy();
         for (var entry : map.entrySet()) {
             var participantDeploy = new ParticipantDeploy();
             participantDeploy.setParticipantId(entry.getKey());
+            acDeployMsg.getParticipantIdList().add(entry.getKey());
             participantDeploy.setAcElementList(entry.getValue());
             participantDeploys.add(participantDeploy);
         }
 
-        var acDeployMsg = new AutomationCompositionDeploy();
         acDeployMsg.setCompositionId(automationComposition.getCompositionId());
         acDeployMsg.setStartPhase(startPhase);
         acDeployMsg.setFirstStartPhase(firstStartPhase);
         acDeployMsg.setAutomationCompositionId(automationComposition.getInstanceId());
         acDeployMsg.setMessageId(UUID.randomUUID());
         acDeployMsg.setTimestamp(Instant.now());
+        acDeployMsg.setRevisionIdInstance(automationComposition.getRevisionId());
+        acDeployMsg.setRevisionIdComposition(revisionIdComposition);
         acDeployMsg.setParticipantUpdatesList(participantDeploys);
 
         LOGGER.debug("AutomationCompositionDeploy message sent {}", acDeployMsg.getMessageId());
index 4aef404..f19473f 100644 (file)
@@ -22,8 +22,10 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm;
 
 import io.micrometer.core.annotation.Timed;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
@@ -38,11 +40,14 @@ public class AutomationCompositionMigrationPublisher
      *
      * @param automationComposition the AutomationComposition
      * @param stage the stage to execute
+     * @param revisionIdComposition the last Update from Composition
+     * @param revisionIdCompositionTarget the last Update from Composition Target
      */
     @Timed(
             value = "publisher.automation_composition_migration",
             description = "AUTOMATION_COMPOSITION_MIGRATION messages published")
-    public void send(AutomationComposition automationComposition, int stage) {
+    public void send(AutomationComposition automationComposition, int stage, UUID revisionIdComposition,
+            UUID revisionIdCompositionTarget) {
         var acMigration = new AutomationCompositionMigration();
         acMigration.setRollback(DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState()));
         acMigration.setPrecheck(Boolean.TRUE.equals(automationComposition.getPrecheck()));
@@ -51,8 +56,14 @@ public class AutomationCompositionMigrationPublisher
         acMigration.setMessageId(UUID.randomUUID());
         acMigration.setCompositionTargetId(automationComposition.getCompositionTargetId());
         acMigration.setStage(stage);
-        acMigration.setParticipantUpdatesList(
-                AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE));
+        acMigration.setRevisionIdInstance(automationComposition.getRevisionId());
+        acMigration.setRevisionIdComposition(revisionIdComposition);
+        acMigration.setRevisionIdCompositionTarget(revisionIdCompositionTarget);
+        var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE);
+        acMigration.setParticipantUpdatesList(participantUpdatesList);
+        acMigration.setParticipantIdList(participantUpdatesList.stream()
+                .map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
+
         super.send(acMigration);
     }
 }
index 3160e36..ee358ff 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021-2024 Nordix Foundation.
+ * Copyright (C) 2021-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.
@@ -22,7 +22,9 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm;
 
 import io.micrometer.core.annotation.Timed;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionStateChange;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.springframework.stereotype.Component;
@@ -39,11 +41,13 @@ public class AutomationCompositionStateChangePublisher
      *
      * @param automationComposition the AutomationComposition
      * @param startPhase the startPhase
+     * @param revisionIdComposition the last Update from Composition
      */
     @Timed(
             value = "publisher.automation_composition_state_change",
             description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published")
-    public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) {
+    public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase,
+            UUID revisionIdComposition) {
         var acsc = new AutomationCompositionStateChange();
         acsc.setCompositionId(automationComposition.getCompositionId());
         acsc.setAutomationCompositionId(automationComposition.getInstanceId());
@@ -52,6 +56,10 @@ public class AutomationCompositionStateChangePublisher
         acsc.setLockOrderedState(AcmUtils.stateLockToOrder(automationComposition.getLockState()));
         acsc.setStartPhase(startPhase);
         acsc.setFirstStartPhase(firstStartPhase);
+        acsc.setRevisionIdInstance(automationComposition.getRevisionId());
+        acsc.setRevisionIdComposition(revisionIdComposition);
+        acsc.setParticipantIdList(automationComposition.getElements().values().stream()
+                .map(AutomationCompositionElement::getParticipantId).collect(Collectors.toSet()));
 
         super.send(acsc);
     }
index 360e526..34bcb01 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021-2024 Nordix Foundation.
+ * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
@@ -28,7 +28,9 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
@@ -62,15 +64,17 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher<Part
      *
      * @param participantDefinitions the list of ParticipantDefinition to send
      * @param compositionId the compositionId
-     * @param participantId the ParticipantId
+     * @param revisionId last update
      */
     @Timed(value = "publisher.participant_update", description = "PARTICIPANT_UPDATE messages published")
     public void sendPriming(List<ParticipantDefinition> participantDefinitions, UUID compositionId,
-            UUID participantId) {
+            UUID revisionId) {
         var message = new ParticipantPrime();
         message.setCompositionId(compositionId);
-        message.setParticipantId(participantId);
+        message.setParticipantIdList(participantDefinitions.stream()
+                .map(ParticipantDefinition::getParticipantId).collect(Collectors.toSet()));
         message.setTimestamp(Instant.now());
+        message.setRevisionIdComposition(revisionId);
         message.setParticipantDefinitionUpdates(participantDefinitions);
         LOGGER.debug("Participant Update sent {}", message.getMessageId());
         super.send(message);
@@ -86,6 +90,7 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher<Part
     public List<ParticipantDefinition> prepareParticipantPriming(AutomationCompositionDefinition acmDefinition) {
         acmDefinition.setStateChangeResult(StateChangeResult.NO_ERROR);
         acmDefinition.setState(AcTypeState.PRIMING);
+        acmDefinition.setRevisionId(UUID.randomUUID());
         acmDefinition.setLastMsg(TimestampHelper.now());
         var acElements = AcmUtils.extractAcElementsFromServiceTemplate(acmDefinition.getServiceTemplate(),
                 acRuntimeParameterGroup.getAcmParameters().getToscaElementName());
@@ -120,10 +125,12 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher<Part
      * Send ParticipantPrime to Participant after that commissioning has been removed.
      */
     @Timed(value = "publisher.participant_update", description = "PARTICIPANT_UPDATE messages published")
-    public void sendDepriming(UUID compositionId) {
+    public void sendDepriming(UUID compositionId, Set<UUID> participantIds, UUID revisionId) {
         var message = new ParticipantPrime();
         message.setCompositionId(compositionId);
+        message.setParticipantIdList(participantIds);
         message.setTimestamp(Instant.now());
+        message.setRevisionIdComposition(revisionId);
         // DeCommission the automation composition but deleting participantdefinitions on participants
         message.setParticipantDefinitionUpdates(null);
 
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java
new file mode 100644 (file)
index 0000000..71a545d
--- /dev/null
@@ -0,0 +1,60 @@
+/*-
+ * ============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.policy.clamp.acm.runtime.supervision.comm;
+
+import org.onap.policy.clamp.acm.runtime.config.messaging.Listener;
+import org.onap.policy.clamp.acm.runtime.main.utils.NetLoggerUtil;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler;
+import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
+import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.message.bus.event.Topic;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ParticipantReqSyncListener extends ScoListener<ParticipantReqSync>
+        implements Listener<ParticipantReqSync> {
+
+    private final SupervisionParticipantHandler supervisionParticipantHandler;
+
+    public ParticipantReqSyncListener(SupervisionParticipantHandler supervisionParticipantHandler) {
+        super(ParticipantReqSync.class);
+        this.supervisionParticipantHandler = supervisionParticipantHandler;
+    }
+
+    @Override
+    public String getType() {
+        return ParticipantMessageType.PARTICIPANT_REQ_SYNC_MSG.name();
+    }
+
+    @Override
+    public ScoListener<ParticipantReqSync> getScoListener() {
+        return this;
+    }
+
+    @Override
+    public void onTopicEvent(final Topic.CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+            ParticipantReqSync participantReqSync) {
+        NetLoggerUtil.log(NetLoggerUtil.EventType.IN, infra, topic, participantReqSync.toString());
+        supervisionParticipantHandler.handleParticipantReqSync(participantReqSync);
+    }
+}
index 3e42f94..b5fe222 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2024 Nordix Foundation.
+ *  Copyright (C) 2024-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.
@@ -64,6 +64,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher<Parti
         message.setMessageId(UUID.randomUUID());
         message.setTimestamp(Instant.now());
         message.setState(acmDefinition.getState());
+        message.setRevisionIdComposition(acmDefinition.getRevisionId());
         message.setParticipantDefinitionUpdates(AcmUtils.prepareParticipantRestarting(participantId, acmDefinition,
                 acRuntimeParameterGroup.getAcmParameters().getToscaElementName()));
 
@@ -102,6 +103,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher<Parti
         message.setStateChangeResult(acDefinition.getStateChangeResult());
         message.setMessageId(UUID.randomUUID());
         message.setTimestamp(Instant.now());
+        message.setRevisionIdComposition(acDefinition.getRevisionId());
         if (AcTypeState.COMMISSIONED.equals(acDefinition.getState())) {
             message.setDelete(true);
         } else {
@@ -127,6 +129,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher<Parti
         message.setTimestamp(Instant.now());
         var syncAc = new ParticipantRestartAc();
         syncAc.setAutomationCompositionId(automationComposition.getInstanceId());
+        syncAc.setRevisionId(automationComposition.getRevisionId());
         syncAc.setDeployState(automationComposition.getDeployState());
         syncAc.setLockState(automationComposition.getLockState());
         syncAc.setStateChangeResult(automationComposition.getStateChangeResult());
index 84b5a9e..27a05f3 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
 
+import java.util.UUID;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
@@ -122,6 +123,9 @@ public abstract class AbstractScanner {
      */
     public void saveAndSync(AutomationComposition automationComposition, UpdateSync updateSync) {
         if (updateSync.isUpdated()) {
+            if (updateSync.isToBeSync()) {
+                automationComposition.setRevisionId(UUID.randomUUID());
+            }
             acProvider.updateAutomationComposition(automationComposition);
         }
         if (updateSync.isToBeDelete()) {
@@ -134,8 +138,6 @@ public abstract class AbstractScanner {
     }
 
     protected void decryptInstanceProperties(AutomationComposition automationComposition) {
-        if (encryptionUtils.encryptionEnabled()) {
-            encryptionUtils.findAndDecryptSensitiveData(automationComposition);
-        }
+        encryptionUtils.decryptInstanceProperties(automationComposition);
     }
 }
index 1502da8..797fe50 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
 
+import java.util.UUID;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
@@ -161,6 +162,7 @@ public class AcDefinitionScanner {
     private void updateAcDefinitionState(AutomationCompositionDefinition acDefinition,
             UpdateSync updateSync) {
         if (updateSync.isUpdated()) {
+            acDefinition.setRevisionId(UUID.randomUUID());
             acDefinitionProvider.updateAcDefinitionState(acDefinition);
         }
         if (updateSync.isToBeSync()) {
index 8436778..38fdede 100644 (file)
@@ -35,7 +35,6 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvide
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -90,15 +89,24 @@ public class MonitoringScanner {
         }
         if (automationCompositionOpt.isPresent()) {
             var automationComposition = automationCompositionOpt.get();
-            var compositionId = automationComposition.getCompositionTargetId() != null
-                    ? automationComposition.getCompositionTargetId() : automationComposition.getCompositionId();
-            var acDefinition = acDefinitionMap.computeIfAbsent(compositionId, acDefinitionProvider::getAcDefinition);
-            scanAutomationComposition(automationComposition, acDefinition.getServiceTemplate(), updateSync);
+            if (automationComposition.getCompositionTargetId() != null) {
+                var acDefinitionTarget = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionTargetId(),
+                        acDefinitionProvider::getAcDefinition);
+                var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
+                        acDefinitionProvider::getAcDefinition);
+                scanAutomationComposition(automationComposition, acDefinitionTarget, updateSync,
+                        acDefinition.getRevisionId());
+            } else {
+                var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
+                        acDefinitionProvider::getAcDefinition);
+                scanAutomationComposition(automationComposition, acDefinition, updateSync,
+                        acDefinition.getRevisionId());
+            }
         }
     }
 
     private void scanAutomationComposition(final AutomationComposition automationComposition,
-            ToscaServiceTemplate serviceTemplate, UpdateSync updateSync) {
+            AutomationCompositionDefinition acDefinition, UpdateSync updateSync, UUID revisionIdComposition) {
         LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
 
         if (!AcmUtils.isInTransitionalState(automationComposition.getDeployState(),
@@ -112,13 +120,13 @@ public class MonitoringScanner {
         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
                 || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())
                 || SubState.PREPARING.equals(automationComposition.getSubState())) {
-            stageScanner.scanStage(automationComposition, serviceTemplate, updateSync);
+            stageScanner.scanStage(automationComposition, acDefinition, updateSync, revisionIdComposition);
         } else if (DeployState.UPDATING.equals(automationComposition.getDeployState())
                 || SubState.REVIEWING.equals(automationComposition.getSubState())
                 || SubState.MIGRATION_PRECHECKING.equals(automationComposition.getSubState())) {
             simpleScanner.simpleScan(automationComposition, updateSync);
         } else {
-            phaseScanner.scanWithPhase(automationComposition, serviceTemplate, updateSync);
+            phaseScanner.scanWithPhase(automationComposition, acDefinition, updateSync);
         }
     }
 }
index 18bdb55..ad2204a 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2025 Nordix Foundation.
+ * Copyright (C) 2025 Nordix 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.
@@ -26,11 +26,11 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionD
 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -64,18 +64,18 @@ public class PhaseScanner extends AbstractScanner {
      * Scan with startPhase: DEPLOY, UNDEPLOY, LOCK and UNLOCK.
      *
      * @param automationComposition the AutomationComposition
-     * @param serviceTemplate the ToscaServiceTemplate
+     * @param acDefinition the AutomationComposition Definition
      * @param updateSync the update/sync information
      */
     public void scanWithPhase(final AutomationComposition automationComposition,
-            ToscaServiceTemplate serviceTemplate, UpdateSync updateSync) {
+            AutomationCompositionDefinition acDefinition, UpdateSync updateSync) {
         var completed = true;
         var minSpNotCompleted = 1000; // min startPhase not completed
         var maxSpNotCompleted = 0; // max startPhase not completed
         var defaultMin = 1000; // min startPhase
         var defaultMax = 0; // max startPhase
         for (var element : automationComposition.getElements().values()) {
-            var toscaNodeTemplate = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+            var toscaNodeTemplate = acDefinition.getServiceTemplate().getToscaTopologyTemplate().getNodeTemplates()
                     .get(element.getDefinition().getName());
             int startPhase = toscaNodeTemplate != null
                     && element.getDefinition().getVersion().equals(toscaNodeTemplate.getVersion())
@@ -102,7 +102,7 @@ public class PhaseScanner extends AbstractScanner {
             var nextSpNotCompleted = isForward ? minSpNotCompleted : maxSpNotCompleted;
 
             if (nextSpNotCompleted != automationComposition.getPhase()) {
-                sendAutomationCompositionMsg(automationComposition, nextSpNotCompleted, updateSync);
+                sendAutomationCompositionMsg(automationComposition, nextSpNotCompleted, updateSync, acDefinition);
             } else {
                 handleTimeout(automationComposition, updateSync);
             }
@@ -110,7 +110,7 @@ public class PhaseScanner extends AbstractScanner {
     }
 
     private void sendAutomationCompositionMsg(AutomationComposition automationComposition, int startPhase,
-            UpdateSync updateSync) {
+            UpdateSync updateSync, AutomationCompositionDefinition acDefinition) {
         savePhase(automationComposition, startPhase);
         updateSync.setUpdated(true);
         saveAndSync(automationComposition, updateSync);
@@ -119,10 +119,10 @@ public class PhaseScanner extends AbstractScanner {
             LOGGER.debug("retry message AutomationCompositionDeploy");
             var acToSend = new AutomationComposition(automationComposition);
             decryptInstanceProperties(acToSend);
-            acDeployPublisher.send(acToSend, startPhase, false);
+            acDeployPublisher.send(acToSend, startPhase, false, acDefinition.getRevisionId());
         } else {
             LOGGER.debug("retry message AutomationCompositionStateChange");
-            acStateChangePublisher.send(automationComposition, startPhase, false);
+            acStateChangePublisher.send(automationComposition, startPhase, false, acDefinition.getRevisionId());
         }
     }
 }
index b9eae89..9791d5e 100644 (file)
 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
 
 import java.util.Comparator;
+import java.util.UUID;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.AcPreparePublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -66,17 +67,18 @@ public class StageScanner extends AbstractScanner {
      * Scan with stage: MIGRATE.
      *
      * @param automationComposition the AutomationComposition
-     * @param serviceTemplate the ToscaServiceTemplate
+     * @param acDefinition the Composition Definition and for migration is the Composition target
      * @param updateSync the update/sync information
+     * @param revisionIdComposition the last Update from Composition
      */
-    public void scanStage(final AutomationComposition automationComposition, ToscaServiceTemplate serviceTemplate,
-            UpdateSync updateSync) {
+    public void scanStage(final AutomationComposition automationComposition,
+            AutomationCompositionDefinition acDefinition, UpdateSync updateSync, UUID revisionIdComposition) {
         var completed = true;
         var minStageNotCompleted = 1000; // min stage not completed
         for (var element : automationComposition.getElements().values()) {
             if (AcmUtils.isInTransitionalState(element.getDeployState(), element.getLockState(),
                     element.getSubState())) {
-                var toscaNodeTemplate = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+                var toscaNodeTemplate = acDefinition.getServiceTemplate().getToscaTopologyTemplate().getNodeTemplates()
                         .get(element.getDefinition().getName());
                 var stageSet = DeployState.MIGRATING.equals(automationComposition.getDeployState())
                             || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())
@@ -102,22 +104,25 @@ public class StageScanner extends AbstractScanner {
                 LOGGER.debug("retry message AutomationCompositionMigration");
                 var acToSend = new AutomationComposition(automationComposition);
                 decryptInstanceProperties(acToSend);
-                sendNextStage(acToSend, minStageNotCompleted);
+                sendNextStage(acToSend, minStageNotCompleted, revisionIdComposition, acDefinition);
             } else {
                 handleTimeout(automationComposition, updateSync);
             }
         }
     }
 
-    private void sendNextStage(final AutomationComposition automationComposition, int minStageNotCompleted) {
+    private void sendNextStage(final AutomationComposition automationComposition, int minStageNotCompleted,
+            UUID revisionIdComposition, AutomationCompositionDefinition acDefinition) {
         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
                 || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())) {
             LOGGER.debug("retry message AutomationCompositionMigration");
-            acMigrationPublisher.send(automationComposition, minStageNotCompleted);
+            // acDefinition for migration is the Composition target
+            acMigrationPublisher.send(automationComposition, minStageNotCompleted, revisionIdComposition,
+                    acDefinition.getRevisionId());
         }
         if (SubState.PREPARING.equals(automationComposition.getSubState())) {
             LOGGER.debug("retry message AutomationCompositionPrepare");
-            acPreparePublisher.sendPrepare(automationComposition, minStageNotCompleted);
+            acPreparePublisher.sendPrepare(automationComposition, minStageNotCompleted, acDefinition.getRevisionId());
         }
     }
 }
index 7c8fda6..517ee56 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2025 Nordix Foundation.
+ *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,7 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC
 
 import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
@@ -42,6 +43,7 @@ import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
+import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.AcTypeStateUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.PrimeOrder;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
@@ -197,9 +199,12 @@ class CommissioningProviderTest {
         var acTypeStateUpdate = new AcTypeStateUpdate();
         acTypeStateUpdate.setPrimeOrder(PrimeOrder.DEPRIME);
 
-        doNothing().when(participantProvider).verifyParticipantState(any());
+        var participantIds = acmDefinition.getElementStateMap().values().stream()
+                .map(NodeTemplateState::getParticipantId).collect(Collectors.toSet());
+        doNothing().when(participantProvider).verifyParticipantState(participantIds);
         provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate);
-        verify(participantPrimePublisher, timeout(1000).times(1)).sendDepriming(compositionId);
+        verify(participantPrimePublisher, timeout(1000).times(1))
+                .sendDepriming(compositionId, participantIds, acmDefinition.getRevisionId());
     }
 
     @Test
index a0e028e..325f3a9 100644 (file)
@@ -33,10 +33,10 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
+import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
 import java.util.UUID;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -130,7 +130,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
         var acProvider = mock(AutomationCompositionProvider.class);
         var supervisionAcHandler = mock(SupervisionAcHandler.class);
@@ -188,7 +188,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationCompositionUpdate =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
@@ -211,7 +211,7 @@ class AutomationCompositionInstantiationProviderTest {
         var instantiationResponse = instantiationProvider.updateAutomationComposition(
                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
 
-        verify(supervisionAcHandler).update(any());
+        verify(supervisionAcHandler).update(any(), any());
         verify(acProvider).updateAutomationComposition(acmFromDb);
         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
 
@@ -232,22 +232,28 @@ class AutomationCompositionInstantiationProviderTest {
 
     @Test
     void testUpdateBadRequest() {
+        var acDefinitionProvider = mock(AcDefinitionProvider.class);
+        var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
+        var compositionId = acDefinition.getCompositionId();
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
+
         var automationCompositionUpdate =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
         automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
         automationCompositionUpdate.setLockState(LockState.NONE);
+        automationCompositionUpdate.setCompositionId(compositionId);
         var acProvider = mock(AutomationCompositionProvider.class);
         var encryptionUtils = mock(EncryptionUtils.class);
         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
                 .thenReturn(automationCompositionUpdate);
 
         var instantiationProvider =
-                new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
+                new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
                         new AcInstanceStateResolver(), mock(SupervisionAcHandler.class),
                         mock(ParticipantProvider.class),
                         mock(AcRuntimeParameterGroup.class), encryptionUtils);
 
-        var compositionId = automationCompositionUpdate.getCompositionId();
+
         assertThatThrownBy(
                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
                 .hasMessageMatching(
@@ -267,7 +273,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
         var instanceId = UUID.randomUUID();
 
         var automationComposition =
@@ -287,7 +293,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
         var compositionTargetId = acDefinitionTarget.getCompositionId();
         automationCompositionTarget.setCompositionTargetId(compositionTargetId);
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
         when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
 
@@ -301,7 +307,7 @@ class AutomationCompositionInstantiationProviderTest {
         automationCompositionTarget.setPrecheck(true);
         var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
                 automationCompositionTarget);
-        verify(supervisionAcHandler).migratePrecheck(any());
+        verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
 
         automationCompositionTarget.setPrecheck(false);
@@ -310,7 +316,7 @@ class AutomationCompositionInstantiationProviderTest {
         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
                 automationCompositionTarget);
 
-        verify(supervisionAcHandler).migrate(any());
+        verify(supervisionAcHandler).migrate(any(), any(), any());
         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
     }
 
@@ -319,7 +325,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
@@ -327,6 +333,9 @@ class AutomationCompositionInstantiationProviderTest {
         automationComposition.setDeployState(DeployState.DEPLOYED);
         automationComposition.setLockState(LockState.LOCKED);
         automationComposition.setCompositionTargetId(UUID.randomUUID());
+        when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()))
+                .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
+                        String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId())));
         var acProvider = mock(AutomationCompositionProvider.class);
         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(automationComposition);
@@ -346,7 +355,6 @@ class AutomationCompositionInstantiationProviderTest {
 
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionTargetId = acDefinitionTarget.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
         automationComposition.setCompositionTargetId(compositionTargetId);
@@ -354,7 +362,7 @@ class AutomationCompositionInstantiationProviderTest {
         var instantiationResponse = instantiationProvider
                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
-        verify(supervisionAcHandler).migrate(any());
+        verify(supervisionAcHandler).migrate(any(), any(), any());
         verify(acProvider).updateAutomationComposition(automationComposition);
         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
     }
@@ -364,7 +372,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
@@ -385,23 +393,25 @@ class AutomationCompositionInstantiationProviderTest {
                 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider,
                 new AcRuntimeParameterGroup(), encryptionUtils);
 
-        assertThatThrownBy(() -> instantiationProvider
-                .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
-                .hasMessageMatching(
-                        String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
-
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionTargetId = acDefinitionTarget.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
-
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
         automationComposition.setCompositionTargetId(compositionTargetId);
 
         var instantiationResponse = instantiationProvider
                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
-        verify(supervisionAcHandler).migratePrecheck(any());
+        verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
         verify(acProvider).updateAutomationComposition(automationComposition);
         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
+
+        automationComposition.setSubState(SubState.NONE);
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId))
+                .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
+                        String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
+        assertThatThrownBy(() -> instantiationProvider
+                .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
+                .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
     }
 
     @Test
@@ -409,7 +419,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
@@ -423,7 +433,7 @@ class AutomationCompositionInstantiationProviderTest {
 
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionTargetId = acDefinitionTarget.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
         var acMigrate = new AutomationComposition(automationComposition);
         acMigrate.setCompositionTargetId(compositionTargetId);
@@ -446,7 +456,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
@@ -461,7 +471,7 @@ class AutomationCompositionInstantiationProviderTest {
 
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionTargetId = acDefinitionTarget.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
         var acMigrate = new AutomationComposition(automationComposition);
         acMigrate.setCompositionTargetId(compositionTargetId);
@@ -584,7 +594,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud");
@@ -615,15 +625,17 @@ class AutomationCompositionInstantiationProviderTest {
         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
                 encryptionUtils);
-        assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
-                .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
-
         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
-        when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
+
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId))
+                .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND,
+                        String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
+        assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
+                .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
     }
 
     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
@@ -656,7 +668,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var automationCompositionCreate =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
@@ -666,6 +678,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acProvider = mock(AutomationCompositionProvider.class);
         when(acProvider.createAutomationComposition(automationCompositionCreate))
                 .thenReturn(automationCompositionCreate);
+        var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
         var participantProvider = mock(ParticipantProvider.class);
         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
@@ -676,13 +689,12 @@ class AutomationCompositionInstantiationProviderTest {
         var instantiationResponse = instantiationProvider.createAutomationComposition(
                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
-        var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
+
         doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
                 .when(acProvider).validateNameVersion(acIdentifier);
-
         assertThatThrownBy(
                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
-                .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
+                .hasMessageMatching(acIdentifier + " already defined");
     }
 
     @Test
@@ -691,7 +703,7 @@ class AutomationCompositionInstantiationProviderTest {
         var participantProvider = mock(ParticipantProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
         automationComposition.setCompositionId(compositionId);
@@ -719,11 +731,15 @@ class AutomationCompositionInstantiationProviderTest {
         var acProvider = mock(AutomationCompositionProvider.class);
         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(automationComposition);
-        var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
+        var acDefinitionProvider = mock(AcDefinitionProvider.class);
+        var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
                 null, null, null,
                 mock(AcRuntimeParameterGroup.class), null);
 
         var compositionId = automationComposition.getCompositionId();
+        when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
+                .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
+                        String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId())));
         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
@@ -773,7 +789,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
         var compositionId = acDefinition.getCompositionId();
-        when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
         var acProvider = mock(AutomationCompositionProvider.class);
         var provider =
                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
@@ -782,11 +798,7 @@ class AutomationCompositionInstantiationProviderTest {
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
         automationComposition.setCompositionId(compositionId);
-        var message = """
-                      "AutomationComposition" INVALID, item has status INVALID
-                        item "ServiceTemplate.state" value "COMMISSIONED" INVALID, Commissioned automation composition \
-                      definition not primed
-                      """;
+        var message = compositionId + " Commissioned automation composition definition not primed";
 
         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
                 .hasMessageMatching(message);
@@ -848,7 +860,8 @@ class AutomationCompositionInstantiationProviderTest {
         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
         acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
-        verify(supervisionAcHandler).prepare(any(AutomationComposition.class), any());
+        verify(supervisionAcHandler).prepare(any(AutomationComposition.class),
+                any(AutomationCompositionDefinition.class));
 
         automationComposition.setDeployState(DeployState.DEPLOYED);
         automationComposition.setLockState(LockState.LOCKED);
@@ -856,6 +869,7 @@ class AutomationCompositionInstantiationProviderTest {
         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
         acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
-        verify(supervisionAcHandler).review(any(AutomationComposition.class));
+        verify(supervisionAcHandler).review(any(AutomationComposition.class),
+                any(AutomationCompositionDefinition.class));
     }
 }
index f4fffdb..49fb33c 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2025 Nordix Foundation.
+ *  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.
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.security.InvalidAlgorithmParameterException;
+import java.util.List;
 import javax.crypto.Cipher;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -35,19 +36,17 @@ import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeEx
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
 
 class EncryptionUtilTest {
 
-    private static ToscaServiceTemplate serviceTemplateEncrypt;
-    public static final String TOSCA_TEMPLATE_YAML = "src/test/resources/providers/AcDefinitionEncryptTest.yaml";
-    public static final String INSTANTIATE_JSON = "src/test/resources/providers/AcInstantiateEncryptTest.json";
+    private static final String TOSCA_TEMPLATE_YAML = "src/test/resources/providers/AcDefinitionEncryptTest.yaml";
+    private static final String INSTANTIATE_JSON = "src/test/resources/providers/AcInstantiateEncryptTest.json";
     private static AutomationCompositionDefinition acDefinition;
 
     @BeforeAll
     static void setUpBeforeClass() {
-        serviceTemplateEncrypt = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
+        var serviceTemplateEncrypt = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
         var jpa2 = ProviderUtils.getJpaAndValidate(serviceTemplateEncrypt, JpaToscaServiceTemplate::new,
                 "toscaServiceTemplate");
         serviceTemplateEncrypt = jpa2.toAuthorative();
@@ -60,22 +59,17 @@ class EncryptionUtilTest {
                 InstantiationUtils.getAutomationCompositionFromResource(INSTANTIATE_JSON, "Crud");
         var encryptionUtils = new EncryptionUtils(CommonTestData.getEncryptionParameterGroup());
         assertTrue(encryptionUtils.encryptionEnabled());
-        assertDoesNotThrow(()
-                -> {
-            assert automationComposition != null;
-            encryptionUtils.findAndEncryptSensitiveData(acDefinition, automationComposition);
-        });
-
         assert automationComposition != null;
+        assertDoesNotThrow(() -> encryptionUtils.findAndEncryptSensitiveData(acDefinition, automationComposition));
+
         automationComposition.getElements().values().forEach(element -> {
             assertTrue(element.getProperties().get("secret").toString().startsWith("ENCRYPTED:"));
             assertTrue(element.getProperties().get("password").toString().startsWith("ENCRYPTED:"));
         });
 
         var encryptionUtil2 = new EncryptionUtils(CommonTestData.getEncryptionParameterGroup());
-        assertDoesNotThrow(() -> {
-            encryptionUtil2.findAndDecryptSensitiveData(automationComposition);
-        });
+        assertDoesNotThrow(() -> encryptionUtil2.decryptInstanceProperties(automationComposition));
+        assertDoesNotThrow(() -> encryptionUtil2.decryptInstanceProperties(List.of(automationComposition)));
         automationComposition.getElements().values().forEach(element -> {
             assertEquals("mysecret", element.getProperties().get("secret").toString());
             assertEquals("mypass", element.getProperties().get("password").toString());
@@ -99,8 +93,7 @@ class EncryptionUtilTest {
 
         assert automationComposition != null;
         assertThrows(AutomationCompositionRuntimeException.class,
-                () -> encryptionUtils.findAndDecryptSensitiveData(automationComposition));
-
+                () -> encryptionUtils.decryptInstanceProperties(automationComposition));
     }
 
 }
index 689a4ba..d9ffb0a 100644 (file)
@@ -45,6 +45,7 @@ import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
@@ -282,7 +283,7 @@ class SupervisionAcHandlerTest {
         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
         handler.deploy(automationComposition, acDefinition);
         verify(acProvider).updateAutomationComposition(automationComposition);
-        verify(acDeployPublisher, timeout(1000)).send(automationComposition, 0, true);
+        verify(acDeployPublisher, timeout(1000)).send(automationComposition, 0, true, acDefinition.getRevisionId());
     }
 
     @Test
@@ -308,7 +309,8 @@ class SupervisionAcHandlerTest {
         handler.undeploy(automationComposition, acDefinition);
 
         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
-        verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
+        verify(acStateChangePublisher, timeout(1000))
+                .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
     }
 
     @Test
@@ -366,7 +368,8 @@ class SupervisionAcHandlerTest {
         handler.unlock(automationComposition, acDefinition);
 
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
-        verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
+        verify(acStateChangePublisher, timeout(1000))
+                .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
     }
 
     @Test
@@ -421,7 +424,8 @@ class SupervisionAcHandlerTest {
         handler.lock(automationComposition, acDefinition);
 
         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
-        verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
+        verify(acStateChangePublisher, timeout(1000))
+                .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
     }
 
     @Test
@@ -492,8 +496,9 @@ class SupervisionAcHandlerTest {
                 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
-        handler.update(automationComposition);
-        verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class));
+        handler.update(automationComposition, UUID.randomUUID());
+        verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class),
+                any(UUID.class));
     }
 
     @Test
@@ -508,8 +513,9 @@ class SupervisionAcHandlerTest {
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
         assert automationComposition != null;
         automationComposition.setPhase(0);
-        handler.migrate(automationComposition);
-        verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt());
+        handler.migrate(automationComposition, UUID.randomUUID(), UUID.randomUUID());
+        verify(acCompositionMigrationPublisher, timeout(1000))
+                .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class));
     }
 
     @Test
@@ -522,8 +528,9 @@ class SupervisionAcHandlerTest {
                 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
-        handler.migratePrecheck(automationComposition);
-        verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt());
+        handler.migratePrecheck(automationComposition, UUID.randomUUID(), UUID.randomUUID());
+        verify(acCompositionMigrationPublisher, timeout(1000))
+                .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class));
     }
 
     @Test
@@ -539,7 +546,8 @@ class SupervisionAcHandlerTest {
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
         handler.prepare(automationComposition, acDefinition);
-        verify(acPreparePublisher, timeout(1000)).sendPrepare(any(AutomationComposition.class), anyInt());
+        verify(acPreparePublisher, timeout(1000)).sendPrepare(any(AutomationComposition.class), anyInt(),
+                any(UUID.class));
     }
 
     @Test
@@ -552,7 +560,7 @@ class SupervisionAcHandlerTest {
                 acPreparePublisher, mock(MessageProvider.class), mock(EncryptionUtils.class));
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
-        handler.review(automationComposition);
-        verify(acPreparePublisher, timeout(1000)).sendRevew(any(AutomationComposition.class));
+        handler.review(automationComposition, new AutomationCompositionDefinition());
+        verify(acPreparePublisher, timeout(1000)).sendReview(any(AutomationComposition.class), any(UUID.class));
     }
 }
index 2cdcf21..67ac077 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2023-2025 Nordix Foundation.
+ *  Copyright (C) 2023-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.
@@ -35,14 +35,18 @@ import java.util.Set;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
+import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionInfo;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionRollback;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
 import org.onap.policy.clamp.models.acm.concepts.Participant;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
@@ -50,12 +54,15 @@ import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
+import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
 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.MessageProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
 
 class SupervisionParticipantHandlerTest {
 
@@ -72,7 +79,7 @@ class SupervisionParticipantHandlerTest {
                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
                         participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class),
                         mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
-                        mock(MessageProvider.class));
+                        mock(MessageProvider.class), mock(EncryptionUtils.class));
 
         handler.handleParticipantMessage(participantDeregisterMessage);
         verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId());
@@ -100,7 +107,7 @@ class SupervisionParticipantHandlerTest {
         var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
                 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
                 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
-                mock(MessageProvider.class));
+                mock(MessageProvider.class), mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantRegisterMessage);
 
         verify(participantProvider).saveParticipant(any());
@@ -157,7 +164,7 @@ class SupervisionParticipantHandlerTest {
         var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
         var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
                 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, acDefinitionProvider,
-                participantSyncPublisher, mock(MessageProvider.class));
+                participantSyncPublisher, mock(MessageProvider.class), mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantRegisterMessage);
 
         verify(participantRegisterAckPublisher)
@@ -186,10 +193,10 @@ class SupervisionParticipantHandlerTest {
         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
         var messageProvider = mock(MessageProvider.class);
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
-        var handler =
-                new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
-                        mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
-                        acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
+        var handler = new SupervisionParticipantHandler(participantProvider,
+                mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                automationCompositionProvider, acDefinitionProvider, mock(ParticipantSyncPublisher.class),
+                messageProvider, mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantStatusMessage);
 
         verify(messageProvider).saveInstanceOutProperties(any(ParticipantStatus.class));
@@ -219,10 +226,10 @@ class SupervisionParticipantHandlerTest {
         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
         var participantProvider = mock(ParticipantProvider.class);
-        var handler =
-                new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
-                        mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
-                        acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
+        var handler = new SupervisionParticipantHandler(participantProvider,
+                mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                mock(AutomationCompositionProvider.class), acDefinitionProvider, mock(ParticipantSyncPublisher.class),
+                messageProvider, mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantStatusMessage);
         verify(messageProvider).saveCompositionOutProperties(any(), any());
     }
@@ -242,10 +249,10 @@ class SupervisionParticipantHandlerTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var messageProvider = mock(MessageProvider.class);
         var participantProvider = mock(ParticipantProvider.class);
-        var handler =
-                new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
-                        mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
-                        acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
+        var handler = new SupervisionParticipantHandler(participantProvider,
+                mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                mock(AutomationCompositionProvider.class), acDefinitionProvider, mock(ParticipantSyncPublisher.class),
+                messageProvider, mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantStatusMessage);
         verify(messageProvider, times(0)).saveCompositionOutProperties(any(), any());
     }
@@ -261,7 +268,7 @@ class SupervisionParticipantHandlerTest {
                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
                         mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
                         mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
-                        mock(MessageProvider.class));
+                        mock(MessageProvider.class), mock(EncryptionUtils.class));
         handler.handleParticipantMessage(participantStatusMessage);
 
         verify(participantProvider).saveParticipant(any());
@@ -280,10 +287,10 @@ class SupervisionParticipantHandlerTest {
         var participantProvider = mock(ParticipantProvider.class);
         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
         var messageProvider = mock(MessageProvider.class);
-        var handler =
-                new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
-                        mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
-                        acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
+        var handler = new SupervisionParticipantHandler(participantProvider,
+                mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                automationCompositionProvider, acDefinitionProvider, mock(ParticipantSyncPublisher.class),
+                messageProvider, mock(EncryptionUtils.class));
         var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
         when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
                 .thenReturn(Optional.of(participant));
@@ -300,4 +307,107 @@ class SupervisionParticipantHandlerTest {
         statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
         return statusMessage;
     }
+
+    @Test
+    void testHandleParticipantReqSyncComposition() {
+        var acDefinitionProvider = mock(AcDefinitionProvider.class);
+        var acDefinition = new AutomationCompositionDefinition();
+        var compositionId = UUID.randomUUID();
+        acDefinition.setCompositionId(compositionId);
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
+
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
+        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
+        var handler =
+                new SupervisionParticipantHandler(mock(ParticipantProvider.class),
+                        mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                        automationCompositionProvider, acDefinitionProvider, participantSyncPublisher,
+                        mock(MessageProvider.class), mock(EncryptionUtils.class));
+        var participantReqSync = createParticipantReqSync(compositionId);
+        handler.handleParticipantReqSync(participantReqSync);
+        verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(),
+                CommonTestData.getReplicaId(), acDefinition, List.of());
+
+        clearInvocations(participantSyncPublisher);
+        var automationComposition =
+                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
+        automationComposition.setCompositionId(compositionId);
+        automationComposition.setInstanceId(UUID.randomUUID());
+        automationComposition.setDeployState(DeployState.DEPLOYED);
+        when(automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
+                .thenReturn(automationComposition);
+
+        participantReqSync.setAutomationCompositionId(automationComposition.getInstanceId());
+        handler.handleParticipantReqSync(participantReqSync);
+        verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(),
+                CommonTestData.getReplicaId(), acDefinition, List.of(automationComposition));
+    }
+
+    @Test
+    void testHandleParticipantReqSyncCompositionTarget() {
+        var acDefinitionProvider = mock(AcDefinitionProvider.class);
+        var acDefinition = new AutomationCompositionDefinition();
+        var compositionId = UUID.randomUUID();
+        acDefinition.setCompositionId(compositionId);
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
+
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
+        var handler = new SupervisionParticipantHandler(mock(ParticipantProvider.class),
+                mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                mock(AutomationCompositionProvider.class), acDefinitionProvider,
+                participantSyncPublisher, mock(MessageProvider.class), mock(EncryptionUtils.class));
+        var participantReqSync = createParticipantReqSync(null);
+        participantReqSync.setCompositionTargetId(compositionId);
+        handler.handleParticipantReqSync(participantReqSync);
+        verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(),
+                CommonTestData.getReplicaId(), acDefinition, List.of());
+    }
+
+
+    @Test
+    void testHandleParticipantReqSyncAutomationComposition() {
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(new ToscaServiceTemplate());
+        acDefinition.getServiceTemplate().setToscaTopologyTemplate(new ToscaTopologyTemplate());
+        var compositionId = UUID.randomUUID();
+        acDefinition.setCompositionId(compositionId);
+        var acDefinitionProvider = mock(AcDefinitionProvider.class);
+        when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
+        var automationComposition = new AutomationComposition();
+        automationComposition.setElements(Map.of());
+        automationComposition.setPhase(1);
+        automationComposition.setCompositionTargetId(compositionId);
+        automationComposition.setInstanceId(UUID.randomUUID());
+        automationComposition.setDeployState(DeployState.MIGRATING);
+        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
+        when(automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
+                .thenReturn(automationComposition);
+
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
+        var handler =
+                new SupervisionParticipantHandler(mock(ParticipantProvider.class),
+                        mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
+                        automationCompositionProvider, acDefinitionProvider, participantSyncPublisher,
+                        mock(MessageProvider.class), mock(EncryptionUtils.class));
+        var participantReqSync = createParticipantReqSync(null);
+        participantReqSync.setAutomationCompositionId(automationComposition.getInstanceId());
+
+        handler.handleParticipantReqSync(participantReqSync);
+        verify(participantSyncPublisher).sendSync(automationComposition);
+
+        clearInvocations(participantSyncPublisher);
+        automationComposition.setPhase(0);
+        when(automationCompositionProvider.getAutomationCompositionRollback(automationComposition.getInstanceId()))
+                .thenReturn(new AutomationCompositionRollback());
+        handler.handleParticipantReqSync(participantReqSync);
+        verify(participantSyncPublisher).sendSync(automationComposition);
+    }
+
+    private ParticipantReqSync createParticipantReqSync(UUID compositionId) {
+        var participantReqSync = new ParticipantReqSync();
+        participantReqSync.setCompositionId(compositionId);
+        participantReqSync.setParticipantId(CommonTestData.getParticipantId());
+        participantReqSync.setReplicaId(CommonTestData.getReplicaId());
+        return participantReqSync;
+    }
 }
index 44582d6..ca65a63 100644 (file)
@@ -206,7 +206,7 @@ class SupervisionScannerTest {
 
     private void verifyNoInteraction(
             StageScanner stageScanner, SimpleScanner simpleScanner, PhaseScanner phaseScanner) {
-        verify(stageScanner, times(0)).scanStage(any(), any(), any());
+        verify(stageScanner, times(0)).scanStage(any(), any(), any(), any());
         verify(simpleScanner, times(0)).simpleScan(any(), any());
         verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any());
     }
@@ -242,7 +242,7 @@ class SupervisionScannerTest {
                 messageProvider, monitoringScanner);
 
         supervisionScanner.run();
-        verify(stageScanner, times(0)).scanStage(any(), any(), any());
+        verify(stageScanner, times(0)).scanStage(any(), any(), any(), any());
         verify(simpleScanner, times(0)).simpleScan(any(), any());
         verify(phaseScanner).scanWithPhase(any(), any(), any());
         verify(messageProvider).removeMessage(message.getMessageId());
@@ -272,10 +272,13 @@ class SupervisionScannerTest {
         when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(Optional.of(automationComposition));
 
-        var definitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED);
-        definitionTarget.setCompositionId(compositionTargetId);
+        var acDefinitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED);
+        acDefinitionTarget.setCompositionId(compositionTargetId);
         var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED);
-        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget);
+        when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setCompositionId(COMPOSITION_ID);
+        when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition);
         var stageScanner = mock(StageScanner.class);
 
         var messageProvider = mock(MessageProvider.class);
@@ -287,8 +290,8 @@ class SupervisionScannerTest {
                 messageProvider, monitoringScanner);
 
         supervisionScanner.run();
-        verify(stageScanner).scanStage(automationComposition, definitionTarget.getServiceTemplate(),
-                new UpdateSync());
+        verify(stageScanner).scanStage(automationComposition, acDefinitionTarget, new UpdateSync(),
+                acDefinition.getRevisionId());
         verify(messageProvider).removeJob(JOB_ID);
     }
 
@@ -319,6 +322,9 @@ class SupervisionScannerTest {
         definitionTarget.setCompositionId(compositionTargetId);
         var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED);
         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget);
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setCompositionId(COMPOSITION_ID);
+        when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition);
         var stageScanner = mock(StageScanner.class);
 
         var messageProvider = mock(MessageProvider.class);
@@ -330,8 +336,8 @@ class SupervisionScannerTest {
                 messageProvider, monitoringScanner);
 
         supervisionScanner.run();
-        verify(stageScanner).scanStage(automationComposition, definitionTarget.getServiceTemplate(),
-                new UpdateSync());
+        verify(stageScanner).scanStage(automationComposition, definitionTarget, new UpdateSync(),
+                acDefinition.getRevisionId());
         verify(messageProvider).removeJob(JOB_ID);
     }
 
index ad3feeb..84b80ae 100644 (file)
@@ -32,6 +32,7 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
@@ -124,7 +125,8 @@ class SupervisionMessagesTest {
     @Test
     void testSendAutomationCompositionStateChangePublisherNotActive() {
         var publisher = new AutomationCompositionStateChangePublisher();
-        assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0, true)).hasMessage(NOT_ACTIVE);
+        assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0, true, UUID.randomUUID()))
+                .hasMessage(NOT_ACTIVE);
     }
 
     private AutomationComposition getAutomationComposition() {
@@ -133,6 +135,7 @@ class SupervisionMessagesTest {
         automationComposition.setVersion("0.0.1");
         automationComposition.setDeployState(DeployState.DEPLOYED);
         automationComposition.setLockState(LockState.UNLOCKING);
+        automationComposition.setElements(new HashMap<>());
         return automationComposition;
     }
 
@@ -141,7 +144,7 @@ class SupervisionMessagesTest {
         var publisher = new AutomationCompositionStateChangePublisher();
         var topicSink = mock(TopicSink.class);
         publisher.active(topicSink);
-        publisher.send(getAutomationComposition(), 0, true);
+        publisher.send(getAutomationComposition(), 0, true, UUID.randomUUID());
         verify(topicSink).send(anyString());
         publisher.stop();
     }
@@ -152,7 +155,7 @@ class SupervisionMessagesTest {
                 mock(AcRuntimeParameterGroup.class));
         var topicSink = mock(TopicSink.class);
         publisher.active(topicSink);
-        publisher.sendDepriming(UUID.randomUUID());
+        publisher.sendDepriming(UUID.randomUUID(), Set.of(UUID.randomUUID()), UUID.randomUUID());
         verify(topicSink).send(anyString());
     }
 
@@ -183,7 +186,7 @@ class SupervisionMessagesTest {
                 .extractAcElementsFromServiceTemplate(serviceTemplate, TOSCA_ELEMENT_NAME);
         acmDefinition.setElementStateMap(AcmUtils.createElementStateMap(acElements, AcTypeState.COMMISSIONED));
         var preparation = publisher.prepareParticipantPriming(acmDefinition);
-        publisher.sendPriming(preparation, acmDefinition.getCompositionId(), null);
+        publisher.sendPriming(preparation, acmDefinition.getCompositionId(), acmDefinition.getRevisionId());
         verify(topicSink).send(anyString());
     }
 
@@ -221,7 +224,7 @@ class SupervisionMessagesTest {
         publisher.active(topicSink);
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
-        publisher.send(automationComposition);
+        publisher.send(automationComposition, UUID.randomUUID());
         verify(topicSink).send(anyString());
     }
 
@@ -232,7 +235,7 @@ class SupervisionMessagesTest {
         publisher.active(topicSink);
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
-        publisher.send(automationComposition, 0);
+        publisher.send(automationComposition, 0, UUID.randomUUID(), UUID.randomUUID());
         verify(topicSink).send(anyString());
     }
 
@@ -243,7 +246,7 @@ class SupervisionMessagesTest {
         publisher.active(topicSink);
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
-        publisher.sendPrepare(automationComposition, 0);
+        publisher.sendPrepare(automationComposition, 0, UUID.randomUUID());
         verify(topicSink).send(anyString());
     }
 
@@ -254,7 +257,7 @@ class SupervisionMessagesTest {
         publisher.active(topicSink);
         var automationComposition =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
-        publisher.sendRevew(automationComposition);
+        publisher.sendReview(automationComposition, UUID.randomUUID());
         verify(topicSink).send(anyString());
     }
 
index 657a21f..4f3dcce 100644 (file)
@@ -41,6 +41,7 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionS
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
@@ -73,8 +74,9 @@ class PhaseScannerTest {
 
         var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
 
         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
     }
@@ -94,8 +96,9 @@ class PhaseScannerTest {
 
         var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
 
         verify(automationCompositionProvider).deleteAutomationComposition(automationComposition.getInstanceId());
     }
@@ -117,21 +120,22 @@ class PhaseScannerTest {
 
         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
         when(automationCompositionProvider.updateAutomationComposition(any())).thenReturn(automationComposition);
-        var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
-        var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
-        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
         var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
         acRuntimeParameterGroup.getParticipantParameters().setMaxOperationWaitMs(-1);
-        var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
 
         // verify timeout scenario
+        automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
+        automationComposition.setLastMsg(TimestampHelper.now());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
+        var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
+        var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
         var phaseScanner = new PhaseScanner(automationCompositionProvider, participantSyncPublisher,
                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
 
-        automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
-        automationComposition.setLastMsg(TimestampHelper.now());
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
         verify(participantSyncPublisher).sendSync(any(AutomationComposition.class));
         assertEquals(StateChangeResult.TIMEOUT, automationComposition.getStateChangeResult());
@@ -139,7 +143,7 @@ class PhaseScannerTest {
         //already in TIMEOUT
         clearInvocations(automationCompositionProvider);
         clearInvocations(participantSyncPublisher);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
         verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
         verify(participantSyncPublisher, times(0))
                 .sendSync(any(AutomationComposition.class));
@@ -149,7 +153,7 @@ class PhaseScannerTest {
         for (Map.Entry<UUID, AutomationCompositionElement> entry : automationComposition.getElements().entrySet()) {
             entry.getValue().setDeployState(DeployState.DEPLOYED);
         }
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
         verify(participantSyncPublisher).sendSync(any(AutomationComposition.class));
         assertEquals(StateChangeResult.NO_ERROR, automationComposition.getStateChangeResult());
@@ -182,10 +186,11 @@ class PhaseScannerTest {
         var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
 
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
 
-        verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
+        verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
     }
 
     @Test
@@ -218,11 +223,12 @@ class PhaseScannerTest {
                 mock(AutomationCompositionStateChangePublisher.class), acDeployPublisher,
                 acRuntimeParameterGroup, encryptionUtils);
 
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
 
         verify(acDeployPublisher, times(0))
-                .send(any(AutomationComposition.class), anyInt(), anyBoolean());
+                .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
     }
 
     @Test
@@ -252,10 +258,11 @@ class PhaseScannerTest {
         var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class),
                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
 
-        var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
+        phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync());
 
         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(),
-                anyBoolean());
+                anyBoolean(), any(UUID.class));
     }
 }
index f51d43d..30d16d5 100644 (file)
@@ -40,6 +40,7 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionM
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.SubState;
@@ -77,7 +78,9 @@ class StageScannerTest {
                 mock(AutomationCompositionMigrationPublisher.class), mock(AcPreparePublisher.class),
                 acRuntimeParameterGroup, encryptionUtils);
         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(serviceTemplate);
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(DeployState.MIGRATING, automationComposition.getDeployState());
 
@@ -87,14 +90,14 @@ class StageScannerTest {
                 .get(element.getDefinition().getName());
         toscaNodeTemplate.setProperties(Map.of("stage", List.of(1)));
 
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(DeployState.MIGRATING, automationComposition.getDeployState());
 
         // first element is migrated
         clearInvocations(acProvider);
         element.setDeployState(DeployState.DEPLOYED);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
 
         assertEquals(DeployState.DEPLOYED, automationComposition.getDeployState());
@@ -128,7 +131,9 @@ class StageScannerTest {
                 mock(AutomationCompositionMigrationPublisher.class), mock(AcPreparePublisher.class),
                 acRuntimeParameterGroup, encryptionUtils);
         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(serviceTemplate);
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState());
 
@@ -138,14 +143,14 @@ class StageScannerTest {
                 .get(element.getDefinition().getName());
         toscaNodeTemplate.setProperties(Map.of("stage", List.of(1)));
 
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState());
 
         // first element is migrated
         clearInvocations(acProvider);
         element.setDeployState(DeployState.DEPLOYED);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
 
         assertEquals(DeployState.DEPLOYED, automationComposition.getDeployState());
@@ -180,7 +185,9 @@ class StageScannerTest {
                 acRuntimeParameterGroup, encryptionUtils);
 
         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        var acDefinition = new AutomationCompositionDefinition();
+        acDefinition.setServiceTemplate(serviceTemplate);
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(SubState.PREPARING, automationComposition.getSubState());
 
@@ -191,14 +198,14 @@ class StageScannerTest {
         var prepare = Map.of("prepare", List.of(1));
         toscaNodeTemplate.setProperties(Map.of("stage", prepare));
 
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
         assertEquals(SubState.PREPARING, automationComposition.getSubState());
 
         // first element is prepared
         clearInvocations(acProvider);
         element.setSubState(SubState.NONE);
-        supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync());
+        supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID());
         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
 
         assertEquals(SubState.NONE, automationComposition.getSubState());