3044080af758751825ed310368c0c883da5358c4
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.acm.participant.intermediary.handler;
22
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;
37
38 @Component
39 @RequiredArgsConstructor
40 public class AcSubStateHandler {
41
42     private static final Logger LOGGER = LoggerFactory.getLogger(AcSubStateHandler.class);
43
44     private final CacheProvider cacheProvider;
45     private final ThreadHandler listener;
46
47     /**
48      * Handles AutomationComposition Migration Precheck.
49      *
50      * @param migrationMsg the AutomationCompositionMigration
51      */
52     public void handleAcMigrationPrecheck(AutomationCompositionMigration migrationMsg) {
53         if (migrationMsg.getAutomationCompositionId() == null || migrationMsg.getCompositionTargetId() == null) {
54             return;
55         }
56
57         var automationComposition = cacheProvider.getAutomationComposition(migrationMsg.getAutomationCompositionId());
58         if (automationComposition == null) {
59             LOGGER.debug("Automation composition {} does not use this participant",
60                     migrationMsg.getAutomationCompositionId());
61             return;
62         }
63         automationComposition.setSubState(SubState.MIGRATION_PRECHECKING);
64         for (var participantDeploy : migrationMsg.getParticipantUpdatesList()) {
65             if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
66
67                 callParticipantMigratePrecheck(migrationMsg.getMessageId(), participantDeploy.getAcElementList(),
68                     automationComposition, migrationMsg.getCompositionTargetId());
69             }
70         }
71     }
72
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);
81         }
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());
88         }
89
90         var compositionElementTargetMap = cacheProvider.getCompositionElementDtoMap(acCopyMigrateTo,
91             compositionTargetId);
92         var instanceElementMigrateMap = cacheProvider.getInstanceElementDtoMap(acCopyMigrateTo);
93
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()));
98         }
99     }
100
101     /**
102      * Handle AutomationComposition Prepare message.
103      *
104      * @param acPrepareMsg the AutomationCompositionPrepare message
105      */
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,
112                         SubState.PREPARING);
113                     callParticipanPrepare(acPrepareMsg.getMessageId(), participantPrepare.getAcElementList(),
114                         acPrepareMsg.getAutomationCompositionId());
115                 }
116             }
117         } else {
118             var automationComposition =
119                 cacheProvider.getAutomationComposition(acPrepareMsg.getAutomationCompositionId());
120             automationComposition.setSubState(SubState.REVIEWING);
121             callParticipanReview(acPrepareMsg.getMessageId(), automationComposition);
122         }
123     }
124
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);
137         }
138     }
139
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);
150         }
151     }
152 }