2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2024 Nordix Foundation.
 
   4  * ================================================================================
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *      http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17  * SPDX-License-Identifier: Apache-2.0
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.policy.clamp.acm.participant.intermediary.api.impl;
 
  23 import jakarta.ws.rs.core.Response;
 
  24 import java.util.ArrayList;
 
  25 import java.util.HashMap;
 
  26 import java.util.List;
 
  28 import java.util.UUID;
 
  29 import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener;
 
  30 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
 
  31 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
 
  32 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 
  33 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
 
  34 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
 
  35 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
 
  36 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
 
  37 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 
  38 import org.onap.policy.clamp.models.acm.concepts.LockState;
 
  39 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
 
  40 import org.onap.policy.models.base.PfModelException;
 
  41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
  42 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 
  45  * Wrapper of AutomationCompositionElementListener.
 
  46  * Valid since 7.1.0 release.
 
  48 public abstract class AcElementListenerV1
 
  49         implements AutomationCompositionElementListener, AutomationCompositionElementListenerV1 {
 
  50     protected final ParticipantIntermediaryApi intermediaryApi;
 
  52     private static final String NOT_SUPPORTED = "not supported!";
 
  54     protected AcElementListenerV1(ParticipantIntermediaryApi intermediaryApi) {
 
  55         this.intermediaryApi = intermediaryApi;
 
  59     public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
  60         throws PfModelException {
 
  61         var element = new AcElementDeploy();
 
  62         element.setId(instanceElement.elementId());
 
  63         element.setDefinition(compositionElement.elementDefinitionId());
 
  64         element.setToscaServiceTemplateFragment(instanceElement.toscaServiceTemplateFragment());
 
  65         element.setProperties(instanceElement.inProperties());
 
  66         Map<String, Object> properties = new HashMap<>(instanceElement.inProperties());
 
  67         properties.putAll(compositionElement.inProperties());
 
  68         deploy(instanceElement.instanceId(), element, properties);
 
  72     public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
  73         throws PfModelException {
 
  74         undeploy(instanceElement.instanceId(), instanceElement.elementId());
 
  78     public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
  79         throws PfModelException {
 
  80         lock(instanceElement.instanceId(), instanceElement.elementId());
 
  84     public void lock(UUID instanceId, UUID elementId) throws PfModelException {
 
  85         intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
 
  86             StateChangeResult.NO_ERROR, "Locked");
 
  90     public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
  91         throws PfModelException {
 
  92         unlock(instanceElement.instanceId(), instanceElement.elementId());
 
  96     public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
 
  97         intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
 
  98             StateChangeResult.NO_ERROR, "Unlocked");
 
 102     public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
 103         throws PfModelException {
 
 104         delete(instanceElement.instanceId(), instanceElement.elementId());
 
 108     public void delete(UUID instanceId, UUID elementId) throws PfModelException {
 
 109         intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
 
 110             StateChangeResult.NO_ERROR, "Deleted");
 
 114     public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
 
 115                        InstanceElementDto instanceElementUpdated) throws PfModelException {
 
 116         var element = new  AcElementDeploy();
 
 117         element.setId(instanceElementUpdated.elementId());
 
 118         element.setDefinition(compositionElement.elementDefinitionId());
 
 119         element.setProperties(instanceElementUpdated.inProperties());
 
 120         update(instanceElementUpdated.instanceId(), element, element.getProperties());
 
 123     public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
 
 124         throws PfModelException {
 
 125         intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
 
 126             StateChangeResult.NO_ERROR, "Update not supported");
 
 129     private List<AutomationCompositionElementDefinition> createAcElementDefinitionList(CompositionDto composition) {
 
 130         List<AutomationCompositionElementDefinition> elementDefinitionList = new ArrayList<>();
 
 131         for (var entry : composition.inPropertiesMap().entrySet()) {
 
 132             elementDefinitionList.add(createAcElementDefinition(entry.getKey(), entry.getValue(),
 
 133                 composition.outPropertiesMap().get(entry.getKey())));
 
 135         return elementDefinitionList;
 
 138     private AutomationCompositionElementDefinition createAcElementDefinition(
 
 139         ToscaConceptIdentifier toscaConceptIdentifier, Map<String, Object> property,
 
 140         Map<String, Object> outProperties) {
 
 141         var acElementDefinition = new AutomationCompositionElementDefinition();
 
 142         acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
 
 143         var toscaNodeTemplate = new ToscaNodeTemplate();
 
 144         toscaNodeTemplate.setProperties(property);
 
 145         acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
 
 146         acElementDefinition.setOutProperties(outProperties);
 
 147         return acElementDefinition;
 
 151     public void prime(CompositionDto composition) throws PfModelException {
 
 152         prime(composition.compositionId(), createAcElementDefinitionList(composition));
 
 156     public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
 
 157         throws PfModelException {
 
 158         intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
 
 162     public void deprime(CompositionDto composition) throws PfModelException {
 
 163         deprime(composition.compositionId());
 
 167     public void deprime(UUID compositionId) throws PfModelException {
 
 168         intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
 
 172     public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
 
 173         throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
 
 177      * Default implementation of handle Restart Composition.
 
 179      * @param compositionId the composition Id
 
 180      * @param elementDefinitionList the list of AutomationCompositionElementDefinition
 
 181      * @param state the current AcTypeState
 
 182      * @throws PfModelException in case of a model exception
 
 184     public void handleRestartComposition(UUID compositionId,
 
 185         List<AutomationCompositionElementDefinition> elementDefinitionList, AcTypeState state) throws PfModelException {
 
 186         throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
 
 189     public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
 
 190         DeployState deployState, LockState lockState) throws PfModelException {
 
 191         throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
 
 195      * Default implementation of handle Restart Instance.
 
 197      * @param instanceId the instance Id
 
 198      * @param element the AcElementDeploy
 
 199      * @param properties the in properties
 
 200      * @param deployState the current deployState
 
 201      * @param lockState the current lockState
 
 202      * @throws PfModelException in case of a model exception
 
 204     public void handleRestartInstance(UUID instanceId, AcElementDeploy element,
 
 205         Map<String, Object> properties, DeployState deployState, LockState lockState) throws PfModelException {
 
 206         throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
 
 211     public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
 
 212         InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate) throws PfModelException {
 
 213         var element = new  AcElementDeploy();
 
 214         element.setId(instanceElementMigrate.elementId());
 
 215         element.setDefinition(compositionElementTarget.elementDefinitionId());
 
 216         element.setProperties(instanceElementMigrate.inProperties());
 
 217         migrate(instanceElementMigrate.instanceId(), element, compositionElementTarget.compositionId(),
 
 218             element.getProperties());
 
 222     public void migrate(UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
 
 223                         Map<String, Object> properties) throws PfModelException {
 
 224         intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(),
 
 225             DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
 
 229     public void migratePrecheck(CompositionElementDto compositionElement,
 
 230         CompositionElementDto compositionElementTarget, InstanceElementDto instanceElement,
 
 231         InstanceElementDto instanceElementMigrate) throws PfModelException {
 
 232         intermediaryApi.updateAutomationCompositionElementState(instanceElementMigrate.instanceId(),
 
 233             instanceElementMigrate.elementId(), DeployState.DEPLOYED, null,
 
 234             StateChangeResult.NO_ERROR, "Migration Precheck completed");
 
 238     public void review(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
 239         throws PfModelException {
 
 240         intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
 
 241             instanceElement.elementId(), DeployState.DEPLOYED, null,
 
 242             StateChangeResult.NO_ERROR, "Review completed");
 
 246     public void prepare(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
 
 247         throws PfModelException {
 
 248         intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
 
 249             instanceElement.elementId(), DeployState.UNDEPLOYED, null,
 
 250             StateChangeResult.NO_ERROR, "Prepare completed");