a59872f0acb380e8fc61677a6dc9abdbb1771ab0
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2023 Nordix Foundation.
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.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.doNothing;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
32
33 import java.util.List;
34 import java.util.Optional;
35 import java.util.UUID;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.Test;
38 import org.onap.policy.clamp.acm.runtime.participants.AcmParticipantProvider;
39 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
40 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
41 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
42 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
45 import org.onap.policy.clamp.models.acm.concepts.DeployState;
46 import org.onap.policy.clamp.models.acm.concepts.LockState;
47 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
48 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
49 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
50 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
51 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
52 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
53 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
54 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
56 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
57
58 /**
59  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
60  *
61  */
62 class AutomationCompositionInstantiationProviderTest {
63     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
64     private static final String AC_INSTANTIATION_UPDATE_JSON =
65             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
66
67     private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
68             "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
69     private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
70             "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
71     private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
72
73     private static final String AC_ELEMENT_NAME_NOT_FOUND =
74             "\"AutomationComposition\" INVALID, item has status INVALID\n"
75                     + "  \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n"
76                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
77                     + "    \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\""
78                     + " INVALID, Not found\n";
79     private static final String AC_DEFINITION_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n"
80             + "  item \"ServiceTemplate\" value \"\" INVALID,"
81             + " Commissioned automation composition definition not found\n";
82     private static final String DO_NOT_MATCH = " do not match with ";
83
84     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
85
86     @BeforeAll
87     public static void setUpBeforeClass() {
88         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
89         var jpa =
90                 ProviderUtils.getJpaAndValidate(serviceTemplate, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
91         serviceTemplate = jpa.toAuthorative();
92     }
93
94     @Test
95     void testInstantiationCrud() throws AutomationCompositionException {
96         var acDefinitionProvider = mock(AcDefinitionProvider.class);
97         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
98         var compositionId = acDefinition.getCompositionId();
99         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
100         var acProvider = mock(AutomationCompositionProvider.class);
101         var supervisionAcHandler = mock(SupervisionAcHandler.class);
102         var acmParticipantProvider = mock(AcmParticipantProvider.class);
103         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
104                 null, supervisionAcHandler, acmParticipantProvider);
105         var automationCompositionCreate =
106                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
107         automationCompositionCreate.setCompositionId(compositionId);
108         when(acProvider.createAutomationComposition(automationCompositionCreate))
109                 .thenReturn(automationCompositionCreate);
110
111         var instantiationResponse = instantiationProvider.createAutomationComposition(
112                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
113         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
114
115         verify(acProvider).createAutomationComposition(automationCompositionCreate);
116
117         when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
118                 automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate));
119
120         var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
121                 automationCompositionCreate.getName(), automationCompositionCreate.getVersion());
122         assertThat(automationCompositionCreate)
123                 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
124
125         var automationCompositionUpdate =
126                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
127         automationCompositionUpdate.setCompositionId(compositionId);
128         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
129                 .thenReturn(automationCompositionUpdate);
130         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
131                 .thenReturn(automationCompositionUpdate);
132
133         instantiationResponse = instantiationProvider.updateAutomationComposition(
134                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
135         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
136
137         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
138
139         when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
140                 .thenReturn(automationCompositionUpdate);
141         doNothing().when(acmParticipantProvider).verifyParticipantState(any());
142         instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
143                 automationCompositionCreate.getInstanceId());
144
145         verify(supervisionAcHandler).delete(any(), any());
146     }
147
148     @Test
149     void testInstantiationUpdate() throws AutomationCompositionException {
150         var acDefinitionProvider = mock(AcDefinitionProvider.class);
151         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
152         var compositionId = acDefinition.getCompositionId();
153         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
154
155         var automationCompositionUpdate =
156                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
157         automationCompositionUpdate.setCompositionId(compositionId);
158         automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
159         automationCompositionUpdate.setLockState(LockState.LOCKED);
160         var acProvider = mock(AutomationCompositionProvider.class);
161         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
162                 .thenReturn(automationCompositionUpdate);
163         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
164                 .thenReturn(automationCompositionUpdate);
165
166         var supervisionAcHandler = mock(SupervisionAcHandler.class);
167         var acmParticipantProvider = mock(AcmParticipantProvider.class);
168         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
169                 null, supervisionAcHandler, acmParticipantProvider);
170         var instantiationResponse = instantiationProvider.updateAutomationComposition(
171                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
172
173         verify(supervisionAcHandler).update(any());
174         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
175         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
176     }
177
178     @Test
179     void testUpdateBadRequest() throws AutomationCompositionException {
180         var automationCompositionUpdate =
181                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
182         automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
183         automationCompositionUpdate.setLockState(LockState.NONE);
184         var acProvider = mock(AutomationCompositionProvider.class);
185         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
186                 .thenReturn(automationCompositionUpdate);
187
188         var instantiationProvider =
189                 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
190                         mock(SupervisionAcHandler.class), mock(AcmParticipantProvider.class));
191
192         var compositionId = automationCompositionUpdate.getCompositionId();
193         assertThatThrownBy(
194                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
195                         .hasMessageMatching(
196                                 "Not allowed to update in the state " + automationCompositionUpdate.getDeployState());
197     }
198
199     @Test
200     void testUpdateRestartedBadRequest() throws AutomationCompositionException {
201         var automationCompositionUpdate =
202                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
203         automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
204         automationCompositionUpdate.setLockState(LockState.LOCKED);
205         automationCompositionUpdate.setRestarting(true);
206         var acProvider = mock(AutomationCompositionProvider.class);
207         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
208                 .thenReturn(automationCompositionUpdate);
209
210         var instantiationProvider =
211                 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
212                         mock(SupervisionAcHandler.class), mock(AcmParticipantProvider.class));
213
214         var compositionId = automationCompositionUpdate.getCompositionId();
215         assertThatThrownBy(
216                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
217                         .hasMessageMatching("There is a restarting process, Update not allowed");
218
219         automationCompositionUpdate.setDeployState(DeployState.UNDEPLOYED);
220         automationCompositionUpdate.setLockState(LockState.NONE);
221
222         var instanceId = automationCompositionUpdate.getInstanceId();
223         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
224                 .hasMessageMatching("There is a restarting process, Delete not allowed");
225     }
226
227     @Test
228     void testUpdateCompositionRestartedBadRequest() throws AutomationCompositionException {
229         var acDefinitionProvider = mock(AcDefinitionProvider.class);
230         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
231         acDefinition.setRestarting(true);
232         var compositionId = acDefinition.getCompositionId();
233         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
234
235         var automationCompositionUpdate =
236                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
237         automationCompositionUpdate.setCompositionId(compositionId);
238         automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
239         automationCompositionUpdate.setLockState(LockState.LOCKED);
240         var acProvider = mock(AutomationCompositionProvider.class);
241         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
242                 .thenReturn(automationCompositionUpdate);
243         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
244                 .thenReturn(automationCompositionUpdate);
245
246         var supervisionAcHandler = mock(SupervisionAcHandler.class);
247         var acmParticipantProvider = mock(AcmParticipantProvider.class);
248         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
249                 null, supervisionAcHandler, acmParticipantProvider);
250         assertThatThrownBy(
251                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
252                         .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
253                                 + "  item \"ServiceTemplate.restarting\" value \"true\" INVALID,"
254                                 + " There is a restarting process in composition\n");
255     }
256
257     @Test
258     void testInstantiationDelete() {
259         var automationComposition =
260                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
261         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
262         var acProvider = mock(AutomationCompositionProvider.class);
263         var acDefinitionProvider = mock(AcDefinitionProvider.class);
264         var supervisionAcHandler = mock(SupervisionAcHandler.class);
265         var acmParticipantProvider = mock(AcmParticipantProvider.class);
266
267         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
268                 null, supervisionAcHandler, acmParticipantProvider);
269
270         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
271                 .thenReturn(automationComposition);
272
273         var wrongCompositionId = UUID.randomUUID();
274         var instanceId = automationComposition.getInstanceId();
275         var compositionId = automationComposition.getCompositionId();
276         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
277                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
278
279         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
280         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
281         assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
282         assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
283
284         automationComposition.setDeployState(DeployState.UNDEPLOYED);
285         automationComposition.setLockState(LockState.NONE);
286         when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
287
288         instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
289         verify(supervisionAcHandler).delete(any(), any());
290     }
291
292     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
293             LockState lockState) {
294         automationComposition.setDeployState(deployState);
295         automationComposition.setLockState(lockState);
296         var acProvider = mock(AutomationCompositionProvider.class);
297         var acDefinitionProvider = mock(AcDefinitionProvider.class);
298
299         var instantiationProvider =
300                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null);
301
302         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
303                 .thenReturn(automationComposition);
304
305         var compositionId = automationComposition.getCompositionId();
306         var instanceId = automationComposition.getInstanceId();
307         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
308                 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, deployState));
309     }
310
311     @Test
312     void testCreateAutomationCompositions_NoDuplicates() {
313         var acDefinitionProvider = mock(AcDefinitionProvider.class);
314         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
315         var compositionId = acDefinition.getCompositionId();
316         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
317
318         var automationCompositionCreate =
319                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
320         automationCompositionCreate.setCompositionId(compositionId);
321         automationCompositionCreate.setInstanceId(UUID.randomUUID());
322
323         var acProvider = mock(AutomationCompositionProvider.class);
324         when(acProvider.createAutomationComposition(automationCompositionCreate))
325                 .thenReturn(automationCompositionCreate);
326         var acmParticipantProvider = mock(AcmParticipantProvider.class);
327
328         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
329                 null, null, acmParticipantProvider);
330
331         var instantiationResponse = instantiationProvider.createAutomationComposition(
332                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
333         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
334
335         when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
336                 .thenReturn(Optional.of(automationCompositionCreate));
337
338         assertThatThrownBy(
339                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
340                         .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
341     }
342
343     @Test
344     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
345         var acDefinitionProvider = mock(AcDefinitionProvider.class);
346         var acmParticipantProvider = mock(AcmParticipantProvider.class);
347         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
348         var compositionId = acDefinition.getCompositionId();
349         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
350         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
351                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
352         automationComposition.setCompositionId(compositionId);
353
354         var acProvider = mock(AutomationCompositionProvider.class);
355         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
356                 acmParticipantProvider);
357
358         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
359                 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
360
361         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
362                 .thenReturn(automationComposition);
363
364         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
365                 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
366     }
367
368     @Test
369     void testAcDefinitionNotFound() {
370         var automationComposition = InstantiationUtils
371                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
372
373         var acProvider = mock(AutomationCompositionProvider.class);
374         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
375                 .thenReturn(automationComposition);
376         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
377                 null, null, null);
378
379         var compositionId = automationComposition.getCompositionId();
380         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
381                 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
382
383         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
384                 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
385     }
386
387     @Test
388     void testCompositionIdDoNotMatch() {
389         var automationComposition = InstantiationUtils
390                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
391
392         var acProvider = mock(AutomationCompositionProvider.class);
393         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
394                 .thenReturn(automationComposition);
395         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
396                 null, null, null);
397
398         var compositionId = automationComposition.getCompositionId();
399         var wrongCompositionId = UUID.randomUUID();
400         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
401                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
402
403         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
404                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
405
406         assertThatThrownBy(
407                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
408                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
409         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
410                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
411                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
412     }
413
414     @Test
415     void testCompositionNotPrimed() {
416         var acDefinitionProvider = mock(AcDefinitionProvider.class);
417         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
418         var compositionId = acDefinition.getCompositionId();
419         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
420         var acProvider = mock(AutomationCompositionProvider.class);
421         var provider =
422                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null);
423
424         var automationComposition =
425                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
426         automationComposition.setCompositionId(compositionId);
427         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
428                 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
429                         + "  item \"ServiceTemplate.state\" value \"COMMISSIONED\" INVALID,"
430                         + " Commissioned automation composition definition not primed\n");
431     }
432
433     @Test
434     void testCompositionInstanceState() {
435         var acDefinitionProvider = mock(AcDefinitionProvider.class);
436         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
437         var compositionId = acDefinition.getCompositionId();
438         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
439
440         var automationComposition = InstantiationUtils
441                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
442         var instanceId = UUID.randomUUID();
443         automationComposition.setCompositionId(compositionId);
444         automationComposition.setInstanceId(instanceId);
445         var acProvider = mock(AutomationCompositionProvider.class);
446         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
447
448         var supervisionAcHandler = mock(SupervisionAcHandler.class);
449         var acmParticipantProvider = mock(AcmParticipantProvider.class);
450         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
451                 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider);
452
453         var acInstanceStateUpdate = new AcInstanceStateUpdate();
454         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
455         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
456         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
457         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
458                 any(AutomationCompositionDefinition.class));
459
460         automationComposition.setDeployState(DeployState.DEPLOYED);
461         automationComposition.setLockState(LockState.LOCKED);
462         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
463         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
464         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
465                 any(AutomationCompositionDefinition.class));
466
467         automationComposition.setDeployState(DeployState.DEPLOYED);
468         automationComposition.setLockState(LockState.LOCKED);
469         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
470         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
471         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
472         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
473                 any(AutomationCompositionDefinition.class));
474
475         automationComposition.setDeployState(DeployState.DEPLOYED);
476         automationComposition.setLockState(LockState.UNLOCKED);
477         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
478         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
479         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
480         verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
481     }
482 }