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
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.acm.runtime.instantiation;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.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;
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.main.parameters.AcRuntimeParameterGroup;
39 import org.onap.policy.clamp.acm.runtime.main.parameters.AcmParameters;
40 import org.onap.policy.clamp.acm.runtime.participants.AcmParticipantProvider;
41 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
42 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
43 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
44 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
47 import org.onap.policy.clamp.models.acm.concepts.DeployState;
48 import org.onap.policy.clamp.models.acm.concepts.LockState;
49 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
50 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
51 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
52 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
53 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
54 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
55 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
56 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
58 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
61 * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
64 class AutomationCompositionInstantiationProviderTest {
65 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
66 private static final String AC_INSTANTIATION_UPDATE_JSON =
67 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
69 private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
70 "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
71 private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
72 "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
73 private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
75 private static final String AC_ELEMENT_NAME_NOT_FOUND =
76 "\"AutomationComposition\" INVALID, item has status INVALID\n"
77 + " \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n"
78 + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
79 + " \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\""
80 + " INVALID, Not found\n";
81 private static final String AC_DEFINITION_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n"
82 + " item \"ServiceTemplate\" value \"\" INVALID,"
83 + " Commissioned automation composition definition not found\n";
84 private static final String DO_NOT_MATCH = " do not match with ";
86 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
89 public static void setUpBeforeClass() {
90 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
92 ProviderUtils.getJpaAndValidate(serviceTemplate, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
93 serviceTemplate = jpa.toAuthorative();
97 void testInstantiationCrud() throws AutomationCompositionException {
98 var acDefinitionProvider = mock(AcDefinitionProvider.class);
99 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
100 var compositionId = acDefinition.getCompositionId();
101 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
102 var acProvider = mock(AutomationCompositionProvider.class);
103 var supervisionAcHandler = mock(SupervisionAcHandler.class);
104 var acmParticipantProvider = mock(AcmParticipantProvider.class);
105 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
106 null, supervisionAcHandler, acmParticipantProvider,
107 CommonTestData.getTestParamaterGroup());
108 var automationCompositionCreate =
109 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
110 automationCompositionCreate.setCompositionId(compositionId);
111 when(acProvider.createAutomationComposition(automationCompositionCreate))
112 .thenReturn(automationCompositionCreate);
114 var instantiationResponse = instantiationProvider.createAutomationComposition(
115 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
116 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
118 verify(acProvider).createAutomationComposition(automationCompositionCreate);
120 when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
121 automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate));
123 var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
124 automationCompositionCreate.getName(), automationCompositionCreate.getVersion());
125 assertThat(automationCompositionCreate)
126 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
128 var automationCompositionUpdate =
129 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
130 automationCompositionUpdate.setCompositionId(compositionId);
131 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
132 .thenReturn(automationCompositionUpdate);
133 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
134 .thenReturn(automationCompositionUpdate);
136 instantiationResponse = instantiationProvider.updateAutomationComposition(
137 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
138 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
140 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
142 when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
143 .thenReturn(automationCompositionUpdate);
144 doNothing().when(acmParticipantProvider).verifyParticipantState(any());
145 instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
146 automationCompositionCreate.getInstanceId());
148 verify(supervisionAcHandler).delete(any(), any());
152 void testInstantiationUpdate() throws AutomationCompositionException {
153 var acDefinitionProvider = mock(AcDefinitionProvider.class);
154 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
155 var compositionId = acDefinition.getCompositionId();
156 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
158 var automationCompositionUpdate =
159 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
160 automationCompositionUpdate.setCompositionId(compositionId);
161 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
162 automationCompositionUpdate.setLockState(LockState.LOCKED);
163 var acProvider = mock(AutomationCompositionProvider.class);
164 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
165 .thenReturn(automationCompositionUpdate);
166 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
167 .thenReturn(automationCompositionUpdate);
169 var supervisionAcHandler = mock(SupervisionAcHandler.class);
170 var acmParticipantProvider = mock(AcmParticipantProvider.class);
171 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
172 null, supervisionAcHandler, acmParticipantProvider,
173 CommonTestData.getTestParamaterGroup());
174 var instantiationResponse = instantiationProvider.updateAutomationComposition(
175 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
177 verify(supervisionAcHandler).update(any());
178 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
179 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
183 void testUpdateBadRequest() throws AutomationCompositionException {
184 var automationCompositionUpdate =
185 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
186 automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
187 automationCompositionUpdate.setLockState(LockState.NONE);
188 var acProvider = mock(AutomationCompositionProvider.class);
189 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
190 .thenReturn(automationCompositionUpdate);
192 var instantiationProvider =
193 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
194 mock(SupervisionAcHandler.class), mock(AcmParticipantProvider.class),
195 mock(AcRuntimeParameterGroup.class));
197 var compositionId = automationCompositionUpdate.getCompositionId();
199 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
201 "Not allowed to update in the state " + automationCompositionUpdate.getDeployState());
205 void testUpdateRestartedBadRequest() throws AutomationCompositionException {
206 var automationCompositionUpdate =
207 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
208 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
209 automationCompositionUpdate.setLockState(LockState.LOCKED);
210 automationCompositionUpdate.setRestarting(true);
211 var acProvider = mock(AutomationCompositionProvider.class);
212 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
213 .thenReturn(automationCompositionUpdate);
215 var instantiationProvider =
216 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
217 mock(SupervisionAcHandler.class), mock(AcmParticipantProvider.class),
218 mock(AcRuntimeParameterGroup.class));
220 var compositionId = automationCompositionUpdate.getCompositionId();
222 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
223 .hasMessageMatching("There is a restarting process, Update not allowed");
225 automationCompositionUpdate.setDeployState(DeployState.UNDEPLOYED);
226 automationCompositionUpdate.setLockState(LockState.NONE);
228 var instanceId = automationCompositionUpdate.getInstanceId();
229 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
230 .hasMessageMatching("There is a restarting process, Delete not allowed");
234 void testUpdateCompositionRestartedBadRequest() throws AutomationCompositionException {
235 var acDefinitionProvider = mock(AcDefinitionProvider.class);
236 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
237 acDefinition.setRestarting(true);
238 var compositionId = acDefinition.getCompositionId();
239 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
241 var automationCompositionUpdate =
242 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
243 automationCompositionUpdate.setCompositionId(compositionId);
244 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
245 automationCompositionUpdate.setLockState(LockState.LOCKED);
246 var acProvider = mock(AutomationCompositionProvider.class);
247 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
248 .thenReturn(automationCompositionUpdate);
249 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
250 .thenReturn(automationCompositionUpdate);
252 var supervisionAcHandler = mock(SupervisionAcHandler.class);
253 var acmParticipantProvider = mock(AcmParticipantProvider.class);
254 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
255 null, supervisionAcHandler, acmParticipantProvider,
256 mock(AcRuntimeParameterGroup.class));
258 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
259 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
260 + " item \"ServiceTemplate.restarting\" value \"true\" INVALID,"
261 + " There is a restarting process in composition\n");
265 void testInstantiationDelete() {
266 var automationComposition =
267 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
268 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
269 var acProvider = mock(AutomationCompositionProvider.class);
270 var acDefinitionProvider = mock(AcDefinitionProvider.class);
271 var supervisionAcHandler = mock(SupervisionAcHandler.class);
272 var acmParticipantProvider = mock(AcmParticipantProvider.class);
273 var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
275 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
276 null, supervisionAcHandler, acmParticipantProvider, acRuntimeParameterGroup);
278 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
279 .thenReturn(automationComposition);
281 var wrongCompositionId = UUID.randomUUID();
282 var instanceId = automationComposition.getInstanceId();
283 var compositionId = automationComposition.getCompositionId();
284 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
285 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
287 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
288 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
289 assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
290 assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
292 automationComposition.setDeployState(DeployState.UNDEPLOYED);
293 automationComposition.setLockState(LockState.NONE);
294 when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
296 instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
297 verify(supervisionAcHandler).delete(any(), any());
300 private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
301 LockState lockState) {
302 automationComposition.setDeployState(deployState);
303 automationComposition.setLockState(lockState);
304 var acProvider = mock(AutomationCompositionProvider.class);
305 var acDefinitionProvider = mock(AcDefinitionProvider.class);
306 var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
308 var instantiationProvider =
309 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
310 acRuntimeParamaterGroup);
312 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
313 .thenReturn(automationComposition);
315 var compositionId = automationComposition.getCompositionId();
316 var instanceId = automationComposition.getInstanceId();
317 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
318 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, deployState));
322 void testCreateAutomationCompositions_NoDuplicates() {
323 var acDefinitionProvider = mock(AcDefinitionProvider.class);
324 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
325 var compositionId = acDefinition.getCompositionId();
326 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
328 var automationCompositionCreate =
329 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
330 automationCompositionCreate.setCompositionId(compositionId);
331 automationCompositionCreate.setInstanceId(UUID.randomUUID());
333 var acProvider = mock(AutomationCompositionProvider.class);
334 when(acProvider.createAutomationComposition(automationCompositionCreate))
335 .thenReturn(automationCompositionCreate);
336 var acmParticipantProvider = mock(AcmParticipantProvider.class);
338 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
339 null, null, acmParticipantProvider,
340 CommonTestData.getTestParamaterGroup());
342 var instantiationResponse = instantiationProvider.createAutomationComposition(
343 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
344 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
346 when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
347 .thenReturn(Optional.of(automationCompositionCreate));
350 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
351 .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
355 void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
356 var acDefinitionProvider = mock(AcDefinitionProvider.class);
357 var acmParticipantProvider = mock(AcmParticipantProvider.class);
358 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
359 var compositionId = acDefinition.getCompositionId();
360 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
361 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
362 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
363 automationComposition.setCompositionId(compositionId);
365 var acProvider = mock(AutomationCompositionProvider.class);
366 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
367 acmParticipantProvider, CommonTestData.getTestParamaterGroup());
369 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
370 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
372 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
373 .thenReturn(automationComposition);
375 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
376 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
380 void testAcDefinitionNotFound() {
381 var automationComposition = InstantiationUtils
382 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
384 var acProvider = mock(AutomationCompositionProvider.class);
385 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
386 .thenReturn(automationComposition);
387 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
389 mock(AcRuntimeParameterGroup.class));
391 var compositionId = automationComposition.getCompositionId();
392 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
393 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
395 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
396 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
400 void testCompositionIdDoNotMatch() {
401 var automationComposition = InstantiationUtils
402 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
404 var acProvider = mock(AutomationCompositionProvider.class);
405 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
406 .thenReturn(automationComposition);
407 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
409 mock(AcRuntimeParameterGroup.class));
411 var compositionId = automationComposition.getCompositionId();
412 var wrongCompositionId = UUID.randomUUID();
413 assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
414 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
416 assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
417 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
420 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
421 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
422 assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
423 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
424 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
428 void testCompositionNotPrimed() {
429 var acDefinitionProvider = mock(AcDefinitionProvider.class);
430 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
431 var compositionId = acDefinition.getCompositionId();
432 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
433 var acProvider = mock(AutomationCompositionProvider.class);
435 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
438 var automationComposition =
439 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
440 automationComposition.setCompositionId(compositionId);
441 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
442 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
443 + " item \"ServiceTemplate.state\" value \"COMMISSIONED\" INVALID,"
444 + " Commissioned automation composition definition not primed\n");
448 void testCompositionInstanceState() {
449 var acDefinitionProvider = mock(AcDefinitionProvider.class);
450 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
451 var compositionId = acDefinition.getCompositionId();
452 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
454 var automationComposition = InstantiationUtils
455 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
456 var instanceId = UUID.randomUUID();
457 automationComposition.setCompositionId(compositionId);
458 automationComposition.setInstanceId(instanceId);
459 var acProvider = mock(AutomationCompositionProvider.class);
460 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
462 var supervisionAcHandler = mock(SupervisionAcHandler.class);
463 var acmParticipantProvider = mock(AcmParticipantProvider.class);
464 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
465 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider,
466 mock(AcRuntimeParameterGroup.class));
468 var acInstanceStateUpdate = new AcInstanceStateUpdate();
469 acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
470 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
471 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
472 verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
473 any(AutomationCompositionDefinition.class));
475 automationComposition.setDeployState(DeployState.DEPLOYED);
476 automationComposition.setLockState(LockState.LOCKED);
477 acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
478 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
479 verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
480 any(AutomationCompositionDefinition.class));
482 automationComposition.setDeployState(DeployState.DEPLOYED);
483 automationComposition.setLockState(LockState.LOCKED);
484 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
485 acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
486 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
487 verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
488 any(AutomationCompositionDefinition.class));
490 automationComposition.setDeployState(DeployState.DEPLOYED);
491 automationComposition.setLockState(LockState.UNLOCKED);
492 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
493 acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
494 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
495 verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));