2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-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.participant.intermediary.handler;
23 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.times;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import java.util.HashMap;
32 import java.util.List;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
36 import org.junit.jupiter.api.extension.ExtendWith;
37 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
38 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
39 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
40 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
41 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
43 import org.onap.policy.clamp.models.acm.concepts.DeployState;
44 import org.onap.policy.clamp.models.acm.concepts.LockState;
45 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
46 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeploy;
47 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
48 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
49 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionStateChange;
50 import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate;
51 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
52 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
55 import org.springframework.test.context.junit.jupiter.SpringExtension;
57 @ExtendWith(SpringExtension.class)
58 class AutomationCompositionHandlerTest {
61 void handleAutomationCompositionStateChangeNullTest() {
62 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
63 var cacheProvider = mock(CacheProvider.class);
65 new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, mock(ThreadHandler.class));
67 var automationCompositionStateChange = new AutomationCompositionStateChange();
68 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(automationCompositionStateChange));
70 automationCompositionStateChange.setAutomationCompositionId(UUID.randomUUID());
71 automationCompositionStateChange.setDeployOrderedState(DeployOrder.DELETE);
72 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(automationCompositionStateChange));
73 verify(participantMessagePublisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
75 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
76 automationCompositionStateChange.setAutomationCompositionId(automationComposition.getInstanceId());
77 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
78 .thenReturn(automationComposition);
79 automationCompositionStateChange.setDeployOrderedState(DeployOrder.UPDATE);
80 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(automationCompositionStateChange));
84 void handleAutomationCompositionStateChangeUndeployTest() {
85 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
86 var cacheProvider = mock(CacheProvider.class);
87 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
88 .thenReturn(automationComposition);
89 when(cacheProvider.getCommonProperties(any(UUID.class), any(UUID.class))).thenReturn(Map.of());
91 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
92 var listener = mock(ThreadHandler.class);
93 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
94 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
95 for (var element : automationComposition.getElements().values()) {
96 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
98 when(cacheProvider.getAcElementsDefinitions())
99 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
100 var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(),
101 automationComposition.getInstanceId(), DeployOrder.UNDEPLOY, LockOrder.NONE);
103 ach.handleAutomationCompositionStateChange(automationCompositionStateChange);
104 verify(listener, times(automationComposition.getElements().size())).undeploy(any(), any(), any());
105 for (var element : automationComposition.getElements().values()) {
106 assertEquals(DeployState.UNDEPLOYING, element.getDeployState());
111 void handleAutomationCompositionStateChangeLockTest() {
112 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
113 var cacheProvider = mock(CacheProvider.class);
114 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
115 .thenReturn(automationComposition);
116 when(cacheProvider.getCommonProperties(any(UUID.class), any(UUID.class))).thenReturn(Map.of());
118 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
119 var listener = mock(ThreadHandler.class);
120 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
121 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
122 for (var element : automationComposition.getElements().values()) {
123 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
125 when(cacheProvider.getAcElementsDefinitions())
126 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
127 var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(),
128 automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.LOCK);
129 ach.handleAutomationCompositionStateChange(automationCompositionStateChange);
130 verify(listener, times(automationComposition.getElements().size())).lock(any(), any(), any());
131 for (var element : automationComposition.getElements().values()) {
132 assertEquals(LockState.LOCKING, element.getLockState());
137 void handleAutomationCompositionStateChangeUnlockTest() {
138 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
139 var cacheProvider = mock(CacheProvider.class);
140 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
141 .thenReturn(automationComposition);
142 when(cacheProvider.getCommonProperties(any(UUID.class), any(UUID.class))).thenReturn(Map.of());
144 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
145 var listener = mock(ThreadHandler.class);
146 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
147 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
148 for (var element : automationComposition.getElements().values()) {
149 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
151 when(cacheProvider.getAcElementsDefinitions())
152 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
153 var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(),
154 automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.UNLOCK);
155 ach.handleAutomationCompositionStateChange(automationCompositionStateChange);
156 verify(listener, times(automationComposition.getElements().size())).unlock(any(), any(), any());
157 for (var element : automationComposition.getElements().values()) {
158 assertEquals(LockState.UNLOCKING, element.getLockState());
163 void handleAutomationCompositionStateChangeDeleteTest() {
164 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
165 var cacheProvider = mock(CacheProvider.class);
166 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
167 .thenReturn(automationComposition);
168 when(cacheProvider.getCommonProperties(any(UUID.class), any(UUID.class))).thenReturn(Map.of());
170 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
171 var listener = mock(ThreadHandler.class);
172 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
173 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
174 for (var element : automationComposition.getElements().values()) {
175 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
177 when(cacheProvider.getAcElementsDefinitions())
178 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
179 var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(),
180 automationComposition.getInstanceId(), DeployOrder.DELETE, LockOrder.NONE);
181 ach.handleAutomationCompositionStateChange(automationCompositionStateChange);
182 verify(listener, times(automationComposition.getElements().size())).delete(any(), any(), any());
183 for (var element : automationComposition.getElements().values()) {
184 assertEquals(DeployState.DELETING, element.getDeployState());
189 void handleAcPropertyUpdateTest() {
190 var cacheProvider = mock(CacheProvider.class);
191 var listener = mock(ThreadHandler.class);
192 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
193 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
195 var updateMsg = new PropertiesUpdate();
196 assertDoesNotThrow(() -> ach.handleAcPropertyUpdate(updateMsg));
198 updateMsg.setParticipantId(CommonTestData.getParticipantId());
199 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
200 var participantDeploy = new ParticipantDeploy();
201 participantDeploy.setParticipantId(CommonTestData.getParticipantId());
202 updateMsg.getParticipantUpdatesList().add(participantDeploy);
204 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
205 updateMsg.setAutomationCompositionId(automationComposition.getInstanceId());
206 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
207 .thenReturn(automationComposition);
208 var acElementDeploy = new AcElementDeploy();
209 acElementDeploy.setProperties(Map.of());
210 acElementDeploy.setId(automationComposition.getElements().values().iterator().next().getId());
211 participantDeploy.getAcElementList().add(acElementDeploy);
213 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
214 for (var element : automationComposition.getElements().values()) {
215 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
217 when(cacheProvider.getAcElementsDefinitions())
218 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
219 ach.handleAcPropertyUpdate(updateMsg);
220 verify(listener).update(any(), any(), any(), any());
224 void handleAutomationCompositionDeployTest() {
225 var cacheProvider = mock(CacheProvider.class);
226 var listener = mock(ThreadHandler.class);
227 var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
228 var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener);
230 var deployMsg = new AutomationCompositionDeploy();
231 assertDoesNotThrow(() -> ach.handleAutomationCompositionDeploy(deployMsg));
233 deployMsg.setParticipantId(CommonTestData.getParticipantId());
234 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
235 var participantDeploy = new ParticipantDeploy();
236 participantDeploy.setParticipantId(CommonTestData.getParticipantId());
237 deployMsg.getParticipantUpdatesList().add(participantDeploy);
239 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
240 deployMsg.setAutomationCompositionId(automationComposition.getInstanceId());
241 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
242 .thenReturn(automationComposition);
243 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
244 for (var element : automationComposition.getElements().values()) {
245 var acElementDeploy = new AcElementDeploy();
246 acElementDeploy.setProperties(Map.of());
247 acElementDeploy.setId(element.getId());
248 participantDeploy.getAcElementList().add(acElementDeploy);
249 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
251 when(cacheProvider.getAcElementsDefinitions())
252 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
254 ach.handleAutomationCompositionDeploy(deployMsg);
255 verify(listener, times(automationComposition.getElements().size())).deploy(any(), any(), any());
259 void handleComposiotPrimeTest() {
260 var acElementDefinition = new AutomationCompositionElementDefinition();
261 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0"));
262 var toscaNodeTemplate = new ToscaNodeTemplate();
263 toscaNodeTemplate.setProperties(Map.of());
264 acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
265 var list = List.of(acElementDefinition);
266 var compositionId = UUID.randomUUID();
267 var messageId = UUID.randomUUID();
268 var listener = mock(ThreadHandler.class);
269 var ach = new AutomationCompositionHandler(mock(CacheProvider.class), mock(ParticipantMessagePublisher.class),
271 ach.prime(messageId, compositionId, list);
272 verify(listener).prime(any(UUID.class), any(CompositionDto.class));
276 void handleComposiotDeprimeTest() {
277 var acElementDefinition = new AutomationCompositionElementDefinition();
278 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0"));
279 var toscaNodeTemplate = new ToscaNodeTemplate();
280 toscaNodeTemplate.setProperties(Map.of());
281 acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
282 var compositionId = UUID.randomUUID();
283 var listener = mock(ThreadHandler.class);
284 var cacheProvider = mock(CacheProvider.class);
285 var ach = new AutomationCompositionHandler(cacheProvider, mock(ParticipantMessagePublisher.class),
287 when(cacheProvider.getAcElementsDefinitions())
288 .thenReturn(Map.of(compositionId, Map.of(new ToscaConceptIdentifier(), acElementDefinition)));
289 var messageId = UUID.randomUUID();
290 ach.deprime(messageId, compositionId);
291 verify(listener).deprime(any(UUID.class), any(CompositionDto.class));
295 void restartedTest() {
296 var acElementDefinition = new AutomationCompositionElementDefinition();
297 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0"));
298 var toscaNodeTemplate = new ToscaNodeTemplate();
299 toscaNodeTemplate.setProperties(Map.of());
300 acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
301 var list = List.of(acElementDefinition);
302 var state = AcTypeState.PRIMED;
303 var participantRestartAc = CommonTestData.createParticipantRestartAc();
304 var automationCompositionList = List.of(participantRestartAc);
305 var listener = mock(ThreadHandler.class);
306 var cacheProvider = mock(CacheProvider.class);
307 var ach = new AutomationCompositionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), listener);
308 var compositionId = UUID.randomUUID();
309 var messageId = UUID.randomUUID();
310 ach.restarted(messageId, compositionId, list, state, automationCompositionList);
311 verify(cacheProvider).initializeAutomationComposition(compositionId, participantRestartAc);
312 verify(listener).restarted(any(), any(), any(), any());
316 void handleAutomationCompositionMigrationTest() {
317 var listener = mock(ThreadHandler.class);
318 var cacheProvider = mock(CacheProvider.class);
319 var ach = new AutomationCompositionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), listener);
320 var migrationMsg = new AutomationCompositionMigration();
321 assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(migrationMsg));
322 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
323 migrationMsg.setCompositionTargetId(UUID.randomUUID());
324 migrationMsg.setAutomationCompositionId(automationComposition.getInstanceId());
325 assertDoesNotThrow(() -> ach.handleAutomationCompositionMigration(migrationMsg));
326 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
327 .thenReturn(automationComposition);
328 var participantDeploy = new ParticipantDeploy();
329 participantDeploy.setParticipantId(CommonTestData.getParticipantId());
330 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
331 migrationMsg.getParticipantUpdatesList().add(participantDeploy);
332 Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
333 for (var element : automationComposition.getElements().values()) {
334 var acElementDeploy = new AcElementDeploy();
335 acElementDeploy.setProperties(Map.of());
336 acElementDeploy.setId(element.getId());
337 acElementDeploy.setDefinition(element.getDefinition());
338 participantDeploy.getAcElementList().add(acElementDeploy);
339 map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
341 when(cacheProvider.getAcElementsDefinitions())
342 .thenReturn(Map.of(automationComposition.getCompositionId(), map,
343 migrationMsg.getCompositionTargetId(), map));
345 ach.handleAutomationCompositionMigration(migrationMsg);
346 verify(listener, times(automationComposition.getElements().size())).migrate(any(), any(), any(), any(), any());