Implement AC Element Instance Locking and Unlocking on ACM-R 93/133193/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Tue, 7 Feb 2023 11:06:01 +0000 (11:06 +0000)
committerFrancescoFioraEst <francesco.fiora@est.tech>
Wed, 8 Feb 2023 11:43:43 +0000 (11:43 +0000)
Issue-ID: POLICY-4509
Change-Id: I8bca27cfa2a417314a27e2bec3938b538f05e346
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
22 files changed:
models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcElementDeploy.java
models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcElementDeployAck.java
models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositionInfo.java
models/src/main/java/org/onap/policy/clamp/models/acm/concepts/ParticipantUtils.java
models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionDeploy.java
models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionStateChange.java
models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java [deleted file]
models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionDeployAckTest.java
models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java [deleted file]
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java [new file with mode: 0644]
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangeAckListener.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionUpdateAckListener.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java [new file with mode: 0644]
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java

index 6b6eda3..5408d31 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.policy.clamp.models.acm.concepts;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.UUID;
 import java.util.function.UnaryOperator;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -41,6 +42,9 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 @ToString
 public class AcElementDeploy {
 
+    @NonNull
+    private UUID id = UUID.randomUUID();
+
     @NonNull
     private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
 
@@ -59,6 +63,7 @@ public class AcElementDeploy {
      * @param otherElement the other element to copy from
      */
     public AcElementDeploy(final AcElementDeploy otherElement) {
+        this.id = otherElement.id;
         this.definition = new ToscaConceptIdentifier(otherElement.definition);
         this.orderedState = otherElement.orderedState;
         this.toscaServiceTemplateFragment = otherElement.toscaServiceTemplateFragment;
index 2db1555..afbd61b 100644 (file)
@@ -37,6 +37,9 @@ public class AcElementDeployAck {
     // State of the AutomationCompositionElement
     private DeployState deployState;
 
+    // State of the AutomationCompositionElement
+    private LockState lockState;
+
     // Result: Success/Fail.
     private Boolean result;
 
index c43e4db..954665b 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021-2022 Nordix Foundation.
+ * Copyright (C) 2021-2023 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,6 +37,10 @@ public class AutomationCompositionInfo {
 
     private AutomationCompositionState state = AutomationCompositionState.UNINITIALISED;
 
+    private DeployState deployState = DeployState.UNDEPLOYED;
+
+    private LockState lockState = LockState.LOCKED;
+
     /**
      * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy.
      *
@@ -45,5 +49,7 @@ public class AutomationCompositionInfo {
     public AutomationCompositionInfo(final AutomationCompositionInfo otherElement) {
         this.automationCompositionId = otherElement.automationCompositionId;
         this.state = otherElement.state;
+        this.deployState = otherElement.deployState;
+        this.lockState = otherElement.lockState;
     }
 }
index 57cf2f3..d6079d0 100644 (file)
@@ -23,7 +23,6 @@ package org.onap.policy.clamp.models.acm.concepts;
 import java.util.Map;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
@@ -43,15 +42,15 @@ public final class ParticipantUtils {
         var minStartPhase = 1000;
         var maxStartPhase = 0;
         for (var element : automationComposition.getElements().values()) {
-            ToscaNodeTemplate toscaNodeTemplate = toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+            var toscaNodeTemplate = toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()
                 .get(element.getDefinition().getName());
             int startPhase = ParticipantUtils.findStartPhase(toscaNodeTemplate.getProperties());
             minStartPhase = Math.min(minStartPhase, startPhase);
             maxStartPhase = Math.max(maxStartPhase, startPhase);
         }
 
-        return AutomationCompositionState.UNINITIALISED2PASSIVE.equals(automationComposition.getState())
-            || AutomationCompositionState.PASSIVE2RUNNING.equals(automationComposition.getState()) ? minStartPhase
+        return DeployState.DEPLOYING.equals(automationComposition.getDeployState())
+            || LockState.UNLOCKING.equals(automationComposition.getLockState()) ? minStartPhase
                 : maxStartPhase;
     }
 
index f0ba43f..77d0d34 100644 (file)
@@ -42,6 +42,7 @@ public class AutomationCompositionDeploy extends ParticipantMessage {
     // A list of ParticipantUpdates instances which carries details of an updated participant.
     private List<ParticipantDeploy> participantUpdatesList = new ArrayList<>();
     private Integer startPhase = 0;
+    private boolean firstStartPhase = true;
 
     /**
      * Constructor for instantiating class with message name.
@@ -59,6 +60,7 @@ public class AutomationCompositionDeploy extends ParticipantMessage {
     public AutomationCompositionDeploy(AutomationCompositionDeploy source) {
         super(source);
         this.startPhase = source.startPhase;
+        this.firstStartPhase = source.firstStartPhase;
         this.participantUpdatesList = PfUtils.mapList(source.participantUpdatesList, ParticipantDeploy::new);
     }
 }
index f8daa36..1694b25 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation.
+ * Copyright (C) 2021,2023 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,8 @@ import lombok.Setter;
 import lombok.ToString;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 
 /**
  * Class to represent the AUTOMATION_COMPOSITION_STATE_CHANGE message that the automation composition runtime will send
@@ -36,7 +38,10 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
 public class AutomationCompositionStateChange extends ParticipantMessage {
     private AutomationCompositionOrderedState orderedState;
     private AutomationCompositionState currentState;
+    private DeployOrder deployOrderedState = DeployOrder.NONE;
+    private LockOrder lockOrderedState = LockOrder.NONE;
     private Integer startPhase;
+    private Boolean firstStartPhase = true;
 
     /**
      * Constructor for instantiating class with message name.
@@ -56,5 +61,8 @@ public class AutomationCompositionStateChange extends ParticipantMessage {
 
         this.orderedState = source.orderedState;
         this.currentState = source.currentState;
+        this.deployOrderedState = source.deployOrderedState;
+        this.lockOrderedState = source.lockOrderedState;
+        this.startPhase = source.startPhase;
     }
 }
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java
deleted file mode 100644 (file)
index 48fc8ba..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * Copyright (C) 2021-2022 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.models.acm.messages.rest.instantiation;
-
-import lombok.Data;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
-
-@Data
-public class InstantiationCommand {
-    // The state to which the automation compositions are to be set
-    private AutomationCompositionOrderedState orderedState;
-}
index 038c140..6e5b504 100644 (file)
@@ -49,7 +49,7 @@ class AutomationCompositionDeployAckTest {
         // verify with all values
         orig.setAutomationCompositionId(UUID.randomUUID());
         orig.setParticipantId(CommonTestData.getParticipantId());
-        var acElementResult = new AcElementDeployAck(AutomationCompositionState.UNINITIALISED, null,
+        var acElementResult = new AcElementDeployAck(AutomationCompositionState.UNINITIALISED, null, null,
             true, "AutomationCompositionElement result");
         final var automationCompositionResultMap = Map.of(UUID.randomUUID(), acElementResult);
         orig.setAutomationCompositionResultMap(automationCompositionResultMap);
diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java
deleted file mode 100644 (file)
index a87f7e0..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2022 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.models.acm.messages.rest.instantiation;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import org.junit.jupiter.api.Test;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
-
-class InstantiationCommandTest {
-    @Test
-    void testInstantiationCommandLombok() {
-        assertNotNull(new InstantiationCommand());
-        var ic0 = new InstantiationCommand();
-
-        assertThat(ic0.toString()).contains("InstantiationCommand(");
-        assertNotEquals(0, ic0.hashCode());
-        assertEquals(ic0, ic0);
-        assertNotEquals(null, ic0);
-
-
-        var ic1 = new InstantiationCommand();
-
-        ic1.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED);
-
-        assertThat(ic1.toString()).contains("InstantiationCommand(");
-        assertNotEquals(0, ic1.hashCode());
-        assertNotEquals(ic1, ic0);
-        assertNotEquals(null, ic1);
-
-        assertNotEquals(ic1, ic0);
-
-        var ic2 = new InstantiationCommand();
-
-        assertEquals(ic2, ic0);
-    }
-}
index f2fd636..95e0f27 100644 (file)
@@ -127,7 +127,7 @@ public class AutomationCompositionHandler {
             acElement.setOrderedState(orderedState);
             acElement.setState(newState);
             automationCompositionStateChangeAck.getAutomationCompositionResultMap().put(acElement.getId(),
-                    new AcElementDeployAck(newState, null, true,
+                    new AcElementDeployAck(newState, null, null, true,
                             "Automation composition element {} state changed to {}\", id, newState)"));
             LOGGER.debug("Automation composition element {} state changed to {}", id, newState);
             automationCompositionStateChangeAck
index 5281cb5..62a769f 100644 (file)
@@ -26,6 +26,7 @@ import javax.validation.Valid;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import lombok.AllArgsConstructor;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
@@ -55,6 +56,7 @@ public class AutomationCompositionInstantiationProvider {
     private final AutomationCompositionProvider automationCompositionProvider;
     private final AcDefinitionProvider acDefinitionProvider;
     private final AcInstanceStateResolver acInstanceStateResolver;
+    private final SupervisionAcHandler supervisionAcHandler;
 
     /**
      * Create automation composition.
@@ -233,19 +235,19 @@ public class AutomationCompositionInstantiationProvider {
                 automationComposition.getLockState());
         switch (result) {
             case "DEPLOY":
-                //
+                supervisionAcHandler.deploy(automationComposition, acDefinition);
                 break;
 
             case "UNDEPLOY":
-                //
+                supervisionAcHandler.undeploy(automationComposition, acDefinition);
                 break;
 
             case "LOCK":
-                //
+                supervisionAcHandler.lock(automationComposition, acDefinition);
                 break;
 
             case "UNLOCK":
-                //
+                supervisionAcHandler.unlock(automationComposition, acDefinition);
                 break;
 
             default:
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java
new file mode 100644 (file)
index 0000000..3e79e78
--- /dev/null
@@ -0,0 +1,171 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.runtime.supervision;
+
+import io.micrometer.core.annotation.Timed;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import lombok.AllArgsConstructor;
+import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
+import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
+import org.onap.policy.clamp.models.acm.concepts.DeployState;
+import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
+import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class handles supervision of automation composition instances, so only one object of this type should be built
+ * at a time.
+ */
+@Component
+@AllArgsConstructor
+public class SupervisionAcHandler {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionAcHandler.class);
+
+    private final AutomationCompositionProvider automationCompositionProvider;
+
+    // Publishers for participant communication
+    private final AutomationCompositionDeployPublisher automationCompositionDeployPublisher;
+    private final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher;
+
+    /**
+     * Handle Deploy an AutomationComposition instance.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param acDefinition the AutomationCompositionDefinition
+     */
+    public void deploy(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
+        AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYING, LockState.NONE);
+        automationCompositionProvider.updateAutomationComposition(automationComposition);
+        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        automationCompositionDeployPublisher.send(automationComposition, acDefinition.getServiceTemplate(), startPhase,
+                true);
+    }
+
+    /**
+     * Handle Undeploy an AutomationComposition instance.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param acDefinition the AutomationCompositionDefinition
+     */
+    public void undeploy(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
+        AcmUtils.setCascadedState(automationComposition, DeployState.UNDEPLOYING, LockState.NONE);
+        automationCompositionProvider.updateAutomationComposition(automationComposition);
+        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        automationCompositionStateChangePublisher.undeploy(automationComposition, startPhase, true);
+    }
+
+    /**
+     * Handle Unlock an AutomationComposition instance.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param acDefinition the AutomationCompositionDefinition
+     */
+    public void unlock(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
+        AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.UNLOCKING);
+        automationCompositionProvider.updateAutomationComposition(automationComposition);
+        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        automationCompositionStateChangePublisher.unlock(automationComposition, startPhase, true);
+    }
+
+    /**
+     * Handle Lock an AutomationComposition instance.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param acDefinition the AutomationCompositionDefinition
+     */
+    public void lock(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) {
+        AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKING);
+        automationCompositionProvider.updateAutomationComposition(automationComposition);
+        var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate());
+        automationCompositionStateChangePublisher.lock(automationComposition, startPhase, true);
+    }
+
+    /**
+     * Handle a AutomationComposition deploy acknowledge message from a participant.
+     *
+     * @param automationCompositionAckMessage the AutomationCompositionAck message received from a participant
+     */
+    @MessageIntercept
+    @Timed(
+            value = "listener.automation_composition_deploy_ack",
+            description = "AUTOMATION_COMPOSITION_DEPLOY_ACK messages received")
+    public void handleAutomationCompositionUpdateAckMessage(
+            AutomationCompositionDeployAck automationCompositionAckMessage) {
+        LOGGER.debug("AutomationComposition Update Ack message received {}", automationCompositionAckMessage);
+        setAcElementStateInDb(automationCompositionAckMessage);
+    }
+
+    /**
+     * Handle a AutomationComposition statechange acknowledge message from a participant.
+     *
+     * @param automationCompositionAckMessage the AutomationCompositionAck message received from a participant
+     */
+    @MessageIntercept
+    @Timed(
+            value = "listener.automation_composition_statechange_ack",
+            description = "AUTOMATION_COMPOSITION_STATECHANGE_ACK messages received")
+    public void handleAutomationCompositionStateChangeAckMessage(
+            AutomationCompositionDeployAck automationCompositionAckMessage) {
+        LOGGER.debug("AutomationComposition StateChange Ack message received {}", automationCompositionAckMessage);
+        setAcElementStateInDb(automationCompositionAckMessage);
+    }
+
+    private void setAcElementStateInDb(AutomationCompositionDeployAck automationCompositionAckMessage) {
+        if (automationCompositionAckMessage.getAutomationCompositionResultMap() != null) {
+            var automationComposition = automationCompositionProvider
+                    .findAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId());
+            if (automationComposition.isPresent()) {
+                var updated = updateState(automationComposition.get(),
+                        automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet());
+                if (updated) {
+                    automationCompositionProvider.updateAutomationComposition(automationComposition.get());
+                }
+            } else {
+                LOGGER.warn("AutomationComposition not found in database {}",
+                        automationCompositionAckMessage.getAutomationCompositionId());
+            }
+        }
+    }
+
+    private boolean updateState(AutomationComposition automationComposition,
+            Set<Map.Entry<UUID, AcElementDeployAck>> automationCompositionResultSet) {
+        var updated = false;
+        for (var acElementAck : automationCompositionResultSet) {
+            var element = automationComposition.getElements().get(acElementAck.getKey());
+            if (element != null) {
+                element.setDeployState(acElementAck.getValue().getDeployState());
+                element.setLockState(acElementAck.getValue().getLockState());
+                updated = true;
+            }
+        }
+        return updated;
+    }
+}
index db726e0..d6bae3b 100644 (file)
 package org.onap.policy.clamp.acm.runtime.supervision;
 
 import io.micrometer.core.annotation.Timed;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import javax.ws.rs.core.Response;
 import lombok.AllArgsConstructor;
