57d8441c67e7be10a025e33774be96b4d1762086
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.models.acm.persistence.provider;
22
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;
29
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
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;
52
53 class AcDefinitionProviderTest {
54
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";
58
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";
63
64     private static ToscaServiceTemplate inputServiceTemplate;
65
66     @Test
67     void testBadRequest() {
68         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
69         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
70
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!");
78
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");
83     }
84
85     @BeforeAll
86     static void loadServiceTemplate() {
87         inputServiceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
88     }
89
90     @Test
91     void testDocCopyCompare() {
92
93         var inputServiceTemplateProperties = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML_PROP);
94         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplateProperties);
95         var docServiceTemplateCopy = new DocToscaServiceTemplate(docServiceTemplate);
96
97         assertThat(docServiceTemplate.compareTo(docServiceTemplateCopy)).isEqualByComparingTo(0);
98         assertThat(docServiceTemplate.compareToWithoutEntities(docServiceTemplateCopy)).isZero();
99
100         var acmDefinition = getAcDefinition(docServiceTemplate);
101         var acmDefinitionCopy = getAcDefinition(docServiceTemplateCopy);
102
103         assertThat(acmDefinition.getServiceTemplate().getName())
104                 .isEqualTo(acmDefinitionCopy.getServiceTemplate().getName());
105
106     }
107
108     @Test
109     void testCreateServiceTemplate() {
110         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
111         var acmDefinition = getAcDefinition(docServiceTemplate);
112
113         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
114         when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
115                 .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
116
117         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
118         var result = acDefinitionProvider
119                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
120
121         assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
122         assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
123     }
124
125     @Test
126     void testToscaWithInvalidElement() {
127         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
128
129         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
130
131         assertThatThrownBy(() -> acDefinitionProvider
132                 .createAutomationCompositionDefinition(inputServiceTemplate, INVALID_ELEMENT_NAME, NODE_TYPE))
133                 .hasMessage("NodeTemplate with element type " + INVALID_ELEMENT_NAME + " must exist!");
134     }
135
136     @Test
137     void testToscaWithInvalidNodeType() {
138         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
139
140         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
141
142         assertThatThrownBy(() -> acDefinitionProvider
143                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, INVALID_NODE_TYPE))
144                 .hasMessageContaining("NodeTemplate with type " + INVALID_NODE_TYPE + " must exist!");
145     }
146
147     @Test
148     void testCreateServiceTemplateWithMetadata() {
149         inputServiceTemplate.setMetadata(new HashMap<>());
150         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
151         var acmDefinition = getAcDefinition(docServiceTemplate);
152
153         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
154         when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
155             .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
156
157         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
158         inputServiceTemplate.setMetadata(new HashMap<>());
159         var result = acDefinitionProvider
160                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
161
162         assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
163         assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
164     }
165
166     @Test
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));
172     }
173
174     @Test
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));
181     }
182
183     @Test
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());
191     }
192
193     @Test
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();
202     }
203
204     @Test
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");
211     }
212
213     @Test
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();
223     }
224
225     @Test
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();
237     }
238
239     @Test
240     void testDeleteAcDefintion() {
241         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
242         var acmDefinition = getAcDefinition(docServiceTemplate);
243
244         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
245         when(acmDefinitionRepository.findById(acmDefinition.getCompositionId().toString()))
246                 .thenReturn(Optional.of(new JpaAutomationCompositionDefinition(acmDefinition)));
247
248         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
249         var result = acDefinitionProvider.deleteAcDefinition(acmDefinition.getCompositionId());
250         assertThat(result).isEqualTo(docServiceTemplate.toAuthorative());
251     }
252
253     @Test
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");
261     }
262
263     @Test
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))));
271
272         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
273         var result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
274                 inputServiceTemplate.getVersion(), Pageable.unpaged());
275
276         assertThat(result).hasSize(1);
277         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
278     }
279
280     @Test
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))));
290
291         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
292         var result = acDefinitionProvider.getServiceTemplateList(null,
293             inputServiceTemplate.getVersion(), Pageable.unpaged());
294
295         assertThat(result).hasSize(1);
296         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
297
298         result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
299             null, Pageable.unpaged());
300
301         assertThat(result).hasSize(1);
302         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
303
304         result = acDefinitionProvider.getServiceTemplateList(null, null, Pageable.unpaged());
305
306         assertThat(result).hasSize(1);
307
308         assertThatThrownBy(() ->
309                 acDefinitionProvider.getServiceTemplateList(null, null, null))
310                 .hasMessage("pageable is marked non-null but is null");
311     }
312
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;
326     }
327
328     @Test
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);
340
341         assertThat(result).hasSize(1);
342         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
343
344         when(acmDefinitionRepository.findAll(Mockito.any(Pageable.class)))
345             .thenReturn(new PageImpl<>(List.of(new JpaAutomationCompositionDefinition(acmDefinition))));
346         result = acDefinitionProvider.getServiceTemplateList(null, null, pagable);
347
348         assertThat(result).hasSize(1);
349         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
350     }
351 }