#. 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:
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.
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.
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!");
}
}
}
}
+
+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 {
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");
}
@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");
}