-import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
-import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
-import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
-import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
-import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
-import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
-import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantPrimeAck;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
-import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 /**
- * This class handles supervision of automation composition instances, so only one object of this type should be built
+ * This class handles supervision of automation composition definition, so only one object of this type should be built
  * at a time.
- *
- * <p/>
- * It is effectively a singleton that is started at system start.
  */
 @Component
 @AllArgsConstructor
 public class SupervisionHandler {
     private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionHandler.class);
 
-    private static final String AUTOMATION_COMPOSITION_CANNOT_TRANSITION_FROM_STATE =
-        "Automation composition can't transition from state ";
-    private static final String AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE =
-        "Automation composition is already in state ";
-    private static final String TO_STATE = " to state ";
-    private static final String AND_TRANSITIONING_TO_STATE = " and transitioning to state ";
-
-    private final AutomationCompositionProvider automationCompositionProvider;
     private final AcDefinitionProvider acDefinitionProvider;
 
-    // Publishers for participant communication
-    private final AutomationCompositionDeployPublisher automationCompositionDeployPublisher;
-    private final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher;
-
-    /**
-     * Handle a AutomationComposition update acknowledge message from a participant.
-     *
-     * @param automationCompositionAckMessage the AutomationCompositionAck message received from a participant
-     */
-    @MessageIntercept
-    @Timed(
-        value = "listener.automation_composition_deploy_ack",
-        description = "AUTOMATION_COMPOSITION_DEPLOY_ACK messages received")
-    public void handleAutomationCompositionUpdateAckMessage(
-            AutomationCompositionDeployAck automationCompositionAckMessage) {
-        LOGGER.debug("AutomationComposition Update Ack message received {}", automationCompositionAckMessage);
-        setAcElementStateInDb(automationCompositionAckMessage);
-    }
-
     /**
      * Handle a ParticipantPrimeAck message from a participant.
      *
@@ -118,183 +75,4 @@ public class SupervisionHandler {
         }
         acDefinitionProvider.updateAcDefinition(acDefinition);
     }
-
-    /**
-     * Handle a AutomationComposition statechange acknowledge message from a participant.
-     *
-     * @param automationCompositionAckMessage the AutomationCompositionAck message received from a participant
-     */
-    @MessageIntercept
-    @Timed(
-        value = "listener.automation_composition_statechange_ack",
-        description = "AUTOMATION_COMPOSITION_STATECHANGE_ACK messages received")
-    public void handleAutomationCompositionStateChangeAckMessage(
-        AutomationCompositionDeployAck automationCompositionAckMessage) {
-        LOGGER.debug("AutomationComposition StateChange Ack message received {}", automationCompositionAckMessage);
-        setAcElementStateInDb(automationCompositionAckMessage);
-    }
-
-    private void setAcElementStateInDb(AutomationCompositionDeployAck automationCompositionAckMessage) {
-        if (automationCompositionAckMessage.getAutomationCompositionResultMap() != null) {
-            var automationComposition = automationCompositionProvider
-                .findAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId());
-            if (automationComposition.isPresent()) {
-                var updated = updateState(automationComposition.get(),
-                    automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet());
-                if (updated) {
-                    automationCompositionProvider.updateAutomationComposition(automationComposition.get());
-                }
-            } else {
-                LOGGER.warn("AutomationComposition not found in database {}",
-                    automationCompositionAckMessage.getAutomationCompositionId());
-            }
-        }
-    }
-
-    private boolean updateState(AutomationComposition automationComposition,
-                                Set<Map.Entry<UUID, AcElementDeployAck>> automationCompositionResultSet) {
-        var updated = false;
-        for (var acElementAck : automationCompositionResultSet) {
-            var element = automationComposition.getElements().get(acElementAck.getKey());
-            if (element != null) {
-                element.setState(acElementAck.getValue().getState());
-                updated = true;
-            }
-        }
-        return updated;
-    }
-
-    /**
-     * Supervise a automation composition, performing whatever actions need to be performed on the automation
-     * composition.
-     *
-     * @param automationComposition the automation composition to supervises
-     * @throws AutomationCompositionException on supervision errors
-     */
-    public void triggerAutomationCompositionSupervision(AutomationComposition automationComposition)
-        throws AutomationCompositionException {
-        switch (automationComposition.getOrderedState()) {
-            case UNINITIALISED:
-                superviseAutomationCompositionUninitialization(automationComposition);
-                break;
-
-            case PASSIVE:
-                superviseAutomationCompositionPassivation(automationComposition);
-                break;
-
-            case RUNNING:
-                superviseAutomationCompositionActivation(automationComposition);
-                break;
-
-            default:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    "A automation composition cannot be commanded to go into state "
-                        + automationComposition.getOrderedState().name());
-        }
-    }
-
-    /**
-     * Supervise a automation composition uninitialisation, performing whatever actions need to be performed on the
-     * automation composition,
-     * automation composition ordered state is UNINITIALIZED.
-     *
-     * @param automationComposition the automation composition to supervises
-     * @throws AutomationCompositionException on supervision errors
-     */
-    private void superviseAutomationCompositionUninitialization(AutomationComposition automationComposition)
-        throws AutomationCompositionException {
-        switch (automationComposition.getState()) {
-            case UNINITIALISED:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name());
-                break;
-
-            case UNINITIALISED2PASSIVE:
-            case PASSIVE:
-                automationComposition.setState(AutomationCompositionState.PASSIVE2UNINITIALISED);
-                automationCompositionStateChangePublisher.send(automationComposition,
-                    getFirstStartPhase(automationComposition));
-                break;
-
-            case PASSIVE2UNINITIALISED:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name()
-                        + AND_TRANSITIONING_TO_STATE + automationComposition.getOrderedState());
-                break;
-
-            default:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE, AUTOMATION_COMPOSITION_CANNOT_TRANSITION_FROM_STATE
-                    + automationComposition.getState().name() + TO_STATE + automationComposition.getOrderedState());
-                break;
-        }
-    }
-
-    private void superviseAutomationCompositionPassivation(AutomationComposition automationComposition)
-        throws AutomationCompositionException {
-        switch (automationComposition.getState()) {
-            case PASSIVE:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name());
-                break;
-            case UNINITIALISED:
-                automationComposition.setState(AutomationCompositionState.UNINITIALISED2PASSIVE);
-                automationCompositionDeployPublisher.send(automationComposition);
-                break;
-
-            case UNINITIALISED2PASSIVE:
-            case RUNNING2PASSIVE:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name()
-                        + AND_TRANSITIONING_TO_STATE + automationComposition.getOrderedState());
-                break;
-
-            case RUNNING:
-                automationComposition.setState(AutomationCompositionState.RUNNING2PASSIVE);
-                automationCompositionStateChangePublisher.send(automationComposition,
-                    getFirstStartPhase(automationComposition));
-                break;
-
-            default:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE, AUTOMATION_COMPOSITION_CANNOT_TRANSITION_FROM_STATE
-                    + automationComposition.getState().name() + TO_STATE + automationComposition.getOrderedState());
-                break;
-        }
-    }
-
-    private void superviseAutomationCompositionActivation(AutomationComposition automationComposition)
-        throws AutomationCompositionException {
-        switch (automationComposition.getState()) {
-            case RUNNING:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name());
-                break;
-
-            case PASSIVE2RUNNING:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE,
-                    AUTOMATION_COMPOSITION_IS_ALREADY_IN_STATE + automationComposition.getState().name()
-                        + AND_TRANSITIONING_TO_STATE + automationComposition.getOrderedState());
-                break;
-
-            case PASSIVE:
-                automationComposition.setState(AutomationCompositionState.PASSIVE2RUNNING);
-                automationCompositionStateChangePublisher.send(automationComposition,
-                    getFirstStartPhase(automationComposition));
-                break;
-
-            default:
-                exceptionOccured(Response.Status.NOT_ACCEPTABLE, AUTOMATION_COMPOSITION_CANNOT_TRANSITION_FROM_STATE
-                    + automationComposition.getState().name() + TO_STATE + automationComposition.getOrderedState());
-                break;
-        }
-    }
-
-    private int getFirstStartPhase(AutomationComposition automationComposition) {
-        var toscaServiceTemplate =
-                acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()).getServiceTemplate();
-        return ParticipantUtils.getFirstStartPhase(automationComposition, toscaServiceTemplate);
-    }
-
-    private void exceptionOccured(Response.Status status, String reason) throws AutomationCompositionException {
-        throw new AutomationCompositionException(status, reason);
-    }
 }
