Handle timeout as hard timeout 41/139041/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Wed, 25 Sep 2024 16:04:00 +0000 (17:04 +0100)
committerFrancesco Fiora <francesco.fiora@est.tech>
Mon, 30 Sep 2024 09:43:38 +0000 (09:43 +0000)
Issue-ID: POLICY-5132
Change-Id: Ic78d346972e955f7700118ffa74be11643a885f0
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
models/src/main/java/org/onap/policy/clamp/models/acm/concepts/ParticipantRestartAc.java
models/src/main/java/org/onap/policy/clamp/models/acm/messages/kafka/participant/ParticipantSync.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AcDefinitionHandler.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/CacheProvider.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java
participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AcDefinitionHandlerTest.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java

index 3312752..5d4b8ac 100644 (file)
@@ -39,6 +39,7 @@ public class ParticipantRestartAc {
 
     private DeployState deployState;
     private LockState lockState;
+    private StateChangeResult stateChangeResult;
 
     private List<AcElementRestart> acElementList = new ArrayList<>();
 
@@ -51,6 +52,7 @@ public class ParticipantRestartAc {
         this.automationCompositionId = copyConstructor.automationCompositionId;
         this.deployState = copyConstructor.deployState;
         this.lockState = copyConstructor.lockState;
+        this.stateChangeResult = copyConstructor.stateChangeResult;
         this.acElementList = PfUtils.mapList(copyConstructor.acElementList, AcElementRestart::new);
     }
 }
index 85b715b..2780a5b 100644 (file)
@@ -31,6 +31,7 @@ import lombok.ToString;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.models.base.PfUtils;
 
 @Getter
