bc0a0939e17fca2886eade6c9136b2c335b9856a
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2025 Nordix Foundation.
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
51 class AcDefinitionProviderTest {
52
53     private static final String TOSCA_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase.yaml";
54     private static final String TOSCA_SERVICE_TEMPLATE_YAML_PROP =
55             "clamp/acm/test/tosca-template-additional-properties.yaml";
56
57     private static final String ELEMENT_NAME = "org.onap.policy.clamp.acm.AutomationCompositionElement";
58     private static final String INVALID_ELEMENT_NAME = "dummyElement";
59     private static final String NODE_TYPE = "org.onap.policy.clamp.acm.AutomationComposition";
60     private static final String INVALID_NODE_TYPE = "dummyNodeTypeName";
61
62     private static ToscaServiceTemplate inputServiceTemplate;
63
64     @Test
65     void testBadRequest() {
66         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
67         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
68
69         var compositionId = UUID.randomUUID();
70         var serviceTemplate = new ToscaServiceTemplate();
71         serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
72         serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(new HashMap<>());
73         assertThatThrownBy(() -> acDefinitionProvider.updateServiceTemplate(compositionId, serviceTemplate,
74                 "ElementName", "CompositionName"))
75                 .hasMessageMatching("NodeTemplate with element type ElementName must exist!");
76
77         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
78         var acmDefinition = getAcDefinition(docServiceTemplate);
79         assertThatThrownBy(() -> acDefinitionProvider.updateAcDefinition(acmDefinition, "CompositionName"))
80                 .hasMessageStartingWith("\"AutomationCompositionDefinition\" INVALID, item has status INVALID");
81     }
82
83     @BeforeAll
84     static void loadServiceTemplate() {
85         inputServiceTemplate = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
86     }
87
88     @Test
89     void testDocCopyCompare() {
90
91         var inputServiceTemplateProperties = CommonTestData.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML_PROP);
92         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplateProperties);
93         var docServiceTemplateCopy = new DocToscaServiceTemplate(docServiceTemplate);
94
95         assertThat(docServiceTemplate.compareTo(docServiceTemplateCopy)).isEqualByComparingTo(0);
96         assertThat(docServiceTemplate.compareToWithoutEntities(docServiceTemplateCopy)).isZero();
97
98         var acmDefinition = getAcDefinition(docServiceTemplate);
99         var acmDefinitionCopy = getAcDefinition(docServiceTemplateCopy);
100
101         assertThat(acmDefinition.getServiceTemplate().getName())
102                 .isEqualTo(acmDefinitionCopy.getServiceTemplate().getName());
103
104     }
105
106     @Test
107     void testCreateServiceTemplate() {
108         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
109         var acmDefinition = getAcDefinition(docServiceTemplate);
110
111         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
112         when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
113                 .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
114
115         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
116         var result = acDefinitionProvider
117                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
118
119         assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
120         assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
121     }
122
123     @Test
124     void testToscaWithInvalidElement() {
125         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
126
127         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
128
129         assertThatThrownBy(() -> acDefinitionProvider
130                 .createAutomationCompositionDefinition(inputServiceTemplate, INVALID_ELEMENT_NAME, NODE_TYPE))
131                 .hasMessage("NodeTemplate with element type " + INVALID_ELEMENT_NAME + " must exist!");
132     }
133
134     @Test
135     void testToscaWithInvalidNodeType() {
136         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
137
138         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
139
140         assertThatThrownBy(() -> acDefinitionProvider
141                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, INVALID_NODE_TYPE))
142                 .hasMessageContaining("NodeTemplate with type " + INVALID_NODE_TYPE + " must exist!");
143     }
144
145     @Test
146     void testCreateServiceTemplateWithMetadata() {
147         inputServiceTemplate.setMetadata(new HashMap<>());
148         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
149         var acmDefinition = getAcDefinition(docServiceTemplate);
150
151         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
152         when(acmDefinitionRepository.save(any(JpaAutomationCompositionDefinition.class)))
153             .thenReturn(new JpaAutomationCompositionDefinition(acmDefinition));
154
155         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
156         inputServiceTemplate.setMetadata(new HashMap<>());
157         var result = acDefinitionProvider
158                 .createAutomationCompositionDefinition(inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
159
160         assertThat(result.getServiceTemplate()).isEqualTo(docServiceTemplate.toAuthorative());
161         assertThat(result.getServiceTemplate().getMetadata()).isNotNull();
162     }
163
164     @Test
165     void testUpdateServiceTemplate() {
166         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
167         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
168         acDefinitionProvider.updateServiceTemplate(UUID.randomUUID(), inputServiceTemplate, ELEMENT_NAME, NODE_TYPE);
169         verify(acmDefinitionRepository).save(any(JpaAutomationCompositionDefinition.class));
170     }
171
172     @Test
173     void testUpdateAcDefinition() {
174         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
175         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
176         var acmDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
177         acDefinitionProvider.updateAcDefinition(acmDefinition, NODE_TYPE);
178         verify(acmDefinitionRepository).save(any(JpaAutomationCompositionDefinition.class));
179     }
180
181     @Test
182     void testUpdateAcDefinitionState() {
183         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
184         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
185         var acmDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
186         acmDefinition.setState(AcTypeState.PRIMING);
187         acDefinitionProvider.updateAcDefinitionState(acmDefinition);
188         verify(acmDefinitionRepository).save(any());
189     }
190
191     @Test
192     void testGetAcDefinition() {
193         var jpa = new JpaAutomationCompositionDefinition();
194         jpa.fromAuthorative(getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate)));
195         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
196         when(acmDefinitionRepository.findById(jpa.getCompositionId())).thenReturn(Optional.of(jpa));
197         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
198         var result = acDefinitionProvider.getAcDefinition(UUID.fromString(jpa.getCompositionId()));
199         assertThat(result).isNotNull();
200     }
201
202     @Test
203     void testGetAcDefinitionNotFound() {
204         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
205         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
206         var compositionId = UUID.randomUUID();
207         assertThatThrownBy(() -> acDefinitionProvider.getAcDefinition(compositionId))
208                 .hasMessage("Get serviceTemplate \"" + compositionId + "\" failed, serviceTemplate does not exist");
209     }
210
211     @Test
212     void testFindAcDefinition() {
213         var jpa = new JpaAutomationCompositionDefinition();
214         jpa.fromAuthorative(getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate)));
215         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
216         when(acmDefinitionRepository.findById(jpa.getCompositionId())).thenReturn(Optional.of(jpa));
217         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
218         var compositionId = UUID.fromString(jpa.getCompositionId());
219         var result = acDefinitionProvider.findAcDefinition(compositionId);
220         assertThat(result).isNotEmpty();
221     }
222
223     @Test
224     void getAllAcDefinitionsInTransition() {
225         var acDefinition = getAcDefinition(new DocToscaServiceTemplate(inputServiceTemplate));
226         acDefinition.setState(AcTypeState.PRIMING);
227         var jpa = new JpaAutomationCompositionDefinition();
228         jpa.fromAuthorative(acDefinition);
229         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
230         when(acmDefinitionRepository.findByStateIn(List.of(AcTypeState.PRIMING, AcTypeState.DEPRIMING)))
231             .thenReturn(List.of(jpa));
232         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
233         var result = acDefinitionProvider.getAllAcDefinitionsInTransition();
234         assertThat(result).isNotEmpty();
235     }
236
237     @Test
238     void testDeleteAcDefintion() {
239         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
240         var acmDefinition = getAcDefinition(docServiceTemplate);
241
242         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
243         when(acmDefinitionRepository.findById(acmDefinition.getCompositionId().toString()))
244                 .thenReturn(Optional.of(new JpaAutomationCompositionDefinition(acmDefinition)));
245
246         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
247         var result = acDefinitionProvider.deleteAcDefintion(acmDefinition.getCompositionId());
248
249         assertThat(result).isEqualTo(docServiceTemplate.toAuthorative());
250     }
251
252     @Test
253     void testDeleteServiceTemplateEmpty() {
254         var compositionId = UUID.randomUUID();
255         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
256         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
257         assertThatThrownBy(() -> acDefinitionProvider.deleteAcDefintion(compositionId))
258                 .hasMessage("delete of Automation Composition Definition \"" + compositionId
259                         + "\" failed, Automation Composition Definition does not exist");
260     }
261
262     @Test
263     void testGetServiceTemplate() {
264         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
265         var acmDefinition = getAcDefinition(docServiceTemplate);
266         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
267         when(acmDefinitionRepository.findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any()))
268                 .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition)));
269
270         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
271         var result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
272                 inputServiceTemplate.getVersion());
273
274         assertThat(result).hasSize(1);
275         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
276     }
277
278     @Test
279     void testGetServiceTemplateNulls() {
280         var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate);
281         var acmDefinition = getAcDefinition(docServiceTemplate);
282         var acmDefinitionRepository = mock(AutomationCompositionDefinitionRepository.class);
283         when(acmDefinitionRepository.findAll(Mockito.<Example<JpaAutomationCompositionDefinition>>any()))
284             .thenReturn(List.of(new JpaAutomationCompositionDefinition(acmDefinition)));
285
286         var acDefinitionProvider = new AcDefinitionProvider(acmDefinitionRepository);
287         var result = acDefinitionProvider.getServiceTemplateList(null,
288             inputServiceTemplate.getVersion());
289
290         assertThat(result).hasSize(1);
291         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
292
293         result = acDefinitionProvider.getServiceTemplateList(inputServiceTemplate.getName(),
294             null);
295
296         assertThat(result).hasSize(1);
297         assertThat(result.get(0)).isEqualTo(acmDefinition.getServiceTemplate());
298
299         result = acDefinitionProvider.getServiceTemplateList(null,
300             null);
301
302         assertThat(result).isEmpty();
303     }
304
305     private AutomationCompositionDefinition getAcDefinition(DocToscaServiceTemplate docServiceTemplate) {
306         var acmDefinition = new AutomationCompositionDefinition();
307         acmDefinition.setCompositionId(UUID.randomUUID());
308         acmDefinition.setState(AcTypeState.COMMISSIONED);
309         acmDefinition.setLastMsg(TimestampHelper.now());
310         acmDefinition.setServiceTemplate(docServiceTemplate.toAuthorative());
311         var nodeTemplateState = new NodeTemplateState();
312         nodeTemplateState.setNodeTemplateStateId(UUID.randomUUID());
313         nodeTemplateState.setNodeTemplateId(new ToscaConceptIdentifier("name", "1.0.0"));
314         nodeTemplateState.setState(AcTypeState.COMMISSIONED);
315         nodeTemplateState.setParticipantId(UUID.randomUUID());
316         acmDefinition.setElementStateMap(Map.of(nodeTemplateState.getNodeTemplateId().getName(), nodeTemplateState));
317         return acmDefinition;
318     }
319 }