2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2024 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.ArrayList;
34 import java.util.List;
35 import java.util.Optional;
36 import java.util.UUID;
37 import org.junit.jupiter.api.BeforeAll;
38 import org.junit.jupiter.api.Test;
39 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
40 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
41 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
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.messages.rest.instantiation.SubOrder;
52 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
53 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
54 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
55 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
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
77 "entry PMSHInstance0AcElementNotFound" INVALID, item has status INVALID
78 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
79 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
81 private static final String AC_DEFINITION_NOT_FOUND = """
82 "AutomationComposition" INVALID, item has status INVALID
83 item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
86 private static final String DO_NOT_MATCH = " do not match with ";
88 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
91 public static void setUpBeforeClass() {
92 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
94 ProviderUtils.getJpaAndValidate(serviceTemplate, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
95 serviceTemplate = jpa.toAuthorative();
99 void testInstantiationCrud() {
100 var acDefinitionProvider = mock(AcDefinitionProvider.class);
101 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
102 var compositionId = acDefinition.getCompositionId();
103 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
104 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
105 var acProvider = mock(AutomationCompositionProvider.class);
106 var supervisionAcHandler = mock(SupervisionAcHandler.class);
107 var participantProvider = mock(ParticipantProvider.class);
108 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
109 null, supervisionAcHandler, participantProvider,
110 CommonTestData.getTestParamaterGroup());
111 var automationCompositionCreate =
112 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
113 automationCompositionCreate.setCompositionId(compositionId);
114 when(acProvider.createAutomationComposition(automationCompositionCreate))
115 .thenReturn(automationCompositionCreate);
117 var instantiationResponse = instantiationProvider.createAutomationComposition(
118 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
119 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
121 verify(acProvider).createAutomationComposition(automationCompositionCreate);
123 when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
124 automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate));
126 var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
127 automationCompositionCreate.getName(), automationCompositionCreate.getVersion());
128 assertThat(automationCompositionCreate)
129 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
131 var automationCompositionUpdate =
132 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
133 automationCompositionUpdate.setCompositionId(compositionId);
134 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
135 .thenReturn(automationCompositionUpdate);
136 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
137 .thenReturn(automationCompositionUpdate);
139 instantiationResponse = instantiationProvider.updateAutomationComposition(
140 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
141 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
143 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
145 when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
146 .thenReturn(automationCompositionUpdate);
147 doNothing().when(participantProvider).verifyParticipantState(any());
148 instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
149 automationCompositionCreate.getInstanceId());
151 verify(supervisionAcHandler).delete(any(), any());
155 void testInstantiationUpdate() {
156 var acDefinitionProvider = mock(AcDefinitionProvider.class);
157 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
158 var compositionId = acDefinition.getCompositionId();
159 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
161 var automationCompositionUpdate =
162 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
163 automationCompositionUpdate.setCompositionId(compositionId);
164 automationCompositionUpdate.setInstanceId(UUID.randomUUID());
165 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
166 automationCompositionUpdate.setLockState(LockState.LOCKED);
167 var acProvider = mock(AutomationCompositionProvider.class);
168 var acmFromDb = new AutomationComposition(automationCompositionUpdate);
169 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
170 when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
172 var supervisionAcHandler = mock(SupervisionAcHandler.class);
173 var participantProvider = mock(ParticipantProvider.class);
174 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
175 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
176 CommonTestData.getTestParamaterGroup());
177 var instantiationResponse = instantiationProvider.updateAutomationComposition(
178 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
180 verify(supervisionAcHandler).update(any());
181 verify(acProvider).updateAutomationComposition(acmFromDb);
182 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
184 var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
185 automationCompositionUpdate.getElements().clear();
186 for (var element : elements) {
187 element.setId(UUID.randomUUID());
188 automationCompositionUpdate.getElements().put(element.getId(), element);
191 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
192 .hasMessageStartingWith("Element id not present ");
196 void testUpdateBadRequest() {
197 var automationCompositionUpdate =
198 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
199 automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
200 automationCompositionUpdate.setLockState(LockState.NONE);
201 var acProvider = mock(AutomationCompositionProvider.class);
202 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
203 .thenReturn(automationCompositionUpdate);
205 var instantiationProvider =
206 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
207 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
208 mock(AcRuntimeParameterGroup.class));
210 var compositionId = automationCompositionUpdate.getCompositionId();
212 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
214 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
216 automationCompositionUpdate.setDeployState(DeployState.UPDATING);
217 automationCompositionUpdate.setLockState(LockState.LOCKED);
218 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
220 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
222 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
226 void testUpdateRestartedBadRequest() {
227 var automationCompositionUpdate =
228 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
229 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
230 automationCompositionUpdate.setLockState(LockState.LOCKED);
231 automationCompositionUpdate.setRestarting(true);
232 var acProvider = mock(AutomationCompositionProvider.class);
233 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
234 .thenReturn(automationCompositionUpdate);
236 var instantiationProvider =
237 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
238 mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
239 mock(AcRuntimeParameterGroup.class));
241 var compositionId = automationCompositionUpdate.getCompositionId();
243 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
244 .hasMessageMatching("There is a restarting process, Update not allowed");
246 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
248 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
249 .hasMessageMatching("There is a restarting process, Update not allowed");
251 automationCompositionUpdate.setDeployState(DeployState.UNDEPLOYED);
252 automationCompositionUpdate.setLockState(LockState.NONE);
254 var instanceId = automationCompositionUpdate.getInstanceId();
255 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
256 .hasMessageMatching("There is a restarting process, Delete not allowed");
260 void testUpdateCompositionRestartedBadRequest() {
261 var acDefinitionProvider = mock(AcDefinitionProvider.class);
262 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
263 acDefinition.setRestarting(true);
264 var compositionId = acDefinition.getCompositionId();
265 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
267 var automationCompositionUpdate =
268 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
269 automationCompositionUpdate.setCompositionId(compositionId);
270 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
271 automationCompositionUpdate.setLockState(LockState.LOCKED);
272 var acProvider = mock(AutomationCompositionProvider.class);
273 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
274 .thenReturn(automationCompositionUpdate);
275 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
276 .thenReturn(automationCompositionUpdate);
278 var supervisionAcHandler = mock(SupervisionAcHandler.class);
279 var participantProvider = mock(ParticipantProvider.class);
280 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
281 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
282 mock(AcRuntimeParameterGroup.class));
284 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
285 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
286 + " item \"ServiceTemplate.restarting\" value \"true\" INVALID,"
287 + " There is a restarting process in composition\n");
291 void testInstantiationMigration() {
292 var acDefinitionProvider = mock(AcDefinitionProvider.class);
293 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
294 var compositionId = acDefinition.getCompositionId();
295 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
297 var automationComposition =
298 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
299 automationComposition.setCompositionId(compositionId);
300 automationComposition.setDeployState(DeployState.DEPLOYED);
301 automationComposition.setLockState(LockState.LOCKED);
302 automationComposition.setCompositionTargetId(UUID.randomUUID());
303 var acProvider = mock(AutomationCompositionProvider.class);
304 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
305 .thenReturn(automationComposition);
306 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
308 var supervisionAcHandler = mock(SupervisionAcHandler.class);
309 var participantProvider = mock(ParticipantProvider.class);
310 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
311 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup());
313 assertThatThrownBy(() -> instantiationProvider
314 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
316 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
318 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
319 var compositionTargetId = acDefinitionTarget.getCompositionId();
320 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
322 automationComposition.setCompositionTargetId(compositionTargetId);
324 var instantiationResponse = instantiationProvider
325 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
327 verify(supervisionAcHandler).migrate(any());
328 verify(acProvider).updateAutomationComposition(automationComposition);
329 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
334 void testInstantiationMigrationPrecheck() {
335 var acDefinitionProvider = mock(AcDefinitionProvider.class);
336 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
337 var compositionId = acDefinition.getCompositionId();
338 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
340 var automationComposition =
341 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
342 automationComposition.setCompositionId(compositionId);
343 automationComposition.setDeployState(DeployState.DEPLOYED);
344 automationComposition.setLockState(LockState.LOCKED);
345 automationComposition.setCompositionTargetId(UUID.randomUUID());
346 automationComposition.setPrecheck(true);
347 var acProvider = mock(AutomationCompositionProvider.class);
348 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
349 .thenReturn(automationComposition);
350 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
352 var supervisionAcHandler = mock(SupervisionAcHandler.class);
353 var acmParticipantProvider = mock(ParticipantProvider.class);
354 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
355 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider, new AcRuntimeParameterGroup());
357 assertThatThrownBy(() -> instantiationProvider
358 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
360 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
362 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
363 var compositionTargetId = acDefinitionTarget.getCompositionId();
364 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
366 automationComposition.setCompositionTargetId(compositionTargetId);
368 var instantiationResponse = instantiationProvider
369 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
371 verify(supervisionAcHandler).migratePrecheck(any());
372 verify(acProvider).updateAutomationComposition(automationComposition);
373 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
377 void testMigrateBadRequest() {
378 var acDefinitionProvider = mock(AcDefinitionProvider.class);
379 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
380 var compositionId = acDefinition.getCompositionId();
381 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
383 var automationComposition =
384 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
385 automationComposition.setCompositionId(compositionId);
386 automationComposition.setDeployState(DeployState.DEPLOYED);
387 automationComposition.setLockState(LockState.LOCKED);
388 var acProvider = mock(AutomationCompositionProvider.class);
389 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
390 .thenReturn(automationComposition);
391 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
393 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
394 var compositionTargetId = acDefinitionTarget.getCompositionId();
395 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
397 var acMigrate = new AutomationComposition(automationComposition);
398 acMigrate.setCompositionTargetId(compositionTargetId);
399 automationComposition.getElements().clear();
401 var supervisionAcHandler = mock(SupervisionAcHandler.class);
402 var participantProvider = mock(ParticipantProvider.class);
403 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
404 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
405 new AcRuntimeParameterGroup());
407 assertThatThrownBy(() -> instantiationProvider
408 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
409 .hasMessageStartingWith("Element id not present");
413 void testMigratePrecheckBadRequest() {
414 var acDefinitionProvider = mock(AcDefinitionProvider.class);
415 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
416 var compositionId = acDefinition.getCompositionId();
417 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
419 var automationComposition =
420 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
421 automationComposition.setCompositionId(compositionId);
422 automationComposition.setDeployState(DeployState.DEPLOYED);
423 automationComposition.setLockState(LockState.LOCKED);
424 automationComposition.setPrecheck(true);
425 var acProvider = mock(AutomationCompositionProvider.class);
426 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
427 .thenReturn(automationComposition);
428 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
430 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
431 var compositionTargetId = acDefinitionTarget.getCompositionId();
432 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
434 var acMigrate = new AutomationComposition(automationComposition);
435 acMigrate.setCompositionTargetId(compositionTargetId);
436 automationComposition.getElements().clear();
438 var supervisionAcHandler = mock(SupervisionAcHandler.class);
439 var participantProvider = mock(ParticipantProvider.class);
440 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
441 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
442 new AcRuntimeParameterGroup());
444 assertThatThrownBy(() -> instantiationProvider
445 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
446 .hasMessageStartingWith("Element id not present");
450 void testInstantiationDelete() {
451 var automationComposition =
452 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
453 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
454 var acProvider = mock(AutomationCompositionProvider.class);
455 var acDefinitionProvider = mock(AcDefinitionProvider.class);
456 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
457 var compositionId = acDefinition.getCompositionId();
458 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
459 automationComposition.setCompositionId(compositionId);
460 var supervisionAcHandler = mock(SupervisionAcHandler.class);
461 var participantProvider = mock(ParticipantProvider.class);
462 var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
464 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
465 null, supervisionAcHandler, participantProvider, acRuntimeParameterGroup);
467 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
468 .thenReturn(automationComposition);
470 var wrongCompositionId = UUID.randomUUID();
471 var instanceId = automationComposition.getInstanceId();
472 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
473 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
475 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
476 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
477 assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
478 assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
480 automationComposition.setDeployState(DeployState.UNDEPLOYED);
481 automationComposition.setLockState(LockState.NONE);
482 when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
484 instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
485 verify(supervisionAcHandler).delete(any(), any());
488 private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
489 LockState lockState) {
490 automationComposition.setDeployState(deployState);
491 automationComposition.setLockState(lockState);
492 var acProvider = mock(AutomationCompositionProvider.class);
493 var acDefinitionProvider = mock(AcDefinitionProvider.class);
494 var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
496 var instantiationProvider =
497 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
498 acRuntimeParamaterGroup);
500 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
501 .thenReturn(automationComposition);
503 var compositionId = automationComposition.getCompositionId();
504 var instanceId = automationComposition.getInstanceId();
505 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
506 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, deployState));
510 void testCreateAutomationCompositions_NoDuplicates() {
511 var acDefinitionProvider = mock(AcDefinitionProvider.class);
512 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
513 var compositionId = acDefinition.getCompositionId();
514 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
516 var automationCompositionCreate =
517 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
518 automationCompositionCreate.setCompositionId(compositionId);
519 automationCompositionCreate.setInstanceId(UUID.randomUUID());
521 var acProvider = mock(AutomationCompositionProvider.class);
522 when(acProvider.createAutomationComposition(automationCompositionCreate))
523 .thenReturn(automationCompositionCreate);
524 var participantProvider = mock(ParticipantProvider.class);
526 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
527 null, null, participantProvider,
528 CommonTestData.getTestParamaterGroup());
530 var instantiationResponse = instantiationProvider.createAutomationComposition(
531 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
532 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
534 when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
535 .thenReturn(Optional.of(automationCompositionCreate));
538 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
539 .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
543 void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
544 var acDefinitionProvider = mock(AcDefinitionProvider.class);
545 var participantProvider = mock(ParticipantProvider.class);
546 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
547 var compositionId = acDefinition.getCompositionId();
548 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
549 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
550 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
551 automationComposition.setCompositionId(compositionId);
553 var acProvider = mock(AutomationCompositionProvider.class);
554 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
555 participantProvider, CommonTestData.getTestParamaterGroup());
557 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
558 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
560 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
561 .thenReturn(automationComposition);
563 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
564 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
568 void testAcDefinitionNotFound() {
569 var automationComposition = InstantiationUtils
570 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
572 var acProvider = mock(AutomationCompositionProvider.class);
573 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
574 .thenReturn(automationComposition);
575 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
577 mock(AcRuntimeParameterGroup.class));
579 var compositionId = automationComposition.getCompositionId();
580 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
581 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
583 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
584 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
588 void testCompositionIdDoNotMatch() {
589 var automationComposition = InstantiationUtils
590 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
592 var acProvider = mock(AutomationCompositionProvider.class);
593 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
594 .thenReturn(automationComposition);
595 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
597 mock(AcRuntimeParameterGroup.class));
599 var compositionId = automationComposition.getCompositionId();
600 var wrongCompositionId = UUID.randomUUID();
601 assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
602 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
604 assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
605 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
608 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
609 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
610 assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
611 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
612 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
614 var compositionTargetId = UUID.randomUUID();
615 automationComposition.setCompositionTargetId(compositionTargetId);
617 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
618 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
620 var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
621 assertThat(result).isNotNull();
625 void testCompositionNotPrimed() {
626 var acDefinitionProvider = mock(AcDefinitionProvider.class);
627 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
628 var compositionId = acDefinition.getCompositionId();
629 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
630 var acProvider = mock(AutomationCompositionProvider.class);
632 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
635 var automationComposition =
636 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
637 automationComposition.setCompositionId(compositionId);
638 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
639 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
640 + " item \"ServiceTemplate.state\" value \"COMMISSIONED\" INVALID,"
641 + " Commissioned automation composition definition not primed\n");
645 void testCompositionInstanceState() {
646 var acDefinitionProvider = mock(AcDefinitionProvider.class);
647 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
648 var compositionId = acDefinition.getCompositionId();
649 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
651 var automationComposition = InstantiationUtils
652 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
653 var instanceId = UUID.randomUUID();
654 automationComposition.setCompositionId(compositionId);
655 automationComposition.setInstanceId(instanceId);
656 var acProvider = mock(AutomationCompositionProvider.class);
657 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
659 var supervisionAcHandler = mock(SupervisionAcHandler.class);
660 var participantProvider = mock(ParticipantProvider.class);
661 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
662 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
663 mock(AcRuntimeParameterGroup.class));
665 var acInstanceStateUpdate = new AcInstanceStateUpdate();
666 acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
667 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
668 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
669 verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
670 any(AutomationCompositionDefinition.class));
672 automationComposition.setDeployState(DeployState.DEPLOYED);
673 automationComposition.setLockState(LockState.LOCKED);
674 acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
675 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
676 verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
677 any(AutomationCompositionDefinition.class));
679 automationComposition.setDeployState(DeployState.DEPLOYED);
680 automationComposition.setLockState(LockState.LOCKED);
681 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
682 acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
683 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
684 verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
685 any(AutomationCompositionDefinition.class));
687 automationComposition.setDeployState(DeployState.DEPLOYED);
688 automationComposition.setLockState(LockState.UNLOCKED);
689 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
690 acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
691 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
692 verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
694 automationComposition.setDeployState(DeployState.UNDEPLOYED);
695 automationComposition.setLockState(LockState.NONE);
696 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
697 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
698 acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
699 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
700 verify(supervisionAcHandler).prepare(any(AutomationComposition.class));
702 automationComposition.setDeployState(DeployState.DEPLOYED);
703 automationComposition.setLockState(LockState.LOCKED);
704 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
705 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
706 acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
707 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
708 verify(supervisionAcHandler).review(any(AutomationComposition.class));