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\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 \"%s\" 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() {
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 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
103 var acProvider = mock(AutomationCompositionProvider.class);
104 var supervisionAcHandler = mock(SupervisionAcHandler.class);
105 var participantProvider = mock(ParticipantProvider.class);
106 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
107 null, supervisionAcHandler, participantProvider,
108 CommonTestData.getTestParamaterGroup());
109 var automationCompositionCreate =
110 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
111 automationCompositionCreate.setCompositionId(compositionId);
112 when(acProvider.createAutomationComposition(automationCompositionCreate))
113 .thenReturn(automationCompositionCreate);
115 var instantiationResponse = instantiationProvider.createAutomationComposition(
116 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
117 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
119 verify(acProvider).createAutomationComposition(automationCompositionCreate);
121 when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
122 automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate));
124 var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
125 automationCompositionCreate.getName(), automationCompositionCreate.getVersion());
126 assertThat(automationCompositionCreate)
127 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
129 var automationCompositionUpdate =
130 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
131 automationCompositionUpdate.setCompositionId(compositionId);
132 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
133 .thenReturn(automationCompositionUpdate);
134 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
135 .thenReturn(automationCompositionUpdate);
137 instantiationResponse = instantiationProvider.updateAutomationComposition(
138 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
139 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
141 verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
143 when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
144 .thenReturn(automationCompositionUpdate);
145 doNothing().when(participantProvider).verifyParticipantState(any());
146 instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
147 automationCompositionCreate.getInstanceId());
149 verify(supervisionAcHandler).delete(any(), any());
153 void testInstantiationUpdate() {
154 var acDefinitionProvider = mock(AcDefinitionProvider.class);
155 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
156 var compositionId = acDefinition.getCompositionId();
157 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
159 var automationCompositionUpdate =
160 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
161 automationCompositionUpdate.setCompositionId(compositionId);
162 automationCompositionUpdate.setInstanceId(UUID.randomUUID());
163 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
164 automationCompositionUpdate.setLockState(LockState.LOCKED);
165 var acProvider = mock(AutomationCompositionProvider.class);
166 var acmFromDb = new AutomationComposition(automationCompositionUpdate);
167 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
168 when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
170 var supervisionAcHandler = mock(SupervisionAcHandler.class);
171 var participantProvider = mock(ParticipantProvider.class);
172 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
173 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
174 CommonTestData.getTestParamaterGroup());
175 var instantiationResponse = instantiationProvider.updateAutomationComposition(
176 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
178 verify(supervisionAcHandler).update(any());
179 verify(acProvider).updateAutomationComposition(acmFromDb);
180 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
182 var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
183 automationCompositionUpdate.getElements().clear();
184 for (var element : elements) {
185 element.setId(UUID.randomUUID());
186 automationCompositionUpdate.getElements().put(element.getId(), element);
189 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
190 .hasMessageStartingWith("Element id not present ");
194 void testUpdateBadRequest() {
195 var automationCompositionUpdate =
196 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
197 automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
198 automationCompositionUpdate.setLockState(LockState.NONE);
199 var acProvider = mock(AutomationCompositionProvider.class);
200 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
201 .thenReturn(automationCompositionUpdate);
203 var instantiationProvider =
204 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
205 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
206 mock(AcRuntimeParameterGroup.class));
208 var compositionId = automationCompositionUpdate.getCompositionId();
210 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
212 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
214 automationCompositionUpdate.setDeployState(DeployState.UPDATING);
215 automationCompositionUpdate.setLockState(LockState.LOCKED);
216 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
218 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
220 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
224 void testUpdateRestartedBadRequest() {
225 var automationCompositionUpdate =
226 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
227 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
228 automationCompositionUpdate.setLockState(LockState.LOCKED);
229 automationCompositionUpdate.setRestarting(true);
230 var acProvider = mock(AutomationCompositionProvider.class);
231 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
232 .thenReturn(automationCompositionUpdate);
234 var instantiationProvider =
235 new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), null,
236 mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
237 mock(AcRuntimeParameterGroup.class));
239 var compositionId = automationCompositionUpdate.getCompositionId();
241 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
242 .hasMessageMatching("There is a restarting process, Update not allowed");
244 automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
246 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
247 .hasMessageMatching("There is a restarting process, Update not allowed");
249 automationCompositionUpdate.setDeployState(DeployState.UNDEPLOYED);
250 automationCompositionUpdate.setLockState(LockState.NONE);
252 var instanceId = automationCompositionUpdate.getInstanceId();
253 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
254 .hasMessageMatching("There is a restarting process, Delete not allowed");
258 void testUpdateCompositionRestartedBadRequest() {
259 var acDefinitionProvider = mock(AcDefinitionProvider.class);
260 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
261 acDefinition.setRestarting(true);
262 var compositionId = acDefinition.getCompositionId();
263 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
265 var automationCompositionUpdate =
266 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
267 automationCompositionUpdate.setCompositionId(compositionId);
268 automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
269 automationCompositionUpdate.setLockState(LockState.LOCKED);
270 var acProvider = mock(AutomationCompositionProvider.class);
271 when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
272 .thenReturn(automationCompositionUpdate);
273 when(acProvider.updateAutomationComposition(automationCompositionUpdate))
274 .thenReturn(automationCompositionUpdate);
276 var supervisionAcHandler = mock(SupervisionAcHandler.class);
277 var participantProvider = mock(ParticipantProvider.class);
278 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
279 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
280 mock(AcRuntimeParameterGroup.class));
282 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
283 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
284 + " item \"ServiceTemplate.restarting\" value \"true\" INVALID,"
285 + " There is a restarting process in composition\n");
289 void testInstantiationMigration() {
290 var acDefinitionProvider = mock(AcDefinitionProvider.class);
291 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
292 var compositionId = acDefinition.getCompositionId();
293 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
295 var automationComposition =
296 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
297 automationComposition.setCompositionId(compositionId);
298 automationComposition.setDeployState(DeployState.DEPLOYED);
299 automationComposition.setLockState(LockState.LOCKED);
300 automationComposition.setCompositionTargetId(UUID.randomUUID());
301 var acProvider = mock(AutomationCompositionProvider.class);
302 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
303 .thenReturn(automationComposition);
304 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
306 var supervisionAcHandler = mock(SupervisionAcHandler.class);
307 var participantProvider = mock(ParticipantProvider.class);
308 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
309 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup());
311 assertThatThrownBy(() -> instantiationProvider
312 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
314 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
316 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
317 var compositionTargetId = acDefinitionTarget.getCompositionId();
318 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
320 automationComposition.setCompositionTargetId(compositionTargetId);
322 var instantiationResponse = instantiationProvider
323 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
325 verify(supervisionAcHandler).migrate(any());
326 verify(acProvider).updateAutomationComposition(automationComposition);
327 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
332 void testInstantiationMigrationPrecheck() {
333 var acDefinitionProvider = mock(AcDefinitionProvider.class);
334 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
335 var compositionId = acDefinition.getCompositionId();
336 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
338 var automationComposition =
339 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
340 automationComposition.setCompositionId(compositionId);
341 automationComposition.setDeployState(DeployState.DEPLOYED);
342 automationComposition.setLockState(LockState.LOCKED);
343 automationComposition.setCompositionTargetId(UUID.randomUUID());
344 automationComposition.setPrecheck(true);
345 var acProvider = mock(AutomationCompositionProvider.class);
346 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
347 .thenReturn(automationComposition);
348 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
350 var supervisionAcHandler = mock(SupervisionAcHandler.class);
351 var acmParticipantProvider = mock(ParticipantProvider.class);
352 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
353 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider, new AcRuntimeParameterGroup());
355 assertThatThrownBy(() -> instantiationProvider
356 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
358 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
360 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
361 var compositionTargetId = acDefinitionTarget.getCompositionId();
362 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
364 automationComposition.setCompositionTargetId(compositionTargetId);
366 var instantiationResponse = instantiationProvider
367 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
369 verify(supervisionAcHandler).migratePrecheck(any());
370 verify(acProvider).updateAutomationComposition(automationComposition);
371 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
375 void testMigrateBadRequest() {
376 var acDefinitionProvider = mock(AcDefinitionProvider.class);
377 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
378 var compositionId = acDefinition.getCompositionId();
379 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
381 var automationComposition =
382 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
383 automationComposition.setCompositionId(compositionId);
384 automationComposition.setDeployState(DeployState.DEPLOYED);
385 automationComposition.setLockState(LockState.LOCKED);
386 var acProvider = mock(AutomationCompositionProvider.class);
387 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
388 .thenReturn(automationComposition);
389 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
391 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
392 var compositionTargetId = acDefinitionTarget.getCompositionId();
393 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
395 var acMigrate = new AutomationComposition(automationComposition);
396 acMigrate.setCompositionTargetId(compositionTargetId);
397 automationComposition.getElements().clear();
399 var supervisionAcHandler = mock(SupervisionAcHandler.class);
400 var participantProvider = mock(ParticipantProvider.class);
401 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
402 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
403 new AcRuntimeParameterGroup());
405 assertThatThrownBy(() -> instantiationProvider
406 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
407 .hasMessageStartingWith("Element id not present");
411 void testMigratePrecheckBadRequest() {
412 var acDefinitionProvider = mock(AcDefinitionProvider.class);
413 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
414 var compositionId = acDefinition.getCompositionId();
415 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
417 var automationComposition =
418 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
419 automationComposition.setCompositionId(compositionId);
420 automationComposition.setDeployState(DeployState.DEPLOYED);
421 automationComposition.setLockState(LockState.LOCKED);
422 automationComposition.setPrecheck(true);
423 var acProvider = mock(AutomationCompositionProvider.class);
424 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
425 .thenReturn(automationComposition);
426 when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
428 var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
429 var compositionTargetId = acDefinitionTarget.getCompositionId();
430 when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
432 var acMigrate = new AutomationComposition(automationComposition);
433 acMigrate.setCompositionTargetId(compositionTargetId);
434 automationComposition.getElements().clear();
436 var supervisionAcHandler = mock(SupervisionAcHandler.class);
437 var participantProvider = mock(ParticipantProvider.class);
438 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
439 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
440 new AcRuntimeParameterGroup());
442 assertThatThrownBy(() -> instantiationProvider
443 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
444 .hasMessageStartingWith("Element id not present");
448 void testInstantiationDelete() {
449 var automationComposition =
450 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
451 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
452 var acProvider = mock(AutomationCompositionProvider.class);
453 var acDefinitionProvider = mock(AcDefinitionProvider.class);
454 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
455 var compositionId = acDefinition.getCompositionId();
456 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
457 automationComposition.setCompositionId(compositionId);
458 var supervisionAcHandler = mock(SupervisionAcHandler.class);
459 var participantProvider = mock(ParticipantProvider.class);
460 var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
462 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
463 null, supervisionAcHandler, participantProvider, acRuntimeParameterGroup);
465 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
466 .thenReturn(automationComposition);
468 var wrongCompositionId = UUID.randomUUID();
469 var instanceId = automationComposition.getInstanceId();
470 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
471 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
473 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
474 assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
475 assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
476 assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
478 automationComposition.setDeployState(DeployState.UNDEPLOYED);
479 automationComposition.setLockState(LockState.NONE);
480 when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
482 instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
483 verify(supervisionAcHandler).delete(any(), any());
486 private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
487 LockState lockState) {
488 automationComposition.setDeployState(deployState);
489 automationComposition.setLockState(lockState);
490 var acProvider = mock(AutomationCompositionProvider.class);
491 var acDefinitionProvider = mock(AcDefinitionProvider.class);
492 var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
494 var instantiationProvider =
495 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
496 acRuntimeParamaterGroup);
498 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
499 .thenReturn(automationComposition);
501 var compositionId = automationComposition.getCompositionId();
502 var instanceId = automationComposition.getInstanceId();
503 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
504 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, deployState));
508 void testCreateAutomationCompositions_NoDuplicates() {
509 var acDefinitionProvider = mock(AcDefinitionProvider.class);
510 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
511 var compositionId = acDefinition.getCompositionId();
512 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
514 var automationCompositionCreate =
515 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
516 automationCompositionCreate.setCompositionId(compositionId);
517 automationCompositionCreate.setInstanceId(UUID.randomUUID());
519 var acProvider = mock(AutomationCompositionProvider.class);
520 when(acProvider.createAutomationComposition(automationCompositionCreate))
521 .thenReturn(automationCompositionCreate);
522 var participantProvider = mock(ParticipantProvider.class);
524 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
525 null, null, participantProvider,
526 CommonTestData.getTestParamaterGroup());
528 var instantiationResponse = instantiationProvider.createAutomationComposition(
529 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
530 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
532 when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
533 .thenReturn(Optional.of(automationCompositionCreate));
536 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
537 .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
541 void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
542 var acDefinitionProvider = mock(AcDefinitionProvider.class);
543 var participantProvider = mock(ParticipantProvider.class);
544 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
545 var compositionId = acDefinition.getCompositionId();
546 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
547 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
548 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
549 automationComposition.setCompositionId(compositionId);
551 var acProvider = mock(AutomationCompositionProvider.class);
552 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
553 participantProvider, CommonTestData.getTestParamaterGroup());
555 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
556 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
558 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
559 .thenReturn(automationComposition);
561 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
562 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
566 void testAcDefinitionNotFound() {
567 var automationComposition = InstantiationUtils
568 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
570 var acProvider = mock(AutomationCompositionProvider.class);
571 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
572 .thenReturn(automationComposition);
573 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
575 mock(AcRuntimeParameterGroup.class));
577 var compositionId = automationComposition.getCompositionId();
578 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
579 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
581 assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
582 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
586 void testCompositionIdDoNotMatch() {
587 var automationComposition = InstantiationUtils
588 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
590 var acProvider = mock(AutomationCompositionProvider.class);
591 when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
592 .thenReturn(automationComposition);
593 var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
595 mock(AcRuntimeParameterGroup.class));
597 var compositionId = automationComposition.getCompositionId();
598 var wrongCompositionId = UUID.randomUUID();
599 assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
600 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
602 assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
603 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
606 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
607 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
608 assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
609 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
610 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
612 var compositionTargetId = UUID.randomUUID();
613 automationComposition.setCompositionTargetId(compositionTargetId);
615 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
616 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
618 var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
619 assertThat(result).isNotNull();
623 void testCompositionNotPrimed() {
624 var acDefinitionProvider = mock(AcDefinitionProvider.class);
625 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
626 var compositionId = acDefinition.getCompositionId();
627 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
628 var acProvider = mock(AutomationCompositionProvider.class);
630 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
633 var automationComposition =
634 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
635 automationComposition.setCompositionId(compositionId);
636 assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
637 .hasMessageMatching("\"AutomationComposition\" INVALID, item has status INVALID\n"
638 + " item \"ServiceTemplate.state\" value \"COMMISSIONED\" INVALID,"
639 + " Commissioned automation composition definition not primed\n");
643 void testCompositionInstanceState() {
644 var acDefinitionProvider = mock(AcDefinitionProvider.class);
645 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
646 var compositionId = acDefinition.getCompositionId();
647 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
649 var automationComposition = InstantiationUtils
650 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
651 var instanceId = UUID.randomUUID();
652 automationComposition.setCompositionId(compositionId);
653 automationComposition.setInstanceId(instanceId);
654 var acProvider = mock(AutomationCompositionProvider.class);
655 when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
657 var supervisionAcHandler = mock(SupervisionAcHandler.class);
658 var participantProvider = mock(ParticipantProvider.class);
659 var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
660 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
661 mock(AcRuntimeParameterGroup.class));
663 var acInstanceStateUpdate = new AcInstanceStateUpdate();
664 acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
665 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
666 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
667 verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
668 any(AutomationCompositionDefinition.class));
670 automationComposition.setDeployState(DeployState.DEPLOYED);
671 automationComposition.setLockState(LockState.LOCKED);
672 acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
673 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
674 verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
675 any(AutomationCompositionDefinition.class));
677 automationComposition.setDeployState(DeployState.DEPLOYED);
678 automationComposition.setLockState(LockState.LOCKED);
679 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
680 acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
681 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
682 verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
683 any(AutomationCompositionDefinition.class));
685 automationComposition.setDeployState(DeployState.DEPLOYED);
686 automationComposition.setLockState(LockState.UNLOCKED);
687 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
688 acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
689 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
690 verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
692 automationComposition.setDeployState(DeployState.UNDEPLOYED);
693 automationComposition.setLockState(LockState.NONE);
694 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
695 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
696 acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
697 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
698 verify(supervisionAcHandler).prepare(any(AutomationComposition.class));
700 automationComposition.setDeployState(DeployState.DEPLOYED);
701 automationComposition.setLockState(LockState.LOCKED);
702 acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
703 acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
704 acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
705 provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
706 verify(supervisionAcHandler).review(any(AutomationComposition.class));