ed3f0745b42f93bf55d8ab3e0ea73c28c8751bdf
[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 testgetAutomationComposition() 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 testsetOutProperties() {
177         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
178         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
179
180         var instanceId = UUID.randomUUID();
181         var elementId = UUID.randomUUID();
182         var useState = "useState";
183         var operationalState = "operationalState";
184         Map<String, Object> map = Map.of("id", "1234");
185
186         acElementHandler.setOutProperties(instanceId, elementId, useState, operationalState, map);
187         verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
188     }
189
190     @Test
191     void testgetDataList() {
192         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
193         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
194
195         var map = CommonTestData.getTestAutomationCompositionMap();
196         when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
197         var result = acElementHandler.getDataList();
198         var data = result.getList().get(0);
199         var automationcomposition = map.values().iterator().next();
200         assertEquals(automationcomposition.getInstanceId(), data.getAutomationCompositionId());
201         var element = automationcomposition.getElements().values().iterator().next();
202         assertEquals(element.getId(), data.getAutomationCompositionElementId());
203     }
204
205     @Test
206     void testPrime() throws PfModelException {
207         var config = new SimConfig();
208         config.setPrimeTimerMs(1);
209         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
210         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
211         acElementHandler.setConfig(config);
212         var compositionId = UUID.randomUUID();
213         acElementHandler.prime(compositionId, List.of());
214         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
215                 "Primed");
216
217         config.setPrimeSuccess(false);
218         acElementHandler.prime(compositionId, List.of());
219         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
220                 StateChangeResult.FAILED, "Prime failed!");
221     }
222
223     @Test
224     void testDeprime() throws PfModelException {
225         var config = new SimConfig();
226         config.setDeprimeTimerMs(1);
227         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
228         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
229         acElementHandler.setConfig(config);
230         var compositionId = UUID.randomUUID();
231         acElementHandler.deprime(compositionId);
232         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
233                 StateChangeResult.NO_ERROR, "Deprimed");
234
235         config.setDeprimeSuccess(false);
236         acElementHandler.deprime(compositionId);
237         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
238                 "Deprime failed!");
239     }
240
241     @Test
242     void testHandleRestartComposition() throws PfModelException {
243         var config = new SimConfig();
244         config.setPrimeTimerMs(1);
245         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
246         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
247         acElementHandler.setConfig(config);
248         var compositionId = UUID.randomUUID();
249         acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMING);
250         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
251                 "Primed");
252
253         acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMED);
254         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
255                 "Restarted");
256
257         acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.DEPRIMING);
258         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
259                 StateChangeResult.NO_ERROR, "Deprimed");
260     }
261
262     @Test
263     void testHandleRestartInstance() throws PfModelException {
264         var config = new SimConfig();
265         config.setDeployTimerMs(1);
266         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
267         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
268         acElementHandler.setConfig(config);
269         var instanceId = UUID.randomUUID();
270         var element = new AcElementDeploy();
271         element.setId(UUID.randomUUID());
272         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYING, LockState.NONE);
273         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
274                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
275
276         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED, LockState.LOCKED);
277         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
278                 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
279
280         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.UPDATING, LockState.LOCKED);
281         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
282                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
283
284         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.UNDEPLOYING,
285                 LockState.LOCKED);
286         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
287                 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
288
289         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DELETING, LockState.NONE);
290         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
291                 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
292
293         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED, LockState.LOCKING);
294         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(), null,
295                 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
296
297         acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.DEPLOYED,
298                 LockState.UNLOCKING);
299         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(), null,
300                 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
301     }
302
303     @Test
304     void testGetCompositionDataList() {
305         var acElementDefinition = new AutomationCompositionElementDefinition();
306         var toscaConceptIdentifier = new ToscaConceptIdentifier("code", "1.0.0");
307         acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
308         acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
309         Map<String, Object> outProperties = Map.of("code", "value");
310         Map<String, Object> inProperties = Map.of("key", "value");
311         acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(inProperties);
312         acElementDefinition.setOutProperties(outProperties);
313         var elementsDefinitions = Map.of(toscaConceptIdentifier, acElementDefinition);
314         var compositionId = UUID.randomUUID();
315         var map = Map.of(compositionId, elementsDefinitions);
316         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
317         when(intermediaryApi.getAcElementsDefinitions()).thenReturn(map);
318         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
319
320         var result = acElementHandler.getCompositionDataList();
321         assertThat(result.getList()).hasSize(1);
322         assertEquals(result.getList().get(0).getCompositionId(), compositionId);
323         assertEquals(result.getList().get(0).getCompositionDefinitionElementId(), toscaConceptIdentifier);
324         assertEquals(result.getList().get(0).getOutProperties(), outProperties);
325         assertEquals(result.getList().get(0).getIntProperties(), inProperties);
326     }
327
328     @Test
329     void testSetCompositionData() {
330         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
331         var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
332
333         var compositionId = UUID.randomUUID();
334         acElementHandler.setCompositionOutProperties(compositionId, null, Map.of());
335         verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
336     }
337 }