9e63cd25c6fd248509286d92677c3fb75d320d86
[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.AcmStateUtils;
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());
315         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
316
317         automationCompositionTarget.setPrecheck(false);
318         AcmStateUtils.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());
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());
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());
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(serviceTemplate, 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         var compositionTargetId = UUID.randomUUID();
607         automationComposition.setInstanceId(instanceId);
608         automationComposition.setCompositionId(compositionId);
609         automationComposition.setCompositionTargetId(compositionTargetId);
610         automationComposition.setDeployState(DeployState.MIGRATING);
611         automationComposition.setLockState(LockState.LOCKED);
612         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
613         automationComposition.setSubState(SubState.NONE);
614         var acProvider = mock(AutomationCompositionProvider.class);
615         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
616         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
617
618         var acRollback =
619                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
620
621         var rollbackRecord = new AutomationCompositionRollback();
622         rollbackRecord.setCompositionId(compositionTargetId);
623         rollbackRecord.setInstanceId(instanceId);
624         rollbackRecord.setElements(acRollback.getElements());
625         when(acProvider.getAutomationCompositionRollback(instanceId)).thenReturn(rollbackRecord);
626
627         var supervisionAcHandler = mock(SupervisionAcHandler.class);
628         var participantProvider = mock(ParticipantProvider.class);
629         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
630         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
631                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
632                 encryptionUtils);
633         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
634         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
635
636         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
637         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
638
639         when(acDefinitionProvider.getAcDefinition(compositionTargetId))
640                 .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND,
641                         String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
642         assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
643                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
644     }
645
646     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
647                                           LockState lockState) {
648         automationComposition.setDeployState(deployState);
649         automationComposition.setLockState(lockState);
650         var acProvider = mock(AutomationCompositionProvider.class);
651         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
652                 .thenReturn(automationComposition);
653         var acDefinitionProvider = mock(AcDefinitionProvider.class);
654         var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
655
656         var instantiationProvider =
657                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
658                         new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
659                         acRuntimeParamaterGroup, null);
660
661         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
662         var compositionId = acDefinition.getCompositionId();
663         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
664         automationComposition.setCompositionId(compositionId);
665
666         var instanceId = automationComposition.getInstanceId();
667         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
668                 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
669     }
670
671     @Test
672     void testCreateAutomationCompositions_NoDuplicates() {
673         var acDefinitionProvider = mock(AcDefinitionProvider.class);
674         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
675         var compositionId = acDefinition.getCompositionId();
676         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
677
678         var automationCompositionCreate =
679                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
680         automationCompositionCreate.setCompositionId(compositionId);
681         automationCompositionCreate.setInstanceId(UUID.randomUUID());
682
683         var acProvider = mock(AutomationCompositionProvider.class);
684         when(acProvider.createAutomationComposition(automationCompositionCreate))
685                 .thenReturn(automationCompositionCreate);
686         var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
687         var participantProvider = mock(ParticipantProvider.class);
688         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
689
690         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
691                 null, null, participantProvider,
692                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
693
694         var instantiationResponse = instantiationProvider.createAutomationComposition(
695                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
696         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
697
698         doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
699                 .when(acProvider).validateNameVersion(acIdentifier);
700         assertThatThrownBy(
701                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
702                 .hasMessageMatching(acIdentifier + " already defined");
703     }
704
705     @Test
706     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
707         var acDefinitionProvider = mock(AcDefinitionProvider.class);
708         var participantProvider = mock(ParticipantProvider.class);
709         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
710         var compositionId = acDefinition.getCompositionId();
711         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
712         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
713                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
714         automationComposition.setCompositionId(compositionId);
715
716         var acProvider = mock(AutomationCompositionProvider.class);
717         var encryptionUtils = mock(EncryptionUtils.class);
718         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
719                 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
720
721         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
722                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
723
724         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
725                 .thenReturn(automationComposition);
726
727         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
728                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
729     }
730
731     @Test
732     void testAcDefinitionNotFound() {
733         var automationComposition = InstantiationUtils
734                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
735
736         var acProvider = mock(AutomationCompositionProvider.class);
737         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
738                 .thenReturn(automationComposition);
739         var acDefinitionProvider = mock(AcDefinitionProvider.class);
740         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
741                 null, null, null,
742                 mock(AcRuntimeParameterGroup.class), null);
743
744         var compositionId = automationComposition.getCompositionId();
745         when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
746                 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
747                         String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId())));
748         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
749                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
750
751         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
752                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
753     }
754
755     @Test
756     void testCompositionIdDoNotMatch() {
757         var automationComposition = InstantiationUtils
758                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
759
760         var acProvider = mock(AutomationCompositionProvider.class);
761         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
762                 .thenReturn(automationComposition);
763         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
764                 null, null, null,
765                 mock(AcRuntimeParameterGroup.class), null);
766
767         var compositionId = automationComposition.getCompositionId();
768         var wrongCompositionId = UUID.randomUUID();
769         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
770                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
771
772         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
773                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
774
775         assertThatThrownBy(
776                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
777                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
778         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
779                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
780                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
781
782         var compositionTargetId = UUID.randomUUID();
783         automationComposition.setCompositionTargetId(compositionTargetId);
784         assertThatThrownBy(
785                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
786                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
787
788         var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
789         assertThat(result).isNotNull();
790     }
791
792     @Test
793     void testCompositionNotPrimed() {
794         var acDefinitionProvider = mock(AcDefinitionProvider.class);
795         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
796         var compositionId = acDefinition.getCompositionId();
797         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
798         var acProvider = mock(AutomationCompositionProvider.class);
799         var provider =
800                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
801                         null, null);
802
803         var automationComposition =
804                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
805         automationComposition.setCompositionId(compositionId);
806         var message = compositionId + " Commissioned automation composition definition not primed";
807
808         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
809                 .hasMessageMatching(message);
810     }
811
812     @Test
813     void testCompositionInstanceState() {
814         var acDefinitionProvider = mock(AcDefinitionProvider.class);
815         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
816         var compositionId = acDefinition.getCompositionId();
817         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
818
819         var automationComposition = InstantiationUtils
820                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
821         var instanceId = UUID.randomUUID();
822         automationComposition.setCompositionId(compositionId);
823         automationComposition.setInstanceId(instanceId);
824         var acProvider = mock(AutomationCompositionProvider.class);
825         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
826
827         var supervisionAcHandler = mock(SupervisionAcHandler.class);
828         var participantProvider = mock(ParticipantProvider.class);
829         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
830                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
831                 mock(AcRuntimeParameterGroup.class), null);
832
833         var acInstanceStateUpdate = new AcInstanceStateUpdate();
834         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
835         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
836         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
837         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
838                 any(AutomationCompositionDefinition.class));
839
840         automationComposition.setDeployState(DeployState.DEPLOYED);
841         automationComposition.setLockState(LockState.LOCKED);
842         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
843         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
844         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
845                 any(AutomationCompositionDefinition.class));
846
847         automationComposition.setDeployState(DeployState.DEPLOYED);
848         automationComposition.setLockState(LockState.LOCKED);
849         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
850         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
851         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
852         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
853                 any(AutomationCompositionDefinition.class));
854
855         automationComposition.setDeployState(DeployState.DEPLOYED);
856         automationComposition.setLockState(LockState.UNLOCKED);
857         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
858         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
859         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
860         verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
861
862         automationComposition.setDeployState(DeployState.UNDEPLOYED);
863         automationComposition.setLockState(LockState.NONE);
864         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
865         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
866         acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
867         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
868         verify(supervisionAcHandler).prepare(any(AutomationComposition.class),
869                 any(AutomationCompositionDefinition.class));
870
871         automationComposition.setDeployState(DeployState.DEPLOYED);
872         automationComposition.setLockState(LockState.LOCKED);
873         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
874         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
875         acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
876         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
877         verify(supervisionAcHandler).review(any(AutomationComposition.class),
878                 any(AutomationCompositionDefinition.class));
879     }
880 }