2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
4 * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.acm.runtime.instantiation;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.jupiter.api.Assertions.assertEquals;
27 import static org.junit.jupiter.api.Assertions.assertThrows;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.Mockito.doNothing;
30 import static org.mockito.Mockito.doThrow;
31 import static org.mockito.Mockito.mock;
32 import static org.mockito.Mockito.never;
33 import static org.mockito.Mockito.verify;
34 import static org.mockito.Mockito.when;
35 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
37 import jakarta.ws.rs.core.Response;
38 import jakarta.ws.rs.core.Response.Status;
39 import java.util.ArrayList;
40 import java.util.List;
41 import java.util.UUID;
42 import org.junit.jupiter.api.BeforeAll;
43 import org.junit.jupiter.api.Test;
44 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
45 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
46 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
47 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
48 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
49 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
50 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
51 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionRollback;
52 import org.onap.policy.clamp.models.acm.concepts.DeployState;
53 import org.onap.policy.clamp.models.acm.concepts.LockState;
54 import org.onap.policy.clamp.models.acm.concepts.MigrationState;
55 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
56 import org.onap.policy.clamp.models.acm.concepts.SubState;
57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
58 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
59 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
60 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.SubOrder;
61 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
62 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
63 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
64 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
65 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
66 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
67 import org.onap.policy.clamp.models.acm.utils.AcmStateUtils;
68 import org.onap.policy.models.base.PfModelRuntimeException;
69 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
70 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
71 import org.springframework.data.domain.Pageable;
74 * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
77 class AutomationCompositionInstantiationProviderTest {
79 public static final String MIGRATION_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase-migration.yaml";
80 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
81 private static final String AC_INSTANTIATION_UPDATE_JSON =
82 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
83 private static final String AC_MIGRATE_JSON = "src/test/resources/rest/acm/AutomationCompositionMigrate.json";
85 private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
86 "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
87 private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
88 "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
89 private static final String DELETE_BAD_REQUEST = "Not valid order DELETE;";
91 private static final String AC_ELEMENT_NAME_NOT_FOUND = """
92 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
93 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
95 private static final String AC_DEFINITION_NOT_FOUND = """
96 "AutomationComposition" INVALID, item has status INVALID
97 item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
100 private static final String DO_NOT_MATCH = " do not match with ";
102 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
103 private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
106 static void setUpBeforeClass() {
107 var st = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
108 var jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
109 serviceTemplate = jpa.toAuthorative();
111 st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
112 jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
113 serviceTemplateMigration = jpa.toAuthorative();
117 void testGetAutomationCompositionsWithNull() {
118 var instantiationProvider = new AutomationCompositionInstantiationProvider(
119 mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
120 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
121 CommonTestData.getTestParamaterGroup(), new EncryptionUtils(CommonTestData.getTestParamaterGroup()));
122 assertThatThrownBy(() -> instantiationProvider
123 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
124 .hasMessage("compositionId is marked non-null but is null");
125 assertThatThrownBy(() -> instantiationProvider
126 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
127 .hasMessage("pageable is marked non-null but is null");
131 void testInstantiationCrud() {
132 var acDefinitionProvider = mock(AcDefinitionProvider.class);
133 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
134 var compositionId = acDefinition.getCompositionId();
135 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
136 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
137 var acProvider = mock(AutomationCompositionProvider.class);
138 var supervisionAcHandler = mock(SupervisionAcHandler.class);
139 var participantProvider = mock(ParticipantProvider.class);
140 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
141 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
142 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
143 CommonTestData.getTestParamaterGroup(), encryptionUtils);
144 var automationCompositionCreate =
145 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
146 automationCompositionCreate.setCompositionId(compositionId);
147 when(acProvider.createAutomationComposition(automationCompositionCreate))
148 .thenReturn(automationCompositionCreate);
150 var instantiationResponse = instantiationProvider.createAutomationComposition(
151 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
152 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
154 verify(acProvider).createAutomationComposition(automationCompositionCreate);
156 assertEquals(StateChangeResult.NO_ERROR, acProvider.createAutomationComposition(automationCompositionCreate)
157 .getStateChangeResult());
159 when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
160 automationCompositionCreate.getVersion(), Pageable.unpaged()))
161 .thenReturn(List.of(automationCompositionCreate));
163 var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
164 automationCompositionCreate.getName(), automationCompositionCreate.getVersion(), Pageable.unpaged());
165 assertThat(automationCompositionCreate)
166 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
168 var automationCompositionUpdate =
169 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
170 automationCompositionUpdate.setCompositionId(compositionId);
171 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
172 .thenReturn(automationCompositionUpdate);
173 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
174 .thenReturn(automationCompositionUpdate);
176 instantiationResponse = instantiationProvider.updateAutomationComposition(
177 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
178 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
180 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
182 when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
183 .thenReturn(automationCompositionUpdate);
184 doNothing().when(participantProvider).verifyParticipantState(any());
185 instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
186 automationCompositionCreate.getInstanceId());
188 verify(supervisionAcHandler).delete(any(), any());
192 void testInstantiationUpdate() {
193 var acDefinitionProvider = mock(AcDefinitionProvider.class);
194 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
195 var compositionId = acDefinition.getCompositionId();
196 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
198 var automationCompositionUpdate =
199 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
200 automationCompositionUpdate.setCompositionId(compositionId);
201 automationCompositionUpdate.setInstanceId(UUID.randomUUID());
202 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
203 automationCompositionUpdate.setLockState(LockState.LOCKED);
204 var acProvider = mock(AutomationCompositionProvider.class);
205 var acmFromDb = new AutomationComposition(automationCompositionUpdate);
206 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
207 when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
209 var supervisionAcHandler = mock(SupervisionAcHandler.class);
210 var participantProvider = mock(ParticipantProvider.class);
211 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
212 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
213 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
214 CommonTestData.getTestParamaterGroup(), encryptionUtils);
216 var instantiationResponse = instantiationProvider.updateAutomationComposition(
217 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
219 verify(supervisionAcHandler).update(any(), any());
220 verify(acProvider).updateAutomationComposition(acmFromDb);
221 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
223 var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
224 automationCompositionUpdate.getElements().clear();
225 for (var element : elements) {
226 element.setId(UUID.randomUUID());
227 automationCompositionUpdate.getElements().put(element.getId(), element);
229 acmFromDb.getElements().values().forEach(element ->
230 element.setDeployState(DeployState.DEPLOYED));
231 acmFromDb.setDeployState(DeployState.DEPLOYED);
233 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
234 .hasMessageStartingWith("Element id not present ");
239 void testUpdateBadRequest() {
240 var acDefinitionProvider = mock(AcDefinitionProvider.class);
241 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
242 var compositionId = acDefinition.getCompositionId();
243 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
245 var automationCompositionUpdate =
246 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
247 automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
248 automationCompositionUpdate.setLockState(LockState.NONE);
249 automationCompositionUpdate.setCompositionId(compositionId);
250 var acProvider = mock(AutomationCompositionProvider.class);
251 var encryptionUtils = mock(EncryptionUtils.class);
252 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
253 .thenReturn(automationCompositionUpdate);
255 var instantiationProvider =
256 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
257 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class),
258 mock(ParticipantProvider.class),
259 mock(AcRuntimeParameterGroup.class), encryptionUtils);
263 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
265 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
267 automationCompositionUpdate.setDeployState(DeployState.UPDATING);
268 automationCompositionUpdate.setLockState(LockState.LOCKED);
269 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
271 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
273 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
277 void testMigrationAddRemoveElements() {
278 var acDefinitionProvider = mock(AcDefinitionProvider.class);
279 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
280 var compositionId = acDefinition.getCompositionId();
281 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
282 var instanceId = UUID.randomUUID();
284 var automationComposition =
285 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
286 automationComposition.setCompositionId(compositionId);
287 automationComposition.setInstanceId(instanceId);
288 automationComposition.setDeployState(DeployState.DEPLOYED);
289 automationComposition.setLockState(LockState.LOCKED);
290 var acProvider = mock(AutomationCompositionProvider.class);
291 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
292 .thenReturn(automationComposition);
294 var automationCompositionTarget =
295 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Migrate");
296 automationCompositionTarget.setInstanceId(instanceId);
297 automationCompositionTarget.setCompositionId(compositionId);
298 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
299 var compositionTargetId = acDefinitionTarget.getCompositionId();
300 automationCompositionTarget.setCompositionTargetId(compositionTargetId);
301 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
302 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
303 when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
305 var supervisionAcHandler = mock(SupervisionAcHandler.class);
306 var participantProvider = mock(ParticipantProvider.class);
307 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
308 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
309 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
310 new AcRuntimeParameterGroup(), encryptionUtils);
312 automationCompositionTarget.setPrecheck(true);
313 var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
314 automationCompositionTarget);
315 verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
316 InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
318 automationCompositionTarget.setPrecheck(false);
319 AcmStateUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
321 automationComposition.getElements().values()
322 .forEach(el -> el.setMigrationState(MigrationState.DEFAULT));
323 var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
324 automationCompositionTarget);
326 verify(supervisionAcHandler).migrate(any(), any(), any());
327 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
331 void testInstantiationMigration() {
332 var acDefinitionProvider = mock(AcDefinitionProvider.class);
333 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
334 var compositionId = acDefinition.getCompositionId();
335 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
337 var automationComposition =
338 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
339 automationComposition.setCompositionId(compositionId);
340 automationComposition.setDeployState(DeployState.DEPLOYED);
341 automationComposition.setLockState(LockState.LOCKED);
342 automationComposition.setCompositionTargetId(UUID.randomUUID());
343 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()))
344 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
345 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId())));
346 var acProvider = mock(AutomationCompositionProvider.class);
347 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
348 .thenReturn(automationComposition);
349 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
351 var supervisionAcHandler = mock(SupervisionAcHandler.class);
352 var participantProvider = mock(ParticipantProvider.class);
353 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
354 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
355 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
358 assertThatThrownBy(() -> instantiationProvider
359 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
361 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
363 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
364 var compositionTargetId = acDefinitionTarget.getCompositionId();
365 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
367 automationComposition.setCompositionTargetId(compositionTargetId);
369 var instantiationResponse = instantiationProvider
370 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
372 verify(supervisionAcHandler).migrate(any(), any(), any());
373 verify(acProvider).updateAutomationComposition(automationComposition);
374 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
378 void testInstantiationMigrationPrecheck() {
379 var acDefinitionProvider = mock(AcDefinitionProvider.class);
380 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
381 var compositionId = acDefinition.getCompositionId();
382 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
384 var automationComposition =
385 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
386 automationComposition.setCompositionId(compositionId);
387 automationComposition.setDeployState(DeployState.DEPLOYED);
388 automationComposition.setLockState(LockState.LOCKED);
389 automationComposition.setCompositionTargetId(UUID.randomUUID());
390 automationComposition.setPrecheck(true);
391 var acProvider = mock(AutomationCompositionProvider.class);
392 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
393 .thenReturn(automationComposition);
394 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
396 var supervisionAcHandler = mock(SupervisionAcHandler.class);
397 var acmParticipantProvider = mock(ParticipantProvider.class);
398 var encryptionUtils = mock(EncryptionUtils.class);
399 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
400 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider,
401 new AcRuntimeParameterGroup(), encryptionUtils);
403 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
404 var compositionTargetId = acDefinitionTarget.getCompositionId();
405 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
406 automationComposition.setCompositionTargetId(compositionTargetId);
408 var instantiationResponse = instantiationProvider
409 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
411 verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
412 verify(acProvider).updateAutomationComposition(automationComposition);
413 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
415 automationComposition.setSubState(SubState.NONE);
416 when(acDefinitionProvider.getAcDefinition(compositionTargetId))
417 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
418 String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
419 assertThatThrownBy(() -> instantiationProvider
420 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
421 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
425 void testMigrateBadRequest() {
426 var acDefinitionProvider = mock(AcDefinitionProvider.class);
427 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
428 var compositionId = acDefinition.getCompositionId();
429 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
431 var automationComposition =
432 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
433 automationComposition.setCompositionId(compositionId);
434 automationComposition.setDeployState(DeployState.DEPLOYED);
435 automationComposition.setLockState(LockState.LOCKED);
436 var acProvider = mock(AutomationCompositionProvider.class);
437 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
438 .thenReturn(automationComposition);
439 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
441 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
442 var compositionTargetId = acDefinitionTarget.getCompositionId();
443 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
445 var acMigrate = new AutomationComposition(automationComposition);
446 acMigrate.setCompositionTargetId(compositionTargetId);
447 automationComposition.setDeployState(DeployState.DEPLOYING);
449 var supervisionAcHandler = mock(SupervisionAcHandler.class);
450 var participantProvider = mock(ParticipantProvider.class);
451 var encryptionUtils = mock(EncryptionUtils.class);
452 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
453 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
454 new AcRuntimeParameterGroup(), encryptionUtils);
456 assertThatThrownBy(() -> instantiationProvider
457 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
458 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
462 void testMigratePreCheckBadRequest() {
463 var acDefinitionProvider = mock(AcDefinitionProvider.class);
464 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
465 var compositionId = acDefinition.getCompositionId();
466 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
468 var automationComposition =
469 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
470 automationComposition.setCompositionId(compositionId);
471 automationComposition.setDeployState(DeployState.DEPLOYED);
472 automationComposition.setLockState(LockState.LOCKED);
473 automationComposition.setPrecheck(true);
474 var acProvider = mock(AutomationCompositionProvider.class);
475 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
476 .thenReturn(automationComposition);
477 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
479 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
480 var compositionTargetId = acDefinitionTarget.getCompositionId();
481 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
483 var acMigrate = new AutomationComposition(automationComposition);
484 acMigrate.setCompositionTargetId(compositionTargetId);
485 automationComposition.setDeployState(DeployState.DEPLOYING);
486 automationComposition.setPrecheck(true);
488 var supervisionAcHandler = mock(SupervisionAcHandler.class);
489 var participantProvider = mock(ParticipantProvider.class);
490 var encryptionUtils = mock(EncryptionUtils.class);
491 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
492 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
493 new AcRuntimeParameterGroup(), encryptionUtils);
495 assertThatThrownBy(() -> instantiationProvider
496 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
497 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
501 void testInstantiationDelete() {
502 var automationComposition =
503 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
504 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
505 var acProvider = mock(AutomationCompositionProvider.class);
506 var acDefinitionProvider = mock(AcDefinitionProvider.class);
507 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
508 var compositionId = acDefinition.getCompositionId();
509 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
510 automationComposition.setCompositionId(compositionId);
511 var supervisionAcHandler = mock(SupervisionAcHandler.class);
512 var participantProvider = mock(ParticipantProvider.class);
513 var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
514 var encryptionUtils = mock(EncryptionUtils.class);
516 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
517 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
520 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
521 .thenReturn(automationComposition);
523 var wrongCompositionId = UUID.randomUUID();
524 var instanceId = automationComposition.getInstanceId();
525 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
526 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
528 automationComposition.setDeployState(DeployState.UNDEPLOYED);
529 automationComposition.setLockState(LockState.NONE);
530 when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
531 instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
532 verify(supervisionAcHandler).delete(any(), any());
536 void testInstantiationDeleteError() {
537 var automationComposition =
538 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
539 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
540 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
541 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
542 assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
543 assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
547 void testRollbackFailure() {
548 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
549 var compositionId = acDefinition.getCompositionId();
550 var automationComposition =
551 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
552 automationComposition.setCompositionId(compositionId);
553 automationComposition.setInstanceId(UUID.randomUUID());
554 automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
555 automationComposition.setCompositionTargetId(UUID.randomUUID());
557 var acProvider = mock(AutomationCompositionProvider.class);
558 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
559 .thenReturn(automationComposition);
560 var rollbackRecord = new JpaAutomationCompositionRollback();
561 when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
563 final var acDefinitionProvider = mock(AcDefinitionProvider.class);
564 final var supervisionAcHandler = mock(SupervisionAcHandler.class);
565 final var participantProvider = mock(ParticipantProvider.class);
566 final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
567 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
568 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
571 var instanceId = automationComposition.getInstanceId();
572 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
574 // DeployState != MIGRATION_REVERTING
575 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
576 .thenReturn(automationComposition);
577 when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
579 automationComposition.setDeployState(DeployState.DELETING);
580 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
583 automationComposition.setDeployState(DeployState.DEPLOYED);
584 automationComposition.setSubState(SubState.PREPARING);
585 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
587 // StateChangeResult != NO_ERROR
588 automationComposition.setSubState(SubState.NONE);
589 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
590 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
592 // !compositionId.equals(compId)
593 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
594 automationComposition.setCompositionId(UUID.randomUUID());
595 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
596 verify(acProvider, never()).updateAutomationComposition(any());
600 void testRollbackSuccess() {
601 var acDefinitionProvider = mock(AcDefinitionProvider.class);
602 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
603 var compositionId = acDefinition.getCompositionId();
604 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
606 var automationComposition =
607 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud");
608 var instanceId = UUID.randomUUID();
609 var compositionTargetId = UUID.randomUUID();
610 automationComposition.setInstanceId(instanceId);
611 automationComposition.setCompositionId(compositionId);
612 automationComposition.setCompositionTargetId(compositionTargetId);
613 automationComposition.setDeployState(DeployState.MIGRATING);
614 automationComposition.setLockState(LockState.LOCKED);
615 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
616 automationComposition.setSubState(SubState.NONE);
617 var acProvider = mock(AutomationCompositionProvider.class);
618 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
619 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
622 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
624 var rollbackRecord = new AutomationCompositionRollback();
625 rollbackRecord.setCompositionId(compositionTargetId);
626 rollbackRecord.setInstanceId(instanceId);
627 rollbackRecord.setElements(acRollback.getElements());
628 when(acProvider.getAutomationCompositionRollback(instanceId)).thenReturn(rollbackRecord);
630 var supervisionAcHandler = mock(SupervisionAcHandler.class);
631 var participantProvider = mock(ParticipantProvider.class);
632 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
633 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
634 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
636 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
637 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
639 instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
640 verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
642 when(acDefinitionProvider.getAcDefinition(compositionTargetId))
643 .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND,
644 String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
645 assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
646 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
649 private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
650 LockState lockState) {
651 automationComposition.setDeployState(deployState);
652 automationComposition.setLockState(lockState);
653 var acProvider = mock(AutomationCompositionProvider.class);
654 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
655 .thenReturn(automationComposition);
656 var acDefinitionProvider = mock(AcDefinitionProvider.class);
657 var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
659 var instantiationProvider =
660 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
661 new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
662 acRuntimeParamaterGroup, null);
664 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
665 var compositionId = acDefinition.getCompositionId();
666 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
667 automationComposition.setCompositionId(compositionId);
669 var instanceId = automationComposition.getInstanceId();
670 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
671 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
675 void testCreateAutomationCompositions_NoDuplicates() {
676 var acDefinitionProvider = mock(AcDefinitionProvider.class);
677 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
678 var compositionId = acDefinition.getCompositionId();
679 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
681 var automationCompositionCreate =
682 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
683 automationCompositionCreate.setCompositionId(compositionId);
684 automationCompositionCreate.setInstanceId(UUID.randomUUID());
686 var acProvider = mock(AutomationCompositionProvider.class);
687 when(acProvider.createAutomationComposition(automationCompositionCreate))
688 .thenReturn(automationCompositionCreate);
689 var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
690 var participantProvider = mock(ParticipantProvider.class);
691 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
693 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
694 null, null, participantProvider,
695 CommonTestData.getTestParamaterGroup(), encryptionUtils);
697 var instantiationResponse = instantiationProvider.createAutomationComposition(
698 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
699 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
701 doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
702 .when(acProvider).validateNameVersion(acIdentifier);
704 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
705 .hasMessageMatching(acIdentifier + " already defined");
709 void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
710 var acDefinitionProvider = mock(AcDefinitionProvider.class);
711 var participantProvider = mock(ParticipantProvider.class);
712 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
713 var compositionId = acDefinition.getCompositionId();
714 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
715 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
716 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
717 automationComposition.setCompositionId(compositionId);
719 var acProvider = mock(AutomationCompositionProvider.class);
720 var encryptionUtils = mock(EncryptionUtils.class);
721 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
722 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
724 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
725 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
727 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
728 .thenReturn(automationComposition);
730 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
731 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
735 void testAcDefinitionNotFound() {
736 var automationComposition = InstantiationUtils
737 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
739 var acProvider = mock(AutomationCompositionProvider.class);
740 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
741 .thenReturn(automationComposition);
742 var acDefinitionProvider = mock(AcDefinitionProvider.class);
743 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
745 mock(AcRuntimeParameterGroup.class), null);
747 var compositionId = automationComposition.getCompositionId();
748 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
749 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
750 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId())));
751 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
752 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
754 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
755 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
759 void testCompositionIdDoNotMatch() {
760 var automationComposition = InstantiationUtils
761 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
763 var acProvider = mock(AutomationCompositionProvider.class);
764 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
765 .thenReturn(automationComposition);
766 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
768 mock(AcRuntimeParameterGroup.class), null);
770 var compositionId = automationComposition.getCompositionId();
771 var wrongCompositionId = UUID.randomUUID();
772 assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
773 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
775 assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
776 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
779 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
780 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
781 assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
782 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
783 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
785 var compositionTargetId = UUID.randomUUID();
786 automationComposition.setCompositionTargetId(compositionTargetId);
788 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
789 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
791 var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
792 assertThat(result).isNotNull();
796 void testCompositionNotPrimed() {
797 var acDefinitionProvider = mock(AcDefinitionProvider.class);
798 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
799 var compositionId = acDefinition.getCompositionId();
800 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
801 var acProvider = mock(AutomationCompositionProvider.class);
803 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
806 var automationComposition =
807 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
808 automationComposition.setCompositionId(compositionId);
809 var message = compositionId + " Commissioned automation composition definition not primed";
811 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
812 .hasMessageMatching(message);
816 void testCompositionInstanceState() {
817 var acDefinitionProvider = mock(AcDefinitionProvider.class);
818 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
819 var compositionId = acDefinition.getCompositionId();
820 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
822 var automationComposition = InstantiationUtils
823 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
824 var instanceId = UUID.randomUUID();
825 automationComposition.setCompositionId(compositionId);
826 automationComposition.setInstanceId(instanceId);
827 var acProvider = mock(AutomationCompositionProvider.class);
828 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
830 var supervisionAcHandler = mock(SupervisionAcHandler.class);
831 var participantProvider = mock(ParticipantProvider.class);
832 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
833 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
834 mock(AcRuntimeParameterGroup.class), null);
836 var acInstanceStateUpdate = new AcInstanceStateUpdate();
837 acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
838 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
839 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
840 verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
841 any(AutomationCompositionDefinition.class));
843 automationComposition.setDeployState(DeployState.DEPLOYED);
844 automationComposition.setLockState(LockState.LOCKED);
845 acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
846 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
847 verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
848 any(AutomationCompositionDefinition.class));
850 automationComposition.setDeployState(DeployState.DEPLOYED);
851 automationComposition.setLockState(LockState.LOCKED);
852 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
853 acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
854 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
855 verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
856 any(AutomationCompositionDefinition.class));
858 automationComposition.setDeployState(DeployState.DEPLOYED);
859 automationComposition.setLockState(LockState.UNLOCKED);
860 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
861 acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
862 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
863 verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
865 automationComposition.setDeployState(DeployState.UNDEPLOYED);
866 automationComposition.setLockState(LockState.NONE);
867 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
868 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
869 acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
870 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
871 verify(supervisionAcHandler).prepare(any(AutomationComposition.class),
872 any(AutomationCompositionDefinition.class));
874 automationComposition.setDeployState(DeployState.DEPLOYED);
875 automationComposition.setLockState(LockState.LOCKED);
876 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
877 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
878 acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
879 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
880 verify(supervisionAcHandler).review(any(AutomationComposition.class),
881 any(AutomationCompositionDefinition.class));