2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2025 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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyBoolean;
26 import static org.mockito.ArgumentMatchers.anyInt;
27 import static org.mockito.Mockito.clearInvocations;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.times;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
35 import java.util.UUID;
36 import org.junit.jupiter.api.Test;
37 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
38 import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
40 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
41 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
42 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
45 import org.onap.policy.clamp.models.acm.concepts.DeployState;
46 import org.onap.policy.clamp.models.acm.concepts.LockState;
47 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
48 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
49 import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
51 class PhaseScannerTest {
53 private static final String AC_JSON = "src/test/resources/rest/acm/AutomationCompositionSmoke.json";
54 private static final UUID COMPOSITION_ID = UUID.randomUUID();
55 private static final UUID INSTANCE_ID = UUID.randomUUID();
56 private static final String ELEMENT_NAME =
57 "org.onap.domain.database.Http_PMSHMicroserviceAutomationCompositionElement";
60 void testAcUndeployCompleted() {
61 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
62 automationComposition.setInstanceId(INSTANCE_ID);
63 automationComposition.setDeployState(DeployState.UNDEPLOYING);
64 automationComposition.setLockState(LockState.NONE);
65 automationComposition.setCompositionId(COMPOSITION_ID);
66 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
67 when(automationCompositionProvider.updateAutomationComposition(any())).thenReturn(automationComposition);
69 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
70 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
71 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
72 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
74 var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
75 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
76 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
77 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
79 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
83 void testAcDeleted() {
84 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
85 automationComposition.setInstanceId(INSTANCE_ID);
86 automationComposition.setDeployState(DeployState.DELETING);
87 automationComposition.setLockState(LockState.NONE);
88 automationComposition.setCompositionId(COMPOSITION_ID);
89 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
90 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
91 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
92 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
93 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
95 var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
96 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
97 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
98 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
100 verify(automationCompositionProvider).deleteAutomationComposition(automationComposition.getInstanceId());
104 void testScannerForTimeout() {
105 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
106 automationComposition.setInstanceId(INSTANCE_ID);
107 automationComposition.setDeployState(DeployState.DEPLOYING);
108 automationComposition.setLockState(LockState.NONE);
109 automationComposition.setPhase(0);
110 automationComposition.setCompositionId(COMPOSITION_ID);
111 for (var entry : automationComposition.getElements().entrySet()) {
112 entry.getValue().setDeployState(DeployState.DEPLOYING);
114 // the first element is already completed
115 automationComposition.getElements().entrySet().iterator().next().getValue()
116 .setDeployState(DeployState.DEPLOYED);
118 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
119 when(automationCompositionProvider.updateAutomationComposition(any())).thenReturn(automationComposition);
120 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
121 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
122 var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
123 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
124 acRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
125 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
127 // verify timeout scenario
128 var phaseScanner = new PhaseScanner(automationCompositionProvider, participantSyncPublisher,
129 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
131 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
132 automationComposition.setLastMsg(TimestampHelper.now());
133 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
134 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
135 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
136 verify(participantSyncPublisher).sendSync(any(AutomationComposition.class));
137 assertEquals(StateChangeResult.TIMEOUT, automationComposition.getStateChangeResult());
140 clearInvocations(automationCompositionProvider);
141 clearInvocations(participantSyncPublisher);
142 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
143 verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
144 verify(participantSyncPublisher, times(0))
145 .sendSync(any(AutomationComposition.class));
147 clearInvocations(automationCompositionProvider);
148 clearInvocations(participantSyncPublisher);
149 for (Map.Entry<UUID, AutomationCompositionElement> entry : automationComposition.getElements().entrySet()) {
150 entry.getValue().setDeployState(DeployState.DEPLOYED);
152 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
153 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
154 verify(participantSyncPublisher).sendSync(any(AutomationComposition.class));
155 assertEquals(StateChangeResult.NO_ERROR, automationComposition.getStateChangeResult());
159 void testSendAutomationCompositionMsgStartPhase() {
160 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
161 automationComposition.setInstanceId(INSTANCE_ID);
162 automationComposition.setDeployState(DeployState.DEPLOYING);
163 automationComposition.setLockState(LockState.NONE);
164 automationComposition.setPhase(0);
165 automationComposition.setCompositionId(COMPOSITION_ID);
166 for (var element : automationComposition.getElements().values()) {
167 if (ELEMENT_NAME.equals(element.getDefinition().getName())) {
168 element.setDeployState(DeployState.DEPLOYING);
169 element.setLockState(LockState.NONE);
171 element.setDeployState(DeployState.DEPLOYED);
172 element.setLockState(LockState.LOCKED);
176 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
177 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
178 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
179 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
180 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
182 var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
183 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
185 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
186 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
188 verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
192 void testStartPhaseWithNull() {
193 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
194 automationComposition.setInstanceId(INSTANCE_ID);
195 automationComposition.setDeployState(DeployState.DEPLOYING);
196 automationComposition.setLockState(LockState.NONE);
197 automationComposition.setPhase(0);
198 automationComposition.setLastMsg(TimestampHelper.now());
199 automationComposition.setCompositionId(COMPOSITION_ID);
200 for (var element : automationComposition.getElements().values()) {
201 if (ELEMENT_NAME.equals(element.getDefinition().getName())) {
202 element.setDeployState(DeployState.DEPLOYING);
203 element.getDefinition().setName("NotExistElement");
204 element.setLockState(LockState.NONE);
206 element.setDeployState(DeployState.DEPLOYING);
207 element.getDefinition().setVersion("0.0.0");
208 element.setLockState(LockState.NONE);
212 var acProvider = mock(AutomationCompositionProvider.class);
213 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
214 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
215 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
217 var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class),
218 mock(AutomationCompositionStateChangePublisher.class), acDeployPublisher,
219 acRuntimeParameterGroup, encryptionUtils);
221 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
222 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
224 verify(acDeployPublisher, times(0))
225 .send(any(AutomationComposition.class), anyInt(), anyBoolean());
229 void testSendAutomationCompositionMsgUnlocking() {
230 var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud");
231 automationComposition.setInstanceId(INSTANCE_ID);
232 automationComposition.setDeployState(DeployState.DEPLOYED);
233 automationComposition.setLockState(LockState.UNLOCKING);
234 automationComposition.setCompositionId(COMPOSITION_ID);
235 automationComposition.setPhase(0);
236 for (var element : automationComposition.getElements().values()) {
237 if (ELEMENT_NAME.equals(element.getDefinition().getName())) {
238 element.setDeployState(DeployState.DEPLOYED);
239 element.setLockState(LockState.UNLOCKING);
241 element.setDeployState(DeployState.DEPLOYED);
242 element.setLockState(LockState.UNLOCKED);
246 var acProvider = mock(AutomationCompositionProvider.class);
247 var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
248 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
249 var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
250 var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
252 var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class),
253 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
255 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
256 phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
258 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(),