2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023-2024 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;
23 import static org.mockito.ArgumentMatchers.any;
24 import static org.mockito.ArgumentMatchers.anyBoolean;
25 import static org.mockito.ArgumentMatchers.anyInt;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.timeout;
28 import static org.mockito.Mockito.times;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
34 import java.util.Optional;
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.supervision.comm.AcElementPropertiesPublisher;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
40 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher;
41 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
42 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
43 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
44 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
45 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
47 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
48 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
49 import org.onap.policy.clamp.models.acm.concepts.DeployState;
50 import org.onap.policy.clamp.models.acm.concepts.LockState;
51 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
52 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
53 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
54 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
55 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
57 class SupervisionAcHandlerTest {
58 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
59 private static final UUID IDENTIFIER = UUID.randomUUID();
62 void testHandleAutomationCompositionStateChangeAckMessage() {
63 var automationComposition =
64 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
65 automationComposition.setInstanceId(IDENTIFIER);
66 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
67 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
68 .thenReturn(Optional.of(automationComposition));
70 var acDefinitionProvider = mock(AcDefinitionProvider.class);
71 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
72 .thenReturn(new AutomationCompositionDefinition());
74 var handler = new SupervisionAcHandler(automationCompositionProvider, acDefinitionProvider,
75 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
76 mock(AcElementPropertiesPublisher.class), null,
77 mock(ParticipantSyncPublisher.class));
79 var automationCompositionAckMessage =
80 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
81 automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
82 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
84 verify(automationCompositionProvider, times(3))
85 .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
88 private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType,
89 AutomationComposition automationComposition, DeployState deployState, LockState lockState) {
90 var automationCompositionAckMessage = new AutomationCompositionDeployAck(messageType);
91 for (var elementEntry : automationComposition.getElements().entrySet()) {
92 var acElementDeployAck = new AcElementDeployAck(deployState, lockState, "", "", Map.of(), true, "");
93 automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
96 automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
97 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
98 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
99 return automationCompositionAckMessage;
103 void testHandleAutomationCompositionUpdateAckMessage() {
104 var automationComposition =
105 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
106 automationComposition.setInstanceId(IDENTIFIER);
107 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
108 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
109 .thenReturn(Optional.of(automationComposition));
111 var acDefinitionProvider = mock(AcDefinitionProvider.class);
112 when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
113 .thenReturn(new AutomationCompositionDefinition());
115 var automationCompositionAckMessage =
116 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
117 automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
118 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
120 var handler = new SupervisionAcHandler(automationCompositionProvider, acDefinitionProvider,
121 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
122 mock(AcElementPropertiesPublisher.class), null,
123 mock(ParticipantSyncPublisher.class));
125 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
127 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
131 void testHandleAcUpdateAckFailedMessage() {
132 var automationComposition =
133 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
134 automationComposition.setDeployState(DeployState.DEPLOYING);
135 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
136 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
137 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
138 .thenReturn(Optional.of(automationComposition));
140 var automationCompositionAckMessage =
141 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
142 automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
143 for (var element : automationComposition.getElements().values()) {
144 element.setDeployState(DeployState.DEPLOYED);
146 var elementEntry = automationComposition.getElements().entrySet().iterator().next();
147 elementEntry.getValue().setDeployState(DeployState.DEPLOYING);
148 var acElementDeployAck =
149 new AcElementDeployAck(DeployState.UNDEPLOYED, LockState.NONE, "", "", Map.of(), true, "Error");
150 automationCompositionAckMessage
151 .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
153 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
154 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
156 var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
158 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
159 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null,
160 null, mock(ParticipantSyncPublisher.class));
162 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
164 verify(automationCompositionProvider)
165 .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
169 void testDeployFailed() {
170 var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
171 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
172 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
173 automationCompositionDeployPublisher, mock(AutomationCompositionStateChangePublisher.class),
174 mock(AcElementPropertiesPublisher.class), null, mock(ParticipantSyncPublisher.class));
176 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
177 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
178 var automationComposition =
179 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
180 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
181 handler.deploy(automationComposition, acDefinition);
182 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
183 verify(automationCompositionDeployPublisher, timeout(1000))
184 .send(automationComposition, acDefinition.getServiceTemplate(), 0, true);
188 void testUndeploy() {
189 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
190 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
191 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
192 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
193 mock(AcElementPropertiesPublisher.class), null,
194 mock(ParticipantSyncPublisher.class));
195 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
196 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
197 var automationComposition =
198 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Undeploy");
199 handler.undeploy(automationComposition, acDefinition);
201 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
202 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
206 void testUndeployFailed() {
207 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
208 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
209 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
210 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
211 mock(AcElementPropertiesPublisher.class), null,
212 mock(ParticipantSyncPublisher.class));
214 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
215 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
216 var automationComposition =
217 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnDeploy");
218 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
219 automationComposition.getElements().values()
220 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYING));
221 handler.undeploy(automationComposition, acDefinition);
222 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
223 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
228 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
229 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
230 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
231 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
232 mock(AcElementPropertiesPublisher.class), null,
233 mock(ParticipantSyncPublisher.class));
234 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
235 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
236 var automationComposition =
237 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
238 handler.unlock(automationComposition, acDefinition);
240 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
241 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
245 void testUnlockFailed() {
246 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
247 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
248 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
249 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
250 mock(AcElementPropertiesPublisher.class), null,
251 mock(ParticipantSyncPublisher.class));
252 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
253 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
254 var automationComposition =
255 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
256 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
257 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
258 handler.unlock(automationComposition, acDefinition);
260 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
261 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
266 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
267 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
268 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
269 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
270 mock(AcElementPropertiesPublisher.class), null,
271 mock(ParticipantSyncPublisher.class));
272 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
273 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
274 var automationComposition =
275 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
276 handler.lock(automationComposition, acDefinition);
278 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
279 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
283 void testLockFailed() {
284 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
285 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
286 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
287 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
288 mock(AcElementPropertiesPublisher.class), null,
289 mock(ParticipantSyncPublisher.class));
290 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
291 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
292 var automationComposition =
293 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
294 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
295 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
296 handler.lock(automationComposition, acDefinition);
298 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
299 verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
303 void testDeleteAck() {
304 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
305 var automationComposition =
306 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
307 automationComposition.setDeployState(DeployState.DELETING);
308 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
309 .thenReturn(Optional.of(automationComposition));
311 var automationCompositionAckMessage =
312 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
313 automationCompositionAckMessage
314 .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId());
315 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
317 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
318 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
319 mock(AcElementPropertiesPublisher.class), null,
320 mock(ParticipantSyncPublisher.class));
322 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
324 verify(automationCompositionProvider)
325 .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
330 var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class);
331 var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class),
332 mock(AcDefinitionProvider.class), mock(AutomationCompositionDeployPublisher.class),
333 mock(AutomationCompositionStateChangePublisher.class), acElementPropertiesPublisher, null,
334 mock(ParticipantSyncPublisher.class));
335 var automationComposition =
336 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
337 handler.update(automationComposition);
338 verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class));
343 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
344 var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class);
345 var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
347 acCompositionMigrationPublisher, mock(ParticipantSyncPublisher.class));
348 var automationComposition =
349 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
350 handler.migrate(automationComposition, UUID.randomUUID());
351 verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), any());