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.assertEquals;
 
  27 import static org.junit.jupiter.api.Assertions.assertThrows;
 
  28 import static org.mockito.ArgumentMatchers.any;
 
  29 import static org.mockito.Mockito.doNothing;
 
  30 import static org.mockito.Mockito.doThrow;
 
  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 jakarta.ws.rs.core.Response;
 
  38 import jakarta.ws.rs.core.Response.Status;
 
  39 import java.util.ArrayList;
 
  40 import java.util.List;
 
  41 import java.util.UUID;
 
  42 import org.junit.jupiter.api.BeforeAll;
 
  43 import org.junit.jupiter.api.Test;
 
  44 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
 
  45 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
 
  46 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
 
  47 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 
  48 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 
  49 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
 
  50 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
 
  51 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionRollback;
 
  52 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 
  53 import org.onap.policy.clamp.models.acm.concepts.LockState;
 
  54 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 
  55 import org.onap.policy.clamp.models.acm.concepts.SubState;
 
  56 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
 
  57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
 
  58 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
 
  59 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.SubOrder;
 
  60 import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionRollback;
 
  61 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 
  62 import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
 
  63 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
 
  64 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 
  65 import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
 
  66 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 
  67 import org.onap.policy.models.base.PfModelRuntimeException;
 
  68 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
  69 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
 
  70 import org.springframework.data.domain.Pageable;
 
  73  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
 
  76 class AutomationCompositionInstantiationProviderTest {
 
  78     public static final String MIGRATION_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase-migration.yaml";
 
  79     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
 
  80     private static final String AC_INSTANTIATION_UPDATE_JSON =
 
  81             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
 
  82     private static final String AC_MIGRATE_JSON = "src/test/resources/rest/acm/AutomationCompositionMigrate.json";
 
  84     private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
 
  85             "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
 
  86     private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
 
  87             "src/test/resources/rest/acm/AutomationCompositionNotFound.json";
 
  88     private static final String DELETE_BAD_REQUEST = "Not valid order DELETE;";
 
  90     private static final String AC_ELEMENT_NAME_NOT_FOUND = """
 
  91                 "entry org.onap.domain.pmsh.DCAEMicroservice" INVALID, Not found
 
  92                 "entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement" INVALID, Not found
 
  94     private static final String AC_DEFINITION_NOT_FOUND = """
 
  95             "AutomationComposition" INVALID, item has status INVALID
 
  96               item "ServiceTemplate" value "%s" INVALID, Commissioned automation composition definition not found
 
  99     private static final String DO_NOT_MATCH = " do not match with ";
 
 101     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
 102     private static ToscaServiceTemplate serviceTemplateMigration = new ToscaServiceTemplate();
 
 105     static void setUpBeforeClass() {
 
 106         var st = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
 
 107         var jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "toscaServiceTemplate");
 
 108         serviceTemplate = jpa.toAuthorative();
 
 110         st = InstantiationUtils.getToscaServiceTemplate(MIGRATION_SERVICE_TEMPLATE_YAML);
 
 111         jpa = ProviderUtils.getJpaAndValidate(st, JpaToscaServiceTemplate::new, "migrationServiceTemplate");
 
 112         serviceTemplateMigration = jpa.toAuthorative();
 
 116     void testGetAutomationCompositionsWithNull() {
 
 117         var instantiationProvider = new AutomationCompositionInstantiationProvider(
 
 118                 mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class),
 
 119                 new AcInstanceStateResolver(), mock(SupervisionAcHandler.class), mock(ParticipantProvider.class),
 
 120                 CommonTestData.getTestParamaterGroup(), new EncryptionUtils(CommonTestData.getTestParamaterGroup()));
 
 121         assertThatThrownBy(() -> instantiationProvider
 
 122                 .getAutomationCompositions(null, null, null, Pageable.unpaged()))
 
 123                 .hasMessage("compositionId is marked non-null but is null");
 
 124         assertThatThrownBy(() -> instantiationProvider
 
 125                 .getAutomationCompositions(UUID.randomUUID(), null, null, null))
 
 126                 .hasMessage("pageable is marked non-null but is null");
 
 130     void testInstantiationCrud() {
 
 131         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 132         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 133         var compositionId = acDefinition.getCompositionId();
 
 134         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 135         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 136         var acProvider = mock(AutomationCompositionProvider.class);
 
 137         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 138         var participantProvider = mock(ParticipantProvider.class);
 
 139         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 140         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 141                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 142                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 143         var automationCompositionCreate =
 
 144                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 145         automationCompositionCreate.setCompositionId(compositionId);
 
 146         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 147                 .thenReturn(automationCompositionCreate);
 
 149         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 150                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 151         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 153         verify(acProvider).createAutomationComposition(automationCompositionCreate);
 
 155         assertEquals(StateChangeResult.NO_ERROR, acProvider.createAutomationComposition(automationCompositionCreate)
 
 156                 .getStateChangeResult());
 
 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.getAcDefinition(compositionId)).thenReturn(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(), 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 ->
 
 229                 element.setDeployState(DeployState.DEPLOYED));
 
 230         acmFromDb.setDeployState(DeployState.DEPLOYED);
 
 232                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 233                 .hasMessageStartingWith("Element id not present ");
 
 238     void testUpdateBadRequest() {
 
 239         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 240         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 241         var compositionId = acDefinition.getCompositionId();
 
 242         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 244         var automationCompositionUpdate =
 
 245                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 246         automationCompositionUpdate.setDeployState(DeployState.DEPLOYING);
 
 247         automationCompositionUpdate.setLockState(LockState.NONE);
 
 248         automationCompositionUpdate.setCompositionId(compositionId);
 
 249         var acProvider = mock(AutomationCompositionProvider.class);
 
 250         var encryptionUtils = mock(EncryptionUtils.class);
 
 251         when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId()))
 
 252                 .thenReturn(automationCompositionUpdate);
 
 254         var instantiationProvider =
 
 255                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 256                         new AcInstanceStateResolver(), mock(SupervisionAcHandler.class),
 
 257                         mock(ParticipantProvider.class),
 
 258                         mock(AcRuntimeParameterGroup.class), encryptionUtils);
 
 262                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 264                         "Not allowed to UPDATE in the state " + automationCompositionUpdate.getDeployState());
 
 266         automationCompositionUpdate.setDeployState(DeployState.UPDATING);
 
 267         automationCompositionUpdate.setLockState(LockState.LOCKED);
 
 268         automationCompositionUpdate.setCompositionTargetId(UUID.randomUUID());
 
 270                 () -> instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate))
 
 272                         "Not allowed to MIGRATE in the state " + automationCompositionUpdate.getDeployState());
 
 276     void testMigrationAddRemoveElements() {
 
 277         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 278         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 279         var compositionId = acDefinition.getCompositionId();
 
 280         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 281         var instanceId = UUID.randomUUID();
 
 283         var automationComposition =
 
 284                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 285         automationComposition.setCompositionId(compositionId);
 
 286         automationComposition.setInstanceId(instanceId);
 
 287         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 288         automationComposition.setLockState(LockState.LOCKED);
 
 289         var acProvider = mock(AutomationCompositionProvider.class);
 
 290         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 291                 .thenReturn(automationComposition);
 
 293         var automationCompositionTarget =
 
 294                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Migrate");
 
 295         automationCompositionTarget.setInstanceId(instanceId);
 
 296         automationCompositionTarget.setCompositionId(compositionId);
 
 297         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
 
 298         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 299         automationCompositionTarget.setCompositionTargetId(compositionTargetId);
 
 300         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 301         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 302         when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget);
 
 304         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 305         var participantProvider = mock(ParticipantProvider.class);
 
 306         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 307         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 308                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 309                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 311         automationCompositionTarget.setPrecheck(true);
 
 312         var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 313                 automationCompositionTarget);
 
 314         verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
 
 315         InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
 
 317         automationCompositionTarget.setPrecheck(false);
 
 318         AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED,
 
 320         var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
 
 321                 automationCompositionTarget);
 
 323         verify(supervisionAcHandler).migrate(any(), any(), any());
 
 324         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
 
 328     void testInstantiationMigration() {
 
 329         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 330         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 331         var compositionId = acDefinition.getCompositionId();
 
 332         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 334         var automationComposition =
 
 335                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 336         automationComposition.setCompositionId(compositionId);
 
 337         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 338         automationComposition.setLockState(LockState.LOCKED);
 
 339         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 340         when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()))
 
 341                 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
 
 342                         String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId())));
 
 343         var acProvider = mock(AutomationCompositionProvider.class);
 
 344         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 345                 .thenReturn(automationComposition);
 
 346         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 348         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 349         var participantProvider = mock(ParticipantProvider.class);
 
 350         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 351         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 352                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 355         assertThatThrownBy(() -> instantiationProvider
 
 356                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 358                         String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()));
 
 360         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 361         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 362         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 364         automationComposition.setCompositionTargetId(compositionTargetId);
 
 366         var instantiationResponse = instantiationProvider
 
 367                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 369         verify(supervisionAcHandler).migrate(any(), any(), any());
 
 370         verify(acProvider).updateAutomationComposition(automationComposition);
 
 371         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 375     void testInstantiationMigrationPrecheck() {
 
 376         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 377         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 378         var compositionId = acDefinition.getCompositionId();
 
 379         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 381         var automationComposition =
 
 382                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 383         automationComposition.setCompositionId(compositionId);
 
 384         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 385         automationComposition.setLockState(LockState.LOCKED);
 
 386         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 387         automationComposition.setPrecheck(true);
 
 388         var acProvider = mock(AutomationCompositionProvider.class);
 
 389         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 390                 .thenReturn(automationComposition);
 
 391         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 393         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 394         var acmParticipantProvider = mock(ParticipantProvider.class);
 
 395         var encryptionUtils = mock(EncryptionUtils.class);
 
 396         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 397                 new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider,
 
 398                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 400         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 401         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 402         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 403         automationComposition.setCompositionTargetId(compositionTargetId);
 
 405         var instantiationResponse = instantiationProvider
 
 406                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
 
 408         verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
 
 409         verify(acProvider).updateAutomationComposition(automationComposition);
 
 410         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
 
 412         automationComposition.setSubState(SubState.NONE);
 
 413         when(acDefinitionProvider.getAcDefinition(compositionTargetId))
 
 414                 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
 
 415                         String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
 
 416         assertThatThrownBy(() -> instantiationProvider
 
 417                 .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition))
 
 418                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
 
 422     void testMigrateBadRequest() {
 
 423         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 424         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 425         var compositionId = acDefinition.getCompositionId();
 
 426         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 428         var automationComposition =
 
 429                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 430         automationComposition.setCompositionId(compositionId);
 
 431         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 432         automationComposition.setLockState(LockState.LOCKED);
 
 433         var acProvider = mock(AutomationCompositionProvider.class);
 
 434         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 435                 .thenReturn(automationComposition);
 
 436         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 438         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 439         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 440         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 442         var acMigrate = new AutomationComposition(automationComposition);
 
 443         acMigrate.setCompositionTargetId(compositionTargetId);
 
 444         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 446         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 447         var participantProvider = mock(ParticipantProvider.class);
 
 448         var encryptionUtils = mock(EncryptionUtils.class);
 
 449         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 450                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 451                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 453         assertThatThrownBy(() -> instantiationProvider
 
 454                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 455                 .hasMessageStartingWith("Not allowed to MIGRATE in the state DEPLOYING");
 
 459     void testMigratePreCheckBadRequest() {
 
 460         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 461         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 462         var compositionId = acDefinition.getCompositionId();
 
 463         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 465         var automationComposition =
 
 466                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 467         automationComposition.setCompositionId(compositionId);
 
 468         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 469         automationComposition.setLockState(LockState.LOCKED);
 
 470         automationComposition.setPrecheck(true);
 
 471         var acProvider = mock(AutomationCompositionProvider.class);
 
 472         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 473                 .thenReturn(automationComposition);
 
 474         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 476         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 477         var compositionTargetId = acDefinitionTarget.getCompositionId();
 
 478         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 480         var acMigrate = new AutomationComposition(automationComposition);
 
 481         acMigrate.setCompositionTargetId(compositionTargetId);
 
 482         automationComposition.setDeployState(DeployState.DEPLOYING);
 
 483         automationComposition.setPrecheck(true);
 
 485         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 486         var participantProvider = mock(ParticipantProvider.class);
 
 487         var encryptionUtils = mock(EncryptionUtils.class);
 
 488         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 489                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 490                 new AcRuntimeParameterGroup(), encryptionUtils);
 
 492         assertThatThrownBy(() -> instantiationProvider
 
 493                 .updateAutomationComposition(automationComposition.getCompositionId(), acMigrate))
 
 494                 .hasMessageStartingWith("Not allowed to NONE in the state DEPLOYING");
 
 498     void testInstantiationDelete() {
 
 499         var automationComposition =
 
 500                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 501         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 502         var acProvider = mock(AutomationCompositionProvider.class);
 
 503         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 504         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 505         var compositionId = acDefinition.getCompositionId();
 
 506         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 507         automationComposition.setCompositionId(compositionId);
 
 508         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 509         var participantProvider = mock(ParticipantProvider.class);
 
 510         var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
 
 511         var encryptionUtils = mock(EncryptionUtils.class);
 
 513         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 514                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, acRuntimeParameterGroup,
 
 517         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 518                 .thenReturn(automationComposition);
 
 520         var wrongCompositionId = UUID.randomUUID();
 
 521         var instanceId = automationComposition.getInstanceId();
 
 522         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId))
 
 523                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 525         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 526         automationComposition.setLockState(LockState.NONE);
 
 527         when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 528         instantiationProvider.deleteAutomationComposition(compositionId, instanceId);
 
 529         verify(supervisionAcHandler).delete(any(), any());
 
 533     void testInstantiationDeleteError() {
 
 534         var automationComposition =
 
 535                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 536         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 537         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
 
 538         assertThatDeleteThrownBy(automationComposition, DeployState.DEPLOYING, LockState.NONE);
 
 539         assertThatDeleteThrownBy(automationComposition, DeployState.UNDEPLOYING, LockState.LOCKED);
 
 540         assertThatDeleteThrownBy(automationComposition, DeployState.DELETING, LockState.NONE);
 
 544     void testRollbackFailure() {
 
 545         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 546         var compositionId = acDefinition.getCompositionId();
 
 547         var automationComposition =
 
 548                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Rollback");
 
 549         automationComposition.setCompositionId(compositionId);
 
 550         automationComposition.setInstanceId(UUID.randomUUID());
 
 551         automationComposition.setDeployState(DeployState.MIGRATION_REVERTING);
 
 552         automationComposition.setCompositionTargetId(UUID.randomUUID());
 
 554         var acProvider = mock(AutomationCompositionProvider.class);
 
 555         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 556                 .thenReturn(automationComposition);
 
 557         var rollbackRecord = new JpaAutomationCompositionRollback();
 
 558         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
 
 560         final var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 561         final var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 562         final var participantProvider = mock(ParticipantProvider.class);
 
 563         final var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 564         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 565                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 568         var instanceId = automationComposition.getInstanceId();
 
 569         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 571         // DeployState != MIGRATION_REVERTING
 
 572         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 573                 .thenReturn(automationComposition);
 
 574         when(acProvider.getAutomationCompositionRollback(any(UUID.class))).thenReturn(rollbackRecord.toAuthorative());
 
 576         automationComposition.setDeployState(DeployState.DELETING);
 
 577         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 580         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 581         automationComposition.setSubState(SubState.PREPARING);
 
 582         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 584         // StateChangeResult != NO_ERROR
 
 585         automationComposition.setSubState(SubState.NONE);
 
 586         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
 
 587         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 589         // !compositionId.equals(compId)
 
 590         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
 
 591         automationComposition.setCompositionId(UUID.randomUUID());
 
 592         assertThrows(PfModelRuntimeException.class, () -> instantiationProvider.rollback(compositionId, instanceId));
 
 593         verify(acProvider, never()).updateAutomationComposition(any());
 
 597     void testRollbackSuccess() {
 
 598         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 599         var acDefinition = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED);
 
 600         var compositionId = acDefinition.getCompositionId();
 
 601         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 603         var automationComposition =
 
 604                 InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud");
 
 605         var instanceId = UUID.randomUUID();
 
 606         automationComposition.setInstanceId(instanceId);
 
 607         automationComposition.setCompositionId(compositionId);
 
 608         automationComposition.setDeployState(DeployState.MIGRATING);
 
 609         automationComposition.setLockState(LockState.LOCKED);
 
 610         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
 
 611         automationComposition.setSubState(SubState.NONE);
 
 612         var acProvider = mock(AutomationCompositionProvider.class);
 
 613         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 614         when(acProvider.updateAutomationComposition(automationComposition)).thenReturn(automationComposition);
 
 617                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
 
 619         var rollbackRecord = new AutomationCompositionRollback();
 
 620         var compositionTargetId = UUID.randomUUID();
 
 621         rollbackRecord.setCompositionId(compositionTargetId);
 
 622         rollbackRecord.setInstanceId(instanceId);
 
 623         rollbackRecord.setElements(acRollback.getElements());
 
 624         when(acProvider.getAutomationCompositionRollback(instanceId)).thenReturn(rollbackRecord);
 
 626         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 627         var participantProvider = mock(ParticipantProvider.class);
 
 628         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 629         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 630                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(),
 
 632         var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 633         when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget);
 
 635         instantiationProvider.rollback(compositionId, automationComposition.getInstanceId());
 
 636         verify(acProvider).updateAutomationComposition(any(AutomationComposition.class));
 
 638         when(acDefinitionProvider.getAcDefinition(compositionTargetId))
 
 639                 .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND,
 
 640                         String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)));
 
 641         assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId))
 
 642                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId));
 
 645     private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState,
 
 646                                           LockState lockState) {
 
 647         automationComposition.setDeployState(deployState);
 
 648         automationComposition.setLockState(lockState);
 
 649         var acProvider = mock(AutomationCompositionProvider.class);
 
 650         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 651                 .thenReturn(automationComposition);
 
 652         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 653         var acRuntimeParamaterGroup = mock(AcRuntimeParameterGroup.class);
 
 655         var instantiationProvider =
 
 656                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 657                         new AcInstanceStateResolver(), null, mock(ParticipantProvider.class),
 
 658                         acRuntimeParamaterGroup, null);
 
 660         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 661         var compositionId = acDefinition.getCompositionId();
 
 662         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 663         automationComposition.setCompositionId(compositionId);
 
 665         var instanceId = automationComposition.getInstanceId();
 
 666         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId))
 
 667                 .hasMessageStartingWith(String.format(DELETE_BAD_REQUEST));
 
 671     void testCreateAutomationCompositions_NoDuplicates() {
 
 672         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 673         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 674         var compositionId = acDefinition.getCompositionId();
 
 675         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 677         var automationCompositionCreate =
 
 678                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
 
 679         automationCompositionCreate.setCompositionId(compositionId);
 
 680         automationCompositionCreate.setInstanceId(UUID.randomUUID());
 
 682         var acProvider = mock(AutomationCompositionProvider.class);
 
 683         when(acProvider.createAutomationComposition(automationCompositionCreate))
 
 684                 .thenReturn(automationCompositionCreate);
 
 685         var acIdentifier = automationCompositionCreate.getKey().asIdentifier();
 
 686         var participantProvider = mock(ParticipantProvider.class);
 
 687         var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup());
 
 689         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 690                 null, null, participantProvider,
 
 691                 CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 693         var instantiationResponse = instantiationProvider.createAutomationComposition(
 
 694                 automationCompositionCreate.getCompositionId(), automationCompositionCreate);
 
 695         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate);
 
 697         doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined"))
 
 698                 .when(acProvider).validateNameVersion(acIdentifier);
 
 700                 () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate))
 
 701                 .hasMessageMatching(acIdentifier + " already defined");
 
 705     void testCreateAutomationCompositions_CommissionedAcElementNotFound() {
 
 706         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 707         var participantProvider = mock(ParticipantProvider.class);
 
 708         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
 
 709         var compositionId = acDefinition.getCompositionId();
 
 710         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 711         var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(
 
 712                 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
 
 713         automationComposition.setCompositionId(compositionId);
 
 715         var acProvider = mock(AutomationCompositionProvider.class);
 
 716         var encryptionUtils = mock(EncryptionUtils.class);
 
 717         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null,
 
 718                 participantProvider, CommonTestData.getTestParamaterGroup(), encryptionUtils);
 
 720         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 721                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 723         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 724                 .thenReturn(automationComposition);
 
 726         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 727                 .hasMessageContaining(AC_ELEMENT_NAME_NOT_FOUND);
 
 731     void testAcDefinitionNotFound() {
 
 732         var automationComposition = InstantiationUtils
 
 733                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 735         var acProvider = mock(AutomationCompositionProvider.class);
 
 736         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 737                 .thenReturn(automationComposition);
 
 738         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 739         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 741                 mock(AcRuntimeParameterGroup.class), null);
 
 743         var compositionId = automationComposition.getCompositionId();
 
 744         when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
 
 745                 .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND,
 
 746                         String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId())));
 
 747         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 748                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 750         assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, automationComposition))
 
 751                 .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId));
 
 755     void testCompositionIdDoNotMatch() {
 
 756         var automationComposition = InstantiationUtils
 
 757                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 759         var acProvider = mock(AutomationCompositionProvider.class);
 
 760         when(acProvider.getAutomationComposition(automationComposition.getInstanceId()))
 
 761                 .thenReturn(automationComposition);
 
 762         var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class),
 
 764                 mock(AcRuntimeParameterGroup.class), null);
 
 766         var compositionId = automationComposition.getCompositionId();
 
 767         var wrongCompositionId = UUID.randomUUID();
 
 768         assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition))
 
 769                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 771         assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, automationComposition))
 
 772                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 775                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 776                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 777         assertThatThrownBy(() -> provider.compositionInstanceState(wrongCompositionId,
 
 778                 automationComposition.getInstanceId(), new AcInstanceStateUpdate()))
 
 779                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 781         var compositionTargetId = UUID.randomUUID();
 
 782         automationComposition.setCompositionTargetId(compositionTargetId);
 
 784                 () -> provider.getAutomationComposition(wrongCompositionId, automationComposition.getInstanceId()))
 
 785                 .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId);
 
 787         var result = provider.getAutomationComposition(compositionTargetId, automationComposition.getInstanceId());
 
 788         assertThat(result).isNotNull();
 
 792     void testCompositionNotPrimed() {
 
 793         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 794         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 795         var compositionId = acDefinition.getCompositionId();
 
 796         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 797         var acProvider = mock(AutomationCompositionProvider.class);
 
 799                 new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null,
 
 802         var automationComposition =
 
 803                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
 
 804         automationComposition.setCompositionId(compositionId);
 
 805         var message = compositionId + " Commissioned automation composition definition not primed";
 
 807         assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition))
 
 808                 .hasMessageMatching(message);
 
 812     void testCompositionInstanceState() {
 
 813         var acDefinitionProvider = mock(AcDefinitionProvider.class);
 
 814         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED);
 
 815         var compositionId = acDefinition.getCompositionId();
 
 816         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
 
 818         var automationComposition = InstantiationUtils
 
 819                 .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
 
 820         var instanceId = UUID.randomUUID();
 
 821         automationComposition.setCompositionId(compositionId);
 
 822         automationComposition.setInstanceId(instanceId);
 
 823         var acProvider = mock(AutomationCompositionProvider.class);
 
 824         when(acProvider.getAutomationComposition(instanceId)).thenReturn(automationComposition);
 
 826         var supervisionAcHandler = mock(SupervisionAcHandler.class);
 
 827         var participantProvider = mock(ParticipantProvider.class);
 
 828         var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider,
 
 829                 new AcInstanceStateResolver(), supervisionAcHandler, participantProvider,
 
 830                 mock(AcRuntimeParameterGroup.class), null);
 
 832         var acInstanceStateUpdate = new AcInstanceStateUpdate();
 
 833         acInstanceStateUpdate.setDeployOrder(DeployOrder.DEPLOY);
 
 834         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 835         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 836         verify(supervisionAcHandler).deploy(any(AutomationComposition.class),
 
 837                 any(AutomationCompositionDefinition.class));
 
 839         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 840         automationComposition.setLockState(LockState.LOCKED);
 
 841         acInstanceStateUpdate.setDeployOrder(DeployOrder.UNDEPLOY);
 
 842         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 843         verify(supervisionAcHandler).undeploy(any(AutomationComposition.class),
 
 844                 any(AutomationCompositionDefinition.class));
 
 846         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 847         automationComposition.setLockState(LockState.LOCKED);
 
 848         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 849         acInstanceStateUpdate.setLockOrder(LockOrder.UNLOCK);
 
 850         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 851         verify(supervisionAcHandler).unlock(any(AutomationComposition.class),
 
 852                 any(AutomationCompositionDefinition.class));
 
 854         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 855         automationComposition.setLockState(LockState.UNLOCKED);
 
 856         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 857         acInstanceStateUpdate.setLockOrder(LockOrder.LOCK);
 
 858         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 859         verify(supervisionAcHandler).lock(any(AutomationComposition.class), any(AutomationCompositionDefinition.class));
 
 861         automationComposition.setDeployState(DeployState.UNDEPLOYED);
 
 862         automationComposition.setLockState(LockState.NONE);
 
 863         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 864         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 865         acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE);
 
 866         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 867         verify(supervisionAcHandler).prepare(any(AutomationComposition.class),
 
 868                 any(AutomationCompositionDefinition.class));
 
 870         automationComposition.setDeployState(DeployState.DEPLOYED);
 
 871         automationComposition.setLockState(LockState.LOCKED);
 
 872         acInstanceStateUpdate.setDeployOrder(DeployOrder.NONE);
 
 873         acInstanceStateUpdate.setLockOrder(LockOrder.NONE);
 
 874         acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW);
 
 875         provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate);
 
 876         verify(supervisionAcHandler).review(any(AutomationComposition.class),
 
 877                 any(AutomationCompositionDefinition.class));