2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.models.acm.persistence.provider;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
30 import java.util.HashMap;
31 import java.util.List;
33 import java.util.Optional;
34 import java.util.UUID;
35 import org.junit.jupiter.api.BeforeAll;
36 import org.junit.jupiter.api.Test;
37 import org.mockito.Mockito;
38 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
39 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
40 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
41 import org.onap.policy.clamp.models.acm.document.concepts.DocToscaServiceTemplate;
42 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionDefinition;
43 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionDefinitionRepository;
44 import org.onap.policy.clamp.models.acm.utils.CommonTestData;
45 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
49 import org.springframework.data.domain.Example;
50 import org.springframework.data.domain.PageImpl;
51 import org.springframework.data.domain.Pageable;
53 class AcDefinitionProviderTest {
55 private static final String TOSCA_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase.yaml";
56 private static final String TOSCA_SERVICE_TEMPLATE_YAML_PROP =
57 "clamp/acm/test/tosca-template-additional-properties.yaml";
59 private static final String ELEMENT_NAME = "org.onap.policy.clamp.acm.AutomationCompositionElement";
60 private static final String INVALID_ELEMENT_NAME = "dummyElement";
61 private static final String NODE_TYPE = "org.onap.policy.clamp.acm.AutomationComposition";
62 private static final String INVALID_NODE_TYPE = "dummyNodeTypeName";
64 private static ToscaServiceTemplate inputServiceTemplate;
67 void testBadRequest() {
68 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
69 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
71 var compositionId = UUID.randomUUID();
72 var serviceTemplate = new ToscaServiceTemplate();
73 serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
74 serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(new HashMap<>());
75 assertThatThrownBy(() -> acDefinitionProvider.updateServiceTemplate(compositionId, serviceTemplate,
76 "ElementName", "CompositionName"))
77 .hasMessageMatching("NodeTemplate with element type ElementName must exist!");
79 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
80 var acmDefinition = getAcDefinition(docServiceTemplate);
81 assertThatThrownBy(() -> acDefinitionProvider.updateAcDefinition(acmDefinition, "CompositionName"))
82 .hasMessageStartingWith("\"AutomationCompositionDefinition\" INVALID, item has status INVALID");
86 static void loadServiceTemplate() {
87 inputServiceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
91 void testDocCopyCompare() {
93 var inputServiceTemplateProperties = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML_PROP);
94 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplateProperties);
95 var docServiceTemplateCopy = new DocToscaServiceTemplate(docServiceTemplate);
97 assertThat(docServiceTemplate.compareTo(docServiceTemplateCopy)).isEqualByComparingTo(0);
98 assertThat(docServiceTemplate.compareToWithoutEntities(docServiceTemplateCopy)).isZero();
100 var acmDefinition = getAcDefinition(docServiceTemplate);
101 var acmDefinitionCopy = getAcDefinition(docServiceTemplateCopy);
103 assertThat(acmDefinition.getServiceTemplate().getName())
104 .isEqualTo(acmDefinitionCopy.getServiceTemplate().getName());
109 void testCreateServiceTemplate() {
110 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
111 var acmDefinition = getAcDefinition(docServiceTemplate);
113 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
114 when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
115 .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
117 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
118 var result = acDefinitionProvider
119 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
121 assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
122 assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
126 void testToscaWithInvalidElement() {
127 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
129 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
131 assertThatThrownBy(() -> acDefinitionProvider
132 .createAutomationCompositionDefinition(inputServiceTemplate, INVALID_ELEMENT_NAME, NODE_TYPE))
133 .hasMessage("NodeTemplate with element type " + INVALID_ELEMENT_NAME + " must exist!");
137 void testToscaWithInvalidNodeType() {
138 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
140 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
142 assertThatThrownBy(() -> acDefinitionProvider
143 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, INVALID_NODE_TYPE))
144 .hasMessageContaining("NodeTemplate with type " + INVALID_NODE_TYPE + " must exist!");
148 void testCreateServiceTemplateWithMetadata() {
149 inputServiceTemplate.setMetadata(new HashMap<>());
150 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
151 var acmDefinition = getAcDefinition(docServiceTemplate);
153 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
154 when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
155 .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
157 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
158 inputServiceTemplate.setMetadata(new HashMap<>());
159 var result = acDefinitionProvider
160 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
162 assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
163 assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
167 void testUpdateServiceTemplate() {
168 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
169 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
170 acDefinitionProvider.updateServiceTemplate(UUID.randomUUID(), inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
171 verify(acmDefinitionRepository).save(any(JpaAutomationCompositionDefinition.class));
175 void testUpdateAcDefinition() {
176 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
177 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
178 var acmDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
179 acDefinitionProvider.updateAcDefinition(acmDefinition, NODE_TYPE);
180 verify(acmDefinitionRepository).save(any(JpaAutomationCompositionDefinition.class));
184 void testUpdateAcDefinitionState() {
185 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
186 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
187 var acmDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
188 acmDefinition.setState(AcTypeState.PRIMING);
189 acDefinitionProvider.updateAcDefinitionState(acmDefinition);
190 verify(acmDefinitionRepository).save(any());
194 void testGetAcDefinition() {
195 var jpa = new JpaAutomationCompositionDefinition();
196 jpa.fromAuthorative(getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate)));
197 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
198 when(acmDefinitionRepository.findById(jpa.getCompositionId())).thenReturn(Optional.of(jpa));
199 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
200 var result = acDefinitionProvider.getAcDefinition(UUID.fromString(jpa.getCompositionId()));
201 assertThat(result).isNotNull();
205 void testGetAcDefinitionNotFound() {
206 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
207 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
208 var compositionId = UUID.randomUUID();
209 assertThatThrownBy(() -> acDefinitionProvider.getAcDefinition(compositionId))
210 .hasMessage("Get serviceTemplate \"" + compositionId + "\" failed, serviceTemplate does not exist");
214 void testFindAcDefinition() {
215 var jpa = new JpaAutomationCompositionDefinition();
216 jpa.fromAuthorative(getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate)));
217 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
218 when(acmDefinitionRepository.findById(jpa.getCompositionId())).thenReturn(Optional.of(jpa));
219 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
220 var compositionId = UUID.fromString(jpa.getCompositionId());
221 var result = acDefinitionProvider.findAcDefinition(compositionId);
222 assertThat(result).isNotEmpty();
226 void getAllAcDefinitionsInTransition() {
227 var acDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
228 acDefinition.setState(AcTypeState.PRIMING);
229 var jpa = new JpaAutomationCompositionDefinition();
230 jpa.fromAuthorative(acDefinition);
231 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
232 when(acmDefinitionRepository.findByStateIn(List.of(AcTypeState.PRIMING, AcTypeState.DEPRIMING)))
233 .thenReturn(List.of(jpa));
234 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
235 var result = acDefinitionProvider.getAllAcDefinitionsInTransition();
236 assertThat(result).isNotEmpty();
240 void testDeleteAcDefintion() {
241 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
242 var acmDefinition = getAcDefinition(docServiceTemplate);
244 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
245 when(acmDefinitionRepository.findById(acmDefinition.getCompositionId().toString()))
246 .thenReturn(Optional.of(new JpaAutomationCompositionDefinition(acmDefinition)));
248 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
249 var result = acDefinitionProvider.deleteAcDefinition(acmDefinition.getCompositionId());
250 assertThat(result).isEqualTo(docServiceTemplate.toAuthorative());
254 void testDeleteServiceTemplateEmpty() {
255 var compositionId = UUID.randomUUID();
256 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
257 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
258 assertThatThrownBy(() -> acDefinitionProvider.deleteAcDefinition(compositionId))
259 .hasMessage("delete of Automation Composition Definition \"" + compositionId
260 + "\" failed, Automation Composition Definition does not exist");
264 void testGetServiceTemplate() {
265 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
266 var acmDefinition = getAcDefinition(docServiceTemplate);
267 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
268 when(acmDefinitionRepository
269 .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), any(Pageable.class)))
270 .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
272 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
273 var result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
274 inputServiceTemplate.getVersion(), Pageable.unpaged());
276 assertThat(result).hasSize(1);
277 assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
281 void testGetServiceTemplateNulls() {
282 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
283 var acmDefinition = getAcDefinition(docServiceTemplate);
284 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
285 when(acmDefinitionRepository
286 .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), any(Pageable.class)))
287 .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
288 when(acmDefinitionRepository.findAll(any(Pageable.class)))
289 .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
291 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
292 var result = acDefinitionProvider.getServiceTemplateList(null,
293 inputServiceTemplate.getVersion(), Pageable.unpaged());
295 assertThat(result).hasSize(1);
296 assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
298 result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
299 null, Pageable.unpaged());
301 assertThat(result).hasSize(1);
302 assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
304 result = acDefinitionProvider.getServiceTemplateList(null, null, Pageable.unpaged());
306 assertThat(result).hasSize(1);
308 assertThatThrownBy(() ->
309 acDefinitionProvider.getServiceTemplateList(null, null, null))
310 .hasMessage("pageable is marked non-null but is null");
313 private AutomationCompositionDefinition getAcDefinition(DocToscaServiceTemplate docServiceTemplate) {
314 var acmDefinition = new AutomationCompositionDefinition();
315 acmDefinition.setCompositionId(UUID.randomUUID());
316 acmDefinition.setState(AcTypeState.COMMISSIONED);
317 acmDefinition.setLastMsg(TimestampHelper.now());
318 acmDefinition.setServiceTemplate(docServiceTemplate.toAuthorative());
319 var nodeTemplateState = new NodeTemplateState();
320 nodeTemplateState.setNodeTemplateStateId(UUID.randomUUID());
321 nodeTemplateState.setNodeTemplateId(new ToscaConceptIdentifier("name", "1.0.0"));
322 nodeTemplateState.setState(AcTypeState.COMMISSIONED);
323 nodeTemplateState.setParticipantId(UUID.randomUUID());
324 acmDefinition.setElementStateMap(Map.of(nodeTemplateState.getNodeTemplateId().getName(), nodeTemplateState));
325 return acmDefinition;
329 void testGetServiceTemplateListWithPageable() {
330 var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
331 var acmDefinition = getAcDefinition(docServiceTemplate);
332 var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
333 when(acmDefinitionRepository
334 .findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any(), Mockito.any(Pageable.class)))
335 .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
336 var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
337 var pagable = Pageable.ofSize(5);
338 var result = acDefinitionProvider.getServiceTemplateList(null,
339 inputServiceTemplate.getVersion(), pagable);
341 assertThat(result).hasSize(1);
342 assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
344 when(acmDefinitionRepository.findAll(Mockito.any(Pageable.class)))
345 .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
346 result = acDefinitionProvider.getServiceTemplateList(null, null, pagable);
348 assertThat(result).hasSize(1);
349 assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());