Add Failure handling support in all ACM-participants 27/134627/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Fri, 2 Jun 2023 11:36:45 +0000 (12:36 +0100)
committerLiam Fallon <liam.fallon@est.tech>
Mon, 12 Jun 2023 08:44:52 +0000 (08:44 +0000)
In any transition (like deploy, undeploy,  lock, unlock, update, delete) a participant should respond with the final state of transition, a status indicator (stateChaneResult) indicating if error has occurred and a message.

Issue-ID: POLICY-4706
Change-Id: I424bc6d620f476392baee8904e21d3a6c7aa8d6b
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
(cherry picked from commit d58c0ca04ae993702b2c399afd52b01e503ec0fe)

16 files changed:
participant/participant-impl/participant-impl-a1pms/src/main/java/org/onap/policy/clamp/acm/participant/a1pms/handler/AutomationCompositionElementHandler.java
participant/participant-impl/participant-impl-a1pms/src/test/java/org/onap/policy/clamp/acm/participant/a1pms/handler/AcElementHandlerTest.java
participant/participant-impl/participant-impl-http/src/main/java/org/onap/policy/clamp/acm/participant/http/main/handler/AutomationCompositionElementHandler.java
participant/participant-impl/participant-impl-http/src/test/java/org/onap/policy/clamp/acm/participant/http/handler/AcElementHandlerTest.java
participant/participant-impl/participant-impl-kserve/src/main/java/org/onap/policy/clamp/acm/participant/kserve/handler/AutomationCompositionElementHandler.java
participant/participant-impl/participant-impl-kserve/src/test/java/org/onap/policy/clamp/acm/participant/kserve/handler/AcElementHandlerTest.java
participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/handler/AutomationCompositionElementHandler.java
participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/handler/AutomationCompositionElementHandlerTest.java
participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/acm/participant/policy/main/handler/AutomationCompositionElementHandler.java
participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/acm/participant/policy/main/handler/AutomationCompositionElementHandlerTest.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java
participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImplTest.java
participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/DummyAcElementListener.java

index 8401b93..665071b 100755 (executable)
@@ -22,6 +22,7 @@ package org.onap.policy.clamp.acm.participant.a1pms.handler;
 
 import java.lang.invoke.MethodHandles;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import javax.validation.Validation;
@@ -37,7 +38,11 @@ import org.onap.policy.clamp.acm.participant.a1pms.webclient.AcA1PmsClient;
 import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
 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.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -81,7 +86,8 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
             acA1PmsClient.deleteService(configurationEntity.getPolicyServiceEntities());
             configRequestMap.remove(automationCompositionElementId);
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                    automationCompositionElementId, DeployState.UNDEPLOYED, null, "Undeployed");
+                    automationCompositionElementId, DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                    "Undeployed");
         } else {
             LOGGER.warn("Failed to connect with A1PMS. Service configuration is: {}", configurationEntity);
             throw new A1PolicyServiceException(HttpStatus.SC_SERVICE_UNAVAILABLE, "Unable to connect with A1PMS");
@@ -107,7 +113,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
                     configRequestMap.put(element.getId(), configurationEntity);
 
                     intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                            DeployState.DEPLOYED, null, "Deployed");
+                            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
                 } else {
                     LOGGER.error("Failed to connect with A1PMS");
                     throw new A1PolicyServiceException(HttpStatus.SC_SERVICE_UNAVAILABLE,
@@ -121,4 +127,41 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
             throw new A1PolicyServiceException(HttpStatus.SC_BAD_REQUEST, "Invalid Configuration", e);
         }
     }
+
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
+                StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
 }
