c2860a86b53ccf886f52f671fe836734ae339ce1
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.acm.runtime.supervision.scanner;
22
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;
33
34 import java.util.Map;
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;
50
51 class PhaseScannerTest {
52
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";
58
59     @Test
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);
68
69         var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
70         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
71         var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
72         var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
73
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());
78
79         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
80     }
81
82     @Test
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);
94
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());
99
100         verify(automationCompositionProvider).deleteAutomationComposition(automationComposition.getInstanceId());
101     }
102
103     @Test
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);
113         }
114         // the first element is already completed
115         automationComposition.getElements().entrySet().iterator().next().getValue()
116                 .setDeployState(DeployState.DEPLOYED);
117
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);
126
127         // verify timeout scenario
128         var phaseScanner = new PhaseScanner(automationCompositionProvider, participantSyncPublisher,
129                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
130
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());
138
139         //already in TIMEOUT
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));
146
147         clearInvocations(automationCompositionProvider);
148         clearInvocations(participantSyncPublisher);
149         for (Map.Entry<UUID, AutomationCompositionElement> entry : automationComposition.getElements().entrySet()) {
150             entry.getValue().setDeployState(DeployState.DEPLOYED);
151         }
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());
156     }
157
158     @Test
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);
170             } else {
171                 element.setDeployState(DeployState.DEPLOYED);
172                 element.setLockState(LockState.LOCKED);
173             }
174         }
175
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);
181
182         var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class),
183                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
184
185         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
186         phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
187
188         verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
189     }
190
191     @Test
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);
205             } else {
206                 element.setDeployState(DeployState.DEPLOYING);
207                 element.getDefinition().setVersion("0.0.0");
208                 element.setLockState(LockState.NONE);
209             }
210         }
211
212         var acProvider = mock(AutomationCompositionProvider.class);
213         var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
214         var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
215         var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup);
216
217         var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class),
218                 mock(AutomationCompositionStateChangePublisher.class), acDeployPublisher,
219                 acRuntimeParameterGroup, encryptionUtils);
220
221         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
222         phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
223
224         verify(acDeployPublisher, times(0))
225                 .send(any(AutomationComposition.class), anyInt(), anyBoolean());
226     }
227
228     @Test
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);
240             } else {
241                 element.setDeployState(DeployState.DEPLOYED);
242                 element.setLockState(LockState.UNLOCKED);
243             }
244         }
245
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);
251
252         var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class),
253                 acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils);
254
255         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
256         phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync());
257
258         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(),
259                 anyBoolean());
260     }
261 }