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
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;
29 import java.util.List;
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;
46 class AutomationCompositionElementHandlerTest {
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");
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!");
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");
81 config.setUndeploySuccess(false);
82 acElementHandler.undeploy(instanceId, elementId);
83 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED,
84 null, StateChangeResult.FAILED, "Undeploy failed!");
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");
100 config.setLockSuccess(false);
101 acElementHandler.lock(instanceId, elementId);
102 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
103 StateChangeResult.FAILED, "Lock failed!");
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");
119 config.setUnlockSuccess(false);
120 acElementHandler.unlock(instanceId, elementId);
121 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
122 StateChangeResult.FAILED, "Unlock failed!");
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");
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!");
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");
158 config.setDeleteSuccess(false);
159 acElementHandler.delete(instanceId, elementId);
160 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED,
161 null, StateChangeResult.FAILED, "Delete failed!");
165 void testgetAutomationCompositions() throws PfModelException {
166 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
167 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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));
176 void testgetAutomationComposition() throws PfModelException {
177 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
178 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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);
187 void testsetOutProperties() {
188 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
189 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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");
197 acElementHandler.setOutProperties(instanceId, elementId, useState, operationalState, map);
198 verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
202 void testgetDataList() {
203 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
204 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
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());
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,
228 config.setPrimeSuccess(false);
229 acElementHandler.prime(compositionId, List.of());
230 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
231 StateChangeResult.FAILED, "Prime failed!");
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");
246 config.setDeprimeSuccess(false);
247 acElementHandler.deprime(compositionId);
248 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED,
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,
264 acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMED);
265 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR,
268 acElementHandler.handleRestartComposition(compositionId, List.of(), AcTypeState.DEPRIMING);
269 verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
270 StateChangeResult.NO_ERROR, "Deprimed");
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");
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");
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");
295 acElementHandler.handleRestartInstance(instanceId, element, Map.of(), DeployState.UNDEPLOYING,
297 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
298 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "Undeployed");
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");
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");
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");
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);
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);
340 void testSetCompositionData() {
341 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
342 var acElementHandler = new AutomationCompositionElementHandler(intermediaryApi);
344 var compositionId = UUID.randomUUID();
345 acElementHandler.setCompositionOutProperties(compositionId, null, Map.of());
346 verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
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");
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!");