index a390766..77f41cb 100755 (executable)
 
 package org.onap.policy.clamp.acm.participant.a1pms.handler;
 
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Spy;
 import org.onap.policy.clamp.acm.participant.a1pms.exception.A1PolicyServiceException;
 import org.onap.policy.clamp.acm.participant.a1pms.utils.CommonTestData;
 import org.onap.policy.clamp.acm.participant.a1pms.utils.ToscaUtils;
 import org.onap.policy.clamp.acm.participant.a1pms.webclient.AcA1PmsClient;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+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.models.base.PfModelException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-@ExtendWith(SpringExtension.class)
 class AcElementHandlerTest {
 
     private final AcA1PmsClient acA1PmsClient = mock(AcA1PmsClient.class);
 
-    @InjectMocks
-    @Spy
-    private AutomationCompositionElementHandler automationCompositionElementHandler =
-            new AutomationCompositionElementHandler(acA1PmsClient);
-
     private final CommonTestData commonTestData = new CommonTestData();
 
     private static ToscaServiceTemplate serviceTemplate;
@@ -65,57 +62,145 @@ class AcElementHandlerTest {
 
     @BeforeEach
     void startMocks() throws A1PolicyServiceException {
-        automationCompositionElementHandler.setIntermediaryApi(mock(ParticipantIntermediaryApi.class));
         when(acA1PmsClient.isPmsHealthy()).thenReturn(Boolean.TRUE);
         doNothing().when(acA1PmsClient).createService(any());
     }
 
     @Test
     void test_automationCompositionElementStateChange() throws A1PolicyServiceException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+
         var automationCompositionId = commonTestData.getAutomationCompositionId();
         var element = commonTestData.getAutomationCompositionElement();
         var automationCompositionElementId = element.getId();
 
         var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
-        automationCompositionElementHandler.deploy(
-                commonTestData.getAutomationCompositionId(), element,
+        automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(), element,
                 nodeTemplatesMap.get(A1_AUTOMATION_COMPOSITION_ELEMENT).getProperties());
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId,
+                automationCompositionElementId, DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
 
-        assertDoesNotThrow(() -> automationCompositionElementHandler.undeploy(
-                automationCompositionId, automationCompositionElementId));
+        automationCompositionElementHandler.undeploy(automationCompositionId, automationCompositionElementId);
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId,
+                automationCompositionElementId, DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
 
         when(acA1PmsClient.isPmsHealthy()).thenReturn(Boolean.FALSE);
-        assertThrows(A1PolicyServiceException.class,
-                () -> automationCompositionElementHandler.undeploy(
-                        automationCompositionId, automationCompositionElementId));
+        assertThrows(A1PolicyServiceException.class, () -> automationCompositionElementHandler
+                .undeploy(automationCompositionId, automationCompositionElementId));
     }
 
     @Test
-    void test_AutomationCompositionElementUpdate() {
+    void test_AutomationCompositionElementUpdate() throws A1PolicyServiceException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
         var element = commonTestData.getAutomationCompositionElement();
 
         var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
-        assertDoesNotThrow(() -> automationCompositionElementHandler.deploy(
-                commonTestData.getAutomationCompositionId(), element,
-                nodeTemplatesMap.get(A1_AUTOMATION_COMPOSITION_ELEMENT).getProperties()));
+        automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(), element,
+                nodeTemplatesMap.get(A1_AUTOMATION_COMPOSITION_ELEMENT).getProperties());
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(
+                commonTestData.getAutomationCompositionId(), element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Deployed");
     }
 
     @Test
     void test_AutomationCompositionElementUpdateWithUnhealthyA1pms() {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        automationCompositionElementHandler.setIntermediaryApi(mock(ParticipantIntermediaryApi.class));
         var element = commonTestData.getAutomationCompositionElement();
         when(acA1PmsClient.isPmsHealthy()).thenReturn(Boolean.FALSE);
 
         var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
         assertThrows(A1PolicyServiceException.class,
-                () -> automationCompositionElementHandler.deploy(
-                        commonTestData.getAutomationCompositionId(), element,
+                () -> automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(), element,
                         nodeTemplatesMap.get(A1_AUTOMATION_COMPOSITION_ELEMENT).getProperties()));
     }
 
     @Test
     void test_AutomationCompositionElementUpdateWithInvalidConfiguration() {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        automationCompositionElementHandler.setIntermediaryApi(mock(ParticipantIntermediaryApi.class));
         var element = commonTestData.getAutomationCompositionElement();
         assertThrows(A1PolicyServiceException.class, () -> automationCompositionElementHandler
                 .deploy(commonTestData.getAutomationCompositionId(), element, Map.of()));
     }
+
+    @Test
+    void testLock() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var automationCompositionId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        automationCompositionElementHandler.lock(automationCompositionId, elementId);
+
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId, elementId,
+                null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Test
+    void testUnlock() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var automationCompositionId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        automationCompositionElementHandler.unlock(automationCompositionId, elementId);
+
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId, elementId,
+                null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Test
+    void testUpdate() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var automationCompositionId = UUID.randomUUID();
+        var element = commonTestData.getAutomationCompositionElement();
+        automationCompositionElementHandler.update(automationCompositionId, element, Map.of());
+
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId,
+                element.getId(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Test
+    void testDelete() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var automationCompositionId = UUID.randomUUID();
+        var elementId = UUID.randomUUID();
+        automationCompositionElementHandler.delete(automationCompositionId, elementId);
+
+        verify(participantIntermediaryApi).updateAutomationCompositionElementState(automationCompositionId, elementId,
+                DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Test
+    void testPrime() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var compositionId = UUID.randomUUID();
+        automationCompositionElementHandler.prime(compositionId, List.of());
+
+        verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED,
+                StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Test
+    void testDeprime() throws PfModelException {
+        var automationCompositionElementHandler = new AutomationCompositionElementHandler(acA1PmsClient);
+        var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+        automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+        var compositionId = UUID.randomUUID();
+        automationCompositionElementHandler.deprime(compositionId);
+
+        verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
+                StateChangeResult.NO_ERROR, "Deprimed");
+    }
 }
index f5fb030..966aee9 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.policy.clamp.acm.participant.http.main.handler;
 import java.io.Closeable;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -41,7 +42,11 @@ import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationComposit
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
 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.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -78,7 +83,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
     @Override
     public void undeploy(UUID automationCompositionId, UUID automationCompositionElementId) {
         intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, automationCompositionElementId,
-                DeployState.UNDEPLOYED, null, "");
+                DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "");
     }
 
     /**
@@ -100,14 +105,15 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
                     .collect(Collectors.toList());
             if (failedResponseStatus.isEmpty()) {
                 intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                        DeployState.DEPLOYED, null, "Deployed");
+                        DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
             } else {
                 intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                        DeployState.UNDEPLOYED, null, "Error on Invoking the http request: " + failedResponseStatus);
+                        DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
+                        "Error on Invoking the http request: " + failedResponseStatus);
             }
         } catch (AutomationCompositionException e) {
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                    DeployState.UNDEPLOYED, null, e.getMessage());
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, e.getMessage());
         }
     }
 
@@ -149,6 +155,43 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
         }
     }
 
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
+                StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
+
     /**
      * Closes this stream and releases any system resources associated
      * with it. If the stream is already closed then invoking this
index b0e05d7..4dca5a5 100644 (file)
@@ -27,7 +27,9 @@ import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.participant.http.main.handler.AutomationCompositionElementHandler;
 import org.onap.policy.clamp.acm.participant.http.main.models.ConfigRequest;
@@ -35,7 +37,10 @@ import org.onap.policy.clamp.acm.participant.http.main.webclient.AcHttpClient;
 import org.onap.policy.clamp.acm.participant.http.utils.CommonTestData;
 import org.onap.policy.clamp.acm.participant.http.utils.ToscaUtils;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
+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.models.base.PfModelException;
 
 class AcElementHandlerTest {
@@ -56,7 +61,7 @@ class AcElementHandlerTest {
             automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
             automationCompositionElementHandler.undeploy(instanceId, acElementId);
             verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
-                    DeployState.UNDEPLOYED, null, "");
+                    DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "");
         }
     }
 
@@ -72,7 +77,8 @@ class AcElementHandlerTest {
             Map<String, Object> map = new HashMap<>();
             automationCompositionElementHandler.deploy(instanceId, element, map);
             verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
-                    DeployState.UNDEPLOYED, null, "Constraint violations in the config request");
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
+                    "Constraint violations in the config request");
         }
     }
 
@@ -89,7 +95,7 @@ class AcElementHandlerTest {
             map.put("httpHeaders", 1);
             automationCompositionElementHandler.deploy(instanceId, element, map);
             verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
-                    DeployState.UNDEPLOYED, null, "Error extracting ConfigRequest ");
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Error extracting ConfigRequest ");
         }
     }
 
@@ -108,7 +114,98 @@ class AcElementHandlerTest {
             automationCompositionElementHandler.deploy(instanceId, element, map);
             verify(acHttpClient).run(any(ConfigRequest.class), anyMap());
             verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
-                    DeployState.DEPLOYED, null, "Deployed");
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
+        }
+    }
+
+    @Test
+    void testUpdate() throws Exception {
+        var instanceId = commonTestData.getAutomationCompositionId();
+        var element = commonTestData.getAutomationCompositionElement();
+        var acElementId = element.getId();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+            automationCompositionElementHandler.update(instanceId, element, Map.of());
+            verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Update not supported");
+        }
+    }
+
+    @Test
+    void testLock() throws Exception {
+        var instanceId = commonTestData.getAutomationCompositionId();
+        var acElementId = UUID.randomUUID();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+            automationCompositionElementHandler.lock(instanceId, acElementId);
+            verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId, null,
+                    LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+        }
+    }
+
+    @Test
+    void testUnlock() throws Exception {
+        var instanceId = commonTestData.getAutomationCompositionId();
+        var acElementId = UUID.randomUUID();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+            automationCompositionElementHandler.unlock(instanceId, acElementId);
+            verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId, null,
+                    LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+        }
+    }
+
+    @Test
+    void testDelete() throws Exception {
+        var instanceId = commonTestData.getAutomationCompositionId();
+        var acElementId = UUID.randomUUID();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+            automationCompositionElementHandler.delete(instanceId, acElementId);
+            verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
+                    DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+        }
+    }
+
+    @Test
+    void testPrime() throws Exception {
+        var compositionId = UUID.randomUUID();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+
+            automationCompositionElementHandler.prime(compositionId, List.of());
+            verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED,
+                    StateChangeResult.NO_ERROR, "Primed");
+        }
+    }
+
+    @Test
+    void testDeprime() throws Exception {
+        var compositionId = UUID.randomUUID();
+
+        try (var automationCompositionElementHandler =
+                new AutomationCompositionElementHandler(mock(AcHttpClient.class))) {
+            var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
+            automationCompositionElementHandler.setIntermediaryApi(participantIntermediaryApi);
+
+            automationCompositionElementHandler.deprime(compositionId);
+            verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
+                    StateChangeResult.NO_ERROR, "Deprimed");
         }
     }
 }
index 6fdb16e..4d55657 100755 (executable)
@@ -24,6 +24,7 @@ import io.kubernetes.client.openapi.ApiException;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
@@ -45,7 +46,11 @@ import org.onap.policy.clamp.acm.participant.kserve.k8s.KserveClient;
 import org.onap.policy.clamp.acm.participant.kserve.models.ConfigurationEntity;
 import org.onap.policy.clamp.acm.participant.kserve.models.KserveInferenceEntity;
 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.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -75,7 +80,6 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
     @Getter(AccessLevel.PACKAGE)
     private final Map<UUID, ConfigurationEntity> configRequestMap = new HashMap<>();
 
-
     private static class ThreadConfig {
 
         private int uninitializedToPassiveTimeout = 60;
@@ -93,7 +97,8 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
                 }
                 configRequestMap.remove(automationCompositionElementId);
                 intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                        automationCompositionElementId, DeployState.UNDEPLOYED, null, "Undeployed");
+                        automationCompositionElementId, DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                        "Undeployed");
             } catch (IOException | ApiException exception) {
                 LOGGER.warn("Deletion of Inference service failed", exception);
             }
@@ -130,7 +135,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
                 if (isAllInferenceSvcDeployed) {
                     configRequestMap.put(element.getId(), configurationEntity);
                     intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                            DeployState.DEPLOYED, null, "Deployed");
+                            DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
                 } else {
                     LOGGER.error("Inference Service deployment failed");
                 }
@@ -152,19 +157,55 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
      * Check the status of Inference Service.
      *
      * @param inferenceServiceName name of the inference service
-     * @param namespace            kubernetes namespace
-     * @param timeout              Inference service time check
-     * @param statusCheckInterval  Status check time interval
+     * @param namespace kubernetes namespace
+     * @param timeout Inference service time check
+     * @param statusCheckInterval Status check time interval
      * @return status of the inference service
-     * @throws ExecutionException   Exception on execution
+     * @throws ExecutionException Exception on execution
      * @throws InterruptedException Exception on inference service status check
      */
     public boolean checkInferenceServiceStatus(String inferenceServiceName, String namespace, int timeout,
             int statusCheckInterval) throws ExecutionException, InterruptedException {
         // Invoke runnable thread to check pod status
-        Future<String> result = executor.submit(
-                new InferenceServiceValidator(inferenceServiceName, namespace, timeout, statusCheckInterval,
-                        kserveClient), "Done");
+        Future<String> result = executor.submit(new InferenceServiceValidator(inferenceServiceName, namespace, timeout,
+                statusCheckInterval, kserveClient), "Done");
         return (!result.get().isEmpty()) && result.isDone();
     }
