Add pagination support in GET /compositions 87/140887/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Mon, 11 Dec 2023 14:45:14 +0000 (14:45 +0000)
committerFrancescoFioraEst <francesco.fiora@est.tech>
Thu, 15 May 2025 11:19:05 +0000 (12:19 +0100)
Issue-ID: POLICY-5357
Change-Id: I28a319fda288e069d463c569f87a84a019f2dfec
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java
models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java
runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java
runtime-acm/src/main/resources/openapi/openapi.yaml
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java

index b8f7be9..f8e3a74 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2025 Nordix Foundation.
+ *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
@@ -40,6 +41,7 @@ import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -207,19 +209,21 @@ public class AcDefinitionProvider {
      *
      * @param name the name of the topology template to get, set to null to get all service templates
      * @param version the version of the service template to get, set to null to get all service templates
+     * @param pageable the Pageable
      * @return the topology templates found
      */
     @Transactional(readOnly = true)
-    public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version) {
+    public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version,
+            @NonNull Pageable pageable) {
         List<JpaAutomationCompositionDefinition> jpaList = null;
         if (name != null || version != null) {
             var entity = new JpaAutomationCompositionDefinition();
             entity.setName(name);
             entity.setVersion(version);
             var example = Example.of(entity);
-            jpaList = acmDefinitionRepository.findAll(example);
+            jpaList = acmDefinitionRepository.findAll(example, pageable).toList();
         } else {
-            jpaList = acmDefinitionRepository.findAll();
+            jpaList = acmDefinitionRepository.findAll(pageable).toList();
         }
 
         return jpaList.stream().map(JpaAutomationCompositionDefinition::getServiceTemplate)
index 3940dc5..57d8441 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2025 Nordix Foundation.
+ *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,6 +47,8 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
 import org.springframework.data.domain.Example;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
 
 class AcDefinitionProviderTest {
 
@@ -263,12 +265,13 @@ class AcDefinitionProviderTest {
         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
         var acmDefinition = getAcDefinition(docServiceTemplate);
         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
-        when(acmDefinitionRepository.findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any()))
-                .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition)));
+        when(acmDefinitionRepository
+                .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), any(Pageable.class)))
+                .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
 
         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
         var result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
-                inputServiceTemplate.getVersion());
+                inputServiceTemplate.getVersion(), Pageable.unpaged());
 
         assertThat(result).hasSize(1);
         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
@@ -279,26 +282,32 @@ class AcDefinitionProviderTest {
         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
         var acmDefinition = getAcDefinition(docServiceTemplate);
         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
-        when(acmDefinitionRepository.findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any()))
-            .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition)));
+        when(acmDefinitionRepository
+                .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), any(Pageable.class)))
+                .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
+        when(acmDefinitionRepository.findAll(any(Pageable.class)))
+                .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
 
         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
         var result = acDefinitionProvider.getServiceTemplateList(null,
-            inputServiceTemplate.getVersion());
+            inputServiceTemplate.getVersion(), Pageable.unpaged());
 
         assertThat(result).hasSize(1);
         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
 
         result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
-            null);
+            null, Pageable.unpaged());
 
         assertThat(result).hasSize(1);
         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
 
-        result = acDefinitionProvider.getServiceTemplateList(null,
-            null);
+        result = acDefinitionProvider.getServiceTemplateList(null, null, Pageable.unpaged());
 
