6ddf965abcd944f8016516e9c1cfcf511aa29820
[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.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertNotNull;
27 import static org.junit.jupiter.api.Assertions.assertThrows;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.ArgumentMatchers.anyIterable;
30 import static org.mockito.ArgumentMatchers.anyString;
31 import static org.mockito.Mockito.mock;
32 import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when;
34
35 import java.util.ArrayList;
36 import java.util.List;
37 import java.util.Optional;
38 import java.util.UUID;
39 import org.junit.jupiter.api.BeforeEach;
40 import org.junit.jupiter.api.Test;
41 import org.mockito.Mockito;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
43 import org.onap.policy.clamp.models.acm.concepts.DeployState;
44 import org.onap.policy.clamp.models.acm.concepts.LockState;
45 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationComposition;
46 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionElement;
47 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
48 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionElementRepository;
49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
50 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRollbackRepository;
51 import org.onap.policy.common.utils.coder.Coder;
52 import org.onap.policy.common.utils.coder.StandardCoder;
53 import org.onap.policy.common.utils.resources.ResourceUtils;
54 import org.onap.policy.models.base.PfModelRuntimeException;
55 import org.springframework.data.domain.PageImpl;
56 import org.springframework.data.domain.PageRequest;
57 import org.springframework.data.domain.Pageable;
58
59 class AutomationCompositionProviderTest {
60
61     private static final String AC_IS_NULL = "automationComposition is marked non-null but is null";
62     private static final String ACELEMENT_ID_IS_NULL = "elementId is marked non-null but is null";
63
64     private static final Coder CODER = new StandardCoder();
65     private static final String AUTOMATION_COMPOSITION_JSON =
66         "src/test/resources/providers/TestAutomationCompositions.json";
67
68     private AutomationCompositions inputAutomationCompositions;
69     private List<JpaAutomationComposition> inputAutomationCompositionsJpa;
70     private final String originalJson = ResourceUtils.getResourceAsString(AUTOMATION_COMPOSITION_JSON);
71
72     @BeforeEach
73     void beforeSetupDao() throws Exception {
74         inputAutomationCompositions = CODER.decode(originalJson, AutomationCompositions.class);
75         inputAutomationCompositionsJpa =
76             ProviderUtils.getJpaAndValidateList(inputAutomationCompositions.getAutomationCompositionList(),
77                 JpaAutomationComposition::new, "automation compositions");
78     }
79
80     @Test
81     void testAutomationCompositionCreate() {
82         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
83         when(automationCompositionRepository.save(any(JpaAutomationComposition.class)))
84             .thenReturn(inputAutomationCompositionsJpa.get(0));
85         var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0);
86
87         var automationCompositionProvider = new AutomationCompositionProvider(
88                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
89                 mock(AutomationCompositionRollbackRepository.class));
90         var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc);
91         inputAc.setInstanceId(createdAutomationComposition.getInstanceId());
92         inputAc.setLastMsg(createdAutomationComposition.getLastMsg());
93         assertEquals(inputAc, createdAutomationComposition);
94     }
95
96     @Test
97     void testAutomationCompositionUpdate() {
98         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
99         var automationCompositionProvider = new AutomationCompositionProvider(
100                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
101                 mock(AutomationCompositionRollbackRepository.class));
102         assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null))
103             .hasMessageMatching(AC_IS_NULL);
104
105         when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0)))
106             .thenReturn(inputAutomationCompositionsJpa.get(0));
107
108         var createdAutomationComposition = automationCompositionProvider
109             .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0));
110
111         assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition);
112     }
113
114     @Test
115     void testGetAutomationCompositionsWithNull() {
116         var automationCompositionProvider = new AutomationCompositionProvider(
117                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
118                 mock(AutomationCompositionRollbackRepository.class));
119         assertThatThrownBy(() -> automationCompositionProvider
120             .getAutomationCompositions(UUID.randomUUID(), null, null, null))
121             .hasMessage("pageable is marked non-null but is null");
122
123         assertThatThrownBy(() -> automationCompositionProvider
124             .getAutomationCompositions(null, null, null, Pageable.unpaged()))
125             .hasMessage("compositionId is marked non-null but is null");
126     }
127
128     @Test
129     void testGetAutomationCompositions() {
130         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
131         var automationCompositionProvider = new AutomationCompositionProvider(
132                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
133                 mock(AutomationCompositionRollbackRepository.class));
134         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
135         when(automationCompositionRepository
136             .findAll(Mockito.any(), any(Pageable.class)))
137             .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
138         var acList = automationCompositionProvider.getAutomationCompositions(UUID.randomUUID(),
139             automationComposition.getName(), automationComposition.getVersion(), Pageable.unpaged());
140         assertThat(acList).hasSize(2);
141
142         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
143             null, Pageable.unpaged());
144         assertThat(acList).hasSize(2);
145
146         when(automationCompositionRepository
147             .findAll(Mockito.any(), Mockito.any(Pageable.class)))
148             .thenReturn(new PageImpl<>(inputAutomationCompositionsJpa));
149         acList = automationCompositionProvider.getAutomationCompositions(automationComposition.getCompositionId(), null,
150             null, PageRequest.of(0, 10));
151         assertThat(acList).hasSize(2);
152     }
153
154     @Test
155     void testGetAutomationComposition() {
156         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
157         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
158         var automationCompositionProvider = new AutomationCompositionProvider(
159                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
160                 mock(AutomationCompositionRollbackRepository.class));
161         assertThatThrownBy(
162             () -> automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()))
163             .hasMessageMatching("AutomationComposition not found");
164
165         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
166             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
167         var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId());
168         assertEquals(automationComposition, ac);
169     }
170
171     @Test
172     void testFindAutomationComposition() {
173         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
174         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
175         var automationCompositionProvider = new AutomationCompositionProvider(
176                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
177                 mock(AutomationCompositionRollbackRepository.class));
178         var acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
179         assertThat(acOpt).isEmpty();
180
181         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
182         assertThat(acOpt).isEmpty();
183
184         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
185             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
186         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId());
187         assertEquals(automationComposition, acOpt.get());
188
189         when(automationCompositionRepository.findOne(Mockito.any()))
190             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
191         acOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier());
192         assertEquals(automationComposition, acOpt.get());
193     }
194
195     @Test
196     void testGetAcInstancesByCompositionId() {
197         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
198         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
199         when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString()))
200             .thenReturn(inputAutomationCompositionsJpa);
201         var automationCompositionProvider = new AutomationCompositionProvider(
202                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
203                 mock(AutomationCompositionRollbackRepository.class));
204         var acList =
205             automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId());
206         assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList);
207     }
208
209     @Test
210     void testGetAcInstancesInTransition() {
211         inputAutomationCompositions.getAutomationCompositionList().get(0).setDeployState(DeployState.DEPLOYING);
212         inputAutomationCompositions.getAutomationCompositionList().get(1).setLockState(LockState.LOCKING);
213         inputAutomationCompositionsJpa.get(0).setDeployState(DeployState.DEPLOYING);
214         inputAutomationCompositionsJpa.get(1).setLockState(LockState.LOCKING);
215
216         List<JpaAutomationComposition> res1 = new ArrayList<>();
217         res1.add(inputAutomationCompositionsJpa.get(0));
218
219         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
220         when(automationCompositionRepository.findByDeployStateIn(List.of(DeployState.DEPLOYING,
221             DeployState.UNDEPLOYING, DeployState.DELETING, DeployState.UPDATING, DeployState.MIGRATING,
222                 DeployState.MIGRATION_REVERTING)))
223             .thenReturn(res1);
224         when(automationCompositionRepository.findByLockStateIn(List.of(LockState.LOCKING, LockState.UNLOCKING)))
225             .thenReturn(List.of(inputAutomationCompositionsJpa.get(1)));
226         var automationCompositionProvider = new AutomationCompositionProvider(
227                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
228                 mock(AutomationCompositionRollbackRepository.class));
229         var acList = automationCompositionProvider.getAcInstancesInTransition();
230         assertThat(acList).hasSize(2)
231             .contains(inputAutomationCompositions.getAutomationCompositionList().get(0).getInstanceId())
232             .contains(inputAutomationCompositions.getAutomationCompositionList().get(1).getInstanceId());
233     }
234
235     @Test
236     void testDeleteAutomationComposition() {
237         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
238         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
239         var automationCompositionProvider = new AutomationCompositionProvider(
240                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
241                 acRollbackRepository);
242         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID()))
243             .hasMessageMatching(".*.failed, automation composition does not exist");
244
245         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(null))
246                 .hasMessageMatching("instanceId is marked non-null but is null");
247
248         var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0);
249         when(automationCompositionRepository.findById(automationComposition.getInstanceId().toString()))
250             .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0)));
251
252         var deletedAc =
253             automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
254         assertEquals(automationComposition, deletedAc);
255
256         when(acRollbackRepository.existsById(automationComposition.getInstanceId().toString())).thenReturn(true);
257
258         deletedAc =
259                 automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId());
260         assertEquals(automationComposition, deletedAc);
261         verify(acRollbackRepository).deleteById(automationComposition.getInstanceId().toString());
262     }
263
264     @Test
265     void testDeleteElementById() {
266         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
267         var acElementRepository = mock(AutomationCompositionElementRepository.class);
268         var automationCompositionProvider = new AutomationCompositionProvider(
269                 automationCompositionRepository, acElementRepository,
270                 mock(AutomationCompositionRollbackRepository.class));
271         assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationCompositionElement(null))
272             .hasMessageMatching(ACELEMENT_ID_IS_NULL);
273         var elementId = UUID.randomUUID();
274         automationCompositionProvider.deleteAutomationCompositionElement(elementId);
275         verify(acElementRepository).deleteById(elementId.toString());
276     }
277
278     @Test
279     void testValidateElementIds() {
280         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
281
282         var acElementRepository = mock(AutomationCompositionElementRepository.class);
283         var automationCompositionProvider = new AutomationCompositionProvider(
284                 mock(AutomationCompositionRepository.class), acElementRepository,
285                 mock(AutomationCompositionRollbackRepository.class));
286         var result = automationCompositionProvider.validateElementIds(ac);
287         assertThat(result.isValid()).isTrue();
288
289         var jpaElement = new JpaAutomationCompositionElement(ac.getElements().values().iterator().next());
290         when(acElementRepository.findAllById(anyIterable()))
291             .thenReturn(List.of(jpaElement));
292
293         ac.setInstanceId(null);
294         result = automationCompositionProvider.validateElementIds(ac);
295         assertThat(result.isValid()).isFalse();
296
297         ac.setInstanceId(UUID.randomUUID());
298         jpaElement.setInstanceId(UUID.randomUUID().toString());
299         result = automationCompositionProvider.validateElementIds(ac);
300         assertThat(result.isValid()).isFalse();
301
302         ac.setInstanceId(UUID.randomUUID());
303         jpaElement.setInstanceId(ac.getInstanceId().toString());
304         result = automationCompositionProvider.validateElementIds(ac);
305         assertThat(result.isValid()).isTrue();
306     }
307
308     @Test
309     void testCopyAcElements() {
310         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
311         var automationCompositionRepository = mock(AutomationCompositionRepository.class);
312         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
313         var automationCompositionProvider = new AutomationCompositionProvider(
314                 automationCompositionRepository, mock(AutomationCompositionElementRepository.class),
315                 acRollbackRepository);
316         automationCompositionProvider.copyAcElementsBeforeUpdate(ac);
317
318         verify(acRollbackRepository).save(any(JpaAutomationCompositionRollback.class));
319         var instanceId = ac.getInstanceId();
320         assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
321             .getAutomationCompositionRollback(instanceId));
322     }
323
324     @Test
325     void testGetRollbackSuccess() {
326         var ac = inputAutomationCompositions.getAutomationCompositionList().get(0);
327         var rollback = new JpaAutomationCompositionRollback();
328         rollback.setInstanceId(ac.getInstanceId().toString());
329         rollback.setCompositionId(ac.getCompositionId().toString());
330
331         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
332         when(acRollbackRepository.findById(anyString())).thenReturn(Optional.of(rollback));
333
334         var automationCompositionProvider = new AutomationCompositionProvider(
335                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
336                 acRollbackRepository);
337         var rbFromDb = automationCompositionProvider.getAutomationCompositionRollback(ac.getInstanceId());
338         assertNotNull(rbFromDb);
339     }
340
341     @Test
342     void testGetRollbackEmpty() {
343         var acRollbackRepository = mock(AutomationCompositionRollbackRepository.class);
344         var automationCompositionProvider = new AutomationCompositionProvider(
345                 mock(AutomationCompositionRepository.class), mock(AutomationCompositionElementRepository.class),
346                 acRollbackRepository);
347         when(acRollbackRepository.findById(anyString())).thenReturn(Optional.empty());
348         var compositionId = UUID.randomUUID();
349         assertThrows(PfModelRuntimeException.class, () -> automationCompositionProvider
350             .getAutomationCompositionRollback(compositionId));
351     }
352 }