Update doc for migration handling 29/142329/1 master
authorFrancescoFioraEst <francesco.fiora@est.tech>
Wed, 29 Oct 2025 15:39:52 +0000 (15:39 +0000)
committerFrancesco Fiora <francesco.fiora@est.tech>
Thu, 30 Oct 2025 15:25:37 +0000 (15:25 +0000)
Issue-ID: POLICY-5471
Change-Id: I9eff2943de4cc7c98efafd3d832b4b9758832fdb
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
docs/clamp/acm/acm-participant-guide.rst
docs/clamp/acm/acm-states.rst
docs/clamp/acm/acm-user-guide.rst
docs/clamp/acm/design-impl/clamp-runtime-acm.rst
docs/clamp/acm/design-impl/participants/participant-intermediary.rst

index b842019..1418df9 100644 (file)
@@ -778,6 +778,7 @@ ParticipantIntermediaryApi:
   #. The requested operations are completed in the handler class and the ACM-runtime needs to be notified.
   #. Collect all instances data.
   #. Send out Properties to ACM-runtime.
+  #. Calculate the next stage during migration, rollback and prepare
 
   The methods are as follows:
 
@@ -788,11 +789,11 @@ This following methods could be invoked to fetch data during each operation in t
   1.  Map<UUID, AutomationComposition> getAutomationCompositions();
   2.  AutomationComposition getAutomationComposition(UUID instanceId);
   3.  AutomationCompositionElement getAutomationCompositionElement(UUID instanceId, UUID elementId);
-  4.  getInstanceElementDto(UUID instanceId, UUID elementId);
+  4.  InstanceElementDto getInstanceElementDto(UUID instanceId, UUID elementId);
   5.  Map<UUID, Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition>> getAcElementsDefinitions();
   6   Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> getAcElementsDefinitions(UUID compositionId);
   7.  AutomationCompositionElementDefinition getAcElementDefinition(UUID compositionId, ToscaConceptIdentifier elementId);
-  8.  getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId);
+  8.  CompositionElementDto getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId);
 
 This following methods are invoked to update the outProperties during each operation in the participant.
 
@@ -809,6 +810,14 @@ This following methods are invoked to update the AC element state or AC element
   2.  void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult, String message);
   3.  void updateAutomationCompositionElementStage(UUID instance, UUID elementId, StateChangeResult stateChangeResult, int stage, String message);
 
+This following methods calculate the next stage during migration, rollback and prepare for the AC element during each operation in the participant.
+
+.. code-block:: java
+
+  1. int getMigrateNextStage(CompositionElementDto compositionElementTarget, int lastStage);
+  2. int getRollbackNextStage(CompositionElementDto compositionElementRollback, int lastStage);
+  3. int getPrepareNextStage(CompositionElementDto compositionElement, int lastStage);
+
 In/Out composition Properties
 -----------------------------
 The 'Common Properties' could be created or updated by ACM-runtime.
@@ -1017,66 +1026,64 @@ The following example shows the Handler implementation and how could be the impl
   public class AutomationCompositionElementHandler extends AcElementListenerV3 {
 
     @Override
-    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-            throws PfModelException {
+    public void prime(CompositionDto composition) throws PfModelException {
 
-        // TODO deploy process
+        // TODO prime process
 
-        if (isDeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
-                "Deployed");
+        if (isPrimeSuccess()) {
+            intermediaryApi.updateCompositionState(composition.compositionId(),
+                AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
         } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
-                "Deploy failed!");
+            intermediaryApi.updateCompositionState(composition.compositionId(),
+                AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
         }
     }
 
     @Override
-    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
-            throws PfModelException {
+    public void deprime(CompositionDto composition) throws PfModelException {
 
-        // TODO undeploy process
+        // TODO deprime process
 
-        if (isUndeploySuccess()) {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
-                    "Undeployed");
+        if (isDeprimeSuccess()) {
+            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
+                StateChangeResult.NO_ERROR, "Deprimed");
         } else {
-            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
-                    "Undeploy failed!");
+            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
+                StateChangeResult.FAILED, "Deprime failed!");
         }
     }
 
     @Override
-    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+    public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
             throws PfModelException {
 
-        // TODO lock process
+        // TODO deploy process
 
-        if (isLockSuccess()) {
+        if (isDeploySuccess()) {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
+                "Deployed");
         } else {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
+                "Deploy failed!");
         }
     }
 
     @Override
-    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+    public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
             throws PfModelException {
 
-        // TODO unlock process
+        // TODO undeploy process
 
-        if (isUnlockSuccess()) {
+        if (isUndeploySuccess()) {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+                instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                    "Undeployed");
         } else {
             intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
-                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+                instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
+                    "Undeploy failed!");
         }
     }
 