-        assertThat(result).isEmpty();
+        assertThat(result).hasSize(1);
+
+        assertThatThrownBy(() ->
+                acDefinitionProvider.getServiceTemplateList(null, null, null))
+                .hasMessage("pageable is marked non-null but is null");
     }
 
     private AutomationCompositionDefinition getAcDefinition(DocToscaServiceTemplate docServiceTemplate) {
@@ -315,4 +324,28 @@ class AcDefinitionProviderTest {
         acmDefinition.setElementStateMap(Map.of(nodeTemplateState.getNodeTemplateId().getName(), nodeTemplateState));
         return acmDefinition;
     }
+
+    @Test
+    void testGetServiceTemplateListWithPageable() {
+        var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
+        var acmDefinition = getAcDefinition(docServiceTemplate);
+        var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
+        when(acmDefinitionRepository
+            .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), Mockito.any(Pageable.class)))
+            .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
+        var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
+        var pagable = Pageable.ofSize(5);
+        var result = acDefinitionProvider.getServiceTemplateList(null,
+            inputServiceTemplate.getVersion(), pagable);
+
+        assertThat(result).hasSize(1);
+        assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
+
+        when(acmDefinitionRepository.findAll(Mockito.any(Pageable.class)))
+            .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
+        result = acDefinitionProvider.getServiceTemplateList(null, null, pagable);
+
+        assertThat(result).hasSize(1);
+        assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
+    }
 }
