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.Mockito.doNothing;
 
  31 import static org.mockito.Mockito.mock;
 
  32 import static org.mockito.Mockito.never;
 
  33 import static org.mockito.Mockito.verify;
 
  34 import static org.mockito.Mockito.when;
 
  35 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
  37 import java.util.ArrayList;
 
  38 import java.util.List;
 
  39 import java.util.Optional;
 
  40 import java.util.UUID;
 
  41 import org.junit.jupiter.api.BeforeAll;
 
  42 import org.junit.jupiter.api.Test;
 
  43 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 
  44 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 
  45 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 
  46 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 
  47 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 
  48 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 
  49 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 
  50 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 
  51 import org.onap.policy.clamp.models.acm.concepts.LockState;
 
  52 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 
  53 import org.onap.policy.clamp.models.acm.concepts.SubState;
 
  54 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
 
  55 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 
  56 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 
  57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.SubOrder;
 
  58 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
 
  59 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 
  60 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
 
  61 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 
  62 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 
  63 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
 
  64 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 
  65 import org.onap.policy.models.base.PfConceptKey;
 
  66 import org.onap.policy.models.base.PfModelRuntimeException;
 
  67 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
  68 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
 
  69 import org.springframework.data.domain.Pageable;
 
  72  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
 
  75 class AutomationCompositionInstantiationProviderTest {
 
  77     public static final String MIGRATION_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase-migration.yaml";
 
  78     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
 
  79     private static final String AC_INSTANTIATION_UPDATE_JSON =
 
  80             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
 
  81     private static final String AC_MIGRATE_JSON = "src/test/resources/rest/acm/AutomationCompositionMigrate.json";
 
  83     private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
 
  84             "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
 
  85     private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
 
  86             "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
 
  87     private static final String DELETE_BAD_REQUEST = "Not valid order DELETE;";
 
  89     private static final String AC_ELEMENT_NAME_NOT_FOUND = """
 
  90                 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
 
  91                 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
 
  93     private static final String AC_DEFINITION_NOT_FOUND = """
 
  94             "AutomationComposition" INVALID, item has status INVALID
 
  95               item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
 
  98     private static final String DO_NOT_MATCH = " do not match with ";
 
 100     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
 101     private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
 
 104     public static void setUpBeforeClass() {
 
 105         var st = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
 
 106         var jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
 
 107         serviceTemplate = jpa.toAuthorative();
 
 109         st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
 
 110         jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
 
 111         serviceTemplateMigration = jpa.toAuthorative();
 
 115     void testGetAutomationCompositionsWithNull() {
 
 116         var instantiationProvider = new AutomationCompositionInstantiationProvider(
 
 117                 mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
 
 118                 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
 
 119                 CommonTestData.getTestParamaterGroup(), new EncryptionUtils(CommonTestData.getTestParamaterGroup()));
 
 120         assertThatThrownBy(() -> instantiationProvider
 
 121                 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
 
 122                 .hasMessage("compositionId is marked non-null but is null");
 
 123         assertThatThrownBy(() -> instantiationProvider
 
 124                 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
 
 125                 .hasMessage("pageable is marked non-null but is null");
 
 129     void testInstantiationCrud() {
 
 130         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 131         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 132         var compositionId = acDefinition.getCompositionId();
 
 133         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 134         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 135         var acProvider = mock(AutomationCompositionProvider.class);
 
 136         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 137         var participantProvider = mock(ParticipantProvider.class);
 
 138         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 139         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 140                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 141                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 142         var automationCompositionCreate =
 
 143                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 144         automationCompositionCreate.setCompositionId(compositionId);
 
 145         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 146                 .thenReturn(automationCompositionCreate);
 
 148         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 149                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 150         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 152         verify(acProvider).createAutomationComposition(automationCompositionCreate);
 
 154         when(acProvider.getAutomationCompositions(compositionId, automationCompositionCreate.getName(),
 
 155                 automationCompositionCreate.getVersion(), Pageable.unpaged()))
 
 156                 .thenReturn(List.of(automationCompositionCreate));
 
 158         var automationCompositionsGet = instantiationProvider.getAutomationCompositions(compositionId,
 
 159                 automationCompositionCreate.getName(), automationCompositionCreate.getVersion(), Pageable.unpaged());
 
 160         assertThat(automationCompositionCreate)
 
 161                 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
 
 163         var automationCompositionUpdate =
 
 164                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 165         automationCompositionUpdate.setCompositionId(compositionId);
 
 166         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 167                 .thenReturn(automationCompositionUpdate);
 
 168         when(acProvider.updateAutomationComposition(automationCompositionUpdate))
 
 169                 .thenReturn(automationCompositionUpdate);
 
 171         instantiationResponse = instantiationProvider.updateAutomationComposition(
 
 172                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
 
 173         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
 
 175         verify(acProvider).updateAutomationComposition(automationCompositionUpdate);
 
 177         when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 178                 .thenReturn(automationCompositionUpdate);
 
 179         doNothing().when(participantProvider).verifyParticipantState(any());
 
 180         instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(),
 
 181                 automationCompositionCreate.getInstanceId());
 
 183         verify(supervisionAcHandler).delete(any(), any());
 
 187     void testInstantiationUpdate() {
 
 188         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 189         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 190         var compositionId = acDefinition.getCompositionId();
 
 191         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 193         var automationCompositionUpdate =
 
 194                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 195         automationCompositionUpdate.setCompositionId(compositionId);
 
 196         automationCompositionUpdate.setInstanceId(UUID.randomUUID());
 
 197         automationCompositionUpdate.setDeployState(DeployState.DEPLOYED);
 
 198         automationCompositionUpdate.setLockState(LockState.LOCKED);
 
 199         var acProvider = mock(AutomationCompositionProvider.class);
 
 200         var acmFromDb = new AutomationComposition(automationCompositionUpdate);
 
 201         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())).thenReturn(acmFromDb);
 
 202         when(acProvider.updateAutomationComposition(acmFromDb)).thenReturn(acmFromDb);
 
 204         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 205         var participantProvider = mock(ParticipantProvider.class);
 
 206         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 207         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 208                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 209                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 211         var instantiationResponse = instantiationProvider.updateAutomationComposition(
 
 212                 automationCompositionUpdate.getCompositionId(), automationCompositionUpdate);
 
 214         verify(supervisionAcHandler).update(any());
 
 215         verify(acProvider).updateAutomationComposition(acmFromDb);
 
 216         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate);
 
 218         var elements = new ArrayList<>(automationCompositionUpdate.getElements().values());
 
 219         automationCompositionUpdate.getElements().clear();
 
 220         for (var element : elements) {
 
 221             element.setId(UUID.randomUUID());
 
 222             automationCompositionUpdate.getElements().put(element.getId(), element);
 
 224         acmFromDb.getElements().values().forEach(element -> element.setDeployState(DeployState.DEPLOYED));
 
 225         acmFromDb.setDeployState(DeployState.DEPLOYED);
 
 227                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 228                 .hasMessageStartingWith("Element id not present ");
 
 233     void testUpdateBadRequest() {
 
 234         var automationCompositionUpdate =
 
 235                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 236         automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
 
 237         automationCompositionUpdate.setLockState(LockState.NONE);
 
 238         var acProvider = mock(AutomationCompositionProvider.class);
 
 239         var encryptionUtils = mock(EncryptionUtils.class);
 
 240         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 241                 .thenReturn(automationCompositionUpdate);
 
 243         var instantiationProvider =
 
 244             new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 245                 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
 
 246                 mock(AcRuntimeParameterGroup.class), encryptionUtils);
 
 248         var compositionId = automationCompositionUpdate.getCompositionId();
 
 250                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 252                                 "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
 
 254         automationCompositionUpdate.setDeployState(DeployState.UPDATING);
 
 255         automationCompositionUpdate.setLockState(LockState.LOCKED);
 
 256         automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
 
 258                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 260                                 "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
 
 264     void testMigrationAddRemoveElements() {
 
 265         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 266         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 267         var compositionId = acDefinition.getCompositionId();
 
 268         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 269         var instanceId = UUID.randomUUID();
 
 271         var automationComposition =
 
 272                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 273         automationComposition.setCompositionId(compositionId);
 
 274         automationComposition.setInstanceId(instanceId);
 
 275         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 276         automationComposition.setLockState(LockState.LOCKED);
 
 277         var acProvider = mock(AutomationCompositionProvider.class);
 
 278         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 279                 .thenReturn(automationComposition);
 
 281         var automationCompositionTarget =
 
 282                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Migrate");
 
 283         automationCompositionTarget.setInstanceId(instanceId);
 
 284         automationCompositionTarget.setCompositionId(compositionId);
 
 285         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
 
 286         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 287         automationCompositionTarget.setCompositionTargetId(compositionTargetId);
 
 288         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 289         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 290         when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
 
 292         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 293         var participantProvider = mock(ParticipantProvider.class);
 
 294         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 295         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 296                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 297                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 299         automationCompositionTarget.setPrecheck(true);
 
 300         var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 301                 automationCompositionTarget);
 
 302         verify(supervisionAcHandler).migratePrecheck(any());
 
 303         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
 
 305         automationCompositionTarget.setPrecheck(false);
 
 306         AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
 
 308         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 309                         automationCompositionTarget);
 
 311         verify(supervisionAcHandler).migrate(any());
 
 312         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
 
 316     void testVersionCompatibility() {
 
 317         var acProvider = mock(AutomationCompositionProvider.class);
 
 318         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 319         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 320         var participantProvider = mock(ParticipantProvider.class);
 
 321         var newDefinition = new PfConceptKey("policy.clamp.element", "1.2.3");
 
 322         var oldDefinition = new PfConceptKey("policy.clamp.element", "2.2.3");
 
 324         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 325                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 326                 new AcRuntimeParameterGroup(), null);
 
 327         var instanceId = UUID.randomUUID();
 
 328         assertDoesNotThrow(() -> {
 
 329             instantiationProvider.checkCompatibility(newDefinition, oldDefinition, instanceId);
 
 330         }, "No exception for major version update");
 
 333         newDefinition.setName("policy.clamp.newElement");
 
 334         newDefinition.setVersion("2.2.4");
 
 336         assertThatThrownBy(() -> instantiationProvider
 
 337                 .checkCompatibility(newDefinition, oldDefinition, instanceId))
 
 338                 .hasMessageContaining("is not compatible");
 
 342     void testInstantiationMigration() {
 
 343         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 344         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 345         var compositionId = acDefinition.getCompositionId();
 
 346         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 348         var automationComposition =
 
 349                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 350         automationComposition.setCompositionId(compositionId);
 
 351         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 352         automationComposition.setLockState(LockState.LOCKED);
 
 353         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 354         var acProvider = mock(AutomationCompositionProvider.class);
 
 355         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 356                 .thenReturn(automationComposition);
 
 357         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 359         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 360         var participantProvider = mock(ParticipantProvider.class);
 
 361         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 362         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 363             new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 366         assertThatThrownBy(() -> instantiationProvider
 
 367                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 369                                 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
 
 371         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 372         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 373         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 374         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 376         automationComposition.setCompositionTargetId(compositionTargetId);
 
 378         var instantiationResponse = instantiationProvider
 
 379                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 381         verify(supervisionAcHandler).migrate(any());
 
 382         verify(acProvider).updateAutomationComposition(automationComposition);
 
 383         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 387     void testInstantiationMigrationPrecheck() {
 
 388         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 389         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 390         var compositionId = acDefinition.getCompositionId();
 
 391         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 393         var automationComposition =
 
 394             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 395         automationComposition.setCompositionId(compositionId);
 
 396         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 397         automationComposition.setLockState(LockState.LOCKED);
 
 398         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 399         automationComposition.setPrecheck(true);
 
 400         var acProvider = mock(AutomationCompositionProvider.class);
 
 401         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 402             .thenReturn(automationComposition);
 
 403         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 405         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 406         var acmParticipantProvider = mock(ParticipantProvider.class);
 
 407         var encryptionUtils = mock(EncryptionUtils.class);
 
 408         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 409             new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider, new AcRuntimeParameterGroup(),
 
 412         assertThatThrownBy(() -> instantiationProvider
 
 413             .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 415                 String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
 
 417         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 418         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 419         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 421         automationComposition.setCompositionTargetId(compositionTargetId);
 
 423         var instantiationResponse = instantiationProvider
 
 424             .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 426         verify(supervisionAcHandler).migratePrecheck(any());
 
 427         verify(acProvider).updateAutomationComposition(automationComposition);
 
 428         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 432     void testMigrateBadRequest() {
 
 433         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 434         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 435         var compositionId = acDefinition.getCompositionId();
 
 436         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 438         var automationComposition =
 
 439                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 440         automationComposition.setCompositionId(compositionId);
 
 441         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 442         automationComposition.setLockState(LockState.LOCKED);
 
 443         var acProvider = mock(AutomationCompositionProvider.class);
 
 444         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 445                 .thenReturn(automationComposition);
 
 446         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 448         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 449         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 450         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 452         var acMigrate = new AutomationComposition(automationComposition);
 
 453         acMigrate.setCompositionTargetId(compositionTargetId);
 
 454         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 456         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 457         var participantProvider = mock(ParticipantProvider.class);
 
 458         var encryptionUtils = mock(EncryptionUtils.class);
 
 459         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 460                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 461                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 463         assertThatThrownBy(() -> instantiationProvider
 
 464                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 465                 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
 
 469     void testMigratePreCheckBadRequest() {
 
 470         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 471         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 472         var compositionId = acDefinition.getCompositionId();
 
 473         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 475         var automationComposition =
 
 476                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 477         automationComposition.setCompositionId(compositionId);
 
 478         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 479         automationComposition.setLockState(LockState.LOCKED);
 
 480         automationComposition.setPrecheck(true);
 
 481         var acProvider = mock(AutomationCompositionProvider.class);
 
 482         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 483                 .thenReturn(automationComposition);
 
 484         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 486         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 487         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 488         when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget));
 
 490         var acMigrate = new AutomationComposition(automationComposition);
 
 491         acMigrate.setCompositionTargetId(compositionTargetId);
 
 492         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 493         automationComposition.setPrecheck(true);
 
 495         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 496         var participantProvider = mock(ParticipantProvider.class);
 
 497         var encryptionUtils = mock(EncryptionUtils.class);
 
 498         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 499                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 500                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 502         assertThatThrownBy(() -> instantiationProvider
 
 503                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 504                 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
 
 508     void testInstantiationDelete() {
 
 509         var automationComposition =
 
 510                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 511         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 512         var acProvider = mock(AutomationCompositionProvider.class);
 
 513         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 514         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 515         var compositionId = acDefinition.getCompositionId();
 
 516         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 517         automationComposition.setCompositionId(compositionId);
 
 518         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 519         var participantProvider = mock(ParticipantProvider.class);
 
 520         var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
 
 521         var encryptionUtils = mock(EncryptionUtils.class);
 
 523         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 524                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
 
 527         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 528                 .thenReturn(automationComposition);
 
 530         var wrongCompositionId = UUID.randomUUID();
 
 531         var instanceId = automationComposition.getInstanceId();
 
 532         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
 
 533                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 535         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 536         automationComposition.setLockState(LockState.NONE);
 
 537         when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 538         instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
 
 539         verify(supervisionAcHandler).delete(any(), any());
 
 543     void testInstantiationDeleteError() {
 
 544         var automationComposition =
 
 545                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 546         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 547         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
 
 548         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
 
 549         assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
 
 550         assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
 
 554     void testRollbackFailure() {
 
 555         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 556         var compositionId = acDefinition.getCompositionId();
 
 557         var automationComposition =
 
 558             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
 
 559         automationComposition.setCompositionId(compositionId);
 
 560         automationComposition.setInstanceId(UUID.randomUUID());
 
 561         automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
 
 562         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 564         var acProvider = mock(AutomationCompositionProvider.class);
 
 565         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 566             .thenReturn(automationComposition);
 
 567         var rollbackRecord = new JpaAutomationCompositionRollback();
 
 568         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
 
 570         final var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 571         final var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 572         final var participantProvider = mock(ParticipantProvider.class);
 
 573         final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 574         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 575             new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 578         var instanceId = automationComposition.getInstanceId();
 
 579         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 581         // DeployState != MIGRATION_REVERTING
 
 582         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 583             .thenReturn(automationComposition);
 
 584         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
 
 586         automationComposition.setDeployState(DeployState.DELETING);
 
 587         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 590         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 591         automationComposition.setSubState(SubState.PREPARING);
 
 592         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 594         // StateChangeResult != NO_ERROR
 
 595         automationComposition.setSubState(SubState.NONE);
 
 596         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
 
 597         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 599         // !compositionId.equals(compId)
 
 600         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 601         automationComposition.setCompositionId(UUID.randomUUID());
 
 602         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 603         verify(acProvider, never()).updateAutomationComposition(any());
 
 607     void testRollbackSuccess() {
 
 608         final var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 609         final var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 610         final var compositionId = acDefinition.getCompositionId();
 
 612         var automationComposition =
 
 613             InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
 
 614         automationComposition.setInstanceId(UUID.randomUUID());
 
 615         automationComposition.setCompositionId(compositionId);
 
 616         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 617         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 618         automationComposition.setSubState(SubState.NONE);
 
 619         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 621         var acProvider = mock(AutomationCompositionProvider.class);
 
 622         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 623             .thenReturn(automationComposition);
 
 624         final var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 625         final var participantProvider = mock(ParticipantProvider.class);
 
 626         final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 627         final var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider,
 
 628             acDefinitionProvider, new AcInstanceStateResolver(), supervisionAcHandler,
 
 629             participantProvider, new AcRuntimeParameterGroup(), encryptionUtils);
 
 631         var rollbackRecord = new JpaAutomationCompositionRollback();
 
 632         rollbackRecord.setCompositionId(automationComposition.getCompositionId().toString());
 
 634         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 635             .thenReturn(automationComposition);
 
 636         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
 
 638         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
 
 640         verify(acProvider).updateAutomationComposition(automationComposition);
 
 641         assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState());
 
 644     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
 
 645             LockState lockState) {
 
 646         automationComposition.setDeployState(deployState);
 
 647         automationComposition.setLockState(lockState);
 
 648         var acProvider = mock(AutomationCompositionProvider.class);
 
 649         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 650                 .thenReturn(automationComposition);
 
 651         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 652         var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
 
 654         var instantiationProvider =
 
 655                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 656                         new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
 
 657                         acRuntimeParamaterGroup, null);
 
 659         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 660         var compositionId = acDefinition.getCompositionId();
 
 661         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 662         automationComposition.setCompositionId(compositionId);
 
 664         var instanceId = automationComposition.getInstanceId();
 
 665         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
 
 666                 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
 
 670     void testCreateAutomationCompositions_NoDuplicates() {
 
 671         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 672         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 673         var compositionId = acDefinition.getCompositionId();
 
 674         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 676         var automationCompositionCreate =
 
 677                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
 
 678         automationCompositionCreate.setCompositionId(compositionId);
 
 679         automationCompositionCreate.setInstanceId(UUID.randomUUID());
 
 681         var acProvider = mock(AutomationCompositionProvider.class);
 
 682         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 683                 .thenReturn(automationCompositionCreate);
 
 684         var participantProvider = mock(ParticipantProvider.class);
 
 685         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 687         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 688                 null, null, participantProvider,
 
 689                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 691         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 692                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 693         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 695         when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier()))
 
 696                 .thenReturn(Optional.of(automationCompositionCreate));
 
 699                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
 
 700                         .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined");
 
 704     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
 
 705         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 706         var participantProvider = mock(ParticipantProvider.class);
 
 707         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 708         var compositionId = acDefinition.getCompositionId();
 
 709         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 710         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
 
 711                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
 
 712         automationComposition.setCompositionId(compositionId);
 
 714         var acProvider = mock(AutomationCompositionProvider.class);
 
 715         var encryptionUtils = mock(EncryptionUtils.class);
 
 716         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
 
 717                 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 719         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 720                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 722         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 723                 .thenReturn(automationComposition);
 
 725         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 726                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 730     void testAcDefinitionNotFound() {
 
 731         var automationComposition = InstantiationUtils
 
 732                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 734         var acProvider = mock(AutomationCompositionProvider.class);
 
 735         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 736                 .thenReturn(automationComposition);
 
 737         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 739                 mock(AcRuntimeParameterGroup.class), null);
 
 741         var compositionId = automationComposition.getCompositionId();
 
 742         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 743                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 745         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 746                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 750     void testCompositionIdDoNotMatch() {
 
 751         var automationComposition = InstantiationUtils
 
 752                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 754         var acProvider = mock(AutomationCompositionProvider.class);
 
 755         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 756                 .thenReturn(automationComposition);
 
 757         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 759                 mock(AcRuntimeParameterGroup.class), null);
 
 761         var compositionId = automationComposition.getCompositionId();
 
 762         var wrongCompositionId = UUID.randomUUID();
 
 763         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
 
 764                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 766         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
 
 767                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 770                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 771                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 772         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
 
 773                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
 
 774                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 776         var compositionTargetId = UUID.randomUUID();
 
 777         automationComposition.setCompositionTargetId(compositionTargetId);
 
 779                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 780                         .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 782         var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
 
 783         assertThat(result).isNotNull();
 
 787     void testCompositionNotPrimed() {
 
 788         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 789         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 790         var compositionId = acDefinition.getCompositionId();
 
 791         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
 
 792         var acProvider = mock(AutomationCompositionProvider.class);
 
 794                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
 
 797         var automationComposition =
 
 798                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 799         automationComposition.setCompositionId(compositionId);
 
 801                       "AutomationComposition" INVALID, item has status INVALID
 
 802                         item "ServiceTemplate.state" value "COMMISSIONED" INVALID, Commissioned automation composition \
 
 803                       definition not primed
 
 806         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 807                 .hasMessageMatching(message);
 
 811     void testCompositionInstanceState() {
 
 812         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 813         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 814         var compositionId = acDefinition.getCompositionId();
 
 815         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 817         var automationComposition = InstantiationUtils
 
 818                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 819         var instanceId = UUID.randomUUID();
 
 820         automationComposition.setCompositionId(compositionId);
 
 821         automationComposition.setInstanceId(instanceId);
 
 822         var acProvider = mock(AutomationCompositionProvider.class);
 
 823         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 825         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 826         var participantProvider = mock(ParticipantProvider.class);
 
 827         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 828                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 829                 mock(AcRuntimeParameterGroup.class), null);
 
 831         var acInstanceStateUpdate = new AcInstanceStateUpdate();
 
 832         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
 
 833         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 834         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 835         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
 
 836                 any(AutomationCompositionDefinition.class));
 
 838         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 839         automationComposition.setLockState(LockState.LOCKED);
 
 840         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
 
 841         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 842         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
 
 843                 any(AutomationCompositionDefinition.class));
 
 845         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 846         automationComposition.setLockState(LockState.LOCKED);
 
 847         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 848         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
 
 849         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 850         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
 
 851                 any(AutomationCompositionDefinition.class));
 
 853         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 854         automationComposition.setLockState(LockState.UNLOCKED);
 
 855         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 856         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
 
 857         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 858         verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
 
 860         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 861         automationComposition.setLockState(LockState.NONE);
 
 862         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 863         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 864         acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
 
 865         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 866         verify(supervisionAcHandler).prepare(any(AutomationComposition.class), any());
 
 868         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 869         automationComposition.setLockState(LockState.LOCKED);
 
 870         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 871         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 872         acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
 
 873         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 874         verify(supervisionAcHandler).review(any(AutomationComposition.class));