From 5b5fe4ce4081040a140b18610ffd9f487ad112fa Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Tue, 29 Jul 2025 15:39:47 +0100 Subject: [PATCH] Update docs for automatic sync up support in ACM Issue-ID: POLICY-5428 Change-Id: Ida99d96f77296d9a83ad4e3a8c9bd3d144de3992 Signed-off-by: FrancescoFioraEst --- .../acm/api-protocol/acm-participant-protocol.rst | 22 ++++++++-- .../api-protocol/puml/ParticipantMonitoring.puml | 2 +- .../acm/api-protocol/puml/ParticipantSyncUp.plum | 11 +++++ docs/clamp/acm/clamp-csit.rst | 46 ++++++++++++++------- .../participants/participant-intermediary.rst | 10 +++++ docs/clamp/acm/files/ACM-Message-Table.csv | 31 ++++++++++++-- .../acm-participants-protocol/acm-monitoring.png | Bin 8577 -> 9131 bytes .../acm-participants-protocol/acm-sync-up.png | Bin 0 -> 20550 bytes 8 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 docs/clamp/acm/api-protocol/puml/ParticipantSyncUp.plum create mode 100644 docs/clamp/acm/images/acm-participants-protocol/acm-sync-up.png diff --git a/docs/clamp/acm/api-protocol/acm-participant-protocol.rst b/docs/clamp/acm/api-protocol/acm-participant-protocol.rst index d384633a..1e778913 100644 --- a/docs/clamp/acm/api-protocol/acm-participant-protocol.rst +++ b/docs/clamp/acm/api-protocol/acm-participant-protocol.rst @@ -63,7 +63,7 @@ The ACM Runtime updates the priming information in the database. Automation Composition Update ----------------------------- -Automation Composition Update handles creation, change, and deletion of Automation Compositions on +Automation Composition Update handles creation, change properties, migration, and deletion of Automation Compositions on participants. Change of Automation Compositions uses a semantic versioning approach and follows the semantics described on the page :ref:`5.1 Management of Automation Composition Instance Configurations `. @@ -112,13 +112,27 @@ The flow of the DEPLOY/UNDEPLOY state change messages are shown below. But the s .. image:: ../images/acm-participants-protocol/acm-state-change-msg.png + +Participant Sync Up +------------------- + +This dialogue is used to Sync Up the participant replicas with the ACM-r database. +Acm-r stores a revision for each instance and composition which will be updated for every update (state change or outProperties change). +This value will be sent to the participants along with the sync message. +When ACM-r sends an operation message (as undeploy/delete), it will insert the revision of the instance and the revision of the composition, +so the participants can compare this value with what is in the memory. +If the instance/composition is missing or outdated, participant caches the operation, sends a sync request to ACM-r +and the cached operation will be resumed after the sync message is received. + +.. image:: ../images/acm-participants-protocol/acm-sync-up.png + + Automation Composition Monitoring and Reporting ----------------------------------------------- This dialogue is used as a heartbeat mechanism for participants, to monitor the status of -Automation Composition Elements, and to gather statistics on Automation Compositions. The -*ParticipantStatus* message is sent periodically by each participant. The reporting interval for -sending the message is configurable. +the replica of the participant. The *ParticipantStatus* message is sent periodically by each participant. +The reporting interval for sending the message is configurable. .. image:: ../images/acm-participants-protocol/acm-monitoring.png diff --git a/docs/clamp/acm/api-protocol/puml/ParticipantMonitoring.puml b/docs/clamp/acm/api-protocol/puml/ParticipantMonitoring.puml index 24f25d7c..9117f9f0 100644 --- a/docs/clamp/acm/api-protocol/puml/ParticipantMonitoring.puml +++ b/docs/clamp/acm/api-protocol/puml/ParticipantMonitoring.puml @@ -1,3 +1,3 @@ @startuml -Participant -> CLAMP_Runtime: Participant Status [periodically from each Participant in all Automation Compositions] +Participant -> CLAMP_Runtime: Participant Status [periodically from each Participant replica] @enduml diff --git a/docs/clamp/acm/api-protocol/puml/ParticipantSyncUp.plum b/docs/clamp/acm/api-protocol/puml/ParticipantSyncUp.plum new file mode 100644 index 00000000..6abe844a --- /dev/null +++ b/docs/clamp/acm/api-protocol/puml/ParticipantSyncUp.plum @@ -0,0 +1,11 @@ +@startuml + +"CLAMP Runtime" -> Participant: Process Update Message +Participant -> Participant: Check if data are missing or outdated +alt missing data or outdated? + Participant -> "CLAMP Runtime": request sync up + "CLAMP Runtime" -> Participant: send sync up +end alt +Participant -> Participant: Process Update Message +Participant -> "CLAMP Runtime": Update Ack +@enduml diff --git a/docs/clamp/acm/clamp-csit.rst b/docs/clamp/acm/clamp-csit.rst index e6a3f3c7..e997f45a 100644 --- a/docs/clamp/acm/clamp-csit.rst +++ b/docs/clamp/acm/clamp-csit.rst @@ -33,6 +33,18 @@ ACM Integration Tests +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | RegisterParticipants | Sends a PUT request to ACM-R to request the participants for registration | Should receive a 202 Accepted response from ACM-R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| InsertDataIntoDatabase | Insert restored data into the Database | Should receive a 0 response from the script | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| AcMigrationRestored | Migration of an automation composition restored | Should receive a 200 response and the AC instance should be migrated to to the target AC definition | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| UpdateDataDatabase | Update restored data into the Database | Should receive a 0 response from the script | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| ReviewAutomationCompositionRestored | Review automation composition restored | Should receive a 202 Accepted response and the substate should be present in the AC instance data | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| AcDeleteRestored | Undeploy and delete of an automation composition restored | Should receive a 202 Accepted response and the restored AC instance should have been deleted in ACM-R | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| DeleteACDefinitionsRestored | Deprime and delete of the compositions definition restored | Should receive a 200 response and the AC definition should be removed in ACM-R db | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | CommissionAcDefinitionTimeout | Commissions a service template for testing Prime Timeout | Should receive a 201 created response from ACM_R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | TimeoutPrimeACDefinition | Verify the priming timeout from participant sim by updating the participant sim behavior | Should receive a 202 Accepted response from ACM-R and the stateChangeResult of AC definition should be TIMEOUT | @@ -51,9 +63,7 @@ ACM Integration Tests +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | UnInstantiateAutomationCompositionSimple | Uninstantiate the simple AC instance | Should receive a 202 Accepted response and the simple AC instance should have been deleted in ACM-R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DePrimeACDefinitionSimple | Deprime the simple AC definition from the participants | Should receive a 202 Accepted response and the simple AC definition in ACM-R should be moved to COMMISSIONED state | -+--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DeleteACDefinitionSimple | Delete the simple automation composition definition | Should receive a 200 response and the simple AC definition should be removed in ACM-R db | +| DeleteACDefinitionSimple | Deprime and Delete the simple automation composition definition | Should receive a 200 response and the simple AC definition should be removed in ACM-R db | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | CommissionAutomationComposition | Commissions a Tosca service template to ACM-R | Should receive a 201 created response from ACM_R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ @@ -115,29 +125,35 @@ ACM Integration Tests +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | FailAutomationCompositionMigration | Verify the Migration failure for AC instance by updating the participant sim behavior | Should receive a 202 Accepted response from ACM-R and the stateChangeResult of AC instance should be FAILED | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| FailDePrimeACDefinitionsFrom | Verify the failure of deprime in migration AC definition by updating the participant sim to fail | Should receive a 202 Accepted response and the migration AC definition in ACM-R should have stateChangeResult FAILED | -+--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DePrimeACDefinitionsFrom | Deprime the migration AC definition from the participants | Should receive a 202 Accepted response and the migration AC definition in ACM-R should be moved to COMMISSIONED state | -+--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| UnDeployAutomationComposition | Undeploy the AC instance | Should receive a 202 Accepted response and the AC instance in ACM-R should have the UNDEPLOYED status | +| UnInstantiateAutomationComposition | Undeploy and Uninstantiate the AC instance | Should receive a 202 Accepted response and the AC instance should have been deleted in ACM-R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | FailUnDeployAutomationCompositionMigrationTo | Verify the failure of undeploy in migration AC instance by updating the participant sim to fail | Should receive a 202 Accepted response and the stateChangeResult of the instance in ACM-R should be FAILED | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | UnDeployAutomationCompositionMigrationTo | Undeploy the migration AC instance by updating the participant sim to success | Should receive a 202 Accepted response and the deploy state of the migration AC instance should be UNDEPLOYED | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| UnInstantiateAutomationComposition | Uninstantiate the AC instance | Should receive a 202 Accepted response and the AC instance should have been deleted in ACM-R | -+--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | FailUnInstantiateACMigrationTo | Verify the uninstantiate failure in migration AC instance after updating the participant sim to fail | Should receive a 202 Accepted response, and the AC instance stateChangeResult should be FAILED in ACM-R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | UnInstantiateAutomationCompositionMigrationTo | Uninstantiate the migration AC instance | Should receive a 202 Accepted response and the migration AC instance should have been deleted in ACM-R | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DePrimeACDefinitions | Deprime the AC definition | Should receive a 202 Accepted response and the the AC definition in ACM-R should be moved to COMMISSIONED state | +| InstantiateAutomationCompositionRollback | Instantiate the Automation Composition for rollback test | Should receive a 201 Accepted response from ACM-R | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| DeployAutomationCompositionRollback | Deploy the AC instance for rollback test | Should receive a 202 Accepted status and the deploy state should be DEPLOYED in ACM-R | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| FailAutomationCompositionMigrationRollback | Verify the Migration failure for AC instance by updating the participant sim behavior | Should receive a 202 Accepted response from ACM-R and the stateChangeResult of AC instance should be FAILED | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| RollbackAutomationComposition | Rollback the AC instance | Should receive a 200 response and the AC instance should be Rolled back to to the original AC definition | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DePrimeACDefinitionsTo | Deprime the migration target AC definition from the participants | Should receive a 202 Accepted response and the target AC definition in ACM-R should be moved to COMMISSIONED state | +| FailAutomationCompositionMigrationRollback2 | Verify the Migration failure for AC instance by updating the participant sim behavior | Should receive a 202 Accepted response from ACM-R and the stateChangeResult of AC instance should be FAILED | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| FailRollbackAutomationComposition | Verify the Rollback failure for AC instance by updating the participant sim behavior | Should receive a 202 Accepted response from ACM-R and the stateChangeResult of AC instance should be FAILED | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| UnInstantiateAutomationCompositionRollback | Uninstantiate the AC instance | Should receive a 202 Accepted response and the AC instance should have been deleted in ACM-R | ++--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ +| FailDePrimeACDefinitionsFrom | Verify the failure of deprime in migration AC definition by updating the participant sim to fail | Should receive a 202 Accepted response and the migration AC definition in ACM-R should have stateChangeResult FAILED | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DeleteACDefinition | Delete automation composition definition | Should receive a 200 response and the AC definition should be removed in ACM-R db | +| DeleteACDefinitionFrom | Deprime and Delete the migration automation composition definition | Should receive a 200 response and the migration AC definition should be removed in ACM-R db | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DeleteACDefinitionFrom | Delete the migration automation composition definition | Should receive a 200 response and the migration AC definition should be removed in ACM-R db | +| DeleteACDefinitions | Deprime and Delete automation composition definition | Should receive a 200 response and the AC definition should be removed in ACM-R db | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ -| DeleteACDefinitionTo | Delete the target automation composition definition | Should receive a 200 response and the target AC definition should be removed in ACM-R db | +| DeleteACDefinitionTo | Deprime and Delete the target automation composition definition | Should receive a 200 response and the target AC definition should be removed in ACM-R db | +--------------------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ diff --git a/docs/clamp/acm/design-impl/participants/participant-intermediary.rst b/docs/clamp/acm/design-impl/participants/participant-intermediary.rst index 92ab6d42..64635f01 100644 --- a/docs/clamp/acm/design-impl/participants/participant-intermediary.rst +++ b/docs/clamp/acm/design-impl/participants/participant-intermediary.rst @@ -39,6 +39,7 @@ Outbound messages - AUTOMATIONCOMPOSITION_STATECHANGE_ACK: is an acknowledgement sent by a participant as a response to AutomationCompositionStateChange - AUTOMATION_COMPOSITION_DEPLOY_ACK: is an acknowledgement sent by a participant as a response to AutomationCompositionDeploy - PARTICIPANT_PRIME_ACK: is an acknowledgement sent by a participant as a response to ParticipantPrime +- PARTICIPANT_REQ_SYNC_MSG: A sync up request sent by a participant Design of a PARTICIPANT_REGISTER message ---------------------------------------- @@ -170,3 +171,12 @@ Design of a AUTOMATIONCOMPOSITION_STATECHANGE_ACK message - AutomationCompositionStateChangeAckListener in ACM-runtime collects the messages from Message Broker - It checks the deployStatus/lockStatus of all automation composition elements - It updates the AC-instance in DB accordingly + +Design of a PARTICIPANT_REQ_SYNC_MSG message +-------------------------------------------- +- ACM-runtime triggers the execution to send an update message +- Participant-intermediary validate the message +- If there is missing or outdated instance/composition it saves in memory the operation on hold, and sends a PARTICIPANT_REQ_SYNC_MSG to ACM-runtime +- ACM-runtime receives the PARTICIPANT_REQ_SYNC_MSG and send back a PARTICIPANT_SYNC_MSG message with updated data +- Participant-intermediary receives the PARTICIPANT_SYNC_MSG and recheck the operations in memory +- If all data in memory are updated Participant performs its designated job diff --git a/docs/clamp/acm/files/ACM-Message-Table.csv b/docs/clamp/acm/files/ACM-Message-Table.csv index 540b043f..978ad033 100755 --- a/docs/clamp/acm/files/ACM-Message-Table.csv +++ b/docs/clamp/acm/files/ACM-Message-Table.csv @@ -9,11 +9,13 @@ ParticipantRegisterAck,ACM Runtime,Participant,Acknowledgment of Participant Reg ParticipantDeregister,Participant,ACM Runtime,Participant deregisters with the ACM runtime,participantId,The ID of this participant – in UUID format ,,,,replicaId,The replica ID of this participant – in UUID format ,,,,messageType,Enum indicating the type of message PARTICIPANT_DEREGISTER -ParticipantDeregisterAck,ACM Runtime,Participant,Acknowledgment of Participant Deegistration,participantId,The ID of this participant – in UUID format +ParticipantDeregisterAck,ACM Runtime,Participant,Acknowledgment of Participant Deregistration,participantId,The ID of this participant – in UUID format ,,,,replicaId,The replica ID of this participant – in UUID format ,,,,messageType,Enum indicating the type of message PARTICIPANT_DEREGISTER_ACK ParticipantPrime,ACM Runtime,Participant,Trigger priming/depriming in the participant,participantId,The ID of this participant – in UUID format +,,,,participantIdList, The list of all participants involved in this message ,,,,compositionId,The id of the AC Definition related to this message +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format ,,,,participantDefinitionUpdates,Contains AC element definition values for a particular participant ,,,,messageType,Enum indicating the type of message PARTICIPANT_PRIME ParticipantPrimeAck,Participant,ACM Runtime,Message to confirm participant has been primed/deprimed,participantId,The ID of this participant – in UUID format @@ -22,18 +24,21 @@ ParticipantPrimeAck,Participant,ACM Runtime,Message to confirm participant has b ,,,,stateChangeResult,NO_ERROR/FAILED ,,,,message,A message indicating the result ,,,,messageType,Enum indicating the type of message PARTICIPANT_PRIME_ACK -ParticipantStatusReq,ACM Runtime,Participant,Message sent to reques a status update from the participant,participantId,The ID of the participant to request update from – in UUID format +ParticipantStatusReq,ACM Runtime,Participant,Message sent to request a status update from the participant,participantId,The ID of the participant to request update from – in UUID format ,,,,messageType,Enum indicating the type of message PARTICIPANT_STATUS_REQ ParticipantStatus,Participant,ACM Runtime,Status update message,state,Enum indicating the current state of the participant ,,,,replicaId,The replica ID of this participant – in UUID format ,,,,participantDefinitionUpdates,"A list of ParticipantDefinition updates, returned in response to ParticipantStatusReq only" ,,,,automationCompositionInfoList,List of AutomationCompositionInfo types with AutomationCompositionId and its state -,,,,participantSupportedElementTypes,Ac element types that this participant is capable for deployinh/supporting +,,,,participantSupportedElementTypes,Ac element types that this participant is capable for deploying/supporting ,,,,messageType,Enum indicating the type of message PARTICIPANT_STATUS AutomationCompositionDeploy,ACM Runtime,Participant,Message to request change state of composition to DEPLOY,participantUpdatesList,A list of ParticipantUpdates instances which carries details of an updated participant. +,,,,participantIdList, The list of all participants involved in this message ,,,,compositionId,The id of the AC Definition related to this message ,,,,automationCompositionId,The id of the automation composition related to this message ,,,,startPhase,Integer indicating the start up order of the elements +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdInstance,The last revision of the automation composition – in UUID format ,,,,participantId,UUID indicating the participant the message is intended for ,,,,messageType,Enum indicating the type of message AUTOMATION_COMPOSITION_DEPLOY AutomationCompositionDeployAck,Participant,ACM Runtime,Message to acknowledge that deploy or state change message has been received by participant,automationCompositionResultMap,"A map with AutomationCompositionElementID as its key, and a pair of result and message as value per AutomationCompositionElement" @@ -45,15 +50,21 @@ AutomationCompositionDeployAck,Participant,ACM Runtime,Message to acknowledge th ,,,,stateChangeResult,NO_ERROR/FAILED ,,,,messageType,Enum indicating the type of message AUTOMATION_COMPOSITION_DEPLOY_ACK AutomationCompositionStateChange,ACM Runtime,Participant,Message to request change state of composition to states other than DEPLOY,deployOrderedState,Enum indicating the deployment state being requested +,,,,participantIdList, The list of all participants involved in this message ,,,,lockOrderedState,Enum indicating the lock state being requested ,,,,compositionId,The id of the AC Definition related to this message ,,,,automationCompositionId,The id of the automation composition related to this message ,,,,startPhase,Integer indicating the start up order of the elements +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdInstance,The last revision of the automation composition – in UUID format ,,,,participantId,UUID indicating the participant the message is intended for ,,,,messageType,Enum indicating the type of message AUTOMATION_COMPOSITION_STATECHANGE_ACK PropertiesUpdate,ACM Runtime,Participant,Message to request update,participantUpdatesList,A list of ParticipantUpdates instances which carries details of an updated participant. +,,,,participantIdList, The list of all participants involved in this message ,,,,compositionId,The id of the AC Definition related to this message ,,,,automationCompositionId,The id of the automation composition related to this message +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdInstance,The last revision of the automation composition – in UUID format ,,,,participantId,UUID indicating the participant the message is intended for ,,,,messageType,Enum indicating the type of message PROPERTIES_UPDATE ParticipantSync,ACM Runtime,Participant,Message to request sync,participantId,The ID of this participant – in UUID format @@ -64,17 +75,31 @@ ParticipantSync,ACM Runtime,Participant,Message to request sync,participantId,Th ,,,,participantDefinitionUpdates,Contains AC element definition values for the participant ,,,,delete,Flag - if true it is a delete operation ,,,,restarting,Flag - if true it is a restarting scenario +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdInstance,The last revision of the automation composition – in UUID format ,,,,messageType,Enum indicating the type of message PARTICIPANT_SYNC_MSG AutomationCompositionMigration,ACM Runtime,Participant,Message to request update,participantUpdatesList,A list of ParticipantUpdates instances which carries details of an updated participant. +,,,,participantIdList, The list of all participants involved in this message ,,,,precheck,Flag - if true it is a Migration Precheck +,,,,rollback,Flag - if true it is a Rollback of the Migration failed ,,,,compositionId,The id of the AC Definition related to this message ,,,,compositionTargetId,The id of the AC Definition target ,,,,automationCompositionId,The id of the automation composition related to this message +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdCompositionTarget,The last revision of the AC Definition Target – in UUID format ,,,,participantId,UUID indicating the participant the message is intended for ,,,,messageType,Enum indicating the type of message AUTOMATION_COMPOSITION_MIGRATION AutomationCompositionPrepare,ACM Runtime,Participant,Message to request prepare/review,participantList,A list of ParticipantUpdates instances which carries details of an updated participant. +,,,,participantIdList, The list of all participants involved in this message ,,,,stage,The next stage that participant is supposed to receiving ,,,,preDeploy,Flag - if true the instance is Undeployed and the action is a Prepare - otherwise (false) the instance is Deployed and the action is a Review ,,,,compositionId,The id of the AC Definition related to this message ,,,,automationCompositionId,The id of the automation composition related to this message +,,,,revisionIdComposition,The last revision of the AC Definition – in UUID format +,,,,revisionIdInstance,The last revision of the automation composition – in UUID format ,,,,messageType,Enum indicating the type of message AUTOMATION_COMPOSITION_PREPARE +ParticipantReqSync,Participant,ACM Runtime,Message sent to request a sync up,participantId,The ID of this participant – in UUID format +,,,,replicaId,The replica ID of this participant – in UUID format +,,,,compositionId,The id of the AC Definition outdated +,,,,compositionTargetId,The id of the AC Definition target outdated +,,,,automationCompositionId,The id of the automation composition outdated diff --git a/docs/clamp/acm/images/acm-participants-protocol/acm-monitoring.png b/docs/clamp/acm/images/acm-participants-protocol/acm-monitoring.png index ec9ba5e1692403d09a9d292b05eee20ad57d7279..673e427f75a0feb78b30e74e0764272d0efafd7a 100644 GIT binary patch literal 9131 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 literal 8577 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