2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
 
   4  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
 
   5  * ================================================================================
 
   6  * Licensed under the Apache License, Version 2.0 (the "License");
 
   7  * you may not use this file except in compliance with the License.
 
   8  * You may obtain a copy of the License at
 
  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.junit.jupiter.api.Assertions.assertDoesNotThrow;
 
  27 import static org.junit.jupiter.api.Assertions.assertEquals;
 
  28 import static org.junit.jupiter.api.Assertions.assertThrows;
 
  29 import static org.mockito.ArgumentMatchers.any;
 
  30 import static org.mockito.ArgumentMatchers.anyString;
 
  31 import static org.mockito.Mockito.doNothing;
 
  32 import static org.mockito.Mockito.mock;
 
  33 import static org.mockito.Mockito.never;
 
  34 import static org.mockito.Mockito.verify;
 
  35 import static org.mockito.Mockito.when;
 
  36 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
  38 import java.util.ArrayList;
 
  39 import java.util.List;
 
  41 import java.util.Optional;
 
  42 import java.util.UUID;
 
  43 import org.junit.jupiter.api.BeforeAll;
 
  44 import org.junit.jupiter.api.Test;
 
  45 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 
  46 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 
  47 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 
  48 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 
  49 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 
  50 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 
  51 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 
  52 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
 
  53 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 
  54 import org.onap.policy.clamp.models.acm.concepts.LockState;
 
  55 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 
  56 import org.onap.policy.clamp.models.acm.concepts.SubState;
 
  57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
 
  58 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 
  59 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 
  60 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.SubOrder;
 
  61 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
 
  62 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 
  63 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
 
  64 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 
  65 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 
  66 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
 
  67 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 
  68 import org.onap.policy.models.base.PfConceptKey;
 
  69 import org.onap.policy.models.base.PfModelRuntimeException;
 
  70 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
  71 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
  72 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
 
  73 import org.springframework.data.domain.Pageable;
 
  76  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
 
  79 class AutomationCompositionInstantiationProviderTest {
 
  81     public static final String MIGRATION_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase-migration.yaml";
 
  82     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
 
  83     private static final String AC_INSTANTIATION_UPDATE_JSON =
 
  84             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
 
  85     private static final String AC_MIGRATE_JSON = "src/test/resources/rest/acm/AutomationCompositionMigrate.json";
 
  87     private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
 
  88             "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
 
  89     private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
 
  90             "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
 
  91     private static final String DELETE_BAD_REQUEST = "Not valid order DELETE;";
 
  93     private static final String AC_ELEMENT_NAME_NOT_FOUND = """
 
  94                 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
 
  95                 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
 
  97     private static final String AC_DEFINITION_NOT_FOUND = """
 
  98             "AutomationComposition" INVALID, item has status INVALID
 
  99               item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
 
 102     private static final String DO_NOT_MATCH = " do not match with ";
 
 104     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
 105     private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
 
 108     public static void setUpBeforeClass() {
 
 109         var st = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
 
 110         var jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
 
 111         serviceTemplate = jpa.toAuthorative();
 
 113         st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
 
 114         jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
 
 115         serviceTemplateMigration = jpa.toAuthorative();
 
 119     void testGetAutomationCompositionsWithNull() {
 
 120         var instantiationProvider = new AutomationCompositionInstantiationProvider(
 
 121                 mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
 
 122                 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
 
 123                 CommonTestData.getTestParamaterGroup(), new EncryptionUtils(CommonTestData.getTestParamaterGroup()));
 
 124         assertThatThrownBy(() -> instantiationProvider
 
 125                 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
 
 126                 .hasMessage("compositionId is marked non-null but is null");
 
 127         assertThatThrownBy(() -> instantiationProvider
 
 128                 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
 
 129                 .hasMessage("pageable is marked non-null but is null");
 
 133     void testInstantiationCrud() {
 
 134         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 135         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 136         var compositionId = acDefinition.getCompositionId();
 
 137         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 138         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 139         var acProvider = mock(AutomationCompositionProvider.class);
 
 140         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 141         var participantProvider = mock(ParticipantProvider.class);
 
 142         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 143         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 144                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 145                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 146         var automationCompositionCreate =
 
 147                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 148         automationCompositionCreate.setCompositionId(compositionId);
 
 149         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 150                 .thenReturn(automationCompositionCreate);
 
 152         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 153                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 154         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 156         verify(acProvider).createAutomationComposition(automationCompositionCreate);
 
 158         when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
 
 159                 automationCompositionCreate.getVersion(), Pageable.unpaged()))
 
 160                 .thenReturn(List.of(automationCompositionCreate));
 
 162         var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
 
 163                 automationCompositionCreate.getName(), automationCompositionCreate.getVersion(), Pageable.unpaged());
 
 164         assertThat(automationCompositionCreate)
 
 165                 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
 
 167         var automationCompositionUpdate =
 
 168                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 169         automationCompositionUpdate.setCompositionId(compositionId);
 
 170         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 171                 .thenReturn(automationCompositionUpdate);
 
 172         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
 
 173                 .thenReturn(automationCompositionUpdate);
 
 175         instantiationResponse = instantiationProvider.updateAutomationComposition(
 
 176                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
 
 177         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
 
 179         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
 
 181         when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 182                 .thenReturn(automationCompositionUpdate);
 
 183         doNothing().when(participantProvider).verifyParticipantState(any());
 
 184         instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
 
 185                 automationCompositionCreate.getInstanceId());
 
 187         verify(supervisionAcHandler).delete(any(), any());
 
 191     void testInstantiationUpdate() {
 
 192         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 193         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 194         var compositionId = acDefinition.getCompositionId();
 
 195         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 197         var automationCompositionUpdate =
 
 198                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 199         automationCompositionUpdate.setCompositionId(compositionId);
 
 200         automationCompositionUpdate.setInstanceId(UUID.randomUUID());
 
 201         automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
 
 202         automationCompositionUpdate.setLockState(LockState.LOCKED);
 
 203         var acProvider = mock(AutomationCompositionProvider.class);
 
 204         var acmFromDb = new AutomationComposition(automationCompositionUpdate);
 
 205         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
 
 206         when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
 
 208         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 209         var participantProvider = mock(ParticipantProvider.class);
 
 210         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 211         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 212                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 213                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 215         var instantiationResponse = instantiationProvider.updateAutomationComposition(
 
 216                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
 
 218         verify(supervisionAcHandler).update(any());
 
 219         verify(acProvider).updateAutomationComposition(acmFromDb);
 
 220         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
 
 222         var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
 
 223         automationCompositionUpdate.getElements().clear();
 
 224         for (var element : elements) {
 
 225             element.setId(UUID.randomUUID());
 
 226             automationCompositionUpdate.getElements().put(element.getId(), element);
 
 228         acmFromDb.getElements().values().forEach(element -> element.setDeployState(DeployState.DEPLOYED));
 
 229         acmFromDb.setDeployState(DeployState.DEPLOYED);
 
 231                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 232                 .hasMessageStartingWith("Element id not present ");
 
 237     void testUpdateBadRequest() {
 
 238         var automationCompositionUpdate =
 
 239                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 240         automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
 
 241         automationCompositionUpdate.setLockState(LockState.NONE);
 
 242         var acProvider = mock(AutomationCompositionProvider.class);
 
 243         var encryptionUtils = mock(EncryptionUtils.class);
 
 244         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 245                 .thenReturn(automationCompositionUpdate);
 
 247         var instantiationProvider =
 
 248             new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 249                 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
 
 250                 mock(AcRuntimeParameterGroup.class), encryptionUtils);
 
 252         var compositionId = automationCompositionUpdate.getCompositionId();
 
 254                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 256                                 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
 
 258         automationCompositionUpdate.setDeployState(DeployState.UPDATING);
 
 259         automationCompositionUpdate.setLockState(LockState.LOCKED);
 
 260         automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
 
 262                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 264                                 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
 
 268     void testMigrationAddRemoveElements() {
 
 269         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 270         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 271         var compositionId = acDefinition.getCompositionId();
 
 272         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 273         var instanceId = UUID.randomUUID();
 
 275         var automationComposition =
 
 276                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 277         automationComposition.setCompositionId(compositionId);
 
 278         automationComposition.setInstanceId(instanceId);
 
 279         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 280         automationComposition.setLockState(LockState.LOCKED);
 
 281         var acProvider = mock(AutomationCompositionProvider.class);
 
 282         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 283                 .thenReturn(automationComposition);
 
 285         var automationCompositionTarget =
 
 286                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Migrate");
 
 287         automationCompositionTarget.setInstanceId(instanceId);
 
 288         automationCompositionTarget.setCompositionId(compositionId);
 
 289         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
 
 290         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 291         automationCompositionTarget.setCompositionTargetId(compositionTargetId);
 
 292         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 293         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 294         when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
 
 296         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 297         var participantProvider = mock(ParticipantProvider.class);
 
 298         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 299         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 300                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 301                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 303         automationCompositionTarget.setPrecheck(true);
 
 304         var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 305                 automationCompositionTarget);
 
 306         verify(supervisionAcHandler).migratePrecheck(any());
 
 307         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
 
 309         automationCompositionTarget.setPrecheck(false);
 
 310         AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
 
 312         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 313                         automationCompositionTarget);
 
 315         verify(supervisionAcHandler).migrate(any());
 
 316         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
 
 320     void testVersionCompatibility() {
 
 321         var acProvider = mock(AutomationCompositionProvider.class);
 
 322         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 323         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 324         var participantProvider = mock(ParticipantProvider.class);
 
 325         var newDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
 
 326         var oldDefinition = new PfConceptKey("policy.clamp.element", "2.2.3");
 
 328         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 329                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 330                 new AcRuntimeParameterGroup(), null);
 
 331         var instanceId = UUID.randomUUID();
 
 332         assertDoesNotThrow(() -> {
 
 333             instantiationProvider.checkCompatibility(newDefinition, oldDefinition, instanceId);
 
 334         }, "No exception for major version update");
 
 337         newDefinition.setName("policy.clamp.newElement");
 
 338         newDefinition.setVersion("2.2.4");
 
 340         assertThatThrownBy(() -> instantiationProvider
 
 341                 .checkCompatibility(newDefinition, oldDefinition, instanceId))
 
 342                 .hasMessageContaining("is not compatible");
 
 346     void testInstantiationMigration() {
 
 347         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 348         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 349         var compositionId = acDefinition.getCompositionId();
 
 350         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 352         var automationComposition =
 
 353                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 354         automationComposition.setCompositionId(compositionId);
 
 355         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 356         automationComposition.setLockState(LockState.LOCKED);
 
 357         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 358         var acProvider = mock(AutomationCompositionProvider.class);
 
 359         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 360                 .thenReturn(automationComposition);
 
 361         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 363         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 364         var participantProvider = mock(ParticipantProvider.class);
 
 365         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 366         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 367             new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 370         assertThatThrownBy(() -> instantiationProvider
 
 371                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 373                                 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
 
 375         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 376         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 377         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 378         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 380         automationComposition.setCompositionTargetId(compositionTargetId);
 
 382         var instantiationResponse = instantiationProvider
 
 383                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 385         verify(supervisionAcHandler).migrate(any());
 
 386         verify(acProvider).updateAutomationComposition(automationComposition);
 
 387         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 391     void testInstantiationMigrationPrecheck() {
 
 392         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 393         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 394         var compositionId = acDefinition.getCompositionId();
 
 395         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 397         var automationComposition =
 
 398             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 399         automationComposition.setCompositionId(compositionId);
 
 400         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 401         automationComposition.setLockState(LockState.LOCKED);
 
 402         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 403         automationComposition.setPrecheck(true);
 
 404         var acProvider = mock(AutomationCompositionProvider.class);
 
 405         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 406             .thenReturn(automationComposition);
 
 407         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 409         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 410         var acmParticipantProvider = mock(ParticipantProvider.class);
 
 411         var encryptionUtils = mock(EncryptionUtils.class);
 
 412         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 413             new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider, new AcRuntimeParameterGroup(),
 
 416         assertThatThrownBy(() -> instantiationProvider
 
 417             .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 419                 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
 
 421         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 422         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 423         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 425         automationComposition.setCompositionTargetId(compositionTargetId);
 
 427         var instantiationResponse = instantiationProvider
 
 428             .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 430         verify(supervisionAcHandler).migratePrecheck(any());
 
 431         verify(acProvider).updateAutomationComposition(automationComposition);
 
 432         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 436     void testMigrateBadRequest() {
 
 437         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 438         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 439         var compositionId = acDefinition.getCompositionId();
 
 440         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 442         var automationComposition =
 
 443                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 444         automationComposition.setCompositionId(compositionId);
 
 445         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 446         automationComposition.setLockState(LockState.LOCKED);
 
 447         var acProvider = mock(AutomationCompositionProvider.class);
 
 448         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 449                 .thenReturn(automationComposition);
 
 450         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 452         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 453         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 454         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 456         var acMigrate = new AutomationComposition(automationComposition);
 
 457         acMigrate.setCompositionTargetId(compositionTargetId);
 
 458         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 460         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 461         var participantProvider = mock(ParticipantProvider.class);
 
 462         var encryptionUtils = mock(EncryptionUtils.class);
 
 463         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 464                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 465                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 467         assertThatThrownBy(() -> instantiationProvider
 
 468                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 469                 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
 
 473     void testMigratePreCheckBadRequest() {
 
 474         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 475         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 476         var compositionId = acDefinition.getCompositionId();
 
 477         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 479         var automationComposition =
 
 480                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 481         automationComposition.setCompositionId(compositionId);
 
 482         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 483         automationComposition.setLockState(LockState.LOCKED);
 
 484         automationComposition.setPrecheck(true);
 
 485         var acProvider = mock(AutomationCompositionProvider.class);
 
 486         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 487                 .thenReturn(automationComposition);
 
 488         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 490         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 491         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 492         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 494         var acMigrate = new AutomationComposition(automationComposition);
 
 495         acMigrate.setCompositionTargetId(compositionTargetId);
 
 496         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 497         automationComposition.setPrecheck(true);
 
 499         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 500         var participantProvider = mock(ParticipantProvider.class);
 
 501         var encryptionUtils = mock(EncryptionUtils.class);
 
 502         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 503                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 504                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 506         assertThatThrownBy(() -> instantiationProvider
 
 507                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 508                 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
 
 512     void testInstantiationDelete() {
 
 513         var automationComposition =
 
 514                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 515         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 516         var acProvider = mock(AutomationCompositionProvider.class);
 
 517         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 518         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 519         var compositionId = acDefinition.getCompositionId();
 
 520         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 521         automationComposition.setCompositionId(compositionId);
 
 522         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 523         var participantProvider = mock(ParticipantProvider.class);
 
 524         var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
 
 525         var encryptionUtils = mock(EncryptionUtils.class);
 
 527         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 528                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
 
 531         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 532                 .thenReturn(automationComposition);
 
 534         var wrongCompositionId = UUID.randomUUID();
 
 535         var instanceId = automationComposition.getInstanceId();
 
 536         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
 
 537                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 539         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 540         automationComposition.setLockState(LockState.NONE);
 
 541         when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 542         instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
 
 543         verify(supervisionAcHandler).delete(any(), any());
 
 547     void testInstantiationDeleteError() {
 
 548         var automationComposition =
 
 549                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 550         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 551         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
 
 552         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
 
 553         assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
 
 554         assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
 
 558     void testRollbackFailure() {
 
 559         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 560         var compositionId = acDefinition.getCompositionId();
 
 561         var automationComposition =
 
 562             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
 
 563         automationComposition.setCompositionId(compositionId);
 
 564         automationComposition.setInstanceId(UUID.randomUUID());
 
 565         automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
 
 566         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 568         var acProvider = mock(AutomationCompositionProvider.class);
 
 569         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 570             .thenReturn(automationComposition);
 
 571         var rollbackRecord = mock(JpaAutomationCompositionRollback.class);
 
 572         when(acProvider.getAutomationCompositionRollback(anyString())).thenReturn(rollbackRecord);
 
 574         final var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 575         final var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 576         final var participantProvider = mock(ParticipantProvider.class);
 
 577         final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 578         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 579             new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 582         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider
 
 583             .rollback(automationComposition.getInstanceId()));
 
 585         // DeployState != MIGRATION_REVERTING
 
 586         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 587             .thenReturn(automationComposition);
 
 588         when(acProvider.getAutomationCompositionRollback(anyString())).thenReturn(rollbackRecord);
 
 590         automationComposition.setDeployState(DeployState.DELETING);
 
 591         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider
 
 592             .rollback(automationComposition.getInstanceId()));
 
 595         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 596         automationComposition.setSubState(SubState.PREPARING);
 
 597         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider
 
 598             .rollback(automationComposition.getInstanceId()));
 
 600         // StateChangeResult != NO_ERROR
 
 601         automationComposition.setSubState(SubState.NONE);
 
 602         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
 
 603         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider
 
 604             .rollback(automationComposition.getInstanceId()));
 
 606         verify(acProvider, never()).updateAutomationComposition(any());
 
 610     void testRollbackSuccess() {
 
 611         final var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 612         final var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 613         final var compositionId = acDefinition.getCompositionId();
 
 615         var automationComposition =
 
 616             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
 
 617         automationComposition.setInstanceId(UUID.randomUUID());
 
 618         automationComposition.setCompositionId(compositionId);
 
 619         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 620         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 621         automationComposition.setSubState(SubState.NONE);
 
 622         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 624         var acProvider = mock(AutomationCompositionProvider.class);
 
 625         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 626             .thenReturn(automationComposition);
 
 627         final var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 628         final var participantProvider = mock(ParticipantProvider.class);
 
 629         final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 630         final var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
 
 631             acDefinitionProvider, new AcInstanceStateResolver(), supervisionAcHandler,
 
 632             participantProvider, new AcRuntimeParameterGroup(), encryptionUtils);
 
 634         var rollbackRecord = new JpaAutomationCompositionRollback();
 
 635         rollbackRecord.setCompositionId(automationComposition.getCompositionId().toString());
 
 637         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 638             .thenReturn(automationComposition);
 
 639         when(acProvider.getAutomationCompositionRollback(anyString())).thenReturn(rollbackRecord);
 
 641         instantiationProvider.rollback(automationComposition.getInstanceId());
 
 643         verify(acProvider).updateAutomationComposition(automationComposition);
 
 644         assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState());
 
 647     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
 
 648             LockState lockState) {
 
 649         automationComposition.setDeployState(deployState);
 
 650         automationComposition.setLockState(lockState);
 
 651         var acProvider = mock(AutomationCompositionProvider.class);
 
 652         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 653                 .thenReturn(automationComposition);
 
 654         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 655         var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
 
 657         var instantiationProvider =
 
 658                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 659                         new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
 
 660                         acRuntimeParamaterGroup, null);
 
 662         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 663         var compositionId = acDefinition.getCompositionId();
 
 664         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 665         automationComposition.setCompositionId(compositionId);
 
 667         var instanceId = automationComposition.getInstanceId();
 
 668         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
 
 669                 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
 
 673     void testCreateAutomationCompositions_NoDuplicates() {
 
 674         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 675         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 676         var compositionId = acDefinition.getCompositionId();
 
 677         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 679         var automationCompositionCreate =
 
 680                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
 
 681         automationCompositionCreate.setCompositionId(compositionId);
 
 682         automationCompositionCreate.setInstanceId(UUID.randomUUID());
 
 684         var acProvider = mock(AutomationCompositionProvider.class);
 
 685         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 686                 .thenReturn(automationCompositionCreate);
 
 687         var participantProvider = mock(ParticipantProvider.class);
 
 688         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 690         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 691                 null, null, participantProvider,
 
 692                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 694         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 695                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 696         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 698         when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
 
 699                 .thenReturn(Optional.of(automationCompositionCreate));
 
 702                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
 
 703                         .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
 
 707     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
 
 708         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 709         var participantProvider = mock(ParticipantProvider.class);
 
 710         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 711         var compositionId = acDefinition.getCompositionId();
 
 712         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 713         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
 
 714                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
 
 715         automationComposition.setCompositionId(compositionId);
 
 717         var acProvider = mock(AutomationCompositionProvider.class);
 
 718         var encryptionUtils = mock(EncryptionUtils.class);
 
 719         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
 
 720                 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 722         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 723                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 725         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 726                 .thenReturn(automationComposition);
 
 728         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 729                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 733     void testAcDefinitionNotFound() {
 
 734         var automationComposition = InstantiationUtils
 
 735                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 737         var acProvider = mock(AutomationCompositionProvider.class);
 
 738         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 739                 .thenReturn(automationComposition);
 
 740         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 742                 mock(AcRuntimeParameterGroup.class), null);
 
 744         var compositionId = automationComposition.getCompositionId();
 
 745         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 746                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 748         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 749                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 753     void testCompositionIdDoNotMatch() {
 
 754         var automationComposition = InstantiationUtils
 
 755                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 757         var acProvider = mock(AutomationCompositionProvider.class);
 
 758         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 759                 .thenReturn(automationComposition);
 
 760         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 762                 mock(AcRuntimeParameterGroup.class), null);
 
 764         var compositionId = automationComposition.getCompositionId();
 
 765         var wrongCompositionId = UUID.randomUUID();
 
 766         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
 
 767                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 769         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
 
 770                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 773                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 774                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 775         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
 
 776                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
 
 777                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 779         var compositionTargetId = UUID.randomUUID();
 
 780         automationComposition.setCompositionTargetId(compositionTargetId);
 
 782                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 783                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 785         var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
 
 786         assertThat(result).isNotNull();
 
 790     void testCompositionNotPrimed() {
 
 791         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 792         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 793         var compositionId = acDefinition.getCompositionId();
 
 794         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 795         var acProvider = mock(AutomationCompositionProvider.class);
 
 797                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
 
 800         var automationComposition =
 
 801                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 802         automationComposition.setCompositionId(compositionId);
 
 804                       "AutomationComposition" INVALID, item has status INVALID
 
 805                         item "ServiceTemplate.state" value "COMMISSIONED" INVALID, Commissioned automation composition \
 
 806                       definition not primed
 
 809         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 810                 .hasMessageMatching(message);
 
 814     void testCompositionInstanceState() {
 
 815         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 816         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 817         var compositionId = acDefinition.getCompositionId();
 
 818         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 820         var automationComposition = InstantiationUtils
 
 821                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 822         var instanceId = UUID.randomUUID();
 
 823         automationComposition.setCompositionId(compositionId);
 
 824         automationComposition.setInstanceId(instanceId);
 
 825         var acProvider = mock(AutomationCompositionProvider.class);
 
 826         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 828         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 829         var participantProvider = mock(ParticipantProvider.class);
 
 830         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 831                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 832                 mock(AcRuntimeParameterGroup.class), null);
 
 834         var acInstanceStateUpdate = new AcInstanceStateUpdate();
 
 835         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
 
 836         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 837         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 838         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
 
 839                 any(AutomationCompositionDefinition.class));
 
 841         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 842         automationComposition.setLockState(LockState.LOCKED);
 
 843         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
 
 844         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 845         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
 
 846                 any(AutomationCompositionDefinition.class));
 
 848         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 849         automationComposition.setLockState(LockState.LOCKED);
 
 850         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 851         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
 
 852         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 853         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
 
 854                 any(AutomationCompositionDefinition.class));
 
 856         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 857         automationComposition.setLockState(LockState.UNLOCKED);
 
 858         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 859         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
 
 860         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 861         verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
 
 863         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 864         automationComposition.setLockState(LockState.NONE);
 
 865         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 866         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 867         acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
 
 868         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 869         verify(supervisionAcHandler).prepare(any(AutomationComposition.class), any());
 
 871         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 872         automationComposition.setLockState(LockState.LOCKED);
 
 873         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 874         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 875         acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
 
 876         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 877         verify(supervisionAcHandler).review(any(AutomationComposition.class));