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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
25 import jakarta.transaction.Transactional;
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;
43 @RequiredArgsConstructor
45 public class MonitoringScanner {
47 private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringScanner.class);
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;
58 * Scan Composition Definition by compositionId.
60 * @param compositionId the Composition Definition id
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());
71 acDefinitionOpt.ifPresent(acDefinition ->
72 acDefinitionScanner.scanAutomationCompositionDefinition(acDefinition, updateSync));
76 * Scan AutomationComposition Instance by instanceId.
78 * @param instanceId the AutomationComposition Instance id
79 * @param acDefinitionMap Map of Composition Definitions
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());
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());
100 var acDefinition = acDefinitionMap.computeIfAbsent(automationComposition.getCompositionId(),
101 acDefinitionProvider::getAcDefinition);
102 scanAutomationComposition(automationComposition, acDefinition, updateSync,
103 acDefinition.getRevisionId());
108 private void scanAutomationComposition(final AutomationComposition automationComposition,
109 AutomationCompositionDefinition acDefinition, UpdateSync updateSync, UUID revisionIdComposition) {
110 LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
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);
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);
129 phaseScanner.scanWithPhase(automationComposition, acDefinition, updateSync);