/*-
* ============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.
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;
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;
*
* @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)
/*-
* ============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.
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 {
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());
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) {
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());
+ }
}
/*-
* ============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");
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;
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;
*
* @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;
}
/*-
* ============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.
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;
*/
@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
/*-
* ============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.
@Override
public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions(String name, String version,
- UUID xonaprequestid) {
+ Integer page, Integer size, UUID requestId) {
return stubUtils.getResponse(pathToAllDefinitions, ToscaServiceTemplates.class);
}
# ============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.
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
X-onap-RequestId:
schema:
type: string
- format: uuid
\ No newline at end of file
+ format: uuid
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 {
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");
}
/**
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();
}
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;
@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();
@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
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
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) {