6179cfbb8b1ce833ba0ad21c9f1718803d8456be
[policy/clamp.git] /
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.acm.runtime.instantiation;
23
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;
36
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;
71
72 /**
73  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
74  *
75  */
76 class AutomationCompositionInstantiationProviderTest {
77
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";
83
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;";
89
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
93             """;
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
97             """;
98
99     private static final String DO_NOT_MATCH = " do not match with ";
100
101     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
102     private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
103
104     @BeforeAll
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();
109
110         st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
111         jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
112         serviceTemplateMigration = jpa.toAuthorative();
113     }
114
115     @Test
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");
127     }
128
129     @Test
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);
148
149         var instantiationResponse = instantiationProvider.createAutomationComposition(
150                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
151         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
152
153         verify(acProvider).createAutomationComposition(automationCompositionCreate);
154
155         assertEquals(StateChangeResult.NO_ERROR, acProvider.createAutomationComposition(automationCompositionCreate)
156                 .getStateChangeResult());
157
158         when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
159                 automationCompositionCreate.getVersion(), Pageable.unpaged()))
160                 .thenReturn(List.of(automationCompositionCreate));
161
162         var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
163                 automationCompositionCreate.getName(), automationCompositionCreate.getVersion(), Pageable.unpaged());
164         assertThat(automationCompositionCreate)
165                 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
166
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);
174
175         instantiationResponse = instantiationProvider.updateAutomationComposition(
176                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
177         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
178
179         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
180
181         when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
182                 .thenReturn(automationCompositionUpdate);
183         doNothing().when(participantProvider).verifyParticipantState(any());
184         instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
185                 automationCompositionCreate.getInstanceId());
186
187         verify(supervisionAcHandler).delete(any(), any());
188     }
189
190     @Test
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);
196
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);
207
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);
214
215         var instantiationResponse = instantiationProvider.updateAutomationComposition(
216                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
217
218         verify(supervisionAcHandler).update(any(), any());
219         verify(acProvider).updateAutomationComposition(acmFromDb);
220         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
221
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);
227         }
228         acmFromDb.getElements().values().forEach(element ->
229                 element.setDeployState(DeployState.DEPLOYED));
230         acmFromDb.setDeployState(DeployState.DEPLOYED);
231         assertThatThrownBy(
232                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
233                 .hasMessageStartingWith("Element id not present ");
234
235     }
236
237     @Test
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);
243
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);
253
254         var instantiationProvider =
255                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
256                         new AcInstanceStateResolver(), mock(SupervisionAcHandler.class),
257                         mock(ParticipantProvider.class),
258                         mock(AcRuntimeParameterGroup.class), encryptionUtils);
259
260
261         assertThatThrownBy(
262                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
263                 .hasMessageMatching(
264                         "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
265
266         automationCompositionUpdate.setDeployState(DeployState.UPDATING);
267         automationCompositionUpdate.setLockState(LockState.LOCKED);
268         automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
269         assertThatThrownBy(
270                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
271                 .hasMessageMatching(
272                         "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
273     }
274
275     @Test
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();
282
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);
292
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);
303
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);
310
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);
316
317         automationCompositionTarget.setPrecheck(false);
318         AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
319                 SubState.NONE);
320         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
321                 automationCompositionTarget);
322
323         verify(supervisionAcHandler).migrate(any(), any(), any(), any());
324         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
325     }
326
327     @Test
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);
333
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);
347
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(),
353                 encryptionUtils);
354
355         assertThatThrownBy(() -> instantiationProvider
356                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
357                 .hasMessageMatching(
358                         String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
359
360         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
361         var compositionTargetId = acDefinitionTarget.getCompositionId();
362         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
363
364         automationComposition.setCompositionTargetId(compositionTargetId);
365
366         var instantiationResponse = instantiationProvider
367                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
368
369         verify(supervisionAcHandler).migrate(any(), any(), any(), any());
370         verify(acProvider).updateAutomationComposition(automationComposition);
371         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
372     }
373
374     @Test
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);
380
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);
392
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);
399
400         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
401         var compositionTargetId = acDefinitionTarget.getCompositionId();
402         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
403         automationComposition.setCompositionTargetId(compositionTargetId);
404
405         var instantiationResponse = instantiationProvider
406                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
407
408         verify(supervisionAcHandler).migratePrecheck(any(), any(), any(), any());
409         verify(acProvider).updateAutomationComposition(automationComposition);
410         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
411
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));
419     }
420
421     @Test
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);
427
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);
437
438         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
439         var compositionTargetId = acDefinitionTarget.getCompositionId();
440         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
441
442         var acMigrate = new AutomationComposition(automationComposition);
443         acMigrate.setCompositionTargetId(compositionTargetId);
444         automationComposition.setDeployState(DeployState.DEPLOYING);
445
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);
452
453         assertThatThrownBy(() -> instantiationProvider
454                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
455                 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
456     }
457
458     @Test
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);
464
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);
475
476         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
477         var compositionTargetId = acDefinitionTarget.getCompositionId();
478         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
479
480         var acMigrate = new AutomationComposition(automationComposition);
481         acMigrate.setCompositionTargetId(compositionTargetId);
482         automationComposition.setDeployState(DeployState.DEPLOYING);
483         automationComposition.setPrecheck(true);
484
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);
491
492         assertThatThrownBy(() -> instantiationProvider
493                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
494                 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
495     }
496
497     @Test
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);
512
513         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
514                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
515                 encryptionUtils);
516
517         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
518                 .thenReturn(automationComposition);
519
520         var wrongCompositionId = UUID.randomUUID();
521         var instanceId = automationComposition.getInstanceId();
522         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
523                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
524
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());
530     }
531
532     @Test
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);
541     }
542
543     @Test
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());
553
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());
559
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(),
566                 encryptionUtils);
567
568         var instanceId = automationComposition.getInstanceId();
569         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
570
571         // DeployState != MIGRATION_REVERTING
572         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
573                 .thenReturn(automationComposition);
574         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
575
576         automationComposition.setDeployState(DeployState.DELETING);
577         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
578
579         // SubState != NONE
580         automationComposition.setDeployState(DeployState.DEPLOYED);
581         automationComposition.setSubState(SubState.PREPARING);
582         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
583
584         // StateChangeResult != NO_ERROR
585         automationComposition.setSubState(SubState.NONE);
586         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
587         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
588
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());
594     }
595
596     @Test
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);
602
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);
615
616         var acRollback =
617                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
618
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);
625
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(),
631                 encryptionUtils);
632         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
633         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
634
635         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
636         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
637
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));
643     }
644
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);
654
655         var instantiationProvider =
656                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
657                         new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
658                         acRuntimeParamaterGroup, null);
659
660         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
661         var compositionId = acDefinition.getCompositionId();
662         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
663         automationComposition.setCompositionId(compositionId);
664
665         var instanceId = automationComposition.getInstanceId();
666         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
667                 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
668     }
669
670     @Test
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);
676
677         var automationCompositionCreate =
678                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
679         automationCompositionCreate.setCompositionId(compositionId);
680         automationCompositionCreate.setInstanceId(UUID.randomUUID());
681
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());
688
689         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
690                 null, null, participantProvider,
691                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
692
693         var instantiationResponse = instantiationProvider.createAutomationComposition(
694                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
695         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
696
697         doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
698                 .when(acProvider).validateNameVersion(acIdentifier);
699         assertThatThrownBy(
700                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
701                 .hasMessageMatching(acIdentifier + " already defined");
702     }
703
704     @Test
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);
714
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);
719
720         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
721                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
722
723         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
724                 .thenReturn(automationComposition);
725
726         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
727                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
728     }
729
730     @Test
731     void testAcDefinitionNotFound() {
732         var automationComposition = InstantiationUtils
733                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
734
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,
740                 null, null, null,
741                 mock(AcRuntimeParameterGroup.class), null);
742
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));
749
750         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
751                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
752     }
753
754     @Test
755     void testCompositionIdDoNotMatch() {
756         var automationComposition = InstantiationUtils
757                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
758
759         var acProvider = mock(AutomationCompositionProvider.class);
760         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
761                 .thenReturn(automationComposition);
762         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
763                 null, null, null,
764                 mock(AcRuntimeParameterGroup.class), null);
765
766         var compositionId = automationComposition.getCompositionId();
767         var wrongCompositionId = UUID.randomUUID();
768         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
769                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
770
771         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
772                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
773
774         assertThatThrownBy(
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);
780
781         var compositionTargetId = UUID.randomUUID();
782         automationComposition.setCompositionTargetId(compositionTargetId);
783         assertThatThrownBy(
784                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
785                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
786
787         var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
788         assertThat(result).isNotNull();
789     }
790
791     @Test
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);
798         var provider =
799                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
800                         null, null);
801
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";
806
807         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
808                 .hasMessageMatching(message);
809     }
810
811     @Test
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);
817
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);
825
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);
831
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));
838
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));
845
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));
853
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));
860
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));
869
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));
878     }
879 }