Add validation for composition de-priming 48/142248/1 master
authorwaynedunican <wayne.dunican@est.tech>
Tue, 7 Oct 2025 10:19:58 +0000 (11:19 +0100)
committerwaynedunican <wayne.dunican@est.tech>
Wed, 8 Oct 2025 12:40:21 +0000 (13:40 +0100)
If compositionId is referenced a targetCompositionId in the instance table, de-priming is not allowed

- Added this validation

Issue-ID: POLICY-5462
Change-Id: I96aa13362c791ec2f76d26aa69b482c95e3d5c7e
Signed-off-by: waynedunican <wayne.dunican@est.tech>
models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java
models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java
models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java
models/src/test/resources/providers/TestAutomationCompositions.json
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java

index 9937576..1b209d6 100644 (file)
@@ -144,6 +144,18 @@ public class AutomationCompositionProvider {
             .asEntityList(automationCompositionRepository.findByCompositionId(compositionId.toString()));
     }
 
             .asEntityList(automationCompositionRepository.findByCompositionId(compositionId.toString()));
     }
 
+    /**
+     * Get all automation compositions by targetCompositionId.
+     *
+     * @param targetCompositionId the target composition ID of the AC definition
+     * @return all automation compositions found
+     */
+    @Transactional(readOnly = true)
+    public List<AutomationComposition> getAcInstancesByTargetCompositionId(UUID targetCompositionId) {
+        return ProviderUtils.asEntityList(automationCompositionRepository
+            .findByCompositionTargetId(targetCompositionId.toString()));
+    }
+
     /**
      * Get all automation compositions in transition.
      *
     /**
      * Get all automation compositions in transition.
      *
index a4aaa58..ca474eb 100644 (file)
@@ -46,6 +46,8 @@ public interface AutomationCompositionRepository extends JpaRepository<JpaAutoma
 
     List<JpaAutomationComposition> findBySubStateIn(Collection<SubState> subStates);
 
 
     List<JpaAutomationComposition> findBySubStateIn(Collection<SubState> subStates);
 
+    List<JpaAutomationComposition> findByCompositionTargetId(String compositionTargetId);
+
     Page<JpaAutomationComposition> findByStateChangeResultInAndDeployStateIn(
             Collection<StateChangeResult> stateChangeResults, Collection<DeployState> deployStates,
             Pageable pageable);
     Page<JpaAutomationComposition> findByStateChangeResultInAndDeployStateIn(
             Collection<StateChangeResult> stateChangeResults, Collection<DeployState> deployStates,
             Pageable pageable);
index 4d35a0a..b375e64 100644 (file)
@@ -207,6 +207,20 @@ class AutomationCompositionProviderTest {
         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
     }
 
         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
     }
 
+    @Test
+    void testGetAcInstancesByTargetCompositionId() {
+        var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
+        var automationCompositionRepository = mock(AutomationCompositionRepository.class);
+        when(automationCompositionRepository.findByCompositionTargetId(any()))
+                .thenReturn(List.of(inputAutomationCompositionsJpa.get(0)));
+        var automationCompositionProvider = new AutomationCompositionProvider(
+                automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
+                mock(AutomationCompositionRollbackRepository.class));
+        var acList = automationCompositionProvider
+                .getAcInstancesByTargetCompositionId(automationComposition.getCompositionTargetId());
+        assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), acList.get(0));
+    }
+
     @Test
     void testGetAcInstancesInTransition() {
         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
     @Test
     void testGetAcInstancesInTransition() {
         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
index c75337b..59d174e 100644 (file)
@@ -3,6 +3,7 @@
         {
             "compositionId": "709c62b3-8918-41b9-a747-e21eb79c6c40",
             "instanceId": "809c62b3-8918-41b9-a748-e21eb79c6c89",
         {
             "compositionId": "709c62b3-8918-41b9-a747-e21eb79c6c40",
             "instanceId": "809c62b3-8918-41b9-a748-e21eb79c6c89",
+            "compositionTargetId": "709c62b3-8918-41b9-a747-e21ed79d6d41",
             "deployState": "UNDEPLOYED",
             "lockState": "NONE",
             "lastMsg": "2024-05-22 10:04:37.6020187",
             "deployState": "UNDEPLOYED",
             "lockState": "NONE",
             "lastMsg": "2024-05-22 10:04:37.6020187",
index 431176a..b6382ac 100644 (file)
@@ -190,6 +190,15 @@ public class CommissioningProvider {
         return !acProvider.getAcInstancesByCompositionId(compositionId).isEmpty();
     }
 
         return !acProvider.getAcInstancesByCompositionId(compositionId).isEmpty();
     }
 
+    /**
+     * Validates to see if there is any compositionTargetId associated with this compositionId.
+     *
+     * @return true if exists compositionTargetId
+     */
+    private boolean verifyIfCompositionTargetIdExists(UUID compositionId) {
+        return !acProvider.getAcInstancesByTargetCompositionId(compositionId).isEmpty();
+    }
+
     /**
      * Composition Definition Priming.
      *
     /**
      * Composition Definition Priming.
      *
@@ -200,6 +209,10 @@ public class CommissioningProvider {
         if (verifyIfInstanceExists(compositionId)) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, "There are instances, Priming/Depriming not allowed");
         }
         if (verifyIfInstanceExists(compositionId)) {
             throw new PfModelRuntimeException(Status.BAD_REQUEST, "There are instances, Priming/Depriming not allowed");
         }
+        if (verifyIfCompositionTargetIdExists(compositionId)) {
+            throw new PfModelRuntimeException(Status.BAD_REQUEST,
+                    "This compositionId is referenced as a targetCompositionId in the instance table.");
+        }
         var acmDefinition = acDefinitionProvider.getAcDefinition(compositionId);
         var stateOrdered = acTypeStateResolver.resolve(acTypeStateUpdate.getPrimeOrder(), acmDefinition.getState(),
                 acmDefinition.getStateChangeResult());
         var acmDefinition = acDefinitionProvider.getAcDefinition(compositionId);
         var stateOrdered = acTypeStateResolver.resolve(acTypeStateUpdate.getPrimeOrder(), acmDefinition.getState(),
                 acmDefinition.getStateChangeResult());
index 8765ac9..e15bc78 100644 (file)
@@ -230,6 +230,12 @@ class CommissioningProviderTest {
         var acTypeStateUpdate = new AcTypeStateUpdate();
         assertThatThrownBy(() -> provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate))
             .hasMessageMatching("There are instances, Priming/Depriming not allowed");
         var acTypeStateUpdate = new AcTypeStateUpdate();
         assertThatThrownBy(() -> provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate))
             .hasMessageMatching("There are instances, Priming/Depriming not allowed");
+
+        when(acProvider.getAcInstancesByCompositionId(compositionId)).thenReturn(List.of());
+        when(acProvider.getAcInstancesByTargetCompositionId(compositionId))
+                .thenReturn(List.of(new AutomationComposition()));
+        assertThatThrownBy(() -> provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate))
+                .hasMessageMatching("This compositionId is referenced as a targetCompositionId in the instance table.");
     }
 
     @Test
     }
 
     @Test