+
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
+                StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
 }
index 63ad3ef..38db1b8 100755 (executable)
@@ -31,6 +31,8 @@ import static org.mockito.Mockito.mock;
 
 import io.kubernetes.client.openapi.ApiException;
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -83,8 +85,8 @@ class AcElementHandlerTest {
     @BeforeEach
     void startMocks() throws ExecutionException, InterruptedException, IOException, ApiException {
         doReturn(true).when(kserveClient).deployInferenceService(any(), any());
-        doReturn(true).when(automationCompositionElementHandler)
-                .checkInferenceServiceStatus(any(), any(), anyInt(), anyInt());
+        doReturn(true).when(automationCompositionElementHandler).checkInferenceServiceStatus(any(), any(), anyInt(),
+                anyInt());
     }
 
     @Test
@@ -93,7 +95,6 @@ class AcElementHandlerTest {
         var element = commonTestData.getAutomationCompositionElement();
         var automationCompositionElementId = element.getId();
 
-
         var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
         automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(), element,
                 nodeTemplatesMap.get(KSERVE_AUTOMATION_COMPOSITION_ELEMENT).getProperties());
@@ -108,11 +109,9 @@ class AcElementHandlerTest {
         var element = commonTestData.getAutomationCompositionElement();
 
         var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
-        assertDoesNotThrow(
-                () -> automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(), element,
-                        nodeTemplatesMap.get(KSERVE_AUTOMATION_COMPOSITION_ELEMENT).getProperties()));
-        assertThat(automationCompositionElementHandler.getConfigRequestMap()).hasSize(1)
-                .containsKey(element.getId());
+        assertDoesNotThrow(() -> automationCompositionElementHandler.deploy(commonTestData.getAutomationCompositionId(),
+                element, nodeTemplatesMap.get(KSERVE_AUTOMATION_COMPOSITION_ELEMENT).getProperties()));
+        assertThat(automationCompositionElementHandler.getConfigRequestMap()).hasSize(1).containsKey(element.getId());
 
         doThrow(new ApiException("Error installing the inference service")).when(kserveClient)
                 .deployInferenceService(any(), any());
@@ -131,8 +130,40 @@ class AcElementHandlerTest {
         doReturn(result).when(executor).submit(any(Runnable.class), any());
         doReturn("Done").when(result).get();
         doReturn(true).when(result).isDone();
+        assertDoesNotThrow(() -> automationCompositionElementHandler.checkInferenceServiceStatus("sklearn-iris",
+                "kserve-test", 1, 1));
+    }
+
+    @Test
+    void testUpdate() throws PfModelException {
+        var automationCompositionId = commonTestData.getAutomationCompositionId();
+        var element = commonTestData.getAutomationCompositionElement();
         assertDoesNotThrow(
-                () -> automationCompositionElementHandler.checkInferenceServiceStatus("sklearn-iris", "kserve-test", 1,
-                        1));
+                () -> automationCompositionElementHandler.update(automationCompositionId, element, Map.of()));
+    }
+
+    @Test
+    void testLock() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.lock(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testUnlock() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.unlock(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testDelete() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.delete(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testPrime() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.prime(UUID.randomUUID(), List.of()));
+    }
+
+    @Test
+    void testDeprime() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.deprime(UUID.randomUUID()));
     }
 }
