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