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.handler;
23 import java.util.List;
24 import java.util.UUID;
25 import lombok.RequiredArgsConstructor;
26 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
27 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
28 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
29 import org.onap.policy.clamp.models.acm.concepts.DeployState;
30 import org.onap.policy.clamp.models.acm.concepts.SubState;
31 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
32 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionPrepare;
33 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import org.springframework.stereotype.Component;
39 @RequiredArgsConstructor
40 public class AcSubStateHandler {
42 private static final Logger LOGGER = LoggerFactory.getLogger(AcSubStateHandler.class);
44 private final CacheProvider cacheProvider;
45 private final ThreadHandler listener;
48 * Handles AutomationComposition Migration Precheck.
50 * @param migrationMsg the AutomationCompositionMigration
52 public void handleAcMigrationPrecheck(AutomationCompositionMigration migrationMsg) {
53 if (migrationMsg.getAutomationCompositionId() == null || migrationMsg.getCompositionTargetId() == null) {
57 var automationComposition = cacheProvider.getAutomationComposition(migrationMsg.getAutomationCompositionId());
58 if (automationComposition == null) {
59 LOGGER.debug("Automation composition {} does not use this participant",
60 migrationMsg.getAutomationCompositionId());
63 automationComposition.setSubState(SubState.MIGRATION_PRECHECKING);
64 for (var participantDeploy : migrationMsg.getParticipantUpdatesList()) {
65 if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
67 callParticipantMigratePrecheck(migrationMsg.getMessageId(), participantDeploy.getAcElementList(),
68 automationComposition, migrationMsg.getCompositionTargetId());
73 private void callParticipantMigratePrecheck(UUID messageId, List<AcElementDeploy> acElements,
74 AutomationComposition automationComposition, UUID compositionTargetId) {
75 var compositionElementMap = cacheProvider.getCompositionElementDtoMap(automationComposition);
76 var instanceElementMap = cacheProvider.getInstanceElementDtoMap(automationComposition);
77 var acElementList = automationComposition.getElements();
78 for (var acElement : acElements) {
79 var element = acElementList.get(acElement.getId());
80 element.setSubState(SubState.MIGRATION_PRECHECKING);
82 var acCopyMigrateTo = new AutomationComposition(automationComposition);
83 acElementList = acCopyMigrateTo.getElements();
84 for (var acElement : acElements) {
85 var element = acElementList.get(acElement.getId());
86 AcmUtils.recursiveMerge(element.getProperties(), acElement.getProperties());
87 element.setDefinition(acElement.getDefinition());
90 var compositionElementTargetMap = cacheProvider.getCompositionElementDtoMap(acCopyMigrateTo,
92 var instanceElementMigrateMap = cacheProvider.getInstanceElementDtoMap(acCopyMigrateTo);
94 for (var acElement : acElements) {
95 listener.migratePrecheck(messageId, compositionElementMap.get(acElement.getId()),
96 compositionElementTargetMap.get(acElement.getId()),
97 instanceElementMap.get(acElement.getId()), instanceElementMigrateMap.get(acElement.getId()));
102 * Handle AutomationComposition Prepare message.
104 * @param acPrepareMsg the AutomationCompositionPrepare message
106 public void handleAcPrepare(AutomationCompositionPrepare acPrepareMsg) {
107 if (acPrepareMsg.isPreDeploy()) {
108 for (var participantPrepare : acPrepareMsg.getParticipantList()) {
109 if (cacheProvider.getParticipantId().equals(participantPrepare.getParticipantId())) {
110 cacheProvider.initializeAutomationComposition(acPrepareMsg.getCompositionId(),
111 acPrepareMsg.getAutomationCompositionId(), participantPrepare, DeployState.UNDEPLOYED,
113 callParticipanPrepare(acPrepareMsg.getMessageId(), participantPrepare.getAcElementList(),
114 acPrepareMsg.getAutomationCompositionId());
118 var automationComposition =
119 cacheProvider.getAutomationComposition(acPrepareMsg.getAutomationCompositionId());
120 automationComposition.setSubState(SubState.REVIEWING);
121 callParticipanReview(acPrepareMsg.getMessageId(), automationComposition);
125 private void callParticipanPrepare(UUID messageId, List<AcElementDeploy> acElementList, UUID instanceId) {
126 var automationComposition = cacheProvider.getAutomationComposition(instanceId);
127 for (var elementDeploy : acElementList) {
128 var element = automationComposition.getElements().get(elementDeploy.getId());
129 var compositionInProperties = cacheProvider
130 .getCommonProperties(automationComposition.getCompositionId(), element.getDefinition());
131 var compositionElement = cacheProvider.createCompositionElementDto(automationComposition.getCompositionId(),
132 element, compositionInProperties);
133 var instanceElement = new InstanceElementDto(instanceId, elementDeploy.getId(),
134 elementDeploy.getToscaServiceTemplateFragment(),
135 elementDeploy.getProperties(), element.getOutProperties());
136 listener.prepare(messageId, compositionElement, instanceElement);
140 private void callParticipanReview(UUID messageId, AutomationComposition automationComposition) {
141 for (var element : automationComposition.getElements().values()) {
142 var compositionInProperties = cacheProvider
143 .getCommonProperties(automationComposition.getCompositionId(), element.getDefinition());
144 element.setSubState(SubState.REVIEWING);
145 var compositionElement = cacheProvider.createCompositionElementDto(automationComposition.getCompositionId(),
146 element, compositionInProperties);
147 var instanceElement = new InstanceElementDto(automationComposition.getInstanceId(), element.getId(),
148 null, element.getProperties(), element.getOutProperties());
149 listener.review(messageId, compositionElement, instanceElement);