@@ -50,6 +51,7 @@ public class ParticipantSync extends ParticipantMessage {
     private Set<UUID> excludeReplicas = new HashSet<>();
     private boolean restarting = false;
     private boolean delete = false;
+    private StateChangeResult stateChangeResult;
 
     /**
      * Constructor.
@@ -72,5 +74,6 @@ public class ParticipantSync extends ParticipantMessage {
         this.excludeReplicas = new HashSet<>(source.excludeReplicas);
         this.restarting = source.restarting;
         this.delete = source.delete;
+        this.stateChangeResult = source.getStateChangeResult();
     }
 }
index b38df51..9e3efce 100644 (file)
@@ -114,16 +114,15 @@ public class AcDefinitionHandler {
     public void handleParticipantSync(ParticipantSync participantSyncMsg) {
 
         if (participantSyncMsg.isDelete()) {
-            if (AcTypeState.COMMISSIONED.equals(participantSyncMsg.getState())) {
-                cacheProvider.removeElementDefinition(participantSyncMsg.getCompositionId());
-            }
-            for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
-                cacheProvider.removeAutomationComposition(automationcomposition.getAutomationCompositionId());
-            }
+            deleteScenario(participantSyncMsg);
             return;
         }
 
         if (!participantSyncMsg.getParticipantDefinitionUpdates().isEmpty()) {
+            if (StateChangeResult.TIMEOUT.equals(participantSyncMsg.getStateChangeResult())) {
+                listener.cleanExecution(participantSyncMsg.getCompositionId(), participantSyncMsg.getMessageId());
+            }
+
             List<AutomationCompositionElementDefinition> list = new ArrayList<>();
             for (var participantDefinition : participantSyncMsg.getParticipantDefinitionUpdates()) {
                 list.addAll(participantDefinition.getAutomationCompositionElementDefinitionList());
@@ -134,6 +133,20 @@ public class AcDefinitionHandler {
         for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
             cacheProvider
                     .initializeAutomationComposition(participantSyncMsg.getCompositionId(), automationcomposition);
+            if (StateChangeResult.TIMEOUT.equals(automationcomposition.getStateChangeResult())) {
+                for (var element : automationcomposition.getAcElementList()) {
+                    listener.cleanExecution(element.getId(), participantSyncMsg.getMessageId());
+                }
+            }
+        }
+    }
+
+    private void deleteScenario(ParticipantSync participantSyncMsg) {
+        if (AcTypeState.COMMISSIONED.equals(participantSyncMsg.getState())) {
+            cacheProvider.removeElementDefinition(participantSyncMsg.getCompositionId());
+        }
+        for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
+            cacheProvider.removeAutomationComposition(automationcomposition.getAutomationCompositionId());
         }
     }
 }
index 65ad627..3837ec6 100644 (file)
@@ -243,6 +243,7 @@ public class CacheProvider {
         automationComposition.setLockState(participantRestartAc.getLockState());
         automationComposition.setInstanceId(participantRestartAc.getAutomationCompositionId());
         automationComposition.setElements(acElementMap);
+        automationComposition.setStateChangeResult(participantRestartAc.getStateChangeResult());
         automationCompositions.put(automationComposition.getInstanceId(), automationComposition);
     }
 
index 9a43bf4..c422b22 100644 (file)
@@ -218,7 +218,13 @@ public class ThreadHandler implements Closeable {
         executionMap.remove(instanceElement.elementId());
     }
 
-    private void cleanExecution(UUID execIdentificationId, UUID messageId) {
+    /**
+     * Clean Execution.
+     *
+     * @param execIdentificationId the identification Id
+     * @param messageId the messageId
+     */
+    public void cleanExecution(UUID execIdentificationId, UUID messageId) {
         var process = executionMap.get(execIdentificationId);
         if (process != null) {
             if (!process.isDone()) {
index c6259a2..d72f5de 100644 (file)
@@ -35,6 +35,7 @@ import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessag
 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrime;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantSync;
@@ -109,6 +110,28 @@ class AcDefinitionHandlerTest {
         verify(cacheProvider).addElementDefinition(any(), any());
     }
 
+    @Test
+    void syncCompositionDefinitionTimeout() {
+        var participantSyncMsg = new ParticipantSync();
+        participantSyncMsg.setState(AcTypeState.PRIMED);
+        participantSyncMsg.setStateChangeResult(StateChangeResult.TIMEOUT);
+        participantSyncMsg.setCompositionId(UUID.randomUUID());
+        participantSyncMsg.getParticipantDefinitionUpdates().add(createParticipantDefinition());
+        var participantRestartAc = CommonTestData.createParticipantRestartAc();
+        participantRestartAc.setStateChangeResult(StateChangeResult.TIMEOUT);
+        participantSyncMsg.setAutomationcompositionList(List.of(participantRestartAc));
+
+        var cacheProvider = mock(CacheProvider.class);
+        var listener = mock(ThreadHandler.class);
+        var ach = new AcDefinitionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), listener);
+        ach.handleParticipantSync(participantSyncMsg);
+        verify(cacheProvider).initializeAutomationComposition(any(UUID.class), any());
+        verify(cacheProvider).addElementDefinition(any(), any());
+        verify(listener).cleanExecution(participantSyncMsg.getCompositionId(), participantSyncMsg.getMessageId());
+        var elementId = participantRestartAc.getAcElementList().get(0).getId();
+        verify(listener).cleanExecution(elementId, participantSyncMsg.getMessageId());
+    }
+
     @Test
     void syncDeleteTest() {
         var participantSyncMsg = new ParticipantSync();
index c4cebb4..db67e5e 100644 (file)
@@ -198,7 +198,7 @@ public class SupervisionScanner {
             if (nextSpNotCompleted != automationComposition.getPhase()) {
                 sendAutomationCompositionMsg(automationComposition, serviceTemplate, nextSpNotCompleted);
             } else {
-                handleTimeout(automationComposition);
+                handleTimeout(automationComposition, serviceTemplate);
             }
         }
     }
@@ -217,7 +217,7 @@ public class SupervisionScanner {
         if (completed) {
             complete(automationComposition, serviceTemplate);
         } else {
-            handleTimeout(automationComposition);
+            handleTimeout(automationComposition, serviceTemplate);
         }
     }
 
@@ -250,11 +250,11 @@ public class SupervisionScanner {
                     automationComposition.getDeployState(), automationComposition.getLockState());
 
             if (minStageNotCompleted != automationComposition.getPhase()) {
-                savePahese(automationComposition, minStageNotCompleted);
+                savePhase(automationComposition, minStageNotCompleted);
                 LOGGER.debug("retry message AutomationCompositionMigration");
                 automationCompositionMigrationPublisher.send(automationComposition, minStageNotCompleted);
             } else {
-                handleTimeout(automationComposition);
+                handleTimeout(automationComposition, serviceTemplate);
             }
         }
     }
