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.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.springframework.stereotype.Component;
44 @RequiredArgsConstructor
46 public class MonitoringScanner {
48 private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringScanner.class);
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;
59 * Scan Composition Definition by compositionId.
61 * @param compositionId the Composition Definition id
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());
72 acDefinitionOpt.ifPresent(acDefinition ->
73 acDefinitionScanner.scanAutomationCompositionDefinition(acDefinition, updateSync));
77 * Scan AutomationComposition Instance by instanceId.
79 * @param instanceId the AutomationComposition Instance id
80 * @param acDefinitionMap Map of Composition Definitions
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());
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);
100 private void scanAutomationComposition(final AutomationComposition automationComposition,
101 ToscaServiceTemplate serviceTemplate, UpdateSync updateSync) {
102 LOGGER.debug("scanning automation composition {} . . .", automationComposition.getInstanceId());
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);
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);
120 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, updateSync);