dcf0881c1dbe38bd9510a30eae2639b1bb9d9638
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
4  * ================================================================================
5  * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
24
25 import jakarta.transaction.Transactional;
26 import java.util.Map;
27 import java.util.UUID;
28 import lombok.RequiredArgsConstructor;
29 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
30 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
31 import org.onap.policy.clamp.models.acm.concepts.DeployState;
32 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
33 import org.onap.policy.clamp.models.acm.concepts.SubState;
34 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
35 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
36 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
37 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
38 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.springframework.stereotype.Component;
42
43 @Component
44 @RequiredArgsConstructor
45 @Transactional
46 public class MonitoringScanner {
47
48     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringScanner.class);
49
50     private final AutomationCompositionProvider automationCompositionProvider;
51     private final AcDefinitionProvider acDefinitionProvider;
52     private final AcDefinitionScanner acDefinitionScanner;
53     private final StageScanner stageScanner;
54     private final SimpleScanner simpleScanner;
55     private final PhaseScanner phaseScanner;
56     private final MessageProvider messageProvider;
57
58     /**
59      * Scan Composition Definition by compositionId.
60      *
61      * @param compositionId the Composition Definition id
62      */
63     public void scanAcDefinition(UUID compositionId) {
64         var messages = messageProvider.getAllMessages(compositionId);
65         var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId);
66         var updateSync = new UpdateSync();
67         for (var message : messages) {
68             acDefinitionOpt.ifPresent(
69                     acDefinition -> updateSync.or(acDefinitionScanner.scanMessage(acDefinition, message)));
70             messageProvider.removeMessage(message.getMessageId());
71         }
72         acDefinitionOpt.ifPresent(acDefinition ->
73                 acDefinitionScanner.scanAutomationCompositionDefinition(acDefinition, updateSync));
74     }
75
76     /**
77      * Scan AutomationComposition Instance by instanceId.
78      *
79      * @param instanceId the AutomationComposition Instance id
80      * @param acDefinitionMap Map of Composition Definitions
81      */
82     public void scanAutomationComposition(UUID instanceId,
83             Map<UUID, AutomationCompositionDefinition> acDefinitionMap) {
84         var messages = messageProvider.getAllMessages(instanceId);
85         var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(instanceId);
86         var updateSync = new UpdateSync();
87         for (var message : messages) {
88             automationCompositionOpt.ifPresent(ac -> updateSync.or(simpleScanner.scanMessage(ac, message)));
89             messageProvider.removeMessage(message.getMessageId());
90         }
91         if (automationCompositionOpt.isPresent()) {
92             var automationComposition = automationCompositionOpt.get();
93             var compositionId = automationComposition.getCompositionTargetId() != null
94                     ? automationComposition.getCompositionTargetId() : automationComposition.getCompositionId();
95             var acDefinition = acDefinitionMap.computeIfAbsent(compositionId, acDefinitionProvider::getAcDefinition);
96             scanAutomationComposition(automationComposition, acDefinition.getServiceTemplate(), updateSync);
97         }
98     }
99
100     private void scanAutomationComposition(final AutomationComposition automationComposition,
101             ToscaServiceTemplate serviceTemplate, UpdateSync updateSync) {
102         LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
103
104         if (!AcmUtils.isInTransitionalState(automationComposition.getDeployState(),
105                 automationComposition.getLockState(), automationComposition.getSubState())
106                 || StateChangeResult.FAILED.equals(automationComposition.getStateChangeResult())) {
107             LOGGER.debug("automation composition {} scanned, OK", automationComposition.getInstanceId());
108             simpleScanner.saveAndSync(automationComposition, updateSync);
109             return;
110         }
111
112         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
113                 || SubState.PREPARING.equals(automationComposition.getSubState())) {
114             stageScanner.scanStage(automationComposition, serviceTemplate, updateSync);
115         } else if (DeployState.UPDATING.equals(automationComposition.getDeployState())
116                 || SubState.REVIEWING.equals(automationComposition.getSubState())
117                 || SubState.MIGRATION_PRECHECKING.equals(automationComposition.getSubState())) {
118             simpleScanner.simpleScan(automationComposition, updateSync);
119         } else {
120             phaseScanner.scanWithPhase(automationComposition, serviceTemplate, updateSync);
121         }
122     }
123 }