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,
213 int stage) throws PfModelException {
214 var element = new AcElementDeploy();
215 element.setId(instanceElementMigrate.elementId());
216 element.setDefinition(compositionElementTarget.elementDefinitionId());
217 element.setProperties(instanceElementMigrate.inProperties());
218 migrate(instanceElementMigrate.instanceId(), element, compositionElementTarget.compositionId(),
219 element.getProperties());
223 public void migrate(UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
224 Map<String, Object> properties) throws PfModelException {
225 intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(),
226 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");
230 public void migratePrecheck(CompositionElementDto compositionElement,
231 CompositionElementDto compositionElementTarget, InstanceElementDto instanceElement,
232 InstanceElementDto instanceElementMigrate) throws PfModelException {
233 intermediaryApi.updateAutomationCompositionElementState(instanceElementMigrate.instanceId(),
234 instanceElementMigrate.elementId(), DeployState.DEPLOYED, null,
235 StateChangeResult.NO_ERROR, "Migration Precheck completed");
239 public void review(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
240 throws PfModelException {
241 intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
242 instanceElement.elementId(), DeployState.DEPLOYED, null,
243 StateChangeResult.NO_ERROR, "Review completed");
247 public void prepare(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
248 throws PfModelException {
249 intermediaryApi.updateAutomationCompositionElementState(instanceElement.instanceId(),
250 instanceElement.elementId(), DeployState.UNDEPLOYED, null,
251 StateChangeResult.NO_ERROR, "Prepare completed");