2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023-2025 OpenInfra Foundation Europe. All rights reserved.
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.runtime.supervision;
23 import static org.junit.jupiter.api.Assertions.assertNotNull;
24 import static org.junit.jupiter.api.Assertions.assertThrows;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.anyBoolean;
27 import static org.mockito.ArgumentMatchers.anyInt;
28 import static org.mockito.Mockito.doCallRealMethod;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.timeout;
31 import static org.mockito.Mockito.times;
32 import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when;
34 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
36 import java.util.List;
38 import java.util.Optional;
39 import java.util.UUID;
40 import org.junit.jupiter.api.Test;
41 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
42 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
43 import org.onap.policy.clamp.acm.runtime.supervision.comm.AcElementPropertiesPublisher;
44 import org.onap.policy.clamp.acm.runtime.supervision.comm.AcPreparePublisher;
45 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
46 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher;
47 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
48 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
49 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
50 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
51 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
52 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
53 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
54 import org.onap.policy.clamp.models.acm.concepts.DeployState;
55 import org.onap.policy.clamp.models.acm.concepts.LockState;
56 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
57 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
58 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
59 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
60 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
61 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
62 import org.onap.policy.models.base.PfModelRuntimeException;
64 class SupervisionAcHandlerTest {
65 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
66 private static final String AC_INSTANTIATION_SIMPLE_JSON =
67 "src/test/resources/rest/acm/AutomationCompositionSimple.json";
68 private static final UUID IDENTIFIER = UUID.randomUUID();
71 void testAutomationCompositionDeployAckValidation() {
72 var automationComposition =
73 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
74 assertNotNull(automationComposition);
76 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
77 var messageProvider = mock(MessageProvider.class);
78 var handler = new SupervisionAcHandler(automationCompositionProvider,
79 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
80 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
81 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
83 automationComposition.setInstanceId(IDENTIFIER);
84 var automationCompositionAckMessage =
85 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
86 automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
87 automationCompositionAckMessage.setStateChangeResult(null);
88 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
90 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.TIMEOUT);
91 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
93 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
94 automationCompositionAckMessage.setAutomationCompositionId(null);
95 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
97 automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
98 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
100 automationCompositionAckMessage =
101 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
102 automationComposition, DeployState.DEPLOYING, LockState.UNLOCKED);
103 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
105 verify(messageProvider, times(0)).save(any(AutomationCompositionDeployAck.class));
107 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
108 .thenReturn(Optional.of(automationComposition));
109 automationCompositionAckMessage.setAutomationCompositionResultMap(null);
110 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
111 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
115 void testHandleAcMigrationWithStage() {
116 var automationComposition =
117 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
118 assertNotNull(automationComposition);
119 automationComposition.setInstanceId(IDENTIFIER);
120 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
121 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
122 .thenReturn(Optional.of(automationComposition));
123 var messageProvider = mock(MessageProvider.class);
125 var handler = new SupervisionAcHandler(automationCompositionProvider,
126 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
127 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
128 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
130 var automationCompositionAckMessage =
131 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
132 automationComposition, DeployState.MIGRATING, LockState.LOCKED);
133 automationCompositionAckMessage.setStage(1);
134 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
136 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
140 void testHandleAutomationCompositionStateChangeAckMessage() {
141 var automationComposition =
142 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
143 assertNotNull(automationComposition);
144 automationComposition.setInstanceId(IDENTIFIER);
145 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
146 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
147 .thenReturn(Optional.of(automationComposition));
148 var messageProvider = mock(MessageProvider.class);
150 var handler = new SupervisionAcHandler(automationCompositionProvider,
151 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
152 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
153 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
155 var automationCompositionAckMessage =
156 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
157 automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
158 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
160 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
163 private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType,
164 AutomationComposition automationComposition, DeployState deployState, LockState lockState) {
165 var automationCompositionAckMessage = new AutomationCompositionDeployAck(messageType);
166 for (var elementEntry : automationComposition.getElements().entrySet()) {
167 var acElementDeployAck = new AcElementDeployAck(deployState, lockState, "", "", Map.of(), true, "");
168 automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
171 automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
172 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
173 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
174 return automationCompositionAckMessage;
178 void testHandleAutomationCompositionUpdateAckMessage() {
179 var automationComposition =
180 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
181 assertNotNull(automationComposition);
182 automationComposition.setInstanceId(IDENTIFIER);
183 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
184 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
185 .thenReturn(Optional.of(automationComposition));
186 var messageProvider = mock(MessageProvider.class);
188 var automationCompositionAckMessage =
189 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
190 automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
191 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
193 var handler = new SupervisionAcHandler(automationCompositionProvider,
194 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
195 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
196 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
198 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
200 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
204 void testHandleAcUpdateAckFailedMessage() {
205 var automationComposition =
206 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
207 assertNotNull(automationComposition);
208 automationComposition.setDeployState(DeployState.DEPLOYING);
209 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
210 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
211 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
212 .thenReturn(Optional.of(automationComposition));
214 var automationCompositionAckMessage =
215 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
216 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
217 for (var element : automationComposition.getElements().values()) {
218 element.setDeployState(DeployState.DEPLOYED);
220 var elementEntry = automationComposition.getElements().entrySet().iterator().next();
221 elementEntry.getValue().setDeployState(DeployState.DEPLOYING);
222 var acElementDeployAck =
223 new AcElementDeployAck(DeployState.UNDEPLOYED, LockState.NONE, "", "", Map.of(), true, "Error");
224 automationCompositionAckMessage
225 .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
227 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
228 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
230 var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
231 var messageProvider = mock(MessageProvider.class);
233 var handler = new SupervisionAcHandler(automationCompositionProvider,
234 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher,
235 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
236 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
238 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
240 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
245 var automationComposition =
246 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
247 assertNotNull(automationComposition);
248 automationComposition.setDeployState(DeployState.UNDEPLOYED);
249 deploy(automationComposition);
253 void testDeployFailed() {
254 var automationComposition =
255 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
256 assertNotNull(automationComposition);
257 automationComposition.setDeployState(DeployState.UNDEPLOYING);
258 automationComposition.getElements().values()
259 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYING));
260 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
261 deploy(automationComposition);
263 automationComposition.setDeployState(DeployState.DEPLOYING);
264 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
265 automationComposition.getElements().values()
266 .forEach(element -> element.setDeployState(DeployState.DEPLOYING));
267 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.DEPLOYED);
268 deploy(automationComposition);
272 void testDeployFailedSimple() {
273 var automationComposition =
274 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_SIMPLE_JSON, "Deploy");
275 assertNotNull(automationComposition);
276 automationComposition.setDeployState(DeployState.UNDEPLOYED);
277 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.UNDEPLOYED);
278 deploy(automationComposition);
280 automationComposition.setDeployState(DeployState.UNDEPLOYING);
281 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
282 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.DEPLOYED);
283 deploy(automationComposition);
285 automationComposition.setDeployState(DeployState.DEPLOYING);
286 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
287 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.UNDEPLOYED);
288 deploy(automationComposition);
291 private void deploy(AutomationComposition automationComposition) {
292 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
293 var acProvider = mock(AutomationCompositionProvider.class);
294 var handler = new SupervisionAcHandler(acProvider, acDeployPublisher,
295 mock(AutomationCompositionStateChangePublisher.class),
296 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
297 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
298 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
299 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
300 handler.deploy(automationComposition, acDefinition);
301 verify(acProvider).updateAutomationComposition(automationComposition);
302 verify(acDeployPublisher, timeout(1000)).send(automationComposition, 0, true, acDefinition.getRevisionId());
306 void testUndeploy() {
307 var automationComposition =
308 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Undeploy");
309 assertNotNull(automationComposition);
310 automationComposition.setDeployState(DeployState.DEPLOYED);
311 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
312 automationComposition.getElements().values()
313 .forEach(element -> element.setDeployState(DeployState.DEPLOYED));
314 undeploy(automationComposition);
317 private void undeploy(AutomationComposition automationComposition) {
318 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
319 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
320 var handler = new SupervisionAcHandler(automationCompositionProvider,
321 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
322 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
323 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
324 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
325 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
326 handler.undeploy(automationComposition, acDefinition);
328 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
329 verify(acStateChangePublisher, timeout(1000))
330 .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
334 void testUndeployFailed() {
335 var automationComposition =
336 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnDeploy");
337 assertNotNull(automationComposition);
338 automationComposition.setDeployState(DeployState.DEPLOYING);
339 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
340 automationComposition.getElements().values()
341 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYED));
342 undeploy(automationComposition);
344 automationComposition.setDeployState(DeployState.UNDEPLOYING);
345 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
346 automationComposition.getElements().values()
347 .forEach(element -> element.setDeployState(DeployState.DEPLOYING));
348 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.UNDEPLOYED);
349 undeploy(automationComposition);
353 void testUndeployFailedSimple() {
354 var automationComposition =
355 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_SIMPLE_JSON, "UnDeploy");
356 assertNotNull(automationComposition);
357 automationComposition.setDeployState(DeployState.DEPLOYING);
358 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
359 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.UNDEPLOYED);
360 undeploy(automationComposition);
362 automationComposition.setDeployState(DeployState.UNDEPLOYING);
363 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
364 automationComposition.getElements().values().iterator().next().setDeployState(DeployState.DEPLOYED);
365 undeploy(automationComposition);
370 var automationComposition =
371 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
372 assertNotNull(automationComposition);
373 automationComposition.setLockState(LockState.LOCKED);
374 automationComposition.getElements().values()
375 .forEach(element -> element.setLockState(LockState.LOCKED));
376 unlock(automationComposition);
379 private void unlock(AutomationComposition automationComposition) {
380 var acProvider = mock(AutomationCompositionProvider.class);
381 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
382 var handler = new SupervisionAcHandler(acProvider,
383 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
384 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
385 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
386 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
387 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
388 handler.unlock(automationComposition, acDefinition);
390 verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
391 verify(acStateChangePublisher, timeout(1000))
392 .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
396 void testUnlockFailed() {
397 var automationComposition =
398 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
399 assertNotNull(automationComposition);
400 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
401 automationComposition.setLockState(LockState.LOCKING);
402 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
403 unlock(automationComposition);
405 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
406 automationComposition.setLockState(LockState.UNLOCKING);
407 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
408 automationComposition.getElements().values().iterator().next().setLockState(LockState.UNLOCKED);
409 unlock(automationComposition);
413 void testUnlockSimple() {
414 var automationComposition =
415 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_SIMPLE_JSON, "UnLock");
416 assertNotNull(automationComposition);
417 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
418 automationComposition.setLockState(LockState.LOCKING);
419 automationComposition.getElements().values().iterator().next().setLockState(LockState.UNLOCKED);
420 unlock(automationComposition);
422 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
423 automationComposition.setLockState(LockState.UNLOCKING);
424 automationComposition.getElements().values().iterator().next().setLockState(LockState.LOCKED);
425 unlock(automationComposition);
430 var automationComposition =
431 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
432 assertNotNull(automationComposition);
433 automationComposition.setLockState(LockState.UNLOCKED);
434 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKED));
435 lock(automationComposition);
438 private void lock(AutomationComposition automationComposition) {
439 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
440 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
441 var handler = new SupervisionAcHandler(automationCompositionProvider,
442 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
443 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
444 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
445 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
446 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
447 handler.lock(automationComposition, acDefinition);
449 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
450 verify(acStateChangePublisher, timeout(1000))
451 .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class));
455 void testLockFailed() {
456 var automationComposition =
457 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
458 assertNotNull(automationComposition);
459 automationComposition.setLockState(LockState.UNLOCKING);
460 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
461 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
462 lock(automationComposition);
464 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
465 automationComposition.setLockState(LockState.LOCKING);
466 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
467 automationComposition.getElements().values().iterator().next().setLockState(LockState.LOCKED);
468 lock(automationComposition);
472 void testLockSimple() {
473 var automationComposition =
474 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_SIMPLE_JSON, "Lock");
475 assertNotNull(automationComposition);
476 automationComposition.setLockState(LockState.UNLOCKING);
477 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
478 automationComposition.getElements().values().iterator().next().setLockState(LockState.LOCKED);
479 lock(automationComposition);
481 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
482 automationComposition.setLockState(LockState.LOCKING);
483 automationComposition.getElements().values().iterator().next().setLockState(LockState.UNLOCKED);
484 lock(automationComposition);
488 void testDeleteAck() {
489 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
490 var automationComposition =
491 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
492 assertNotNull(automationComposition);
493 automationComposition.setDeployState(DeployState.DELETING);
494 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
495 .thenReturn(Optional.of(automationComposition));
497 var automationCompositionAckMessage =
498 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
499 automationCompositionAckMessage
500 .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId());
501 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
502 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
503 var messageProvider = mock(MessageProvider.class);
505 var handler = new SupervisionAcHandler(automationCompositionProvider,
506 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
507 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
508 mock(AcPreparePublisher.class), messageProvider, mock(EncryptionUtils.class));
510 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
512 verify(messageProvider).save(any(AutomationCompositionDeployAck.class));
517 var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class);
518 var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class),
519 mock(AutomationCompositionDeployPublisher.class),
520 mock(AutomationCompositionStateChangePublisher.class), acElementPropertiesPublisher,
521 mock(AutomationCompositionMigrationPublisher.class),
522 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
523 var automationComposition =
524 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
525 handler.update(automationComposition, UUID.randomUUID());
526 verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class),
532 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
533 var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class);
534 var handler = new SupervisionAcHandler(automationCompositionProvider,
535 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
536 mock(AcElementPropertiesPublisher.class), acCompositionMigrationPublisher,
537 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
538 var automationComposition =
539 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
540 assert automationComposition != null;
541 automationComposition.setPhase(0);
542 handler.migrate(automationComposition, UUID.randomUUID(), UUID.randomUUID(), List.of());
543 verify(acCompositionMigrationPublisher, timeout(1000))
544 .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class), any());
548 void testMigratePrecheck() {
549 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
550 var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class);
551 var handler = new SupervisionAcHandler(automationCompositionProvider,
552 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
553 mock(AcElementPropertiesPublisher.class), acCompositionMigrationPublisher,
554 mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
555 var automationComposition =
556 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
557 handler.migratePrecheck(automationComposition, UUID.randomUUID(), UUID.randomUUID(), List.of());
558 verify(acCompositionMigrationPublisher, timeout(1000))
559 .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class), any());
564 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
565 var acPreparePublisher = mock(AcPreparePublisher.class);
566 var handler = new SupervisionAcHandler(automationCompositionProvider,
567 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
568 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
569 acPreparePublisher, mock(MessageProvider.class), mock(EncryptionUtils.class));
570 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
571 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
572 var automationComposition =
573 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
574 assertNotNull(automationComposition);
575 handler.prepare(automationComposition, acDefinition);
576 verify(acPreparePublisher, timeout(1000)).sendPrepare(any(AutomationComposition.class), anyInt(),
582 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
583 var acPreparePublisher = mock(AcPreparePublisher.class);
584 var handler = new SupervisionAcHandler(automationCompositionProvider,
585 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
586 mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class),
587 acPreparePublisher, mock(MessageProvider.class), mock(EncryptionUtils.class));
588 var automationComposition =
589 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
590 assertNotNull(automationComposition);
591 handler.review(automationComposition, new AutomationCompositionDefinition());
592 verify(acPreparePublisher, timeout(1000)).sendReview(any(AutomationComposition.class), any(UUID.class));
596 void testDeployWithInvalidElement_NewState() {
597 var elementNew = new AutomationCompositionElement();
598 elementNew.setDeployState(DeployState.UNDEPLOYED);
599 elementNew.setMigrationState(MigrationState.NEW);
601 var automationComposition =
602 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
603 assertNotNull(automationComposition);
604 automationComposition.setDeployState(DeployState.DEPLOYING);
605 automationComposition.getElements().put(elementNew.getParticipantId(), elementNew);
607 var mockHandler = mock(SupervisionAcHandler.class);
608 var acDefinition = new AutomationCompositionDefinition();
609 doCallRealMethod().when(mockHandler).deploy(automationComposition, acDefinition);
611 assertThrows(PfModelRuntimeException.class,
612 () -> mockHandler.deploy(automationComposition, acDefinition));
616 void testDeployWithInvalidElement_RemovedState() {
617 var elementRemoved = new AutomationCompositionElement();
618 elementRemoved.setDeployState(DeployState.UNDEPLOYED);
619 elementRemoved.setMigrationState(MigrationState.REMOVED);
621 var automationComposition =
622 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
623 assertNotNull(automationComposition);
624 automationComposition.setDeployState(DeployState.DEPLOYING);
625 automationComposition.getElements().put(elementRemoved.getParticipantId(), elementRemoved);
627 var mockHandler = mock(SupervisionAcHandler.class);
628 var acDefinition = new AutomationCompositionDefinition();
629 doCallRealMethod().when(mockHandler).deploy(automationComposition, acDefinition);
631 assertThrows(PfModelRuntimeException.class,
632 () -> mockHandler.deploy(automationComposition, acDefinition));