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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.acm.participant.sim.main.handler;
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;
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;
48 class AutomationCompositionElementHandlerTest {
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(),
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");
66 config.setDeploySuccess(false);
67 acElementHandler.deploy(compositionElement, instanceElement);
68 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
69 null, StateChangeResult.FAILED, "Deploy failed!");
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(),
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");
88 config.setUndeploySuccess(false);
89 acElementHandler.undeploy(compositionElement, instanceElement);
90 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
91 null, StateChangeResult.FAILED, "Undeploy failed!");
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(),
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");
110 config.setLockSuccess(false);
111 acElementHandler.lock(compositionElement, instanceElement);
112 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
113 StateChangeResult.FAILED, "Lock failed!");
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(),
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");
132 config.setUnlockSuccess(false);
133 acElementHandler.unlock(compositionElement, instanceElement);
134 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
135 StateChangeResult.FAILED, "Unlock failed!");
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(),
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");
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!");
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(),
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");
179 config.setDeleteSuccess(false);
180 acElementHandler.delete(compositionElement, instanceElement);
181 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
182 null, StateChangeResult.FAILED, "Delete failed!");
186 void testgetAutomationCompositions() throws PfModelException {
187 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
188 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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));
197 void testgetAutomationComposition() throws PfModelException {
198 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
199 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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);
208 void testsetOutProperties() {
209 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
210 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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");
218 acElementHandler.setOutProperties(instanceId, elementId, useState, operationalState, map);
219 verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
223 void testgetDataList() {
224 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
225 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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());
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,
250 config.setPrimeSuccess(false);
251 acElementHandler.prime(composition);
252 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
253 StateChangeResult.FAILED, "Prime failed!");
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");
269 config.setDeprimeSuccess(false);
270 acElementHandler.deprime(composition);
271 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
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,
288 acElementHandler.handleRestartComposition(composition, AcTypeState.PRIMED);
289 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
292 acElementHandler.handleRestartComposition(composition, AcTypeState.DEPRIMING);
293 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
294 StateChangeResult.NO_ERROR, "Deprimed");
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(),
309 acElementHandler.handleRestartInstance(compositionElement, instanceElement,
310 DeployState.DEPLOYING, LockState.NONE);
311 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
312 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
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");
319 acElementHandler.handleRestartInstance(compositionElement, instanceElement,
320 DeployState.UPDATING, LockState.LOCKED);
321 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
322 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Updated");
324 acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.UNDEPLOYING,
326 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
327 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
329 acElementHandler.handleRestartInstance(compositionElement, instanceElement,
330 DeployState.DELETING, LockState.NONE);
331 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
332 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
334 acElementHandler.handleRestartInstance(compositionElement, instanceElement,
335 DeployState.DEPLOYED, LockState.LOCKING);
336 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
337 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
339 acElementHandler.handleRestartInstance(compositionElement, instanceElement, DeployState.DEPLOYED,
340 LockState.UNLOCKING);
341 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null,
342 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
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);
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);
371 void testSetCompositionData() {
372 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
373 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
375 var compositionId = UUID.randomUUID();
376 acElementHandler.setCompositionOutProperties(compositionId, null, Map.of());
377 verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
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(),
389 var compositionElementTraget = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
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());
398 .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
399 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
400 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
402 config.setMigrateSuccess(false);
404 .migrate(compositionElement, compositionElementTraget, instanceElement, instanceElementMigrated);
405 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
406 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Migrate failed!");