d634053691cd2687630398bcd24632d09effdc12
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2023-2024 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.acm.participant.sim.main.handler;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
28
29 import java.util.Map;
30 import java.util.UUID;
31 import org.junit.jupiter.api.Test;
32 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
33 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
34 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
35 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
36 import org.onap.policy.clamp.acm.participant.sim.comm.CommonTestData;
37 import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
38 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
39 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
40 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
41 import org.onap.policy.clamp.models.acm.concepts.DeployState;
42 import org.onap.policy.clamp.models.acm.concepts.LockState;
43 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
44 import org.onap.policy.models.base.PfModelException;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
47
48 class AutomationCompositionElementHandlerTest {
49
50     @Test
51     void testDeploy() throws PfModelException {
52         var config = new SimConfig();
53         config.setDeployTimerMs(1);
54         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
55         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
56         acElementHandler.setConfig(config);
57         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
58             Map.of(), Map.of());
59         var instanceId = UUID.randomUUID();
60         var elementId = UUID.randomUUID();
61         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
62         acElementHandler.deploy(compositionElement, instanceElement);
63         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
64             null, StateChangeResult.NO_ERROR, "Deployed");
65
66         config.setDeploySuccess(false);
67         acElementHandler.deploy(compositionElement, instanceElement);
68         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
69             null, StateChangeResult.FAILED, "Deploy failed!");
70     }
71
72     @Test
73     void testUndeploy() throws PfModelException {
74         var config = new SimConfig();
75         config.setUndeployTimerMs(1);
76         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
77         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
78         acElementHandler.setConfig(config);
79         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
80             Map.of(), Map.of());
81         var instanceId = UUID.randomUUID();
82         var elementId = UUID.randomUUID();
83         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
84         acElementHandler.undeploy(compositionElement, instanceElement);
85         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
86                 null, StateChangeResult.NO_ERROR, "Undeployed");
87
88         config.setUndeploySuccess(false);
89         acElementHandler.undeploy(compositionElement, instanceElement);
90         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
91                 null, StateChangeResult.FAILED, "Undeploy failed!");
92     }
93
94     @Test
95     void testLock() throws PfModelException {
96         var config = new SimConfig();
97         config.setLockTimerMs(1);
98         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
99         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
100         acElementHandler.setConfig(config);
101         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
102             Map.of(), Map.of());
103         var instanceId = UUID.randomUUID();
104         var elementId = UUID.randomUUID();
105         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
106         acElementHandler.lock(compositionElement, instanceElement);
107         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
108                 StateChangeResult.NO_ERROR, "Locked");
109
110         config.setLockSuccess(false);
111         acElementHandler.lock(compositionElement, instanceElement);
112         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
113                 StateChangeResult.FAILED, "Lock failed!");
114     }
115
116     @Test
117     void testUnlock() throws PfModelException {
118         var config = new SimConfig();
119         config.setUnlockTimerMs(1);
120         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
121         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
122         acElementHandler.setConfig(config);
123         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
124             Map.of(), Map.of());
125         var instanceId = UUID.randomUUID();
126         var elementId = UUID.randomUUID();
127         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
128         acElementHandler.unlock(compositionElement, instanceElement);
129         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
130                 StateChangeResult.NO_ERROR, "Unlocked");
131
132         config.setUnlockSuccess(false);
133         acElementHandler.unlock(compositionElement, instanceElement);
134         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
135                 StateChangeResult.FAILED, "Unlock failed!");
136     }
137
138     @Test
139     void testUpdate() throws PfModelException {
140         var config = new SimConfig();
141         config.setUpdateTimerMs(1);
142         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
143         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
144         acElementHandler.setConfig(config);
145         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
146             Map.of(), Map.of());
147         var instanceId = UUID.randomUUID();
148         var element = new AcElementDeploy();
149         element.setId(UUID.randomUUID());
150         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
151         var instanceElementUpdated = new InstanceElementDto(instanceId, element.getId(), null,
152             Map.of("key", "value"), Map.of());
153         acElementHandler.update(compositionElement, instanceElement, instanceElementUpdated);
154         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
155                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
156
157         config.setUpdateSuccess(false);
158         acElementHandler.update(compositionElement, instanceElement, instanceElementUpdated);
159         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
160                 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
161     }
162
163     @Test
164     void testDelete() throws PfModelException {
165         var config = new SimConfig();
166         config.setDeleteTimerMs(1);
167         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
168         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
169         acElementHandler.setConfig(config);
170         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
171             Map.of(), Map.of());
172         var instanceId = UUID.randomUUID();
173         var elementId = UUID.randomUUID();
174         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
175         acElementHandler.delete(compositionElement, instanceElement);
176         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED,
177                 null, StateChangeResult.NO_ERROR, "Deleted");
178
179         config.setDeleteSuccess(false);
180         acElementHandler.delete(compositionElement, instanceElement);
181         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
182                 null, StateChangeResult.FAILED, "Delete failed!");
183     }
184
185     @Test
186     void testgetAutomationCompositions() throws PfModelException {
187         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
188         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
189
190         var map = CommonTestData.getTestAutomationCompositionMap();
191         when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
192         var result = acElementHandler.getAutomationCompositions();
193         assertEquals(map.values().iterator().next(), result.getAutomationCompositionList().get(0));
194     }
195
196     @Test
197     void testgetAutomationComposition() throws PfModelException {
198         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
199         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
200
201         var instance = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
202         when(intermediaryApi.getAutomationComposition(instance.getInstanceId())).thenReturn(instance);
203         var result = acElementHandler.getAutomationComposition(instance.getInstanceId());
204         assertEquals(instance, result);
205     }
206
207     @Test
208     void testsetOutProperties() {
209         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
210         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
211
212         var instanceId = UUID.randomUUID();
213         var elementId = UUID.randomUUID();
214         var useState = "useState";
215         var operationalState = "operationalState";
216         Map<String, Object> map = Map.of("id", "1234");
217
218         acElementHandler.setOutProperties(instanceId, elementId, useState, operationalState, map);
219         verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
220     }
221
222     @Test
223     void testgetDataList() {
224         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
225         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
226
227         var map = CommonTestData.getTestAutomationCompositionMap();
228         when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
229         var result = acElementHandler.getDataList();
230         var data = result.getList().get(0);
231         var automationcomposition = map.values().iterator().next();
232         assertEquals(automationcomposition.getInstanceId(), data.getAutomationCompositionId());
233         var element = automationcomposition.getElements().values().iterator().next();
234         assertEquals(element.getId(), data.getAutomationCompositionElementId());
235     }
236
237     @Test
238     void testPrime() throws PfModelException {
239         var config = new SimConfig();
240         config.setPrimeTimerMs(1);
241         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
242         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
243         acElementHandler.setConfig(config);
244         var compositionId = UUID.randomUUID();
245         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
246         acElementHandler.prime(composition);
247         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
248                 "Primed");
249
250         config.setPrimeSuccess(false);
251         acElementHandler.prime(composition);
252         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
253                 StateChangeResult.FAILED, "Prime failed!");
254     }
255
256     @Test
257     void testDeprime() throws PfModelException {
258         var config = new SimConfig();
259         config.setDeprimeTimerMs(1);
260         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
261         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
262         acElementHandler.setConfig(config);
263         var compositionId = UUID.randomUUID();
264         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
265         acElementHandler.deprime(composition);
266         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
267                 StateChangeResult.NO_ERROR, "Deprimed");
268
269         config.setDeprimeSuccess(false);
270         acElementHandler.deprime(composition);
271         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
272                 "Deprime failed!");
273     }
274
275     @Test
276     void testHandleRestartComposition() throws PfModelException {
277         var config = new SimConfig();
278         config.setPrimeTimerMs(1);
279         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
280         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
281         acElementHandler.setConfig(config);
282         var compositionId = UUID.randomUUID();
283         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
284         acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMING);
285         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
286                 "Primed");
287
288         acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMED);
289         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
290                 "Restarted");
291
292         acElementHandler.handleRestartComposition(composition, AcTypeState.DEPRIMING);
293         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
294                 StateChangeResult.NO_ERROR, "Deprimed");
295     }
296
297     @Test
298     void testHandleRestartInstance() throws PfModelException {
299         var config = new SimConfig();
300         config.setDeployTimerMs(1);
301         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
302         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
303         acElementHandler.setConfig(config);
304         var instanceId = UUID.randomUUID();
305         var elementId = UUID.randomUUID();
306         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
307         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
308             Map.of(), Map.of());
309         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
310             DeployState.DEPLOYING, LockState.NONE);
311         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
312                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
313
314         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
315             DeployState.DEPLOYED, LockState.LOCKED);
316         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
317                 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
318
319         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
320             DeployState.UPDATING, LockState.LOCKED);
321         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
322                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
323
324         acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.UNDEPLOYING,
325                 LockState.LOCKED);
326         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
327                 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
328
329         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
330             DeployState.DELETING, LockState.NONE);
331         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
332                 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
333
334         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
335             DeployState.DEPLOYED, LockState.LOCKING);
336         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
337                 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
338
339         acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.DEPLOYED,
340                 LockState.UNLOCKING);
341         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
342                 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
343     }
344
345     @Test
346     void testGetCompositionDataList() {
347         var acElementDefinition = new AutomationCompositionElementDefinition();
348         var toscaConceptIdentifier = new ToscaConceptIdentifier("code", "1.0.0");
349         acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
350         acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
351         Map<String, Object> outProperties = Map.of("code", "value");
352         Map<String, Object> inProperties = Map.of("key", "value");
353         acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(inProperties);
354         acElementDefinition.setOutProperties(outProperties);
355         var elementsDefinitions = Map.of(toscaConceptIdentifier, acElementDefinition);
356         var compositionId = UUID.randomUUID();
357         var map = Map.of(compositionId, elementsDefinitions);
358         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
359         when(intermediaryApi.getAcElementsDefinitions()).thenReturn(map);
360         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
361
362         var result = acElementHandler.getCompositionDataList();
363         assertThat(result.getList()).hasSize(1);
364         assertEquals(result.getList().get(0).getCompositionId(), compositionId);
365         assertEquals(result.getList().get(0).getCompositionDefinitionElementId(), toscaConceptIdentifier);
366         assertEquals(result.getList().get(0).getOutProperties(), outProperties);
367         assertEquals(result.getList().get(0).getIntProperties(), inProperties);
368     }
369
370     @Test
371     void testSetCompositionData() {
372         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
373         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
374
375         var compositionId = UUID.randomUUID();
376         acElementHandler.setCompositionOutProperties(compositionId, null, Map.of());
377         verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
378     }
379
380     @Test
381     void testMigrate() throws PfModelException {
382         var config = new SimConfig();
383         config.setUpdateTimerMs(1);
384         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
385         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
386         acElementHandler.setConfig(config);
387         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
388             Map.of(), Map.of());
389         var compositionElementTraget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
390             Map.of(), Map.of());
391         var instanceId = UUID.randomUUID();
392         var element = new AcElementDeploy();
393         element.setId(UUID.randomUUID());
394         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
395         var instanceElementMigrated = new InstanceElementDto(instanceId, element.getId(),
396             null, Map.of("key", "value"), Map.of());
397         acElementHandler
398             .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
399         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
400                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
401
402         config.setMigrateSuccess(false);
403         acElementHandler
404             .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
405         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
406                 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
407     }
408 }