From: FrancescoFioraEst Date: Mon, 11 Dec 2023 14:45:14 +0000 (+0000) Subject: Add pagination support in GET /compositions X-Git-Tag: 8.2.0~11 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F87%2F140887%2F1;p=policy%2Fclamp.git Add pagination support in GET /compositions Issue-ID: POLICY-5357 Change-Id: I28a319fda288e069d463c569f87a84a019f2dfec Signed-off-by: FrancescoFioraEst --- diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java index b8f7be93e..f8e3a7409 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProvider.java @@ -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 getServiceTemplateList(final String name, final String version) { + public List getServiceTemplateList(final String name, final String version, + @NonNull Pageable pageable) { List 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) diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java index 3940dc51c..57d8441c6 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java @@ -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.>any())) - .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition))); + when(acmDefinitionRepository + .findAll(Mockito.>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.>any())) - .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition))); + when(acmDefinitionRepository + .findAll(Mockito.>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.>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()); + } } 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 d225d4462..c8ddb4374 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 @@ -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; } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java index 5bbe27737..56f3179c2 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java @@ -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 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 diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java index fc94f3476..235b137e9 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/stub/CommissioningControllerStub.java @@ -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 queryCompositionDefinitions(String name, String version, - UUID xonaprequestid) { + Integer page, Integer size, UUID requestId) { return stubUtils.getResponse(pathToAllDefinitions, ToscaServiceTemplates.class); } diff --git a/runtime-acm/src/main/resources/openapi/openapi.yaml b/runtime-acm/src/main/resources/openapi/openapi.yaml index 21e850b92..bf5c6a9dd 100644 --- a/runtime-acm/src/main/resources/openapi/openapi.yaml +++ b/runtime-acm/src/main/resources/openapi/openapi.yaml @@ -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 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 e168210b9..7c8fda63e 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 @@ -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(); } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java index 069708fe6..34ce3f742 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java @@ -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) {