aboutsummaryrefslogtreecommitdiffstats
path: root/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler
diff options
context:
space:
mode:
Diffstat (limited to 'participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler')
-rw-r--r--participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java415
-rw-r--r--participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java170
-rw-r--r--participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java187
-rw-r--r--participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java345
4 files changed, 702 insertions, 415 deletions
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java
deleted file mode 100644
index 2cba379c4..000000000
--- a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandler.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * Copyright (C) 2023-2024 Nordix Foundation.
- * ================================================================================
- * 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.participant.sim.main.handler;
-
-import java.lang.invoke.MethodHandles;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.UUID;
-import lombok.Getter;
-import lombok.Setter;
-import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
-import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
-import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
-import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
-import org.onap.policy.clamp.acm.participant.intermediary.api.impl.AcElementListenerV2;
-import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
-import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
-import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
-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.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.StateChangeResult;
-import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * This class handles implementation of automationCompositionElement updates.
- */
-@Component
-public class AutomationCompositionElementHandler extends AcElementListenerV2 {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
- @Getter
- @Setter
- private SimConfig config = new SimConfig();
-
- public AutomationCompositionElementHandler(ParticipantIntermediaryApi intermediaryApi) {
- super(intermediaryApi);
- }
-
- /**
- * Handle a deploy on a automation composition element.
- *
- * @param compositionElement the information of the Automation Composition Definition Element
- * @param instanceElement the information of the Automation Composition Instance Element
- * @throws PfModelException from Policy framework
- */
- @Override
- public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
- throws PfModelException {
- LOGGER.debug("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
- if (!execution(config.getDeployTimerMs(), "Current Thread deploy is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.isDeploySuccess()) {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR,
- "Deployed");
- } else {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
- "Deploy failed!");
- }
- }
-
- private boolean execution(int timeMs, String msg, UUID elementId) {
- long endTime = System.currentTimeMillis() + timeMs;
- while (System.currentTimeMillis() < endTime) {
- try {
- if (Thread.currentThread().isInterrupted()) {
- LOGGER.debug(msg, elementId);
- return false;
- }
- Thread.sleep(10L);
- } catch (InterruptedException e) {
- LOGGER.debug(msg, elementId);
- Thread.currentThread().interrupt();
- return false;
- }
- }
- return true;
- }
-
- /**
- * Handle a automation composition element state change.
- *
- * @param compositionElement the information of the Automation Composition Definition Element
- * @param instanceElement the information of the Automation Composition Instance Element
- * @throws PfModelException from Policy framework
- */
- @Override
- public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
- throws PfModelException {
- LOGGER.debug("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
- if (!execution(config.getUndeployTimerMs(), "Current Thread undeploy is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.isUndeploySuccess()) {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
- "Undeployed");
- } else {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED,
- "Undeploy failed!");
- }
- }
-
- @Override
- public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
- throws PfModelException {
- LOGGER.debug("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
- if (!execution(config.getLockTimerMs(), "Current Thread lock is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.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 unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
- throws PfModelException {
- LOGGER.debug("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
- if (!execution(config.getUnlockTimerMs(), "Current Thread unlock is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.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 delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
- throws PfModelException {
- LOGGER.debug("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
-
- if (!execution(config.getDeleteTimerMs(), "Current Thread delete is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.isDeleteSuccess()) {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
- } else {
- intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
- instanceElement.elementId(), DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
- "Delete failed!");
- }
- }
-
- @Override
- public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
- InstanceElementDto instanceElementUpdated) throws PfModelException {
- LOGGER.debug("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
- compositionElement, instanceElement, instanceElementUpdated);
-
- if (!execution(config.getUpdateTimerMs(), "Current Thread update is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.isUpdateSuccess()) {
- intermediaryApi.updateAutomationCompositionElementState(
- instanceElement.instanceId(), instanceElement.elementId(),
- DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
- } else {
- intermediaryApi.updateAutomationCompositionElementState(
- instanceElement.instanceId(), instanceElement.elementId(),
- DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
- }
- }
-
- /**
- * Get AutomationComposition.
- *
- * @return the AutomationCompositions
- */
- public AutomationCompositions getAutomationCompositions() {
- var result = new AutomationCompositions();
- result.setAutomationCompositionList(new ArrayList<>(intermediaryApi.getAutomationCompositions().values()));
- return result;
- }
-
- public AutomationComposition getAutomationComposition(UUID instanceId) {
- return intermediaryApi.getAutomationComposition(instanceId);
- }
-
- /**
- * Set OutProperties.
- *
- * @param automationCompositionId the automationComposition Id
- * @param elementId the automationComposition Element Id
- * @param useState the useState
- * @param operationalState the operationalState
- * @param outProperties the outProperties
- */
- public void setOutProperties(UUID automationCompositionId, UUID elementId, String useState, String operationalState,
- Map<String, Object> outProperties) {
- intermediaryApi.sendAcElementInfo(automationCompositionId, elementId, useState, operationalState,
- outProperties);
- }
-
- @Override
- public void prime(CompositionDto composition) throws PfModelException {
- LOGGER.debug("prime call composition: {}", composition);
-
- if (!execution(config.getPrimeTimerMs(), "Current Thread prime is Interrupted during execution {}",
- composition.compositionId())) {
- return;
- }
-
- if (config.isPrimeSuccess()) {
- intermediaryApi.updateCompositionState(composition.compositionId(),
- AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
- } else {
- intermediaryApi.updateCompositionState(composition.compositionId(),
- AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Prime failed!");
- }
- }
-
- @Override
- public void deprime(CompositionDto composition) throws PfModelException {
- LOGGER.debug("deprime call composition: {}", composition);
-
- if (!execution(config.getDeprimeTimerMs(), "Current Thread deprime is Interrupted during execution {}",
- composition.compositionId())) {
- return;
- }
-
- if (config.isDeprimeSuccess()) {
- intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.COMMISSIONED,
- StateChangeResult.NO_ERROR, "Deprimed");
- } else {
- intermediaryApi.updateCompositionState(composition.compositionId(), AcTypeState.PRIMED,
- StateChangeResult.FAILED, "Deprime failed!");
- }
- }
-
- /**
- * Get Instance Data List.
- *
- * @return the InternalDatas
- */
- public InternalDatas getDataList() {
- var result = new InternalDatas();
- var map = intermediaryApi.getAutomationCompositions();
- for (var instance : map.values()) {
- for (var element : instance.getElements().values()) {
- var data = new InternalData();
- data.setCompositionId(instance.getCompositionId());
- data.setCompositionDefinitionElementId(element.getDefinition());
- data.setAutomationCompositionId(instance.getInstanceId());
- data.setAutomationCompositionElementId(element.getId());
- data.setIntProperties(element.getProperties());
- data.setOperationalState(element.getOperationalState());
- data.setUseState(element.getUseState());
- data.setOutProperties(element.getOutProperties());
- result.getList().add(data);
- }
- }
- return result;
- }
-
- @Override
- public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
- LOGGER.debug("restart composition definition call");
- switch (state) {
- case PRIMING:
- prime(composition);
- break;
-
- case DEPRIMING:
- deprime(composition);
- break;
-
- default:
- intermediaryApi.updateCompositionState(composition.compositionId(), state,
- StateChangeResult.NO_ERROR, "Restarted");
- }
- }
-
- @Override
- public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
- DeployState deployState, LockState lockState) throws PfModelException {
- LOGGER.debug("restart instance call");
- if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
- intermediaryApi.updateAutomationCompositionElementState(
- instanceElement.instanceId(), instanceElement.elementId(), deployState, lockState,
- StateChangeResult.NO_ERROR, "Restarted");
- return;
- }
- if (DeployState.DEPLOYING.equals(deployState)) {
- deploy(compositionElement, instanceElement);
- return;
- }
- if (DeployState.UNDEPLOYING.equals(deployState)) {
- undeploy(compositionElement, instanceElement);
- return;
- }
- if (DeployState.UPDATING.equals(deployState)) {
- update(compositionElement, instanceElement, instanceElement);
- return;
- }
- if (DeployState.DELETING.equals(deployState)) {
- delete(compositionElement, instanceElement);
- return;
- }
- if (LockState.LOCKING.equals(lockState)) {
- lock(compositionElement, instanceElement);
- return;
- }
- if (LockState.UNLOCKING.equals(lockState)) {
- unlock(compositionElement, instanceElement);
- }
- }
-
- /**
- * Get Composition Data List.
- *
- * @return the InternalDatas
- */
- public InternalDatas getCompositionDataList() {
- var acElementsDefinitions = intermediaryApi.getAcElementsDefinitions();
- var internalDatas = new InternalDatas();
- for (var entry : acElementsDefinitions.entrySet()) {
- for (var acElementsDefinition : entry.getValue().values()) {
- var internalData = new InternalData();
- internalData.setCompositionId(entry.getKey());
- internalData.setCompositionDefinitionElementId(acElementsDefinition.getAcElementDefinitionId());
- internalData.setIntProperties(
- acElementsDefinition.getAutomationCompositionElementToscaNodeTemplate().getProperties());
- internalData.setOutProperties(acElementsDefinition.getOutProperties());
- internalDatas.getList().add(internalData);
- }
- }
- return internalDatas;
- }
-
- public void setCompositionOutProperties(UUID compositionId, ToscaConceptIdentifier compositionDefinitionElementId,
- Map<String, Object> outProperties) {
- intermediaryApi.sendAcDefinitionInfo(compositionId, compositionDefinitionElementId, outProperties);
-
- }
-
- @Override
- public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
- InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate)
- throws PfModelException {
- LOGGER.debug("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
- + " instanceElementMigrate: {}",
- compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate);
-
- if (!execution(config.getMigrateTimerMs(), "Current Thread migrate is Interrupted during execution {}",
- instanceElement.elementId())) {
- return;
- }
-
- if (config.isMigrateSuccess()) {
- intermediaryApi.updateAutomationCompositionElementState(
- instanceElement.instanceId(), instanceElement.elementId(),
- DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
- } else {
- intermediaryApi.updateAutomationCompositionElementState(
- instanceElement.instanceId(), instanceElement.elementId(),
- DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
- }
- }
-}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java
new file mode 100644
index 000000000..f503987a2
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV1.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.participant.sim.main.handler;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.intermediary.api.impl.AcElementListenerV1;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
+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;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.base.PfModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+@ConditionalOnExpression("'${element.handler}'=='AcElementHandlerV1'")
+@Component
+public class AutomationCompositionElementHandlerV1 extends AcElementListenerV1 {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionElementHandlerV1.class);
+
+ private final SimulatorService simulatorService;
+
+ public AutomationCompositionElementHandlerV1(ParticipantIntermediaryApi intermediaryApi,
+ SimulatorService simulatorService) {
+ super(intermediaryApi);
+ this.simulatorService = simulatorService;
+ }
+
+ @Override
+ public void deploy(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+ throws PfModelException {
+ LOGGER.debug("deploy call instanceId: {}, element: {}, properties: {}", instanceId, element, properties);
+ simulatorService.deploy(instanceId, element.getId());
+ }
+
+ @Override
+ public void undeploy(UUID instanceId, UUID elementId) throws PfModelException {
+ LOGGER.debug("undeploy call instanceId: {}, elementId: {}", instanceId, elementId);
+ simulatorService.undeploy(instanceId, elementId);
+ }
+
+ @Override
+ public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+ LOGGER.debug("lock call instanceId: {}, elementId: {}", instanceId, elementId);
+ simulatorService.lock(instanceId, elementId);
+ }
+
+ @Override
+ public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+ LOGGER.debug("unlock call instanceId: {}, elementId: {}", instanceId, elementId);
+ simulatorService.unlock(instanceId, elementId);
+ }
+
+ @Override
+ public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+ LOGGER.debug("delete call instanceId: {}, elementId: {}", instanceId, elementId);
+ simulatorService.delete(instanceId, elementId);
+ }
+
+ @Override
+ public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+ throws PfModelException {
+ LOGGER.debug("update call instanceId: {}, element: {}, properties: {}", instanceId, element, properties);
+ simulatorService.update(instanceId, element.getId());
+ }
+
+ @Override
+ public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+ throws PfModelException {
+ LOGGER.debug("prime call compositionId: {}, elementDefinitionList: {}", compositionId, elementDefinitionList);
+ simulatorService.prime(compositionId);
+ }
+
+ @Override
+ public void deprime(UUID compositionId) throws PfModelException {
+ LOGGER.debug("deprime call compositionId: {}", compositionId);
+ simulatorService.deprime(compositionId);
+ }
+
+ @Override
+ public void handleRestartComposition(UUID compositionId,
+ List<AutomationCompositionElementDefinition> elementDefinitionList, AcTypeState state)
+ throws PfModelException {
+ LOGGER.debug("restart composition definition call compositionId: {}, elementDefinitionList: {}, state: {}",
+ compositionId, elementDefinitionList, state);
+
+ switch (state) {
+ case PRIMING:
+ prime(compositionId, elementDefinitionList);
+ break;
+
+ case DEPRIMING:
+ deprime(compositionId);
+ break;
+
+ default:
+ intermediaryApi.updateCompositionState(compositionId, state, StateChangeResult.NO_ERROR, "Restarted");
+ }
+ }
+
+ @Override
+ public void handleRestartInstance(UUID instanceId, AcElementDeploy element,
+ Map<String, Object> properties, DeployState deployState, LockState lockState) throws PfModelException {
+ LOGGER.debug("restart instance call instanceId: {}, element: {}, properties: {},"
+ + "deployState: {}, lockState: {}", instanceId, element, properties, deployState, lockState);
+
+ if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(),
+ deployState, lockState, StateChangeResult.NO_ERROR, "Restarted");
+ return;
+ }
+ if (DeployState.DEPLOYING.equals(deployState)) {
+ deploy(instanceId, element, properties);
+ return;
+ }
+ if (DeployState.UNDEPLOYING.equals(deployState)) {
+ undeploy(instanceId, element.getId());
+ return;
+ }
+ if (DeployState.UPDATING.equals(deployState)) {
+ update(instanceId, element, properties);
+ return;
+ }
+ if (DeployState.DELETING.equals(deployState)) {
+ delete(instanceId, element.getId());
+ return;
+ }
+ if (LockState.LOCKING.equals(lockState)) {
+ lock(instanceId, element.getId());
+ return;
+ }
+ if (LockState.UNLOCKING.equals(lockState)) {
+ unlock(instanceId, element.getId());
+ }
+ }
+
+ @Override
+ public void migrate(UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
+ Map<String, Object> properties) throws PfModelException {
+ LOGGER.debug("migrate call instanceId: {}, element: {}, compositionTargetId: {}, properties: {}",
+ instanceId, element, compositionTargetId, properties);
+ simulatorService.migrate(instanceId, element.getId());
+ }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java
new file mode 100644
index 000000000..e836c9874
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/AutomationCompositionElementHandlerV2.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2023-2024 Nordix Foundation.
+ * ================================================================================
+ * 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.participant.sim.main.handler;
+
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
+import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.intermediary.api.impl.AcElementListenerV2;
+import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
+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;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.base.PfModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class handles implementation of automationCompositionElement updates.
+ */
+@ConditionalOnExpression("'${element.handler:AcElementHandlerV2}' == 'AcElementHandlerV2'")
+@Component
+public class AutomationCompositionElementHandlerV2 extends AcElementListenerV2 {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionElementHandlerV2.class);
+
+ private final SimulatorService simulatorService;
+
+ public AutomationCompositionElementHandlerV2(ParticipantIntermediaryApi intermediaryApi,
+ SimulatorService simulatorService) {
+ super(intermediaryApi);
+ this.simulatorService = simulatorService;
+ }
+
+ /**
+ * Handle a deploy on a automation composition element.
+ *
+ * @param compositionElement the information of the Automation Composition Definition Element
+ * @param instanceElement the information of the Automation Composition Instance Element
+ * @throws PfModelException from Policy framework
+ */
+ @Override
+ public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+ throws PfModelException {
+ LOGGER.debug("deploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+ simulatorService.deploy(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ /**
+ * Handle a automation composition element state change.
+ *
+ * @param compositionElement the information of the Automation Composition Definition Element
+ * @param instanceElement the information of the Automation Composition Instance Element
+ * @throws PfModelException from Policy framework
+ */
+ @Override
+ public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+ throws PfModelException {
+ LOGGER.debug("undeploy call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+ simulatorService.undeploy(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ @Override
+ public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+ throws PfModelException {
+ LOGGER.debug("lock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+ simulatorService.lock(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ @Override
+ public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+ throws PfModelException {
+ LOGGER.debug("unlock call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+ simulatorService.unlock(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ @Override
+ public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
+ throws PfModelException {
+ LOGGER.debug("delete call compositionElement: {}, instanceElement: {}", compositionElement, instanceElement);
+ simulatorService.delete(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ @Override
+ public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
+ InstanceElementDto instanceElementUpdated) throws PfModelException {
+ LOGGER.debug("update call compositionElement: {}, instanceElement: {}, instanceElementUpdated: {}",
+ compositionElement, instanceElement, instanceElementUpdated);
+ simulatorService.update(instanceElement.instanceId(), instanceElement.elementId());
+ }
+
+ @Override
+ public void prime(CompositionDto composition) throws PfModelException {
+ LOGGER.debug("prime call composition: {}", composition);
+ simulatorService.prime(composition.compositionId());
+ }
+
+ @Override
+ public void deprime(CompositionDto composition) throws PfModelException {
+ LOGGER.debug("deprime call composition: {}", composition);
+ simulatorService.deprime(composition.compositionId());
+ }
+
+ @Override
+ public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
+ LOGGER.debug("restart composition definition call");
+ switch (state) {
+ case PRIMING:
+ prime(composition);
+ break;
+
+ case DEPRIMING:
+ deprime(composition);
+ break;
+
+ default:
+ intermediaryApi.updateCompositionState(composition.compositionId(), state,
+ StateChangeResult.NO_ERROR, "Restarted");
+ }
+ }
+
+ @Override
+ public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
+ DeployState deployState, LockState lockState) throws PfModelException {
+ LOGGER.debug("restart instance call");
+ if (!AcmUtils.isInTransitionalState(deployState, lockState)) {
+ intermediaryApi.updateAutomationCompositionElementState(
+ instanceElement.instanceId(), instanceElement.elementId(), deployState, lockState,
+ StateChangeResult.NO_ERROR, "Restarted");
+ return;
+ }
+ if (DeployState.DEPLOYING.equals(deployState)) {
+ deploy(compositionElement, instanceElement);
+ return;
+ }
+ if (DeployState.UNDEPLOYING.equals(deployState)) {
+ undeploy(compositionElement, instanceElement);
+ return;
+ }
+ if (DeployState.UPDATING.equals(deployState)) {
+ update(compositionElement, instanceElement, instanceElement);
+ return;
+ }
+ if (DeployState.DELETING.equals(deployState)) {
+ delete(compositionElement, instanceElement);
+ return;
+ }
+ if (LockState.LOCKING.equals(lockState)) {
+ lock(compositionElement, instanceElement);
+ return;
+ }
+ if (LockState.UNLOCKING.equals(lockState)) {
+ unlock(compositionElement, instanceElement);
+ }
+ }
+
+ @Override
+ public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
+ InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate)
+ throws PfModelException {
+ LOGGER.debug("migrate call compositionElement: {}, compositionElementTarget: {}, instanceElement: {},"
+ + " instanceElementMigrate: {}",
+ compositionElement, compositionElementTarget, instanceElement, instanceElementMigrate);
+ simulatorService.migrate(instanceElement.instanceId(), instanceElement.elementId());
+ }
+}
diff --git a/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java
new file mode 100644
index 000000000..d37edf761
--- /dev/null
+++ b/participant/participant-impl/participant-impl-simulator/src/main/java/org/onap/policy/clamp/acm/participant/sim/main/handler/SimulatorService.java
@@ -0,0 +1,345 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 Nordix Foundation.
+ * ================================================================================
+ * 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.participant.sim.main.handler;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.UUID;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.acm.participant.sim.model.InternalData;
+import org.onap.policy.clamp.acm.participant.sim.model.InternalDatas;
+import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
+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.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.StateChangeResult;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * This class handles implementation of Simulator Service.
+ */
+@Service
+@RequiredArgsConstructor
+public class SimulatorService {
+
+ private final ParticipantIntermediaryApi intermediaryApi;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SimulatorService.class);
+
+ @Getter
+ @Setter
+ private SimConfig config = new SimConfig();
+
+ /**
+ * Get AutomationComposition.
+ *
+ * @return the AutomationCompositions
+ */
+ public AutomationCompositions getAutomationCompositions() {
+ var result = new AutomationCompositions();
+ result.setAutomationCompositionList(new ArrayList<>(intermediaryApi.getAutomationCompositions().values()));
+ return result;
+ }
+
+ public AutomationComposition getAutomationComposition(UUID instanceId) {
+ return intermediaryApi.getAutomationComposition(instanceId);
+ }
+
+ /**
+ * Set OutProperties.
+ *
+ * @param instanceId the automationComposition Id
+ * @param elementId the automationComposition Element Id
+ * @param useState the useState
+ * @param operationalState the operationalState
+ * @param outProperties the outProperties
+ */
+ public void setOutProperties(UUID instanceId, UUID elementId, String useState, String operationalState,
+ Map<String, Object> outProperties) {
+ intermediaryApi.sendAcElementInfo(instanceId, elementId, useState, operationalState,
+ outProperties);
+ }
+
+ /**
+ * Get Instance Data List.
+ *
+ * @return the InternalDatas
+ */
+ public InternalDatas getDataList() {
+ var result = new InternalDatas();
+ var map = intermediaryApi.getAutomationCompositions();
+ for (var instance : map.values()) {
+ for (var element : instance.getElements().values()) {
+ var data = new InternalData();
+ data.setCompositionId(instance.getCompositionId());
+ data.setAutomationCompositionId(instance.getInstanceId());
+ data.setAutomationCompositionElementId(element.getId());
+ data.setIntProperties(element.getProperties());
+ data.setOperationalState(element.getOperationalState());
+ data.setUseState(element.getUseState());
+ data.setOutProperties(element.getOutProperties());
+ result.getList().add(data);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get Composition Data List.
+ *
+ * @return the InternalDatas
+ */
+ public InternalDatas getCompositionDataList() {
+ var acElementsDefinitions = intermediaryApi.getAcElementsDefinitions();
+ var internalDatas = new InternalDatas();
+ for (var entry : acElementsDefinitions.entrySet()) {
+ for (var acElementsDefinition : entry.getValue().values()) {
+ var internalData = new InternalData();
+ internalData.setCompositionId(entry.getKey());
+ internalData.setCompositionDefinitionElementId(acElementsDefinition.getAcElementDefinitionId());
+ internalData.setIntProperties(
+ acElementsDefinition.getAutomationCompositionElementToscaNodeTemplate().getProperties());
+ internalData.setOutProperties(acElementsDefinition.getOutProperties());
+ internalDatas.getList().add(internalData);
+ }
+ }
+ return internalDatas;
+ }
+
+ public void setCompositionOutProperties(UUID compositionId, ToscaConceptIdentifier compositionDefinitionElementId,
+ Map<String, Object> outProperties) {
+ intermediaryApi.sendAcDefinitionInfo(compositionId, compositionDefinitionElementId, outProperties);
+
+ }
+
+ private boolean execution(int timeMs, String msg, UUID elementId) {
+ long endTime = System.currentTimeMillis() + timeMs;
+ while (System.currentTimeMillis() < endTime) {
+ try {
+ if (Thread.currentThread().isInterrupted()) {
+ LOGGER.debug(msg, elementId);
+ return false;
+ }
+ Thread.sleep(10L);
+ } catch (InterruptedException e) {
+ LOGGER.debug(msg, elementId);
+ Thread.currentThread().interrupt();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Handle a deploy on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void deploy(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getDeployTimerMs(),
+ "Current Thread deploy is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isDeploySuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Deploy failed!");
+ }
+ }
+
+ /**
+ * Handle an udeploy on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void undeploy(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getUndeployTimerMs(),
+ "Current Thread undeploy is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isUndeploySuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Undeploy failed!");
+ }
+ }
+
+ /**
+ * Handle a lock on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void lock(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getLockTimerMs(),
+ "Current Thread lock is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isLockSuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ null, LockState.UNLOCKED, StateChangeResult.FAILED, "Lock failed!");
+ }
+ }
+
+ /**
+ * Handle an unlock on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void unlock(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getUnlockTimerMs(),
+ "Current Thread unlock is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isUnlockSuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ null, LockState.LOCKED, StateChangeResult.FAILED, "Unlock failed!");
+ }
+ }
+
+ /**
+ * Handle a delete on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void delete(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getDeleteTimerMs(),
+ "Current Thread delete is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isDeleteSuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Delete failed!");
+ }
+ }
+
+ /**
+ * Handle an update on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void update(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getUpdateTimerMs(),
+ "Current Thread update is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isUpdateSuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
+ }
+ }
+
+ /**
+ * Handle a prime on a automation composition definition.
+ *
+ * @param compositionId the compositionId
+ */
+ public void prime(UUID compositionId) {
+ if (!execution(getConfig().getPrimeTimerMs(),
+ "Current Thread prime is Interrupted during execution {}", compositionId)) {
+ return;
+ }
+
+ if (getConfig().isPrimeSuccess()) {
+ intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
+ "Primed");
+ } else {
+ intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.FAILED,
+ "Prime failed!");
+ }
+ }
+
+ /**
+ * Handle a deprime on a automation composition definition.
+ *
+ * @param compositionId the compositionId
+ */
+ public void deprime(UUID compositionId) {
+ if (!execution(getConfig().getDeprimeTimerMs(),
+ "Current Thread deprime is Interrupted during execution {}", compositionId)) {
+ return;
+ }
+
+ if (getConfig().isDeprimeSuccess()) {
+ intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+ "Deprimed");
+ } else {
+ intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
+ "Deprime failed!");
+ }
+ }
+
+ /**
+ * Handle a migrate on a automation composition element.
+ *
+ * @param instanceId the instanceId
+ * @param elementId the elementId
+ */
+ public void migrate(UUID instanceId, UUID elementId) {
+ if (!execution(getConfig().getMigrateTimerMs(),
+ "Current Thread migrate is Interrupted during execution {}", elementId)) {
+ return;
+ }
+
+ if (getConfig().isMigrateSuccess()) {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
+ } else {
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId,
+ DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
+ }
+ }
+}