@@ -1096,6 +1103,13 @@ The following example shows the Handler implementation and how could be the impl
         }
     }
 
+
+The following example shows how could be the implemented the update/migration/rollback notifications.
+Note: the removed elements always happen at stage 0
+
+.. code-block:: java
+
+
     @Override
     public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
             InstanceElementDto instanceElementUpdated) throws PfModelException {
@@ -1118,22 +1132,30 @@ The following example shows the Handler implementation and how could be the impl
             InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate, int stage)
             throws PfModelException
 
+        if (ElementState.REMOVED.equals(instanceElementMigrate.state())) {
+
+            // TODO element remove scenario
+
+            if (isMigrateSuccess()) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Migrated");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
+            }
+            return;
+        }
+
         switch (instanceElementMigrate.state()) {
             case NEW -> // TODO new element scenario
-            case REMOVED -> // TODO element remove scenario
             default ->  // TODO migration process
         }
 
         if (isMigrateSuccess()) {
-            var stageSet = ParticipantUtils.findStageSetMigrate(compositionElementTarget.inProperties());
-            var nextStage = 1000;
-            for (var s : stageSet) {
-                if (s > stage) {
-                    nextStage = Math.min(s, nextStage);
-                }
-            }
-
-            if (nextStage == 1000) {
+            var nextStage = intermediaryApi.getMigrateNextStage(compositionElementTarget, stage);
+            if (nextStage == stage) {
                 intermediaryApi.updateAutomationCompositionElementState(
                     instanceElement.instanceId(), instanceElement.elementId(),
                     DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
@@ -1150,61 +1172,124 @@ The following example shows the Handler implementation and how could be the impl
     }
 
     @Override
-    public void migratePrecheck(UUID instanceId, UUID elementId) throws PfModelException {
+    public void rollbackMigration(CompositionElementDto compositionElement,
+            CompositionElementDto compositionElementRollback, InstanceElementDto instanceElement,
+            InstanceElementDto instanceElementRollback, int stage) {
 
-        // TODO migration Precheck process
+        if (ElementState.REMOVED.equals(instanceElementRollback.state())) {
 
-        intermediaryApi.updateAutomationCompositionElementState(
-            instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migration precheck completed");
+            // TODO element remove scenario
+
+            if (isRollbackSuccess()) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Rollback completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Rollback failed!");
+            }
+            return;
+        }
+
+        switch (instanceElementRollback.state()) {
+            case NEW -> // TODO element to be re-insert
+            default ->  // TODO rollback process
+        }
+
+        if (isRollbackSuccess()) {
+            var nextStage = intermediaryApi.getRollbackNextStage(compositionElementRollback, stage);
+            if (nextStage == stage) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Rollback completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementStage(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    StateChangeResult.NO_ERROR, nextStage, "stage " + stage + " Rollback");
+            }
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(
+                instanceElement.instanceId(), instanceElement.elementId(),
+                DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Rollback failed!");
+        }
     }
 
+
+The following example shows how could be the implemented the other notifications.
+
+.. code-block:: java
+
     @Override
-    public void prepare(UUID instanceId, UUID elementId) throws PfModelException {
+    public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
 
-        // TODO prepare process
+        // TODO lock process
 
-        intermediaryApi.updateAutomationCompositionElementState(
-            instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
+        if (isLockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+        }
     }
 
     @Override
-    public void review(UUID instanceId, UUID elementId) throws PfModelException {
+    public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+            throws PfModelException {
 
-        // TODO review process
+        // TODO unlock process
+
+        if (isUnlockSuccess()) {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+        } else {
+            intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
+                instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+        }
+    }
+
+    @Override
+    public void migratePrecheck(UUID instanceId, UUID elementId) throws PfModelException {
+
+        // TODO migration Precheck process
 
         intermediaryApi.updateAutomationCompositionElementState(
             instanceElement.instanceId(), instanceElement.elementId(),
-            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Review completed");
+            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migration precheck completed");
     }
 
     @Override
-    public void prime(CompositionDto composition) throws PfModelException {
-
-        // TODO prime process
+    public void prepare(UUID instanceId, UUID elementId) throws PfModelException {
 
-        if (isPrimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+        // TODO prepare process
+        if (isPrepareSuccess()) {
+            var nextStage = intermediaryApi.getPrepareNextStage(compositionElement, stage);
+            if (nextStage == stage) {
+                intermediaryApi.updateAutomationCompositionElementState(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
+            } else {
+                intermediaryApi.updateAutomationCompositionElementStage(
+                    instanceElement.instanceId(), instanceElement.elementId(),
+                    StateChangeResult.NO_ERROR, nextStage, "stage " + stage + " Prepare");
+            }
         } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(),
-                AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
+            intermediaryApi.updateAutomationCompositionElementState(
+                instanceElement.instanceId(), instanceElement.elementId(),
+                DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Prepare failed");
         }
     }
 
     @Override
-    public void deprime(CompositionDto composition) throws PfModelException {
+    public void review(UUID instanceId, UUID elementId) throws PfModelException {
 
-        // TODO deprime process
+        // TODO review process
 
-        if (isDeprimeSuccess()) {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
-                StateChangeResult.NO_ERROR, "Deprimed");
-        } else {
-            intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
-                StateChangeResult.FAILED, "Deprime failed!");
-        }
+        intermediaryApi.updateAutomationCompositionElementState(
+            instanceElement.instanceId(), instanceElement.elementId(),
+            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Review completed");
     }
 
 
index 12849e7..7ba4c56 100644 (file)
@@ -133,25 +133,27 @@ Automation Composition Type State
 Automation Composition Instance DeployState
 ===========================================
 
-+---------------+------------+
-|  DeployState  |  Database  |
-+===============+============+
-|  DEPLOYED     |         0  |
-+---------------+------------+
-|  DEPLOYING    |         1  |
-+---------------+------------+
-|  UNDEPLOYED   |         2  |
-+---------------+------------+
-|  UNDEPLOYING  |         3  |
-+---------------+------------+
-|  DELETING     |         4  |
-+---------------+------------+
-|  DELETED      |         5  |
-+---------------+------------+
-|  UPDATING     |         6  |
-+---------------+------------+
-|  MIGRATING    |         7  |
-+---------------+------------+
++---------------------+------------+
+|  DeployState        |  Database  |
++=====================+============+
+|  DEPLOYED           |         0  |
++---------------------+------------+
+|  DEPLOYING          |         1  |
++---------------------+------------+
+|  UNDEPLOYED         |         2  |
++---------------------+------------+
+|  UNDEPLOYING        |         3  |
++---------------------+------------+
+|  DELETING           |         4  |
++---------------------+------------+
+|  DELETED            |         5  |
++---------------------+------------+
+|  UPDATING           |         6  |
++---------------------+------------+
+|  MIGRATING          |         7  |
++---------------------+------------+
+| MIGRATION_REVERTING |         8  |
++---------------------+------------+
 
 Automation Composition Instance Lock State
 ==========================================
index 7f9078c..0ffcac4 100644 (file)
@@ -249,8 +249,8 @@ deleteTimeoutMs:
   Denotes the maximum wait time during delete operation by the runtime to receive the state change update from participant
 
 
-Update AC instance properties (Optional)
-----------------------------------------
+Update AC instance properties
+-----------------------------
 Before the AC instance is deployed, the user is allowed to update the instance property values if needed. The runtime updates these new values
 in the database.
 
@@ -347,8 +347,8 @@ Request payload
 .. literalinclude:: files/AC-review.json
    :language: json
 
-Update AC instance properties after deployment (Optional)
----------------------------------------------------------
+Update AC instance properties after deployment
+----------------------------------------------
 After the AC instance is deployed, the user can still update the instance property values if needed. In this case, the runtime updates these new values
 in the database and also sends an update event to the participants. The participants has to implement the update method to perform the
 required operation.
@@ -403,10 +403,10 @@ by the participant.
 .. literalinclude:: files/AC-migrate.json
    :language: json
 
-Rollback AC instance (Optional)
--------------------------------
+Rollback AC instance
+--------------------
 
-In the event of a migration failure, the user can rollback to a previous state.
+In the event of a migration failure or timeout, the user can rollback to a previous state.
 
 .. code-block:: bash
 
index 5c6359a..bfeeceb 100644 (file)
@@ -366,16 +366,19 @@ How Stage works
 +++++++++++++++
 In state changes in MIGRATING Automation Composition elements starts in increasing order from stage 0.
 
-Example of MIGRATE order with Http_PMSHMicroserviceAutomationCompositionElement with stage [0,2] and PMSH_K8SMicroserviceAutomationCompositionElement with startPhase to [0,1]:
+Example of MIGRATE order with Http_PMSHMicroserviceAutomationCompositionElement with stage [0,2] and PMSH_K8SMicroserviceAutomationCompositionElement with stage to [0,1]:
 
 - ACM-runtime sends a broadcast AUTOMATION_COMPOSITION_MIGRATION message to all participants with stage = 0
-- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs to DEPLOYED state (only AC elements that contains stage 0: Http_PMSHMicroserviceAutomationCompositionElement and PMSH_K8SMicroserviceAutomationCompositionElement)
-- ACM-runtime receives AUTOMATION_COMPOSITION_DEPLOY_ACK messages from participants and set the state (from the AC element of the message) to DEPLOYED
-- ACM-runtime calculates that all AC elements with stage = 0 are set to proper state and sends a broadcast AUTOMATION_COMPOSITION_MIGRATION message with stage = 1
-- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs to DEPLOYED state (only AC elements that contains stage 1: PMSH_K8SMicroserviceAutomationCompositionElement)
-- ACM-runtime receives AUTOMATION_COMPOSITION_DEPLOY_ACK messages from participants and set the state (from the AC element of the message) to DEPLOYED
-- ACM-runtime calculates that all AC elements with stage = 1 are set to proper state and sends a broadcast AUTOMATION_COMPOSITION_MIGRATION message with stage = 2
-- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs to DEPLOYED state (only AC elements that contains stage 2: Http_PMSHMicroserviceAutomationCompositionElement)
+- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs the migration only the AC elements that contains stage 0: Http_PMSHMicroserviceAutomationCompositionElement and PMSH_K8SMicroserviceAutomationCompositionElement
+- participant calculates the next stage and sends the AUTOMATION_COMPOSITION_DEPLOY_ACK message to runtime with the next stage
+- ACM-runtime receives AUTOMATION_COMPOSITION_DEPLOY_ACK messages from participants and set the state and stage from the AC element of the message
+- ACM-runtime calculates that all AC elements have forwarded to next stage and sends a broadcast AUTOMATION_COMPOSITION_MIGRATION message with stage = 1
+- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs the migration only the AC elements that contains stage 1: PMSH_K8SMicroserviceAutomationCompositionElement
+- participant sends the AUTOMATION_COMPOSITION_DEPLOY_ACK message to runtime with the next stage or migration completed
+- ACM-runtime receives AUTOMATION_COMPOSITION_DEPLOY_ACK messages from participants and set the state and stage from the AC element of the message
+- ACM-runtime calculates that all AC elements have forwarded to next stage or completed and sends a broadcast AUTOMATION_COMPOSITION_MIGRATION message with stage = 2
+- participant receives the AUTOMATION_COMPOSITION_MIGRATION message and runs the migration only the AC elements that contains stage 2: Http_PMSHMicroserviceAutomationCompositionElement
+- participant sends the AUTOMATION_COMPOSITION_DEPLOY_ACK message to runtime with migration completed
 - ACM-runtime receives AUTOMATION_COMPOSITION_DEPLOY_ACK messages from participants and set the state (from the AC element of the message) to DEPLOYED
 - ACM-runtime calculates that all AC elements are set to proper state and set AC to DEPLOYED
 
index 64635f0..57c5447 100644 (file)
@@ -117,11 +117,19 @@ Migrate-precheck of an Automation Composition Instance
 Migrate of an Automation Composition Instance
 ---------------------------------------------
 - ACM-runtime saves the compositionTargetId and updates the instance properties of the deployed Ac instances
-- it triggers the execution to send a broadcast AUTOMATION_COMPOSITION_MIGRATION message with precheck set to false
+- it triggers the execution to send a broadcast AUTOMATION_COMPOSITION_MIGRATION message with precheck and rollback set to false
 - the message is built by AutomationCompositionMigrationPublisher using the REST request payload (to fill the compositionTargetId and list of elements with the updated property values)
 - Participant-intermediary will receive a AUTOMATION_COMPOSITION_MIGRATION message and stores the compositionTargetId and the updated values of the elements on CacheProvider
 - Each participant performs its designated job of migrate by interacting with respective frameworks
 
+Rollback of an Automation Composition Instance
+----------------------------------------------
+- ACM-runtime fetch the rollback from database and updates the instance properties of the deployed Ac instances
+- it triggers the execution to send a broadcast AUTOMATION_COMPOSITION_MIGRATION message with precheck set to false and rollback set to true
+- the message is built by AutomationCompositionMigrationPublisher using the REST request payload (to fill the compositionTargetId and list of elements with the updated property values)
+- Participant-intermediary will receive a AUTOMATION_COMPOSITION_MIGRATION message and the updated values of the elements on CacheProvider
+- Each participant performs its designated job of rollback by interacting with respective frameworks
+
 Design of "issues automation composition commands to automation compositions" - case LOCKED to UNLOCKED
 -------------------------------------------------------------------------------------------------------
 - AUTOMATION_COMPOSITION_STATE_CHANGE message with instantiation details and UNLOCK order state is sent to participants