From: waynedunican Date: Tue, 7 Oct 2025 10:19:58 +0000 (+0100) Subject: Add validation for composition de-priming X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;ds=inline;p=policy%2Fclamp.git Add validation for composition de-priming 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 --- diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java index 9937576e2..1b209d697 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java @@ -144,6 +144,18 @@ public class AutomationCompositionProvider { .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 getAcInstancesByTargetCompositionId(UUID targetCompositionId) { + return ProviderUtils.asEntityList(automationCompositionRepository + .findByCompositionTargetId(targetCompositionId.toString())); + } + /** * Get all automation compositions in transition. * diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java index a4aaa58a5..ca474ebec 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java @@ -46,6 +46,8 @@ public interface AutomationCompositionRepository extends JpaRepository findBySubStateIn(Collection subStates); + List findByCompositionTargetId(String compositionTargetId); + Page findByStateChangeResultInAndDeployStateIn( Collection stateChangeResults, Collection deployStates, Pageable pageable); diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java index 4d35a0a87..b375e6475 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java @@ -207,6 +207,20 @@ class AutomationCompositionProviderTest { 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); diff --git a/models/src/test/resources/providers/TestAutomationCompositions.json b/models/src/test/resources/providers/TestAutomationCompositions.json index c75337bc1..59d174efc 100644 --- a/models/src/test/resources/providers/TestAutomationCompositions.json +++ b/models/src/test/resources/providers/TestAutomationCompositions.json @@ -3,6 +3,7 @@ { "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", diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java index 431176ab6..b6382ac8d 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java @@ -190,6 +190,15 @@ public class CommissioningProvider { 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. * @@ -200,6 +209,10 @@ public class CommissioningProvider { 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()); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java index 8765ac949..e15bc78ee 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java @@ -230,6 +230,12 @@ class CommissioningProviderTest { 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