index 2f1abe1..95ff1e8 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.policy.clamp.acm.participant.kubernetes.handler;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -40,7 +41,11 @@ import org.onap.policy.clamp.acm.participant.kubernetes.helm.PodStatusValidator;
 import org.onap.policy.clamp.acm.participant.kubernetes.models.ChartInfo;
 import org.onap.policy.clamp.acm.participant.kubernetes.service.ChartService;
 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.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -93,7 +98,8 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
             try {
                 chartService.uninstallChart(chart);
                 intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                        automationCompositionElementId, DeployState.UNDEPLOYED, null, "Undeployed");
+                        automationCompositionElementId, DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                        "Undeployed");
                 chartMap.remove(automationCompositionElementId);
                 podStatusMap.remove(chart.getReleaseName());
             } catch (ServiceException se) {
@@ -148,7 +154,44 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
         if (!result.get().isEmpty()) {
             LOGGER.info("Pod Status Validator Completed: {}", result.isDone());
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, elementId,
-                    DeployState.DEPLOYED, null, "Deployed");
+                    DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
         }
     }
+
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
+                StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
 }
index ee0039c..d9702ab 100644 (file)
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.doThrow;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -157,4 +158,41 @@ class AutomationCompositionElementHandlerTest {
             () -> automationCompositionElementHandler.checkPodStatus(automationCompositionId,
                     element.getId(), chartInfo, 1, 1));
     }