index 0811a5a..cc4a059 100644 (file)
@@ -25,14 +25,22 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm;
 import io.micrometer.core.annotation.Timed;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
+import java.util.function.UnaryOperator;
 import lombok.AllArgsConstructor;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeploy;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -86,4 +94,48 @@ public class AutomationCompositionDeployPublisher extends AbstractParticipantPub
         LOGGER.debug("AutomationCompositionDeploy message sent {}", acDeployMsg);
         super.send(acDeployMsg);
     }
+
+    /**
+     * Send AutomationCompositionDeploy to Participant.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param startPhase the Start Phase
+     */
+    @Timed(value = "publisher.automation_composition_deploy",
+            description = "AUTOMATION_COMPOSITION_DEPLOY messages published")
+    public void send(AutomationComposition automationComposition, ToscaServiceTemplate toscaServiceTemplate,
+            int startPhase, boolean firstStartPhase) {
+        var toscaServiceTemplateFragment = AcmUtils.getToscaServiceTemplateFragment(toscaServiceTemplate);
+        Map<UUID, List<AcElementDeploy>> map = new HashMap<>();
+        for (var element : automationComposition.getElements().values()) {
+            var acElementDeploy = new AcElementDeploy();
+            acElementDeploy.setId(element.getId());
+            acElementDeploy.setDefinition(new ToscaConceptIdentifier(element.getDefinition()));
+            acElementDeploy.setOrderedState(DeployOrder.DEPLOY);
+            acElementDeploy.setProperties(PfUtils.mapMap(element.getProperties(), UnaryOperator.identity()));
+            acElementDeploy.setToscaServiceTemplateFragment(toscaServiceTemplateFragment);
+
+            map.putIfAbsent(element.getParticipantId(), new ArrayList<>());
+            map.get(element.getParticipantId()).add(acElementDeploy);
+        }
+        List<ParticipantDeploy> participantDeploys = new ArrayList<>();
+        for (var entry : map.entrySet()) {
+            var participantDeploy = new ParticipantDeploy();
+            participantDeploy.setParticipantId(entry.getKey());
+            participantDeploy.setAcElementList(entry.getValue());
+            participantDeploys.add(participantDeploy);
+        }
+
+        var acDeployMsg = new AutomationCompositionDeploy();
+        acDeployMsg.setCompositionId(automationComposition.getCompositionId());
+        acDeployMsg.setStartPhase(startPhase);
+        acDeployMsg.setFirstStartPhase(firstStartPhase);
+        acDeployMsg.setAutomationCompositionId(automationComposition.getInstanceId());
+        acDeployMsg.setMessageId(UUID.randomUUID());
+        acDeployMsg.setTimestamp(Instant.now());
+        acDeployMsg.setParticipantUpdatesList(participantDeploys);
+
+        LOGGER.debug("AutomationCompositionDeploy message sent {}", acDeployMsg);
+        super.send(acDeployMsg);
+    }
 }
