38fdede6c33bf274063ac07ccc6a4dab33e48a6d
[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.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40 import org.springframework.stereotype.Component;
41
42 @Component
43 @RequiredArgsConstructor
44 @Transactional
45 public class MonitoringScanner {
46
47     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringScanner.class);
48
49     private final AutomationCompositionProvider automationCompositionProvider;
50     private final AcDefinitionProvider acDefinitionProvider;
51     private final AcDefinitionScanner acDefinitionScanner;
52     private final StageScanner stageScanner;
53     private final SimpleScanner simpleScanner;
54     private final PhaseScanner phaseScanner;
55     private final MessageProvider messageProvider;
56
57     /**
58      * Scan Composition Definition by compositionId.
59      *
60      * @param compositionId the Composition Definition id
61      */
62     public void scanAcDefinition(UUID compositionId) {
63         var messages = messageProvider.getAllMessages(compositionId);
64         var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId);
65         var updateSync = new UpdateSync();
66         for (var message : messages) {
67             acDefinitionOpt.ifPresent(
68                     acDefinition -> updateSync.or(acDefinitionScanner.scanMessage(acDefinition, message)));
69             messageProvider.removeMessage(message.getMessageId());
70         }
71         acDefinitionOpt.ifPresent(acDefinition ->
72                 acDefinitionScanner.scanAutomationCompositionDefinition(acDefinition, updateSync));
73     }
74
75     /**
76      * Scan AutomationComposition Instance by instanceId.
77      *
78      * @param instanceId the AutomationComposition Instance id
79      * @param acDefinitionMap Map of Composition Definitions
80      */
81     public void scanAutomationComposition(UUID instanceId,
82             Map<UUID, AutomationCompositionDefinition> acDefinitionMap) {
83         var messages = messageProvider.getAllMessages(instanceId);
84         var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(instanceId);
85         var updateSync = new UpdateSync();
86         for (var message : messages) {
87             automationCompositionOpt.ifPresent(ac -> updateSync.or(simpleScanner.scanMessage(ac, message)));
88             messageProvider.removeMessage(message.getMessageId());
89         }
90         if (automationCompositionOpt.isPresent()) {
91             var automationComposition = automationCompositionOpt.get();
92             if (automationComposition.getCompositionTargetId() != null) {
93                 var acDefinitionTarget = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionTargetId(),
94                         acDefinitionProvider::getAcDefinition);
95                 var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
96                         acDefinitionProvider::getAcDefinition);
97                 scanAutomationComposition(automationComposition, acDefinitionTarget, updateSync,
98                         acDefinition.getRevisionId());
99             } else {
100                 var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
101                         acDefinitionProvider::getAcDefinition);
102                 scanAutomationComposition(automationComposition, acDefinition, updateSync,
103                         acDefinition.getRevisionId());
104             }
105         }
106     }
107
108     private void scanAutomationComposition(final AutomationComposition automationComposition,
109             AutomationCompositionDefinition acDefinition, UpdateSync updateSync, UUID revisionIdComposition) {
110         LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
111
112         if (!AcmUtils.isInTransitionalState(automationComposition.getDeployState(),
113                 automationComposition.getLockState(), automationComposition.getSubState())
114                 || StateChangeResult.FAILED.equals(automationComposition.getStateChangeResult())) {
115             LOGGER.debug("automation composition {} scanned, OK", automationComposition.getInstanceId());
116             simpleScanner.saveAndSync(automationComposition, updateSync);
117             return;
118         }
119
120         if (DeployState.MIGRATING.equals(automationComposition.getDeployState())
121                 || DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())
122                 || SubState.PREPARING.equals(automationComposition.getSubState())) {
123             stageScanner.scanStage(automationComposition, acDefinition, updateSync, revisionIdComposition);
124         } else if (DeployState.UPDATING.equals(automationComposition.getDeployState())
125                 || SubState.REVIEWING.equals(automationComposition.getSubState())
126                 || SubState.MIGRATION_PRECHECKING.equals(automationComposition.getSubState())) {
127             simpleScanner.simpleScan(automationComposition, updateSync);
128         } else {
129             phaseScanner.scanWithPhase(automationComposition, acDefinition, updateSync);
130         }
131     }
132 }