+
+    @Test
+    void testUpdate() throws PfModelException {
+        var elementId1 = UUID.randomUUID();
+        var element = new AcElementDeploy();
+        element.setId(elementId1);
+        element.setDefinition(new ToscaConceptIdentifier(KEY_NAME, "1.0.1"));
+        element.setOrderedState(DeployOrder.DEPLOY);
+        var automationCompositionId = commonTestData.getAutomationCompositionId();
+        assertDoesNotThrow(
+                () -> automationCompositionElementHandler.update(automationCompositionId, element, Map.of()));
+    }
+
+    @Test
+    void testLock() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.lock(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testUnlock() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.unlock(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testDelete() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.delete(UUID.randomUUID(), UUID.randomUUID()));
+    }
+
+    @Test
+    void testPrime() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.prime(UUID.randomUUID(), List.of()));
+    }
+
+    @Test
+    void testDeprime() throws PfModelException {
+        assertDoesNotThrow(() -> automationCompositionElementHandler.deprime(UUID.randomUUID()));
+    }
 }
index 5eb997e..0b8ffe2 100644 (file)
 package org.onap.policy.clamp.acm.participant.policy.main.handler;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 import javax.ws.rs.core.Response.Status;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
@@ -36,7 +36,11 @@ import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantInterme
 import org.onap.policy.clamp.acm.participant.policy.client.PolicyApiHttpClient;
 import org.onap.policy.clamp.acm.participant.policy.client.PolicyPapHttpClient;
 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.models.base.PfModelException;
 import org.onap.policy.models.pdp.concepts.DeploymentSubGroup;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
@@ -54,7 +58,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionElementHandler.class);
 
-    private final Map<UUID, ToscaServiceTemplate> serviceTemplateMap = new LinkedHashMap<>();
+    private final Map<UUID, ToscaServiceTemplate> serviceTemplateMap = new ConcurrentHashMap<>();
 
     private final PolicyApiHttpClient apiHttpClient;
     private final PolicyPapHttpClient papHttpClient;
@@ -74,7 +78,8 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
         if (automationCompositionDefinition == null) {
             LOGGER.debug("No policies to undeploy to {}", automationCompositionElementId);
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                    automationCompositionElementId, DeployState.UNDEPLOYED, null, "Undeployed");
+                    automationCompositionElementId, DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR,
+                    "Undeployed");
             return;
         }
         var policyList = getPolicyList(automationCompositionDefinition);
@@ -82,8 +87,8 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
         var policyTypeList = getPolicyTypeList(automationCompositionDefinition);
         deletePolicyData(policyTypeList, policyList);
         serviceTemplateMap.remove(automationCompositionElementId);
-        intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                automationCompositionElementId, DeployState.UNDEPLOYED, null, "Undeployed");
+        intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, automationCompositionElementId,
+                DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
     }
 
     private void deletePolicyData(List<ToscaConceptIdentifier> policyTypeList,
@@ -119,7 +124,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
             intermediaryApi.sendAcElementInfo(automationCompositionId, automationCompositionElementId, "IDLE",
                     "ENABLED", Map.of());
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId,
-                    automationCompositionElementId, DeployState.DEPLOYED, null, "Deployed");
+                    automationCompositionElementId, DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
         } else {
             throw new PfModelException(Status.BAD_REQUEST, "Deploy of Policy failed.");
         }
@@ -155,7 +160,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
         var automationCompositionDefinition = element.getToscaServiceTemplateFragment();
         if (automationCompositionDefinition.getToscaTopologyTemplate() == null) {
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                    DeployState.UNDEPLOYED, null, "ToscaTopologyTemplate not defined");
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "ToscaTopologyTemplate not defined");
             return;
         }
         serviceTemplateMap.put(element.getId(), automationCompositionDefinition);
@@ -177,7 +182,7 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
             deployPolicies(policyList, automationCompositionId, element.getId());
         } else {
             intermediaryApi.updateAutomationCompositionElementState(automationCompositionId, element.getId(),
-                    DeployState.UNDEPLOYED, null,
+                    DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
                     "Creation of PolicyTypes/Policies failed. Policies will not be deployed.");
         }
     }