index ed1662a..df8e60c 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation.
+ * Copyright (C) 2021,2023 Nordix Foundation.
  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,7 @@
 package org.onap.policy.clamp.acm.runtime.supervision.comm;
 
 import org.onap.policy.clamp.acm.runtime.config.messaging.Listener;
-import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
@@ -40,12 +40,12 @@ public class AutomationCompositionStateChangeAckListener extends ScoListener<Aut
     implements Listener<AutomationCompositionDeployAck> {
     private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionStateChangeAckListener.class);
 
-    private final SupervisionHandler supervisionHandler;
+    private final SupervisionAcHandler supervisionHandler;
 
     /**
      * Constructs the object.
      */
-    public AutomationCompositionStateChangeAckListener(SupervisionHandler supervisionHandler) {
+    public AutomationCompositionStateChangeAckListener(SupervisionAcHandler supervisionHandler) {
         super(AutomationCompositionDeployAck.class);
         this.supervisionHandler = supervisionHandler;
     }
index 8d6378e..56a62e1 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021,2022 Nordix Foundation.
+ * Copyright (C) 2021-2023 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,8 @@ import io.micrometer.core.annotation.Timed;
 import java.util.UUID;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionStateChange;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 import org.springframework.stereotype.Component;
 
 /**
@@ -33,13 +35,75 @@ import org.springframework.stereotype.Component;
 public class AutomationCompositionStateChangePublisher
         extends AbstractParticipantPublisher<AutomationCompositionStateChange> {
 
+    /**
+     * Send undeploy message to to Participant.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param startPhase the startPhase
+     */
+    @Timed(
+            value = "publisher.automation_composition_state_change",
+            description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published")
+    public void undeploy(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) {
+        send(automationComposition, startPhase, firstStartPhase, DeployOrder.UNDEPLOY, LockOrder.NONE);
+    }
+
+    /**
+     * Send unlock message to to Participant.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param startPhase the startPhase
+     */
+    @Timed(
+            value = "publisher.automation_composition_state_change",
+            description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published")
+    public void unlock(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) {
+        send(automationComposition, startPhase, firstStartPhase, DeployOrder.NONE, LockOrder.UNLOCK);
+    }
+
+    /**
+     * Send lock message to to Participant.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param startPhase the startPhase
+     */
+    @Timed(
+            value = "publisher.automation_composition_state_change",
+            description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published")
+    public void lock(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) {
+        send(automationComposition, startPhase, firstStartPhase, DeployOrder.NONE, LockOrder.LOCK);
+    }
+
+    /**
+     * Send undeploy message to to Participant.
+     *
+     * @param automationComposition the AutomationComposition
+     * @param startPhase the startPhase
+     * @param deployOrder the DeployOrder
+     * @param lockOrder the LockOrder
+     */
+    private void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase,
+            DeployOrder deployOrder, LockOrder lockOrder) {
+        var acsc = new AutomationCompositionStateChange();
+        acsc.setCompositionId(automationComposition.getCompositionId());
+        acsc.setAutomationCompositionId(automationComposition.getInstanceId());
+        acsc.setMessageId(UUID.randomUUID());
+        acsc.setDeployOrderedState(deployOrder);
+        acsc.setLockOrderedState(lockOrder);
+        acsc.setStartPhase(startPhase);
+        acsc.setFirstStartPhase(firstStartPhase);
+
+        super.send(acsc);
+    }
+
     /**
      * Send AutomationCompositionStateChange to Participant.
      *
      * @param automationComposition the AutomationComposition
      * @param startPhase the startPhase
      */
-    @Timed(value = "publisher.automation_composition_state_change",
+    @Timed(
+            value = "publisher.automation_composition_state_change",
             description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published")
     public void send(AutomationComposition automationComposition, int startPhase) {
         var acsc = new AutomationCompositionStateChange();
index 64d1fbe..81ecf93 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation.
+ * Copyright (C) 2021,2023 Nordix Foundation.
  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,7 @@
 package org.onap.policy.clamp.acm.runtime.supervision.comm;
 
 import org.onap.policy.clamp.acm.runtime.config.messaging.Listener;
-import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
@@ -40,12 +40,12 @@ public class AutomationCompositionUpdateAckListener extends ScoListener<Automati
     implements Listener<AutomationCompositionDeployAck> {
     private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionUpdateAckListener.class);
 
-    private final SupervisionHandler supervisionHandler;
+    private final SupervisionAcHandler supervisionHandler;
 
     /**
      * Constructs the object.
      */
-    public AutomationCompositionUpdateAckListener(SupervisionHandler supervisionHandler) {
+    public AutomationCompositionUpdateAckListener(SupervisionAcHandler supervisionHandler) {
         super(AutomationCompositionDeployAck.class);
         this.supervisionHandler = supervisionHandler;
     }
index 019d53c..1acaebe 100644 (file)
@@ -88,7 +88,7 @@ class AutomationCompositionInstantiationProviderTest {
         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
         var acProvider = mock(AutomationCompositionProvider.class);
         var instantiationProvider =
-                new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null);
+                new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null);
         var automationCompositionCreate =
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
         automationCompositionCreate.setCompositionId(compositionId);
@@ -140,7 +140,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
-                acDefinitionProvider, null);
+                acDefinitionProvider, null, null);
 
         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(automationComposition);
@@ -169,7 +169,7 @@ class AutomationCompositionInstantiationProviderTest {
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
-                acDefinitionProvider, null);
+                acDefinitionProvider, null, null);
 
         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
                 .thenReturn(automationComposition);
@@ -197,7 +197,7 @@ class AutomationCompositionInstantiationProviderTest {
                 .thenReturn(automationCompositionCreate);
 
         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
-                acDefinitionProvider, null);
+                acDefinitionProvider, null, null);
 
         var instantiationResponse = instantiationProvider.createAutomationComposition(
                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
@@ -223,7 +223,7 @@ class AutomationCompositionInstantiationProviderTest {
 
         var acProvider = mock(AutomationCompositionProvider.class);
         var provider = new AutomationCompositionInstantiationProvider(acProvider,
-                acDefinitionProvider, null);
+                acDefinitionProvider, null, null);
 
         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
                 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
@@ -245,7 +245,7 @@ class AutomationCompositionInstantiationProviderTest {
                 .thenReturn(automationComposition);
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
         var provider = new AutomationCompositionInstantiationProvider(acProvider,
-                acDefinitionProvider, null);
+                acDefinitionProvider, null, null);
 
         var compositionId = automationComposition.getCompositionId();
         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
index a5ffacc..5347622 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2022 Nordix Foundation.
+ *  Copyright (C) 2021-2023 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,6 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.File;
 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
-import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
 import org.onap.policy.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
@@ -64,21 +63,6 @@ public class InstantiationUtils {
         }
     }
 
-    /**
-     * Gets InstantiationCommand from Resource.
-     *
-     * @param path path of the resource
-     * @return the InstantiationCommand
-     */
-    public static InstantiationCommand getInstantiationCommandFromResource(final String path) {
-        try {
-            return CODER.decode(new File(path), InstantiationCommand.class);
-        } catch (CoderException e) {
-            fail("Cannot read or decode " + path);
-            return null;
-        }
-    }
-
     /**
      * Assert that Instantiation Response contains proper AutomationCompositions.
      *
diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java
new file mode 100644 (file)
index 0000000..e16672d
--- /dev/null
@@ -0,0 +1,100 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2023 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.runtime.supervision;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
+import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
+import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
+import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
+import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
+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.messages.dmaap.participant.AutomationCompositionDeployAck;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
+
+class SupervisionAcHandlerTest {
+    private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
+    private static final UUID IDENTIFIER = UUID.randomUUID();
+
+    @Test
+    void testHandleAutomationCompositionStateChangeAckMessage() {
+        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
+        var automationComposition =
+                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
+        when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
+                .thenReturn(Optional.of(automationComposition));
+
+        var handler = new SupervisionAcHandler(automationCompositionProvider,
+                mock(AutomationCompositionDeployPublisher.class),
+                mock(AutomationCompositionStateChangePublisher.class));
+
+        var automationCompositionAckMessage =
+                new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK);
+        for (var elementEntry : automationComposition.getElements().entrySet()) {
+            var acElementDeployAck = new AcElementDeployAck(null, DeployState.DEPLOYED, LockState.UNLOCKED, true, "");
+            automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
+                    acElementDeployAck);
+        }
+        automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
+
+        handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
+
+        verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
+    }
+
+    @Test
+    void testHandleAutomationCompositionUpdateAckMessage() {
+        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
+        var automationComposition =
+                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
+        when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
+                .thenReturn(Optional.of(automationComposition));
+
+        var automationCompositionAckMessage =
+                new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
+        for (var elementEntry : automationComposition.getElements().entrySet()) {
+            var acElementDeployAck = new AcElementDeployAck(null, DeployState.DEPLOYED, LockState.LOCKED, true, "");
+            automationCompositionAckMessage
+                    .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
+        }
+        automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
+        automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
+
+        var handler = new SupervisionAcHandler(automationCompositionProvider,
+                mock(AutomationCompositionDeployPublisher.class),
+                mock(AutomationCompositionStateChangePublisher.class));
+
+        handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
+
+        verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
+    }
+}
index 0fa15b6..d4cc5e3 100644 (file)
 
 package org.onap.policy.clamp.acm.runtime.supervision;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
-import java.util.UUID;
 import org.junit.jupiter.api.Test;
-import org.mockito.Mockito;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
-import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
-import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
-import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
-import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
-import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
-import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
-import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
-import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantPrimeAck;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
-import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
-
 
 class SupervisionHandlerTest {
-    private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
-    private static final UUID IDENTIFIER = UUID.randomUUID();
-
-    @Test
-    void testTriggerAutomationCompositionSupervision() throws AutomationCompositionException {
-        var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
-        var handler = createSupervisionHandlerForTrigger(automationCompositionDeployPublisher);
-
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE);
-        automationComposition.setState(AutomationCompositionState.UNINITIALISED);
-        handler.triggerAutomationCompositionSupervision(automationComposition);
-
-        verify(automationCompositionDeployPublisher).send(automationComposition);
-    }
-
-    @Test
-    void testAcUninitialisedToUninitialised() {
-        var handler = createSupervisionHandlerForTrigger();
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED);
-        automationComposition.setState(AutomationCompositionState.UNINITIALISED);
-
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state UNINITIALISED");
-    }
-
-    @Test
-    void testAcUninitialisedToPassive() throws AutomationCompositionException {
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED);
-        automationComposition.setState(AutomationCompositionState.PASSIVE);
-        automationComposition.setCompositionId(UUID.randomUUID());
-
-        var acDefinitionProvider = Mockito.mock(AcDefinitionProvider.class);
-        var acDefinition = new AutomationCompositionDefinition();
-        acDefinition.setCompositionId(automationComposition.getCompositionId());
-        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
-        when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId())).thenReturn(acDefinition);
-
-        var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
-
-        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
-        var handler = new SupervisionHandler(automationCompositionProvider, acDefinitionProvider,
-                mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher);
-
-        handler.triggerAutomationCompositionSupervision(automationComposition);
-
-        verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(1));
-    }
-
-    @Test
-    void testAcPassiveToPassive() {
-        var handler = createSupervisionHandlerForTrigger();
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE);
-        automationComposition.setState(AutomationCompositionState.PASSIVE);
-
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state PASSIVE");
-    }
-
-    @Test
-    void testAcTransitioning() {
-        var handler = createSupervisionHandlerForTrigger();
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED);
-        automationComposition.setState(AutomationCompositionState.PASSIVE2UNINITIALISED);
-
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state "
-                        + "PASSIVE2UNINITIALISED and transitioning to state UNINITIALISED");
-
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE);
-        automationComposition.setState(AutomationCompositionState.UNINITIALISED2PASSIVE);
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state "
-                        + "UNINITIALISED2PASSIVE and transitioning to state PASSIVE");
-
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING);
-        automationComposition.setState(AutomationCompositionState.PASSIVE2RUNNING);
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state "
-                        + "PASSIVE2RUNNING and transitioning to state RUNNING");
-    }
-
-    @Test
-    void testAcRunningToPassive() throws AutomationCompositionException {
-        var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
-        var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class),
-                mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher,
-                AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED);
-
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE);
-        automationComposition.setState(AutomationCompositionState.RUNNING);
-
-        handler.triggerAutomationCompositionSupervision(automationComposition);
-
-        verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(1));
-    }
-
-    @Test
-    void testAcRunningToRunning() {
-        var handler = createSupervisionHandlerForTrigger();
-
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING);
-        automationComposition.setState(AutomationCompositionState.RUNNING);
-
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching("Automation composition is already in state RUNNING");
-    }
-
-    @Test
-    void testAcRunningToUninitialised() {
-        var handler = createSupervisionHandlerForTrigger();
-
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING);
-        automationComposition.setState(AutomationCompositionState.UNINITIALISED);
-
-        assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition))
-                .hasMessageMatching(
-                        "Automation composition can't transition from state UNINITIALISED to state RUNNING");
-    }
-
-    @Test
-    void testAcPassiveToRunning() throws AutomationCompositionException {
-        var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
-        var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class),
-                mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher,
-                AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED);
-
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-        automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING);
-        automationComposition.setState(AutomationCompositionState.PASSIVE);
-
-        handler.triggerAutomationCompositionSupervision(automationComposition);
-
-        verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(0));
-    }
-
-    @Test
-    void testHandleAutomationCompositionStateChangeAckMessage() {
-        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
-        var handler = createSupervisionHandler(automationCompositionProvider,
-                mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
-                AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED);
-        var automationCompositionAckMessage =
-                new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK);
-        var acElementDeployAck =
-                new AcElementDeployAck(AutomationCompositionState.PASSIVE, DeployState.DEPLOYED, true, "");
-        automationCompositionAckMessage.setAutomationCompositionResultMap(
-                Map.of(UUID.fromString("709c62b3-8918-41b9-a747-d21eb79c6c20"), acElementDeployAck));
-        automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
-
-        handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
-
-        verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
-    }
-
-    @Test
-    void testHandleAutomationCompositionUpdateAckMessage() {
-        var automationCompositionAckMessage =
-                new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
-        automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
-        var acElementDeployAck =
-                new AcElementDeployAck(AutomationCompositionState.PASSIVE, DeployState.DEPLOYED, true, "");
-        automationCompositionAckMessage.setAutomationCompositionResultMap(
-                Map.of(UUID.fromString("709c62b3-8918-41b9-a747-d21eb79c6c20"), acElementDeployAck));
-        automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
-        var automationCompositionProvider = mock(AutomationCompositionProvider.class);
-        var handler = createSupervisionHandler(automationCompositionProvider,
-                mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
-                AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED);
-
-        handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
-
-        verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
-    }
 
     @Test
     void testParticipantPrimeAckNotFound() {
@@ -253,9 +43,7 @@ class SupervisionHandlerTest {
         participantPrimeAckMessage.setParticipantId(CommonTestData.getParticipantId());
         participantPrimeAckMessage.setState(ParticipantState.ON_LINE);
         var acDefinitionProvider = mock(AcDefinitionProvider.class);
-        var handler = new SupervisionHandler(mock(AutomationCompositionProvider.class), acDefinitionProvider,
-                mock(AutomationCompositionDeployPublisher.class),
-                mock(AutomationCompositionStateChangePublisher.class));
+        var handler = new SupervisionHandler(acDefinitionProvider);
 
         handler.handleParticipantMessage(participantPrimeAckMessage);
         verify(acDefinitionProvider).findAcDefinition(any());
@@ -275,9 +63,7 @@ class SupervisionHandlerTest {
         when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId()))
                 .thenReturn(Optional.of(acDefinition));
 
-        var handler = new SupervisionHandler(mock(AutomationCompositionProvider.class), acDefinitionProvider,
-                mock(AutomationCompositionDeployPublisher.class),
-                mock(AutomationCompositionStateChangePublisher.class));
+        var handler = new SupervisionHandler(acDefinitionProvider);
 
         handler.handleParticipantMessage(participantPrimeAckMessage);
         verify(acDefinitionProvider).findAcDefinition(any());
@@ -297,50 +83,10 @@ class SupervisionHandlerTest {
         when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId()))
                 .thenReturn(Optional.of(acDefinition));
 
-        var handler = new SupervisionHandler(mock(AutomationCompositionProvider.class), acDefinitionProvider,
-                mock(AutomationCompositionDeployPublisher.class),
-                mock(AutomationCompositionStateChangePublisher.class));
+        var handler = new SupervisionHandler(acDefinitionProvider);
 
         handler.handleParticipantMessage(participantPrimeAckMessage);
         verify(acDefinitionProvider).findAcDefinition(any());
         verify(acDefinitionProvider).updateAcDefinition(any());
     }
-
-    private SupervisionHandler createSupervisionHandler(AutomationCompositionProvider automationCompositionProvider,
-            AutomationCompositionDeployPublisher automationCompositionDeployPublisher,
-            AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher,
-            AutomationCompositionOrderedState orderedState, AutomationCompositionState state) {
-        var automationComposition =
-                InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
-
-        automationComposition.setOrderedState(orderedState);
-        automationComposition.setState(state);
-        when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
-                .thenReturn(Optional.of(automationComposition));
-
-        var acDefinitionProvider = Mockito.mock(AcDefinitionProvider.class);
-        when(acDefinitionProvider.getServiceTemplateList(any(), any())).thenReturn(List
-                .of(Objects.requireNonNull(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML))));
-
-        var acDefinition = new AutomationCompositionDefinition();
-        acDefinition.setCompositionId(automationComposition.getCompositionId());
-        acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML));
-        when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId())).thenReturn(acDefinition);
-
-        return new SupervisionHandler(automationCompositionProvider, acDefinitionProvider,
-                automationCompositionDeployPublisher, automationCompositionStateChangePublisher);
-    }
-
-    private SupervisionHandler createSupervisionHandlerForTrigger() {
-        return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
-                mock(AutomationCompositionDeployPublisher.class),
-                mock(AutomationCompositionStateChangePublisher.class));
-    }
-
-    private SupervisionHandler createSupervisionHandlerForTrigger(
-            AutomationCompositionDeployPublisher automationCompositionDeployPublisher) {
-
-        return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
-                automationCompositionDeployPublisher, mock(AutomationCompositionStateChangePublisher.class));
-    }
 }
index c2d4e0f..0072a10 100644 (file)
@@ -35,6 +35,7 @@ import java.util.Map;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
@@ -225,7 +226,7 @@ class SupervisionMessagesTest {
     void testAutomationCompositionUpdateAckListener() {
         final var automationCompositionAck =
                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY);
-        var supervisionHandler = mock(SupervisionHandler.class);
+        var supervisionHandler = mock(SupervisionAcHandler.class);
         var acUpdateAckListener = new AutomationCompositionUpdateAckListener(supervisionHandler);
         acUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck);
         verify(supervisionHandler).handleAutomationCompositionUpdateAckMessage(automationCompositionAck);
@@ -235,7 +236,7 @@ class SupervisionMessagesTest {
     void testAutomationCompositionStateChangeAckListener() {
         final var automationCompositionAck =
                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATE_CHANGE);
-        var supervisionHandler = mock(SupervisionHandler.class);
+        var supervisionHandler = mock(SupervisionAcHandler.class);
         var acStateChangeAckListener = new AutomationCompositionStateChangeAckListener(supervisionHandler);
         acStateChangeAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck);
         verify(supervisionHandler).handleAutomationCompositionStateChangeAckMessage(automationCompositionAck);