faf356c2258bb1a05bd18609b05f0347de6fb688
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2023 Nordix Foundation.
4  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.acm.runtime.instantiation;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
31
32 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.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
38 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
39 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
40 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
41 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
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.messages.rest.instantiation.AcInstanceStateUpdate;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
47 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
48 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
49 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
50 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
51 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
54
55 /**
56  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
57  *
58  */
59 class AutomationCompositionInstantiationProviderTest {
60     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
61     private static final String AC_INSTANTIATION_UPDATE_JSON =
62             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
63
64     private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
65             "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
66     private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
67             "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
68     private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
69
70     private static final String AC_ELEMENT_NAME_NOT_FOUND =
71             "\"AutomationComposition\" INVALID, item has status INVALID\n"
72                     + "  \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n"
73                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
74                     + "    \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\""
75                     + " INVALID, Not found\n";
76     private static final String AC_DEFINITION_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n"
77             + "  item \"ServiceTemplate\" value \"\" INVALID,"
78             + " Commissioned automation composition definition not found\n";
79     private static final String DO_NOT_MATCH = " do not match with ";
80
81     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
82
83     @BeforeAll
84     public static void setUpBeforeClass() {
85         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
86         var jpa =
87                 ProviderUtils.getJpaAndValidate(serviceTemplate, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
88         serviceTemplate = jpa.toAuthorative();
89     }
90
91     @Test
92     void testInstantiationCrud() throws AutomationCompositionException {
93         var acDefinitionProvider = mock(AcDefinitionProvider.class);
94         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
95         var compositionId = acDefinition.getCompositionId();
96         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
97         var acProvider = mock(AutomationCompositionProvider.class);
98         var supervisionAcHandler = mock(SupervisionAcHandler.class);
99         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
100                 null, supervisionAcHandler);
101         var automationCompositionCreate =
102                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
103         automationCompositionCreate.setCompositionId(compositionId);
104         when(acProvider.createAutomationComposition(automationCompositionCreate))
105                 .thenReturn(automationCompositionCreate);
106
107         var instantiationResponse = instantiationProvider.createAutomationComposition(
108                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
109         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
110
111         verify(acProvider).createAutomationComposition(automationCompositionCreate);
112
113         when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
114                 automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate));
115
116         var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
117                 automationCompositionCreate.getName(), automationCompositionCreate.getVersion());
118         assertThat(automationCompositionCreate)
119                 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
120
121         var automationCompositionUpdate =
122                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
123         automationCompositionUpdate.setCompositionId(compositionId);
124         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
125                 .thenReturn(automationCompositionUpdate);
126         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
127                 .thenReturn(automationCompositionUpdate);
128
129         instantiationResponse = instantiationProvider.updateAutomationComposition(
130                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
131         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
132
133         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
134
135         when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
136                 .thenReturn(automationCompositionUpdate);
137         instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
138                 automationCompositionCreate.getInstanceId());
139
140         verify(supervisionAcHandler).delete(any(), any());
141     }
142
143     @Test
144     void testInstantiationDelete() {
145         var automationComposition =
146                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
147
148         var acProvider = mock(AutomationCompositionProvider.class);
149         var acDefinitionProvider = mock(AcDefinitionProvider.class);
150         var supervisionAcHandler = mock(SupervisionAcHandler.class);
151
152         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
153                 acDefinitionProvider, null, supervisionAcHandler);
154
155         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
156                 .thenReturn(automationComposition);
157
158         var wrongCompositionId = UUID.randomUUID();
159         var instanceId = automationComposition.getInstanceId();
160         var compositionId = automationComposition.getCompositionId();
161         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
162                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
163
164         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
165         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
166         assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
167
168         automationComposition.setDeployState(DeployState.UNDEPLOYED);
169         automationComposition.setLockState(LockState.NONE);
170         when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
171
172         instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
173         verify(supervisionAcHandler).delete(any(), any());
174     }
175
176     private void assertThatDeleteThrownBy(AutomationComposition automationComposition,
177             DeployState deployState, LockState lockState) {
178         automationComposition.setDeployState(deployState);
179         automationComposition.setLockState(lockState);
180         var acProvider = mock(AutomationCompositionProvider.class);
181         var acDefinitionProvider = mock(AcDefinitionProvider.class);
182
183         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
184                 acDefinitionProvider, null, null);
185
186         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
187                 .thenReturn(automationComposition);
188
189         var compositionId = automationComposition.getCompositionId();
190         var instanceId = automationComposition.getInstanceId();
191         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
192                 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, deployState));
193     }
194
195     @Test
196     void testCreateAutomationCompositions_NoDuplicates() {
197         var acDefinitionProvider = mock(AcDefinitionProvider.class);
198         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
199         var compositionId = acDefinition.getCompositionId();
200         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
201
202         var automationCompositionCreate =
203                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
204         automationCompositionCreate.setCompositionId(compositionId);
205         automationCompositionCreate.setInstanceId(UUID.randomUUID());
206
207         var acProvider = mock(AutomationCompositionProvider.class);
208         when(acProvider.createAutomationComposition(automationCompositionCreate))
209                 .thenReturn(automationCompositionCreate);
210
211         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
212                 acDefinitionProvider, null, null);
213
214         var instantiationResponse = instantiationProvider.createAutomationComposition(
215                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
216         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
217
218         when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
219                 .thenReturn(Optional.of(automationCompositionCreate));
220
221         assertThatThrownBy(
222                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
223                         .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
224     }
225
226     @Test
227     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
228         var acDefinitionProvider = mock(AcDefinitionProvider.class);
229         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
230         var compositionId = acDefinition.getCompositionId();
231         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
232         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
233                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
234         automationComposition.setCompositionId(compositionId);
235
236         var acProvider = mock(AutomationCompositionProvider.class);
237         var provider = new AutomationCompositionInstantiationProvider(acProvider,
238                 acDefinitionProvider, null, null);
239
240         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
241                 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
242
243         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
244                 .thenReturn(automationComposition);
245
246         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
247                 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
248     }
249
250     @Test
251     void testAcDefinitionNotFound() {
252         var automationComposition = InstantiationUtils
253                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
254
255         var acProvider = mock(AutomationCompositionProvider.class);
256         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
257                 .thenReturn(automationComposition);
258         var provider = new AutomationCompositionInstantiationProvider(acProvider,
259                 mock(AcDefinitionProvider.class), null, null);
260
261         var compositionId = automationComposition.getCompositionId();
262         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
263                 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
264
265         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
266                 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
267     }
268
269     @Test
270     void testCompositionIdDoNotMatch() {
271         var automationComposition = InstantiationUtils
272                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
273
274         var acProvider = mock(AutomationCompositionProvider.class);
275         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
276                 .thenReturn(automationComposition);
277         var provider = new AutomationCompositionInstantiationProvider(acProvider,
278                 mock(AcDefinitionProvider.class), null, null);
279
280         var compositionId = automationComposition.getCompositionId();
281         var wrongCompositionId = UUID.randomUUID();
282         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
283                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
284
285         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
286                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
287
288         assertThatThrownBy(
289                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
290                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
291         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
292                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
293                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
294     }
295
296     @Test
297     void testCompositionNotPrimed() {
298         var acDefinitionProvider = mock(AcDefinitionProvider.class);
299         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
300         var compositionId = acDefinition.getCompositionId();
301         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
302         var acProvider = mock(AutomationCompositionProvider.class);
303         var provider =
304                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null);
305
306         var automationComposition =
307                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
308         automationComposition.setCompositionId(compositionId);
309         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
310                 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
311                         + "  item \"ServiceTemplate\" value \"COMMISSIONED\" INVALID,"
312                         + " Commissioned automation composition definition not primed\n");
313     }
314
315     @Test
316     void testUpdateBadRequest() {
317         var automationComposition = InstantiationUtils
318                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
319
320         var acProvider = mock(AutomationCompositionProvider.class);
321         automationComposition.setDeployState(DeployState.DEPLOYED);
322         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
323                 .thenReturn(automationComposition);
324         var provider = new AutomationCompositionInstantiationProvider(acProvider,
325                 mock(AcDefinitionProvider.class), null, null);
326
327         assertThatThrownBy(() -> provider.updateAutomationComposition(automationComposition.getCompositionId(),
328                 automationComposition)).hasMessageMatching("Not allow to update for state in DEPLOYED");
329     }
330
331     @Test
332     void testCompositionInstanceState() {
333         var acDefinitionProvider = mock(AcDefinitionProvider.class);
334         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
335         var compositionId = acDefinition.getCompositionId();
336         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
337
338         var automationComposition = InstantiationUtils
339                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
340         var instanceId = UUID.randomUUID();
341         automationComposition.setCompositionId(compositionId);
342         automationComposition.setInstanceId(instanceId);
343         var acProvider = mock(AutomationCompositionProvider.class);
344         when(acProvider.getAutomationComposition(instanceId))
345                 .thenReturn(automationComposition);
346
347         var supervisionAcHandler = mock(SupervisionAcHandler.class);
348         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
349                 new AcInstanceStateResolver(), supervisionAcHandler);
350
351         var acInstanceStateUpdate = new AcInstanceStateUpdate();
352         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
353         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
354         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
355         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
356                 any(AutomationCompositionDefinition.class));
357
358         automationComposition.setDeployState(DeployState.DEPLOYED);
359         automationComposition.setLockState(LockState.LOCKED);
360         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
361         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
362         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
363                 any(AutomationCompositionDefinition.class));
364
365         automationComposition.setDeployState(DeployState.DEPLOYED);
366         automationComposition.setLockState(LockState.LOCKED);
367         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
368         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
369         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
370         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
371                 any(AutomationCompositionDefinition.class));
372
373         automationComposition.setDeployState(DeployState.DEPLOYED);
374         automationComposition.setLockState(LockState.UNLOCKED);
375         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
376         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
377         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
378         verify(supervisionAcHandler).lock(any(AutomationComposition.class),
379                 any(AutomationCompositionDefinition.class));
380     }
381 }