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.StateChangeResult;
55 import org.onap.policy.clamp.models.acm.concepts.SubState;
56 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
58 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
59 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.SubOrder;
60 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
61 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
62 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
63 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
64 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
65 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
66 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
67 import org.onap.policy.models.base.PfModelRuntimeException;
68 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
69 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
70 import org.springframework.data.domain.Pageable;
73 * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
76 class AutomationCompositionInstantiationProviderTest {
78 public static final String MIGRATION_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase-migration.yaml";
79 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
80 private static final String AC_INSTANTIATION_UPDATE_JSON =
81 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
82 private static final String AC_MIGRATE_JSON = "src/test/resources/rest/acm/AutomationCompositionMigrate.json";
84 private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
85 "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
86 private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
87 "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
88 private static final String DELETE_BAD_REQUEST = "Not valid order DELETE;";
90 private static final String AC_ELEMENT_NAME_NOT_FOUND = """
91 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
92 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
94 private static final String AC_DEFINITION_NOT_FOUND = """
95 "AutomationComposition" INVALID, item has status INVALID
96 item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
99 private static final String DO_NOT_MATCH = " do not match with ";
101 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
102 private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
105 static void setUpBeforeClass() {
106 var st = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
107 var jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
108 serviceTemplate = jpa.toAuthorative();
110 st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
111 jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
112 serviceTemplateMigration = jpa.toAuthorative();
116 void testGetAutomationCompositionsWithNull() {
117 var instantiationProvider = new AutomationCompositionInstantiationProvider(
118 mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
119 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
120 CommonTestData.getTestParamaterGroup(), new EncryptionUtils(CommonTestData.getTestParamaterGroup()));
121 assertThatThrownBy(() -> instantiationProvider
122 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
123 .hasMessage("compositionId is marked non-null but is null");
124 assertThatThrownBy(() -> instantiationProvider
125 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
126 .hasMessage("pageable is marked non-null but is null");
130 void testInstantiationCrud() {
131 var acDefinitionProvider = mock(AcDefinitionProvider.class);
132 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
133 var compositionId = acDefinition.getCompositionId();
134 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
135 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
136 var acProvider = mock(AutomationCompositionProvider.class);
137 var supervisionAcHandler = mock(SupervisionAcHandler.class);
138 var participantProvider = mock(ParticipantProvider.class);
139 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
140 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
141 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
142 CommonTestData.getTestParamaterGroup(), encryptionUtils);
143 var automationCompositionCreate =
144 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
145 automationCompositionCreate.setCompositionId(compositionId);
146 when(acProvider.createAutomationComposition(automationCompositionCreate))
147 .thenReturn(automationCompositionCreate);
149 var instantiationResponse = instantiationProvider.createAutomationComposition(
150 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
151 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
153 verify(acProvider).createAutomationComposition(automationCompositionCreate);
155 assertEquals(StateChangeResult.NO_ERROR, acProvider.createAutomationComposition(automationCompositionCreate)
156 .getStateChangeResult());
158 when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
159 automationCompositionCreate.getVersion(), Pageable.unpaged()))
160 .thenReturn(List.of(automationCompositionCreate));
162 var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
163 automationCompositionCreate.getName(), automationCompositionCreate.getVersion(), Pageable.unpaged());
164 assertThat(automationCompositionCreate)
165 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
167 var automationCompositionUpdate =
168 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
169 automationCompositionUpdate.setCompositionId(compositionId);
170 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
171 .thenReturn(automationCompositionUpdate);
172 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
173 .thenReturn(automationCompositionUpdate);
175 instantiationResponse = instantiationProvider.updateAutomationComposition(
176 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
177 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
179 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
181 when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
182 .thenReturn(automationCompositionUpdate);
183 doNothing().when(participantProvider).verifyParticipantState(any());
184 instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
185 automationCompositionCreate.getInstanceId());
187 verify(supervisionAcHandler).delete(any(), any());
191 void testInstantiationUpdate() {
192 var acDefinitionProvider = mock(AcDefinitionProvider.class);
193 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
194 var compositionId = acDefinition.getCompositionId();
195 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
197 var automationCompositionUpdate =
198 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
199 automationCompositionUpdate.setCompositionId(compositionId);
200 automationCompositionUpdate.setInstanceId(UUID.randomUUID());
201 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
202 automationCompositionUpdate.setLockState(LockState.LOCKED);
203 var acProvider = mock(AutomationCompositionProvider.class);
204 var acmFromDb = new AutomationComposition(automationCompositionUpdate);
205 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
206 when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
208 var supervisionAcHandler = mock(SupervisionAcHandler.class);
209 var participantProvider = mock(ParticipantProvider.class);
210 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
211 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
212 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
213 CommonTestData.getTestParamaterGroup(), encryptionUtils);
215 var instantiationResponse = instantiationProvider.updateAutomationComposition(
216 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
218 verify(supervisionAcHandler).update(any(), any());
219 verify(acProvider).updateAutomationComposition(acmFromDb);
220 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
222 var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
223 automationCompositionUpdate.getElements().clear();
224 for (var element : elements) {
225 element.setId(UUID.randomUUID());
226 automationCompositionUpdate.getElements().put(element.getId(), element);
228 acmFromDb.getElements().values().forEach(element ->
229 element.setDeployState(DeployState.DEPLOYED));
230 acmFromDb.setDeployState(DeployState.DEPLOYED);
232 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
233 .hasMessageStartingWith("Element id not present ");
238 void testUpdateBadRequest() {
239 var acDefinitionProvider = mock(AcDefinitionProvider.class);
240 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
241 var compositionId = acDefinition.getCompositionId();
242 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
244 var automationCompositionUpdate =
245 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
246 automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
247 automationCompositionUpdate.setLockState(LockState.NONE);
248 automationCompositionUpdate.setCompositionId(compositionId);
249 var acProvider = mock(AutomationCompositionProvider.class);
250 var encryptionUtils = mock(EncryptionUtils.class);
251 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
252 .thenReturn(automationCompositionUpdate);
254 var instantiationProvider =
255 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
256 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class),
257 mock(ParticipantProvider.class),
258 mock(AcRuntimeParameterGroup.class), encryptionUtils);
262 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
264 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
266 automationCompositionUpdate.setDeployState(DeployState.UPDATING);
267 automationCompositionUpdate.setLockState(LockState.LOCKED);
268 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
270 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
272 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
276 void testMigrationAddRemoveElements() {
277 var acDefinitionProvider = mock(AcDefinitionProvider.class);
278 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
279 var compositionId = acDefinition.getCompositionId();
280 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
281 var instanceId = UUID.randomUUID();
283 var automationComposition =
284 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
285 automationComposition.setCompositionId(compositionId);
286 automationComposition.setInstanceId(instanceId);
287 automationComposition.setDeployState(DeployState.DEPLOYED);
288 automationComposition.setLockState(LockState.LOCKED);
289 var acProvider = mock(AutomationCompositionProvider.class);
290 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
291 .thenReturn(automationComposition);
293 var automationCompositionTarget =
294 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Migrate");
295 automationCompositionTarget.setInstanceId(instanceId);
296 automationCompositionTarget.setCompositionId(compositionId);
297 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
298 var compositionTargetId = acDefinitionTarget.getCompositionId();
299 automationCompositionTarget.setCompositionTargetId(compositionTargetId);
300 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
301 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
302 when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
304 var supervisionAcHandler = mock(SupervisionAcHandler.class);
305 var participantProvider = mock(ParticipantProvider.class);
306 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
307 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
308 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
309 new AcRuntimeParameterGroup(), encryptionUtils);
311 automationCompositionTarget.setPrecheck(true);
312 var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
313 automationCompositionTarget);
314 verify(supervisionAcHandler).migratePrecheck(any(), any(), any(), any());
315 InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
317 automationCompositionTarget.setPrecheck(false);
318 AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
320 var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
321 automationCompositionTarget);
323 verify(supervisionAcHandler).migrate(any(), any(), any(), any());
324 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
328 void testInstantiationMigration() {
329 var acDefinitionProvider = mock(AcDefinitionProvider.class);
330 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
331 var compositionId = acDefinition.getCompositionId();
332 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
334 var automationComposition =
335 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
336 automationComposition.setCompositionId(compositionId);
337 automationComposition.setDeployState(DeployState.DEPLOYED);
338 automationComposition.setLockState(LockState.LOCKED);
339 automationComposition.setCompositionTargetId(UUID.randomUUID());
340 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()))
341 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
342 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId())));
343 var acProvider = mock(AutomationCompositionProvider.class);
344 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
345 .thenReturn(automationComposition);
346 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
348 var supervisionAcHandler = mock(SupervisionAcHandler.class);
349 var participantProvider = mock(ParticipantProvider.class);
350 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
351 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
352 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
355 assertThatThrownBy(() -> instantiationProvider
356 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
358 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
360 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
361 var compositionTargetId = acDefinitionTarget.getCompositionId();
362 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
364 automationComposition.setCompositionTargetId(compositionTargetId);
366 var instantiationResponse = instantiationProvider
367 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
369 verify(supervisionAcHandler).migrate(any(), any(), any(), any());
370 verify(acProvider).updateAutomationComposition(automationComposition);
371 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
375 void testInstantiationMigrationPrecheck() {
376 var acDefinitionProvider = mock(AcDefinitionProvider.class);
377 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
378 var compositionId = acDefinition.getCompositionId();
379 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
381 var automationComposition =
382 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
383 automationComposition.setCompositionId(compositionId);
384 automationComposition.setDeployState(DeployState.DEPLOYED);
385 automationComposition.setLockState(LockState.LOCKED);
386 automationComposition.setCompositionTargetId(UUID.randomUUID());
387 automationComposition.setPrecheck(true);
388 var acProvider = mock(AutomationCompositionProvider.class);
389 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
390 .thenReturn(automationComposition);
391 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
393 var supervisionAcHandler = mock(SupervisionAcHandler.class);
394 var acmParticipantProvider = mock(ParticipantProvider.class);
395 var encryptionUtils = mock(EncryptionUtils.class);
396 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
397 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider,
398 new AcRuntimeParameterGroup(), encryptionUtils);
400 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
401 var compositionTargetId = acDefinitionTarget.getCompositionId();
402 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
403 automationComposition.setCompositionTargetId(compositionTargetId);
405 var instantiationResponse = instantiationProvider
406 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
408 verify(supervisionAcHandler).migratePrecheck(any(), any(), any(), any());
409 verify(acProvider).updateAutomationComposition(automationComposition);
410 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
412 automationComposition.setSubState(SubState.NONE);
413 when(acDefinitionProvider.getAcDefinition(compositionTargetId))
414 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
415 String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
416 assertThatThrownBy(() -> instantiationProvider
417 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
418 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
422 void testMigrateBadRequest() {
423 var acDefinitionProvider = mock(AcDefinitionProvider.class);
424 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
425 var compositionId = acDefinition.getCompositionId();
426 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
428 var automationComposition =
429 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
430 automationComposition.setCompositionId(compositionId);
431 automationComposition.setDeployState(DeployState.DEPLOYED);
432 automationComposition.setLockState(LockState.LOCKED);
433 var acProvider = mock(AutomationCompositionProvider.class);
434 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
435 .thenReturn(automationComposition);
436 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
438 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
439 var compositionTargetId = acDefinitionTarget.getCompositionId();
440 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
442 var acMigrate = new AutomationComposition(automationComposition);
443 acMigrate.setCompositionTargetId(compositionTargetId);
444 automationComposition.setDeployState(DeployState.DEPLOYING);
446 var supervisionAcHandler = mock(SupervisionAcHandler.class);
447 var participantProvider = mock(ParticipantProvider.class);
448 var encryptionUtils = mock(EncryptionUtils.class);
449 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
450 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
451 new AcRuntimeParameterGroup(), encryptionUtils);
453 assertThatThrownBy(() -> instantiationProvider
454 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
455 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
459 void testMigratePreCheckBadRequest() {
460 var acDefinitionProvider = mock(AcDefinitionProvider.class);
461 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
462 var compositionId = acDefinition.getCompositionId();
463 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
465 var automationComposition =
466 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
467 automationComposition.setCompositionId(compositionId);
468 automationComposition.setDeployState(DeployState.DEPLOYED);
469 automationComposition.setLockState(LockState.LOCKED);
470 automationComposition.setPrecheck(true);
471 var acProvider = mock(AutomationCompositionProvider.class);
472 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
473 .thenReturn(automationComposition);
474 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
476 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
477 var compositionTargetId = acDefinitionTarget.getCompositionId();
478 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
480 var acMigrate = new AutomationComposition(automationComposition);
481 acMigrate.setCompositionTargetId(compositionTargetId);
482 automationComposition.setDeployState(DeployState.DEPLOYING);
483 automationComposition.setPrecheck(true);
485 var supervisionAcHandler = mock(SupervisionAcHandler.class);
486 var participantProvider = mock(ParticipantProvider.class);
487 var encryptionUtils = mock(EncryptionUtils.class);
488 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
489 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
490 new AcRuntimeParameterGroup(), encryptionUtils);
492 assertThatThrownBy(() -> instantiationProvider
493 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
494 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
498 void testInstantiationDelete() {
499 var automationComposition =
500 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
501 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
502 var acProvider = mock(AutomationCompositionProvider.class);
503 var acDefinitionProvider = mock(AcDefinitionProvider.class);
504 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
505 var compositionId = acDefinition.getCompositionId();
506 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
507 automationComposition.setCompositionId(compositionId);
508 var supervisionAcHandler = mock(SupervisionAcHandler.class);
509 var participantProvider = mock(ParticipantProvider.class);
510 var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
511 var encryptionUtils = mock(EncryptionUtils.class);
513 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
514 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
517 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
518 .thenReturn(automationComposition);
520 var wrongCompositionId = UUID.randomUUID();
521 var instanceId = automationComposition.getInstanceId();
522 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
523 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
525 automationComposition.setDeployState(DeployState.UNDEPLOYED);
526 automationComposition.setLockState(LockState.NONE);
527 when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
528 instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
529 verify(supervisionAcHandler).delete(any(), any());
533 void testInstantiationDeleteError() {
534 var automationComposition =
535 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
536 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
537 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
538 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
539 assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
540 assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
544 void testRollbackFailure() {
545 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
546 var compositionId = acDefinition.getCompositionId();
547 var automationComposition =
548 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
549 automationComposition.setCompositionId(compositionId);
550 automationComposition.setInstanceId(UUID.randomUUID());
551 automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
552 automationComposition.setCompositionTargetId(UUID.randomUUID());
554 var acProvider = mock(AutomationCompositionProvider.class);
555 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
556 .thenReturn(automationComposition);
557 var rollbackRecord = new JpaAutomationCompositionRollback();
558 when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
560 final var acDefinitionProvider = mock(AcDefinitionProvider.class);
561 final var supervisionAcHandler = mock(SupervisionAcHandler.class);
562 final var participantProvider = mock(ParticipantProvider.class);
563 final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
564 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
565 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
568 var instanceId = automationComposition.getInstanceId();
569 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
571 // DeployState != MIGRATION_REVERTING
572 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
573 .thenReturn(automationComposition);
574 when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
576 automationComposition.setDeployState(DeployState.DELETING);
577 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
580 automationComposition.setDeployState(DeployState.DEPLOYED);
581 automationComposition.setSubState(SubState.PREPARING);
582 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
584 // StateChangeResult != NO_ERROR
585 automationComposition.setSubState(SubState.NONE);
586 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
587 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
589 // !compositionId.equals(compId)
590 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
591 automationComposition.setCompositionId(UUID.randomUUID());
592 assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
593 verify(acProvider, never()).updateAutomationComposition(any());
597 void testRollbackSuccess() {
598 var acDefinitionProvider = mock(AcDefinitionProvider.class);
599 var acDefinition = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
600 var compositionId = acDefinition.getCompositionId();
601 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
603 var automationComposition =
604 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud");
605 var instanceId = UUID.randomUUID();
606 automationComposition.setInstanceId(instanceId);
607 automationComposition.setCompositionId(compositionId);
608 automationComposition.setDeployState(DeployState.MIGRATING);
609 automationComposition.setLockState(LockState.LOCKED);
610 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
611 automationComposition.setSubState(SubState.NONE);
612 var acProvider = mock(AutomationCompositionProvider.class);
613 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
614 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
617 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
619 var rollbackRecord = new AutomationCompositionRollback();
620 var compositionTargetId = UUID.randomUUID();
621 rollbackRecord.setCompositionId(compositionTargetId);
622 rollbackRecord.setInstanceId(instanceId);
623 rollbackRecord.setElements(acRollback.getElements());
624 when(acProvider.getAutomationCompositionRollback(instanceId)).thenReturn(rollbackRecord);
626 var supervisionAcHandler = mock(SupervisionAcHandler.class);
627 var participantProvider = mock(ParticipantProvider.class);
628 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
629 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
630 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
632 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
633 when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
635 instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
636 verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
638 when(acDefinitionProvider.getAcDefinition(compositionTargetId))
639 .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND,
640 String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
641 assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
642 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
645 private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
646 LockState lockState) {
647 automationComposition.setDeployState(deployState);
648 automationComposition.setLockState(lockState);
649 var acProvider = mock(AutomationCompositionProvider.class);
650 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
651 .thenReturn(automationComposition);
652 var acDefinitionProvider = mock(AcDefinitionProvider.class);
653 var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
655 var instantiationProvider =
656 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
657 new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
658 acRuntimeParamaterGroup, null);
660 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
661 var compositionId = acDefinition.getCompositionId();
662 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
663 automationComposition.setCompositionId(compositionId);
665 var instanceId = automationComposition.getInstanceId();
666 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
667 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
671 void testCreateAutomationCompositions_NoDuplicates() {
672 var acDefinitionProvider = mock(AcDefinitionProvider.class);
673 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
674 var compositionId = acDefinition.getCompositionId();
675 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
677 var automationCompositionCreate =
678 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
679 automationCompositionCreate.setCompositionId(compositionId);
680 automationCompositionCreate.setInstanceId(UUID.randomUUID());
682 var acProvider = mock(AutomationCompositionProvider.class);
683 when(acProvider.createAutomationComposition(automationCompositionCreate))
684 .thenReturn(automationCompositionCreate);
685 var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
686 var participantProvider = mock(ParticipantProvider.class);
687 var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
689 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
690 null, null, participantProvider,
691 CommonTestData.getTestParamaterGroup(), encryptionUtils);
693 var instantiationResponse = instantiationProvider.createAutomationComposition(
694 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
695 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
697 doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
698 .when(acProvider).validateNameVersion(acIdentifier);
700 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
701 .hasMessageMatching(acIdentifier + " already defined");
705 void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
706 var acDefinitionProvider = mock(AcDefinitionProvider.class);
707 var participantProvider = mock(ParticipantProvider.class);
708 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
709 var compositionId = acDefinition.getCompositionId();
710 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
711 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
712 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
713 automationComposition.setCompositionId(compositionId);
715 var acProvider = mock(AutomationCompositionProvider.class);
716 var encryptionUtils = mock(EncryptionUtils.class);
717 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
718 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
720 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
721 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
723 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
724 .thenReturn(automationComposition);
726 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
727 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
731 void testAcDefinitionNotFound() {
732 var automationComposition = InstantiationUtils
733 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
735 var acProvider = mock(AutomationCompositionProvider.class);
736 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
737 .thenReturn(automationComposition);
738 var acDefinitionProvider = mock(AcDefinitionProvider.class);
739 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
741 mock(AcRuntimeParameterGroup.class), null);
743 var compositionId = automationComposition.getCompositionId();
744 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
745 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
746 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId())));
747 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
748 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
750 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
751 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
755 void testCompositionIdDoNotMatch() {
756 var automationComposition = InstantiationUtils
757 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
759 var acProvider = mock(AutomationCompositionProvider.class);
760 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
761 .thenReturn(automationComposition);
762 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
764 mock(AcRuntimeParameterGroup.class), null);
766 var compositionId = automationComposition.getCompositionId();
767 var wrongCompositionId = UUID.randomUUID();
768 assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
769 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
771 assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
772 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
775 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
776 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
777 assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
778 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
779 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
781 var compositionTargetId = UUID.randomUUID();
782 automationComposition.setCompositionTargetId(compositionTargetId);
784 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
785 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
787 var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
788 assertThat(result).isNotNull();
792 void testCompositionNotPrimed() {
793 var acDefinitionProvider = mock(AcDefinitionProvider.class);
794 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
795 var compositionId = acDefinition.getCompositionId();
796 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
797 var acProvider = mock(AutomationCompositionProvider.class);
799 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
802 var automationComposition =
803 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
804 automationComposition.setCompositionId(compositionId);
805 var message = compositionId + " Commissioned automation composition definition not primed";
807 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
808 .hasMessageMatching(message);
812 void testCompositionInstanceState() {
813 var acDefinitionProvider = mock(AcDefinitionProvider.class);
814 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
815 var compositionId = acDefinition.getCompositionId();
816 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
818 var automationComposition = InstantiationUtils
819 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
820 var instanceId = UUID.randomUUID();
821 automationComposition.setCompositionId(compositionId);
822 automationComposition.setInstanceId(instanceId);
823 var acProvider = mock(AutomationCompositionProvider.class);
824 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
826 var supervisionAcHandler = mock(SupervisionAcHandler.class);
827 var participantProvider = mock(ParticipantProvider.class);
828 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
829 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
830 mock(AcRuntimeParameterGroup.class), null);
832 var acInstanceStateUpdate = new AcInstanceStateUpdate();
833 acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
834 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
835 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
836 verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
837 any(AutomationCompositionDefinition.class));
839 automationComposition.setDeployState(DeployState.DEPLOYED);
840 automationComposition.setLockState(LockState.LOCKED);
841 acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
842 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
843 verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
844 any(AutomationCompositionDefinition.class));
846 automationComposition.setDeployState(DeployState.DEPLOYED);
847 automationComposition.setLockState(LockState.LOCKED);
848 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
849 acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
850 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
851 verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
852 any(AutomationCompositionDefinition.class));
854 automationComposition.setDeployState(DeployState.DEPLOYED);
855 automationComposition.setLockState(LockState.UNLOCKED);
856 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
857 acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
858 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
859 verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
861 automationComposition.setDeployState(DeployState.UNDEPLOYED);
862 automationComposition.setLockState(LockState.NONE);
863 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
864 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
865 acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
866 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
867 verify(supervisionAcHandler).prepare(any(AutomationComposition.class),
868 any(AutomationCompositionDefinition.class));
870 automationComposition.setDeployState(DeployState.DEPLOYED);
871 automationComposition.setLockState(LockState.LOCKED);
872 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
873 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
874 acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
875 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
876 verify(supervisionAcHandler).review(any(AutomationComposition.class),
877 any(AutomationCompositionDefinition.class));