@@ -205,4 +210,41 @@ public class AutomationCompositionElementHandler implements AutomationCompositio
 
         return policyList;
     }
+
+    @Override
+    public void lock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
+                StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Override
+    public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
+                StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Override
+    public void delete(UUID instanceId, UUID elementId) throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
+                StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Override
+    public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+        intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
+                StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+        intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
 }
index 4cf5a58..ec55c17 100644 (file)
@@ -35,7 +35,10 @@ import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantInterme
 import org.onap.policy.clamp.acm.participant.policy.client.PolicyApiHttpClient;
 import org.onap.policy.clamp.acm.participant.policy.client.PolicyPapHttpClient;
 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.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.messages.rest.instantiation.DeployOrder;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
@@ -61,7 +64,7 @@ class AutomationCompositionElementHandlerTest {
 
         handler.undeploy(AC_ID, automationCompositionElementId);
         verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
-                DeployState.UNDEPLOYED, null, "Undeployed");
+                DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
     }
 
     private AcElementDeploy getTestingAcElement() {
@@ -93,11 +96,11 @@ class AutomationCompositionElementHandlerTest {
 
         handler.deploy(AC_ID, getTestingAcElement(), Map.of());
         verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
-                DeployState.DEPLOYED, null, "Deployed");
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
 
         handler.undeploy(AC_ID, automationCompositionElementId);
         verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
-                DeployState.UNDEPLOYED, null, "Undeployed");
+                DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
     }
 
     @Test
@@ -111,7 +114,7 @@ class AutomationCompositionElementHandlerTest {
         acElement.getToscaServiceTemplateFragment().setToscaTopologyTemplate(null);
         handler.deploy(AC_ID, acElement, Map.of());
         verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
-                DeployState.UNDEPLOYED, null, "ToscaTopologyTemplate not defined");
+                DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "ToscaTopologyTemplate not defined");
     }
 
     @Test
@@ -131,7 +134,7 @@ class AutomationCompositionElementHandlerTest {
         // Mock failure in policy type creation
         handler.deploy(AC_ID, element, Map.of());
         verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
-                DeployState.UNDEPLOYED, null,
+                DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
                 "Creation of PolicyTypes/Policies failed. Policies will not be deployed.");
     }
 
@@ -151,4 +154,77 @@ class AutomationCompositionElementHandlerTest {
         assertThatThrownBy(() -> handler.deploy(AC_ID, element, Map.of()))
                 .hasMessageMatching("Deploy of Policy failed.");
     }
+
+    @Test
+    void testUpdate() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        var acElement = getTestingAcElement();
+        acElement.getToscaServiceTemplateFragment().setToscaTopologyTemplate(null);
+        handler.update(AC_ID, acElement, Map.of());
+        verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
+                DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Update not supported");
+    }
+
+    @Test
+    void testLock() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        handler.lock(AC_ID, automationCompositionElementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId, null,
+                LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
+    }
+
+    @Test
+    void testUnlock() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        handler.unlock(AC_ID, automationCompositionElementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId, null,
+                LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
+    }
+
+    @Test
+    void testDelete() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        handler.delete(AC_ID, automationCompositionElementId);
+        verify(intermediaryApi).updateAutomationCompositionElementState(AC_ID, automationCompositionElementId,
+                DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
+    }
+
+    @Test
+    void testPrime() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        handler.prime(AC_ID, List.of());
+        verify(intermediaryApi).updateCompositionState(AC_ID, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
+    }
+
+    @Test
+    void testDeprime() throws Exception {
+        var handler = new AutomationCompositionElementHandler(mock(PolicyApiHttpClient.class),
+                mock(PolicyPapHttpClient.class));
+        var intermediaryApi = mock(ParticipantIntermediaryApi.class);
+        handler.setIntermediaryApi(intermediaryApi);
+
+        handler.deprime(AC_ID);
+        verify(intermediaryApi).updateCompositionState(AC_ID, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
+                "Deprimed");
+    }
 }
index c8fd91d..6ca4d3c 100644 (file)
 
 package org.onap.policy.clamp.acm.participant.intermediary.api;
 
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
 import org.onap.policy.models.base.PfModelException;
 
 /**
@@ -48,23 +50,17 @@ public interface AutomationCompositionElementListener {
     public void deploy(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties)
             throws PfModelException;
 
-    public default void lock(UUID automationCompositionId, UUID automationCompositionElementId)
-            throws PfModelException {
-        // default Lock Operation
-    }
+    public void lock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException;
 
-    public default void unlock(UUID automationCompositionId, UUID automationCompositionElementId)
-            throws PfModelException {
-        // default Unlock Operation
-    }
+    public void unlock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException;
 
-    public default void delete(UUID automationCompositionId, UUID automationCompositionElementId)
-            throws PfModelException {
-        // default Delete Operation
-    }
+    public void delete(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException;
 
-    public default void update(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties)
-            throws PfModelException {
-        // default update Operation
-    }
+    public void update(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException;
+
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException;
+
+    public void deprime(UUID compositionId) throws PfModelException;
 }
index 550ac37..1677f54 100644 (file)
@@ -23,9 +23,11 @@ package org.onap.policy.clamp.acm.participant.intermediary.api;
 
 import java.util.Map;
 import java.util.UUID;
+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.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 
 /**
  * This interface is used by participant implementations to use the participant intermediary.
@@ -47,10 +49,11 @@ public interface ParticipantIntermediaryApi {
      * @param id the ID of the automation composition element to update the state on
      * @param deployState the Deploy State of the automation composition element
      * @param lockState the Lock State of the automation composition element
+     * @param stateChangeResult the indicator if error occurs
      * @param message the message
      */
     void updateAutomationCompositionElementState(UUID automationCompositionId, UUID id, DeployState deployState,
-            LockState lockState, String message);
+            LockState lockState, StateChangeResult stateChangeResult, String message);
 
     /**
      * Get AutomationCompositions.
@@ -70,4 +73,7 @@ public interface ParticipantIntermediaryApi {
      */
     void sendAcElementInfo(UUID automationCompositionId, UUID id, String useState, String operationalState,
             Map<String, Object> outProperties);
