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.setProperties(instanceElement.inProperties());
65 Map<String, Object> properties = new HashMap<>(instanceElement.inProperties());
66 properties.putAll(compositionElement.inProperties());
67 deploy(instanceElement.instanceId(), element, properties);
71 public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
72 throws PfModelException {
73 undeploy(instanceElement.instanceId(), instanceElement.elementId());
77 public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
78 throws PfModelException {
79 lock(instanceElement.instanceId(), instanceElement.elementId());
83 public void lock(UUID instanceId, UUID elementId) throws PfModelException {
84 intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED,
85 StateChangeResult.NO_ERROR, "Locked");
89 public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
90 throws PfModelException {
91 unlock(instanceElement.instanceId(), instanceElement.elementId());
95 public void unlock(UUID instanceId, UUID elementId) throws PfModelException {
96 intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED,
97 StateChangeResult.NO_ERROR, "Unlocked");
101 public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
102 throws PfModelException {
103 delete(instanceElement.instanceId(), instanceElement.elementId());
107 public void delete(UUID instanceId, UUID elementId) throws PfModelException {
108 intermediaryApi.updateAutomationCompositionElementState(instanceId, elementId, DeployState.DELETED, null,
109 StateChangeResult.NO_ERROR, "Deleted");
113 public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
114 InstanceElementDto instanceElementUpdated) throws PfModelException {
115 var element = new AcElementDeploy();
116 element.setId(instanceElementUpdated.elementId());
117 element.setDefinition(compositionElement.elementDefinitionId());
118 element.setProperties(instanceElementUpdated.inProperties());
119 update(instanceElementUpdated.instanceId(), element, element.getProperties());
122 public void update(UUID instanceId, AcElementDeploy element, Map<String, Object> properties)
123 throws PfModelException {
124 intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED, null,
125 StateChangeResult.NO_ERROR, "Update not supported");
128 private List<AutomationCompositionElementDefinition> createAcElementDefinitionList(CompositionDto composition) {
129 List<AutomationCompositionElementDefinition> elementDefinitionList = new ArrayList<>();
130 for (var entry : composition.inPropertiesMap().entrySet()) {
131 elementDefinitionList.add(createAcElementDefinition(entry.getKey(), entry.getValue(),
132 composition.outPropertiesMap().get(entry.getKey())));
134 return elementDefinitionList;
137 private AutomationCompositionElementDefinition createAcElementDefinition(
138 ToscaConceptIdentifier toscaConceptIdentifier, Map<String, Object> property,
139 Map<String, Object> outProperties) {
140 var acElementDefinition = new AutomationCompositionElementDefinition();
141 acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
142 var toscaNodeTemplate = new ToscaNodeTemplate();
143 toscaNodeTemplate.setProperties(property);
144 acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
145 acElementDefinition.setOutProperties(outProperties);
146 return acElementDefinition;
150 public void prime(CompositionDto composition) throws PfModelException {
151 prime(composition.compositionId(), createAcElementDefinitionList(composition));
155 public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList)
156 throws PfModelException {
157 intermediaryApi.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
161 public void deprime(CompositionDto composition) throws PfModelException {
162 deprime(composition.compositionId());
166 public void deprime(UUID compositionId) throws PfModelException {
167 intermediaryApi.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
171 public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException {
172 throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
176 * Default implementation of handle Restart Composition.
178 * @param compositionId the composition Id
179 * @param elementDefinitionList the list of AutomationCompositionElementDefinition
180 * @param state the current AcTypeState
181 * @throws PfModelException in case of a model exception
183 public void handleRestartComposition(UUID compositionId,
184 List<AutomationCompositionElementDefinition> elementDefinitionList, AcTypeState state) throws PfModelException {
185 throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
188 public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement,
189 DeployState deployState, LockState lockState) throws PfModelException {
190 throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
194 * Default implementation of handle Restart Instance.
196 * @param instanceId the instance Id
197 * @param element the AcElementDeploy
198 * @param properties the in properties
199 * @param deployState the current deployState
200 * @param lockState the current lockState
201 * @throws PfModelException in case of a model exception
203 public void handleRestartInstance(UUID instanceId, AcElementDeploy element,
204 Map<String, Object> properties, DeployState deployState, LockState lockState) throws PfModelException {
205 throw new PfModelException(Response.Status.BAD_REQUEST, NOT_SUPPORTED);
210 public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget,
211 InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate,
212 int stage) 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");