Fix automatic sync up support in ACM-intermediary 31/141831/4
authorFrancescoFioraEst <francesco.fiora@est.tech>
Thu, 14 Aug 2025 10:41:13 +0000 (11:41 +0100)
committerFrancescoFioraEst <francesco.fiora@est.tech>
Thu, 14 Aug 2025 15:56:56 +0000 (16:56 +0100)
Issue-ID: POLICY-5419
Change-Id: I2c73f621f7f398ddda763c545b4da7967f9eb957
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AcDefinitionHandler.java
participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AcDefinitionHandlerTest.java

index d1ded25..e0f8cd3 100644 (file)
@@ -135,6 +135,8 @@ public class AcDefinitionHandler {
                 cacheProvider.addElementDefinition(participantSyncMsg.getCompositionId(), list,
                         participantSyncMsg.getRevisionIdComposition());
             }
+        } else if (participantSyncMsg.isRestarting()) {
+            checkComposition(participantSyncMsg);
         }
 
         for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
@@ -148,6 +150,19 @@ public class AcDefinitionHandler {
         }
     }
 
+    private void checkComposition(ParticipantSync participantSyncMsg) {
+        // edge case scenario in migration whit remove/add elements,
+        // when composition or target composition doesn't contain elements from this participant
+        for (var msg : cacheProvider.getMessagesOnHold().values()) {
+            if (participantSyncMsg.getCompositionId().equals(msg.getCompositionTargetId())) {
+                msg.setCompositionTargetId(null);
+            }
+            if (participantSyncMsg.getCompositionId().equals(msg.getCompositionId())) {
+                msg.setCompositionId(null);
+            }
+        }
+    }
+
     private void deleteScenario(ParticipantSync participantSyncMsg) {
         if (AcTypeState.COMMISSIONED.equals(participantSyncMsg.getState())) {
             cacheProvider.removeElementDefinition(participantSyncMsg.getCompositionId());
index 64883e6..1e47a0b 100644 (file)
@@ -33,6 +33,7 @@ import org.junit.jupiter.api.Test;
 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.AcDefinition;
+import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.AutomationCompositionMsg;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
@@ -161,4 +162,29 @@ class AcDefinitionHandlerTest {
         verify(cacheProvider).removeElementDefinition(participantSyncMsg.getCompositionId());
         verify(cacheProvider).removeAutomationComposition(restartAc.getAutomationCompositionId());
     }
+
+    @Test
+    void syncDeleteInMigrationTest() {
+        var participantSyncMsg = new ParticipantSync();
+        participantSyncMsg.setState(AcTypeState.PRIMED);
+        participantSyncMsg.setRestarting(true);
+        var compositionId = UUID.randomUUID();
+        participantSyncMsg.setCompositionId(compositionId);
+
+        AutomationCompositionMsg<?> acMsgComposition = mock(AutomationCompositionMsg.class);
+        when(acMsgComposition.getCompositionId()).thenReturn(compositionId);
+
+        AutomationCompositionMsg<?> acMsgCompositionTarget = mock(AutomationCompositionMsg.class);
+        acMsgCompositionTarget.setCompositionId(UUID.randomUUID());
+        when(acMsgCompositionTarget.getCompositionTargetId()).thenReturn(compositionId);
+
+        var cacheProvider = mock(CacheProvider.class);
+        when(cacheProvider.getMessagesOnHold())
+                .thenReturn(Map.of(UUID.randomUUID(), acMsgComposition, UUID.randomUUID(), acMsgCompositionTarget));
+        var ach = new AcDefinitionHandler(cacheProvider, mock(ParticipantMessagePublisher.class),
+                mock(ThreadHandler.class));
+        ach.handleParticipantSync(participantSyncMsg);
+        verify(acMsgComposition).setCompositionId(null);
+        verify(acMsgCompositionTarget).setCompositionTargetId(null);
+    }
 }