index d225d44..c8ddb43 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2021-2025 Nordix Foundation.
+ * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,7 @@ import java.util.HashSet;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantPrimePublisher;
@@ -43,6 +44,7 @@ import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -146,13 +148,14 @@ public class CommissioningProvider {
      *
      * @param acName the name of the automation composition, null for all
      * @param acVersion the version of the automation composition, null for all
+     * @param pageable the Pageable
      * @return automation composition definition
      */
     @Transactional(readOnly = true)
-    public ToscaServiceTemplates getAutomationCompositionDefinitions(String acName, String acVersion) {
-
+    public ToscaServiceTemplates getAutomationCompositionDefinitions(String acName, String acVersion,
+            @NonNull Pageable pageable) {
         var result = new ToscaServiceTemplates();
-        result.setServiceTemplates(acDefinitionProvider.getServiceTemplateList(acName, acVersion));
+        result.setServiceTemplates(acDefinitionProvider.getServiceTemplateList(acName, acVersion, pageable));
         return result;
     }
 
index 5bbe277..56f3179 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021-2023 Nordix Foundation.
+ *  Copyright (C) 2021-2023,2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,6 +32,8 @@ import org.onap.policy.clamp.models.acm.messages.rest.commissioning.Commissionin
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates;
 import org.springframework.context.annotation.Profile;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -87,8 +89,9 @@ public class CommissioningController extends AbstractRestController implements A
      */
     @Override
     public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions(String name, String version,
-        UUID requestId) {
-        return ResponseEntity.ok().body(provider.getAutomationCompositionDefinitions(name, version));
+        Integer page, Integer size, UUID requestId) {
+        var pageable = page != null && size != null ? PageRequest.of(page, size) : Pageable.unpaged();
+        return ResponseEntity.ok().body(provider.getAutomationCompositionDefinitions(name, version, pageable));
     }
 
     @Override
index fc94f34..235b137 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2022-2023 Nordix Foundation.
+ *  Copyright (C) 2022-2023,2025 OpenInfra Foundation Europe. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -81,7 +81,7 @@ public class CommissioningControllerStub extends AbstractRestController implemen
 
     @Override
     public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions(String name, String version,
-            UUID xonaprequestid) {
+            Integer page, Integer size, UUID requestId) {
         return stubUtils.getResponse(pathToAllDefinitions, ToscaServiceTemplates.class);
     }
 
index 21e850b..bf5c6a9 100644 (file)
@@ -1,5 +1,5 @@
 #  ============LICENSE_START=======================================================
-#  Copyright (C) 2022-2023 Nordix Foundation
+#  Copyright (C) 2022-2023,2025 OpenInfra Foundation Europe. All rights reserved.
 #  ================================================================================
 #  Licensed under the Apache License, Version 2.0 (the "License");
 #  you may not use this file except in compliance with the License.
@@ -447,6 +447,18 @@ paths:
           parameter is not specified, all automation composition definitions that match the "name" filter are are returned.
         schema:
           type: string
+      - name: page
+        in: query
+        required: false
+        description: Zero-based page number, must not be negative.
+        schema:
+          type: integer
+      - name: size
+        in: query
+        required: false
+        description: The size of the page to be returned, must be greater than 0.
+        schema:
+          type: integer
       - name: X-onap-RequestId
         in: header
         description: RequestID for http transaction
@@ -1620,4 +1632,4 @@ components:
     X-onap-RequestId:
       schema:
         type: string
-        format: uuid
\ No newline at end of file
+        format: uuid
index e168210..7c8fda6 100644 (file)
@@ -49,6 +49,7 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AcTypeStateResolver
 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.springframework.data.domain.Pageable;
 
 class CommissioningProviderTest {
 
@@ -64,12 +65,16 @@ class CommissioningProviderTest {
         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null,
             acRuntimeParameterGroup);
 
-        var serviceTemplates = provider.getAutomationCompositionDefinitions(null, null);
+        var serviceTemplates = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
         assertThat(serviceTemplates.getServiceTemplates()).isEmpty();
 
-        when(acDefinitionProvider.getServiceTemplateList(null, null)).thenReturn(List.of(new ToscaServiceTemplate()));
-        serviceTemplates = provider.getAutomationCompositionDefinitions(null, null);
+        when(acDefinitionProvider.getServiceTemplateList(null, null, Pageable.unpaged()))
+            .thenReturn(List.of(new ToscaServiceTemplate()));
+        serviceTemplates = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
         assertThat(serviceTemplates.getServiceTemplates()).hasSize(1);
+
+        assertThatThrownBy(() -> provider.getAutomationCompositionDefinitions(null, null, null))
+                .hasMessage("pageable is marked non-null but is null");
     }
 
     /**
@@ -111,9 +116,10 @@ class CommissioningProviderTest {
         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null, null);
         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
         assertNotNull(serviceTemplate);
-        when(acDefinitionProvider.getServiceTemplateList(null, null)).thenReturn(List.of(serviceTemplate));
+        when(acDefinitionProvider
+                .getServiceTemplateList(null, null, Pageable.unpaged())).thenReturn(List.of(serviceTemplate));
 
-        var returnedServiceTemplate = provider.getAutomationCompositionDefinitions(null, null);
+        var returnedServiceTemplate = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
         assertThat(returnedServiceTemplate).isNotNull();
         assertThat(returnedServiceTemplate.getServiceTemplates()).isNotEmpty();
     }
index 069708f..34ce3f7 100644 (file)
@@ -43,16 +43,20 @@ import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
+import org.onap.policy.clamp.models.acm.concepts.Participant;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.AcTypeStateUpdate;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse;
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.PrimeOrder;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.onap.policy.models.base.PfKey;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
@@ -65,6 +69,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
 @ActiveProfiles({"test", "default"})
 class CommissioningControllerTest extends CommonRestController {
 
+    private static final int NUMBER_COMPOSITIONS = 10;
     private static final String COMMISSIONING_ENDPOINT = "compositions";
     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
@@ -224,11 +229,11 @@ class CommissioningControllerTest extends CommonRestController {
     @Test
     void testQuery_NoResultWithThisName() {
         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName");
-        var rawresp = invocationBuilder.buildGet().invoke();
-        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
-        var entityList = rawresp.readEntity(ToscaServiceTemplate.class);
-        assertThat(entityList.getNodeTypes()).isNull();
-        rawresp.close();
+        try (var rawresp = invocationBuilder.buildGet().invoke()) {
+            assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+            var entityList = rawresp.readEntity(ToscaServiceTemplate.class);
+            assertThat(entityList.getNodeTypes()).isNull();
+        }
     }
 
     @Test
@@ -236,11 +241,50 @@ class CommissioningControllerTest extends CommonRestController {
         createEntryInDB("forQuery");
 
         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
-        var rawresp = invocationBuilder.buildGet().invoke();
-        assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
-        var entityList = rawresp.readEntity(ToscaServiceTemplate.class);
-        assertNotNull(entityList);
-        rawresp.close();
+        try (var rawresp = invocationBuilder.buildGet().invoke()) {
+            assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
+            var entityList = rawresp.readEntity(ToscaServiceTemplates.class);
+            assertNotNull(entityList);
+            assertThat(entityList.getServiceTemplates()).isNotEmpty();
+        }
+    }
+
+    @Test
+    void testQueryPageable() {
+        for (var i = 0; i < NUMBER_COMPOSITIONS; i++) {
+            createEntryInDB("queryPageable" + i);
+        }
+        // filter by name with wrong name
+        validateQueryPageable("?name=wrongName", 0);
+
+        // filter by name
+        validateQueryPageable("?name=queryPageable1", 1);
+
+        // page=1 and size=5
+        validateQueryPageable("?page=1&size=5", 5);
+
+        // not pageable
+        validateQueryNotPageable("?size=4");
+        validateQueryNotPageable("?page=2");
+        validateQueryNotPageable("");
+    }
+
+    private void validateQueryNotPageable(String parameters) {
+        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + parameters);
+        try (var response = invocationBuilder.buildGet().invoke()) {
+            assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+            var entityList = response.readEntity(ToscaServiceTemplates.class);
+            assertThat(entityList.getServiceTemplates()).hasSizeGreaterThanOrEqualTo(NUMBER_COMPOSITIONS);
+        }
+    }
+
+    private void validateQueryPageable(String parameters, int size) {
+        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + parameters);
+        try (var response = invocationBuilder.buildGet().invoke()) {
+            assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+            var entityList = response.readEntity(ToscaServiceTemplates.class);
+            assertThat(entityList.getServiceTemplates()).hasSize(size);
+        }
     }
 
     @Test
@@ -265,15 +309,52 @@ class CommissioningControllerTest extends CommonRestController {
         assertThat(templatesInDB).isEmpty();
     }
 
+    @Test
+    void testPrime() {
+        var compositionId = createEntryInDB("Prime");
+        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
+
+        var acElements = AcmUtils.extractAcElementsFromServiceTemplate(serviceTemplate,
+            "org.onap.policy.clamp.acm.AutomationCompositionElement");
+        for (var elementEntry : acElements) {
+            var participant = CommonTestData.createParticipant(UUID.randomUUID());
+            var supportedElementType = new ParticipantSupportedElementType();
+            supportedElementType.setTypeName(elementEntry.getValue().getType());
+            supportedElementType.setTypeVersion(elementEntry.getValue().getTypeVersion());
+            participant.getParticipantSupportedElementTypes().put(supportedElementType.getId(), supportedElementType);
+            var replica = CommonTestData.createParticipantReplica(UUID.randomUUID());
+            participant.getReplicas().put(replica.getReplicaId(), replica);
+            participantProvider.saveParticipant(participant);
+        }
+
+        var body = new AcTypeStateUpdate();
+        body.setPrimeOrder(PrimeOrder.PRIME);
+        try (var resp = invocationBuilder.put(Entity.json(body))) {
+            assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
+        }
+    }
+
     @Test
     void testPrimeBadRequest() {
         var compositionId = createEntryInDB("Prime");
         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
+
+        var acElements = AcmUtils.extractAcElementsFromServiceTemplate(serviceTemplate,
+                "org.onap.policy.clamp.acm.AutomationCompositionElement");
+        for (var elementEntry : acElements) {
+            var participant = CommonTestData.createParticipant(UUID.randomUUID());
+            var supportedElementType = new ParticipantSupportedElementType();
+            supportedElementType.setTypeName(elementEntry.getValue().getType());
+            supportedElementType.setTypeVersion(elementEntry.getValue().getTypeVersion());
+            participant.getParticipantSupportedElementTypes().put(supportedElementType.getId(), supportedElementType);
+            participantProvider.saveParticipant(participant);
+        }
+
         var body = new AcTypeStateUpdate();
         body.setPrimeOrder(PrimeOrder.PRIME);
-        var resp = invocationBuilder.put(Entity.json(body));
-        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
-        resp.close();
+        try (var resp = invocationBuilder.put(Entity.json(body))) {
+            assertEquals(Response.Status.CONFLICT.getStatusCode(), resp.getStatus());
+        }
     }
 
     private UUID createEntryInDB(String name) {