c521d37556fb1430b54eec1d3f7f9b3c59832ae8
[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.mockito.Mockito.mock;
24 import static org.mockito.Mockito.verify;
25
26 import java.util.Map;
27 import java.util.UUID;
28 import org.junit.jupiter.api.Test;
29 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
30 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
31 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
32 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
33 import org.onap.policy.clamp.acm.participant.sim.model.SimConfig;
34 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
35 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
36 import org.onap.policy.clamp.models.acm.concepts.DeployState;
37 import org.onap.policy.clamp.models.acm.concepts.LockState;
38 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
41
42 class AutomationCompositionElementHandlerV2Test {
43
44     @Test
45     void testDeploy() throws PfModelException {
46         var config = new SimConfig();
47         config.setDeployTimerMs(1);
48         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
49         var simulatorService = new SimulatorService(intermediaryApi);
50         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
51         simulatorService.setConfig(config);
52         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
53                 Map.of(), Map.of());
54         var instanceId = UUID.randomUUID();
55         var elementId = UUID.randomUUID();
56         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
57         acElementHandler.deploy(compositionElement, instanceElement);
58         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
59                 null, StateChangeResult.NO_ERROR, "Deployed");
60
61         config.setDeploySuccess(false);
62         acElementHandler.deploy(compositionElement, instanceElement);
63         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
64                 null, StateChangeResult.FAILED, "Deploy failed!");
65     }
66
67     @Test
68     void testUndeploy() throws PfModelException {
69         var config = new SimConfig();
70         config.setUndeployTimerMs(1);
71         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
72         var simulatorService = new SimulatorService(intermediaryApi);
73         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
74         simulatorService.setConfig(config);
75         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
76                 Map.of(), Map.of());
77         var instanceId = UUID.randomUUID();
78         var elementId = UUID.randomUUID();
79         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
80         acElementHandler.undeploy(compositionElement, instanceElement);
81         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
82                 null, StateChangeResult.NO_ERROR, "Undeployed");
83
84         config.setUndeploySuccess(false);
85         acElementHandler.undeploy(compositionElement, instanceElement);
86         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
87                 null, StateChangeResult.FAILED, "Undeploy failed!");
88     }
89
90     @Test
91     void testLock() throws PfModelException {
92         var config = new SimConfig();
93         config.setLockTimerMs(1);
94         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
95         var simulatorService = new SimulatorService(intermediaryApi);
96         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
97         simulatorService.setConfig(config);
98         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
99                 Map.of(), Map.of());
100         var instanceId = UUID.randomUUID();
101         var elementId = UUID.randomUUID();
102         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
103         acElementHandler.lock(compositionElement, instanceElement);
104         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
105                 StateChangeResult.NO_ERROR, "Locked");
106
107         config.setLockSuccess(false);
108         acElementHandler.lock(compositionElement, instanceElement);
109         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
110                 StateChangeResult.FAILED, "Lock failed!");
111     }
112
113     @Test
114     void testUnlock() throws PfModelException {
115         var config = new SimConfig();
116         config.setUnlockTimerMs(1);
117         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
118         var simulatorService = new SimulatorService(intermediaryApi);
119         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
120         simulatorService.setConfig(config);
121         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
122                 Map.of(), Map.of());
123         var instanceId = UUID.randomUUID();
124         var elementId = UUID.randomUUID();
125         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
126         acElementHandler.unlock(compositionElement, instanceElement);
127         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
128                 StateChangeResult.NO_ERROR, "Unlocked");
129
130         config.setUnlockSuccess(false);
131         acElementHandler.unlock(compositionElement, instanceElement);
132         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
133                 StateChangeResult.FAILED, "Unlock failed!");
134     }
135
136     @Test
137     void testUpdate() throws PfModelException {
138         var config = new SimConfig();
139         config.setUpdateTimerMs(1);
140         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
141         var simulatorService = new SimulatorService(intermediaryApi);
142         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
143         simulatorService.setConfig(config);
144         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
145                 Map.of(), Map.of());
146         var instanceId = UUID.randomUUID();
147         var element = new AcElementDeploy();
148         element.setId(UUID.randomUUID());
149         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
150         var instanceElementUpdated = new InstanceElementDto(instanceId, element.getId(), null,
151                 Map.of("key", "value"), Map.of());
152         acElementHandler.update(compositionElement, instanceElement, instanceElementUpdated);
153         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
154                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
155
156         config.setUpdateSuccess(false);
157         acElementHandler.update(compositionElement, instanceElement, instanceElementUpdated);
158         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
159                 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Update failed!");
160     }
161
162     @Test
163     void testDelete() throws PfModelException {
164         var config = new SimConfig();
165         config.setDeleteTimerMs(1);
166         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
167         var simulatorService = new SimulatorService(intermediaryApi);
168         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
169         simulatorService.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 testPrime() throws PfModelException {
187         var config = new SimConfig();
188         config.setPrimeTimerMs(1);
189         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
190         var simulatorService = new SimulatorService(intermediaryApi);
191         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
192         simulatorService.setConfig(config);
193         var compositionId = UUID.randomUUID();
194         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
195         acElementHandler.prime(composition);
196         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
197                 "Primed");
198
199         config.setPrimeSuccess(false);
200         acElementHandler.prime(composition);
201         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
202                 StateChangeResult.FAILED, "Prime failed!");
203     }
204
205     @Test
206     void testDeprime() throws PfModelException {
207         var config = new SimConfig();
208         config.setDeprimeTimerMs(1);
209         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
210         var simulatorService = new SimulatorService(intermediaryApi);
211         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
212         simulatorService.setConfig(config);
213         var compositionId = UUID.randomUUID();
214         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
215         acElementHandler.deprime(composition);
216         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
217                 StateChangeResult.NO_ERROR, "Deprimed");
218
219         config.setDeprimeSuccess(false);
220         acElementHandler.deprime(composition);
221         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
222                 "Deprime failed!");
223     }
224
225     @Test
226     void testHandleRestartComposition() throws PfModelException {
227         var config = new SimConfig();
228         config.setPrimeTimerMs(1);
229         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
230         var simulatorService = new SimulatorService(intermediaryApi);
231         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
232         simulatorService.setConfig(config);
233         var compositionId = UUID.randomUUID();
234         var composition = new CompositionDto(compositionId, Map.of(), Map.of());
235         acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMING);
236         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
237                 "Primed");
238
239         acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMED);
240         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
241                 "Restarted");
242
243         acElementHandler.handleRestartComposition(composition, AcTypeState.DEPRIMING);
244         verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
245                 StateChangeResult.NO_ERROR, "Deprimed");
246     }
247
248     @Test
249     void testHandleRestartInstance() throws PfModelException {
250         var config = new SimConfig();
251         config.setDeployTimerMs(1);
252         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
253         var simulatorService = new SimulatorService(intermediaryApi);
254         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
255         simulatorService.setConfig(config);
256         var instanceId = UUID.randomUUID();
257         var elementId = UUID.randomUUID();
258         var instanceElement = new InstanceElementDto(instanceId, elementId, null, Map.of(), Map.of());
259         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
260                 Map.of(), Map.of());
261         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
262                 DeployState.DEPLOYING, LockState.NONE);
263         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
264                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
265
266         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
267                 DeployState.DEPLOYED, LockState.LOCKED);
268         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
269                 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
270
271         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
272                 DeployState.UPDATING, LockState.LOCKED);
273         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
274                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
275
276         acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.UNDEPLOYING,
277                 LockState.LOCKED);
278         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
279                 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
280
281         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
282                 DeployState.DELETING, LockState.NONE);
283         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
284                 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
285
286         acElementHandler.handleRestartInstance(compositionElement, instanceElement,
287                 DeployState.DEPLOYED, LockState.LOCKING);
288         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
289                 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
290
291         acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.DEPLOYED,
292                 LockState.UNLOCKING);
293         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
294                 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
295     }
296
297
298
299     @Test
300     void testMigrate() throws PfModelException {
301         var config = new SimConfig();
302         config.setUpdateTimerMs(1);
303         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
304         var simulatorService = new SimulatorService(intermediaryApi);
305         var acElementHandler = new AutomationCompositionElementHandlerV2(intermediaryApi, simulatorService);
306         simulatorService.setConfig(config);
307         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
308                 Map.of(), Map.of());
309         var compositionElementTraget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
310                 Map.of(), Map.of());
311         var instanceId = UUID.randomUUID();
312         var element = new AcElementDeploy();
313         element.setId(UUID.randomUUID());
314         var instanceElement = new InstanceElementDto(instanceId, element.getId(), null, Map.of(), Map.of());
315         var instanceElementMigrated = new InstanceElementDto(instanceId, element.getId(),
316                 null, Map.of("key", "value"), Map.of());
317         acElementHandler
318                 .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
319         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
320                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
321
322         config.setMigrateSuccess(false);
323         acElementHandler
324                 .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
325         verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
326                 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");
327     }
328 }