+
+    void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult,
+            String message);
 }
index 1bc3e5e..14a6531 100644 (file)
@@ -26,9 +26,11 @@ import java.util.UUID;
 import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionHandler;
+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.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.models.base.PfUtils;
 import org.springframework.stereotype.Component;
 
@@ -57,9 +59,9 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp
     }
 
     @Override
-    public void updateAutomationCompositionElementState(UUID automationCompositionId, UUID id, DeployState newState,
-            LockState lockState, String message) {
-        automationCompositionHandler.updateAutomationCompositionElementState(automationCompositionId, id, newState,
+    public void updateAutomationCompositionElementState(UUID automationCompositionId, UUID id, DeployState deployState,
+            LockState lockState, StateChangeResult stateChangeResult, String message) {
+        automationCompositionHandler.updateAutomationCompositionElementState(automationCompositionId, id, deployState,
                 lockState, message);
     }
 
@@ -74,4 +76,10 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp
     public Map<UUID, AutomationComposition> getAutomationCompositions() {
         return PfUtils.mapMap(automationCompositionHandler.getAutomationCompositionMap(), AutomationComposition::new);
     }
+
+    @Override
+    public void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult,
+            String message) {
+        // Auto-generated method stub
+    }
 }
index 514bc65..0456777 100644 (file)
@@ -137,6 +137,10 @@ public class AutomationCompositionHandler {
             if (checkOpt.isEmpty()) {
                 automationComposition.setDeployState(deployState);
                 automationComposition.setLockState(element.getLockState());
+
+                if (DeployState.DELETED.equals(deployState)) {
+                    automationCompositionMap.remove(automationComposition.getInstanceId());
+                }
             }
         }
         if (lockState != null) {
@@ -272,7 +276,7 @@ public class AutomationCompositionHandler {
      * @param acElementDefinitions the list of AutomationCompositionElementDefinition
      */
     public void handleAcPropertyUpdate(PropertiesUpdate updateMsg,
-                                       List<AutomationCompositionElementDefinition> acElementDefinitions) {
+            List<AutomationCompositionElementDefinition> acElementDefinitions) {
 
         if (updateMsg.getParticipantUpdatesList().isEmpty()) {
             LOGGER.warn("No AutomationCompositionElement updates in message {}",
@@ -283,8 +287,8 @@ public class AutomationCompositionHandler {
         for (var participantDeploy : updateMsg.getParticipantUpdatesList()) {
             if (participantId.equals(participantDeploy.getParticipantId())) {
 
-                initializeDeploy(updateMsg.getMessageId(), updateMsg.getAutomationCompositionId(),
-                            participantDeploy, DeployState.UPDATING);
+                initializeDeploy(updateMsg.getMessageId(), updateMsg.getAutomationCompositionId(), participantDeploy,
+                        DeployState.UPDATING);
 
                 callParticipantUpdateProperty(participantDeploy.getAcElementList(), acElementDefinitions,
                         updateMsg.getAutomationCompositionId());
@@ -320,7 +324,7 @@ public class AutomationCompositionHandler {
     }
 
     private void initializeDeploy(UUID messageId, UUID instanceId, ParticipantDeploy participantDeploy,
-                                  DeployState deployState) {
+            DeployState deployState) {
         if (automationCompositionMap.containsKey(instanceId)) {
             updateExistingElementsOnThisParticipant(instanceId, participantDeploy, deployState);
         } else {
@@ -333,12 +337,11 @@ public class AutomationCompositionHandler {
     }
 
     private void callParticipantDeploy(List<AcElementDeploy> acElements,
-                                       List<AutomationCompositionElementDefinition> acElementDefinitions,
-                                       Integer startPhaseMsg, UUID automationCompositionId) {
+            List<AutomationCompositionElementDefinition> acElementDefinitions, Integer startPhaseMsg,
+            UUID automationCompositionId) {
         try {
             for (var element : acElements) {
-                var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions,
-                        element.getDefinition());
+                var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions, element.getDefinition());
                 if (acElementNodeTemplate != null) {
                     int startPhase = ParticipantUtils.findStartPhase(acElementNodeTemplate.getProperties());
                     if (startPhaseMsg.equals(startPhase)) {
@@ -357,12 +360,10 @@ public class AutomationCompositionHandler {
     }
 
     private void callParticipantUpdateProperty(List<AcElementDeploy> acElements,
-                                       List<AutomationCompositionElementDefinition> acElementDefinitions,
-                                       UUID automationCompositionId) {
+            List<AutomationCompositionElementDefinition> acElementDefinitions, UUID automationCompositionId) {
         try {
             for (var element : acElements) {
-                var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions,
-                        element.getDefinition());
+                var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions, element.getDefinition());
                 if (acElementNodeTemplate != null) {
                     for (var acElementListener : listeners) {
                         var map = new HashMap<>(acElementNodeTemplate.getProperties());
@@ -389,7 +390,7 @@ public class AutomationCompositionHandler {
     }
 
     private List<AutomationCompositionElement> storeElementsOnThisParticipant(ParticipantDeploy participantDeploy,
-                                                                              DeployState deployState) {
+            DeployState deployState) {
         List<AutomationCompositionElement> acElementList = new ArrayList<>();
         for (var element : participantDeploy.getAcElementList()) {
             var acElement = new AutomationCompositionElement();
@@ -403,8 +404,8 @@ public class AutomationCompositionHandler {
         return acElementList;
     }
 
-    private void updateExistingElementsOnThisParticipant(
-            UUID instanceId, ParticipantDeploy participantDeploy, DeployState deployState) {
+    private void updateExistingElementsOnThisParticipant(UUID instanceId, ParticipantDeploy participantDeploy,
+            DeployState deployState) {
 
         Map<UUID, AutomationCompositionElement> elementList = automationCompositionMap.get(instanceId).getElements();
         for (var element : participantDeploy.getAcElementList()) {
@@ -443,12 +444,6 @@ public class AutomationCompositionHandler {
         automationComposition.getElements().values().stream()
                 .forEach(acElement -> automationCompositionElementDelete(automationComposition.getInstanceId(),
                         acElement, startPhaseMsg, acElementDefinitions));
-
-        boolean isAllUninitialised = automationComposition.getElements().values().stream()
-                .filter(element -> !DeployState.DELETED.equals(element.getDeployState())).findAny().isEmpty();
-        if (isAllUninitialised) {
-            automationCompositionMap.remove(automationComposition.getInstanceId());
-        }
     }
 
     /**
@@ -488,8 +483,6 @@ public class AutomationCompositionHandler {
                 for (var acElementListener : listeners) {
                     try {
                         acElementListener.lock(instanceId, acElement.getId());
-                        updateAutomationCompositionElementState(instanceId, acElement.getId(), null, LockState.LOCKED,
-                                "Locked");
                     } catch (PfModelException e) {
                         LOGGER.error("Automation composition element lock failed {}", instanceId);
                     }
@@ -507,8 +500,6 @@ public class AutomationCompositionHandler {
                 for (var acElementListener : listeners) {
                     try {
                         acElementListener.unlock(instanceId, acElement.getId());
-                        updateAutomationCompositionElementState(instanceId, acElement.getId(), null, LockState.UNLOCKED,
-                                "Unlocked");
                     } catch (PfModelException e) {
                         LOGGER.error("Automation composition element unlock failed {}", instanceId);
                     }
@@ -537,8 +528,6 @@ public class AutomationCompositionHandler {
                 for (var acElementListener : listeners) {
                     try {
                         acElementListener.delete(instanceId, acElement.getId());
-                        updateAutomationCompositionElementState(instanceId, acElement.getId(), DeployState.DELETED,
-                                null, "Deleted");
                     } catch (PfModelException e) {
                         LOGGER.error("Automation composition element unlock failed {}", instanceId);
                     }
index aa39f5a..8f70bc7 100644 (file)
@@ -30,6 +30,7 @@ import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationComposit
 import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionHandler;
 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.common.utils.coder.CoderException;
 
 class ParticipantIntermediaryApiImplTest {
@@ -50,7 +51,7 @@ class ParticipantIntermediaryApiImplTest {
         var uuid = UUID.randomUUID();
         var automationCompositionId = UUID.randomUUID();
         apiImpl.updateAutomationCompositionElementState(automationCompositionId, uuid, DeployState.UNDEPLOYED,
-                LockState.NONE, null);
+                LockState.NONE, StateChangeResult.NO_ERROR, null);
         verify(automationComposiitonHandler).updateAutomationCompositionElementState(automationCompositionId, uuid,
                 DeployState.UNDEPLOYED, LockState.NONE, null);
 
index b88ea03..0a724ed 100644 (file)
 
 package org.onap.policy.clamp.acm.participant.intermediary.handler;
 
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener;
 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
 import org.onap.policy.models.base.PfModelException;
 
 public class DummyAcElementListener implements AutomationCompositionElementListener {
@@ -37,4 +39,30 @@ public class DummyAcElementListener implements AutomationCompositionElementListe
         throws PfModelException {
 
     }
+
+    @Override
+    public void lock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException {
+    }
+
+    @Override
+    public void unlock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException {
+    }
+
+    @Override
+    public void delete(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException {
+    }
+
+    @Override
+    public void update(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties)
+            throws PfModelException {
+    }
+
+    @Override
+    public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
+            throws PfModelException {
+    }
+
+    @Override
+    public void deprime(UUID compositionId) throws PfModelException {
+    }
 }