@@ -300,10 +300,12 @@ public class SupervisionScanner {
             acDefinition.setStateChangeResult(StateChangeResult.TIMEOUT);
             acDefinitionProvider.updateAcDefinitionState(acDefinition.getCompositionId(),
                 acDefinition.getState(), acDefinition.getStateChangeResult());
+            participantSyncPublisher.sendSync(acDefinition, null);
         }
     }
 
-    private void handleTimeout(AutomationComposition automationComposition) {
+    private void handleTimeout(AutomationComposition automationComposition,
+            ToscaServiceTemplate serviceTemplate) {
         LOGGER.debug("automation composition scan: transition from state {} to {} {} not completed",
                 automationComposition.getDeployState(), automationComposition.getLockState(),
                 automationComposition.getSubState());
@@ -318,10 +320,11 @@ public class SupervisionScanner {
             LOGGER.debug("Report timeout for the ac instance {}", automationComposition.getInstanceId());
             automationComposition.setStateChangeResult(StateChangeResult.TIMEOUT);
             automationCompositionProvider.updateAcState(automationComposition);
+            participantSyncPublisher.sendSync(serviceTemplate, automationComposition);
         }
     }
 
-    private void savePahese(AutomationComposition automationComposition, int startPhase) {
+    private void savePhase(AutomationComposition automationComposition, int startPhase) {
         automationComposition.setLastMsg(TimestampHelper.now());
         automationComposition.setPhase(startPhase);
         automationCompositionProvider.updateAcState(automationComposition);
@@ -329,7 +332,7 @@ public class SupervisionScanner {
 
     private void sendAutomationCompositionMsg(AutomationComposition automationComposition,
             ToscaServiceTemplate serviceTemplate, int startPhase) {
-        savePahese(automationComposition, startPhase);
+        savePhase(automationComposition, startPhase);
 
         if (DeployState.DEPLOYING.equals(automationComposition.getDeployState())) {
             LOGGER.debug("retry message AutomationCompositionDeploy");
index eb1db6f..d90b6f6 100644 (file)
@@ -101,6 +101,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher<Parti
             message.getExcludeReplicas().add(excludeReplicaId);
         }
         message.setState(acDefinition.getState());
+        message.setStateChangeResult(acDefinition.getStateChangeResult());
         message.setMessageId(UUID.randomUUID());
         message.setTimestamp(Instant.now());
         if (AcTypeState.COMMISSIONED.equals(acDefinition.getState())) {
@@ -131,6 +132,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher<Parti
         syncAc.setAutomationCompositionId(automationComposition.getInstanceId());
         syncAc.setDeployState(automationComposition.getDeployState());
         syncAc.setLockState(automationComposition.getLockState());
+        syncAc.setStateChangeResult(automationComposition.getStateChangeResult());
         if (DeployState.DELETED.equals(automationComposition.getDeployState())) {
             message.setDelete(true);
         } else {
index 5cefd5f..17cc8ad 100644 (file)
@@ -115,10 +115,11 @@ class SupervisionScannerTest {
     void testAcDefinitionPrimeTimeout() {
         var acDefinition = createAutomationCompositionDefinition(AcTypeState.PRIMING, StateChangeResult.NO_ERROR);
         var acDefinitionProvider = createAcDefinitionProvider(acDefinition);
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
         var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
         var supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider,
                 mock(AutomationCompositionStateChangePublisher.class), mock(AutomationCompositionDeployPublisher.class),
-                mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+                participantSyncPublisher, null, acRuntimeParameterGroup);
         supervisionScanner.run();
         // Ac Definition in Priming state
         verify(acDefinitionProvider, times(0)).updateAcDefinitionState(any(), any(), any());
@@ -126,25 +127,30 @@ class SupervisionScannerTest {
         acRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
         supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider,
                 mock(AutomationCompositionStateChangePublisher.class), mock(AutomationCompositionDeployPublisher.class),
-                mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+                participantSyncPublisher, null, acRuntimeParameterGroup);
         supervisionScanner.run();
         // set Timeout
         verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), acDefinition.getState(),
             StateChangeResult.TIMEOUT);
+        verify(participantSyncPublisher).sendSync(any(AutomationCompositionDefinition.class), any());
 
         clearInvocations(acDefinitionProvider);
+        clearInvocations(participantSyncPublisher);
         acDefinition.setStateChangeResult(StateChangeResult.TIMEOUT);
         supervisionScanner.run();
         // already in Timeout
         verify(acDefinitionProvider, times(0)).updateAcDefinitionState(any(), any(), any());
+        verify(participantSyncPublisher, times(0)).sendSync(acDefinition, null);
 
         clearInvocations(acDefinitionProvider);
+        clearInvocations(participantSyncPublisher);
         // retry by the user
         acDefinition.setStateChangeResult(StateChangeResult.NO_ERROR);
         supervisionScanner.run();
         // set Timeout
         verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), acDefinition.getState(),
             StateChangeResult.TIMEOUT);
+        verify(participantSyncPublisher).sendSync(any(AutomationCompositionDefinition.class), any());
 
         clearInvocations(acDefinitionProvider);
         for (var element : acDefinition.getElementStateMap().values()) {
@@ -263,31 +269,38 @@ class SupervisionScannerTest {
         when(automationCompositionProvider.updateAcState(any())).thenReturn(automationComposition);
         var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
         var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
+        var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
         var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
         acRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
 
         // verify timeout scenario
         var scannerObj2 = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(),
                 automationCompositionStateChangePublisher, automationCompositionDeployPublisher,
-                mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+                participantSyncPublisher, null, acRuntimeParameterGroup);
 
         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
         automationComposition.setLastMsg(TimestampHelper.now());
         scannerObj2.run();
-        verify(automationCompositionProvider, times(1)).updateAcState(any(AutomationComposition.class));
+        verify(automationCompositionProvider).updateAcState(any(AutomationComposition.class));
+        verify(participantSyncPublisher).sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
         assertEquals(StateChangeResult.TIMEOUT, automationComposition.getStateChangeResult());
 
         //already in TIMEOUT
         clearInvocations(automationCompositionProvider);
+        clearInvocations(participantSyncPublisher);
         scannerObj2.run();
         verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
+        verify(participantSyncPublisher, times(0))
+                .sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
 
         clearInvocations(automationCompositionProvider);
+        clearInvocations(participantSyncPublisher);
         for (Map.Entry<UUID, AutomationCompositionElement> entry : automationComposition.getElements().entrySet()) {
             entry.getValue().setDeployState(DeployState.DEPLOYED);
         }
         scannerObj2.run();
-        verify(automationCompositionProvider, times(1)).updateAcState(any(AutomationComposition.class));
+        verify(automationCompositionProvider).updateAcState(any(AutomationComposition.class));
+        verify(participantSyncPublisher).sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
         assertEquals(StateChangeResult.NO_ERROR, automationComposition.getStateChangeResult());
     }