661c009f6578ac6311274ad0a83c4c870b110340
[policy/clamp.git] /
1 /*-
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
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.participant.intermediary.handler;
22
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;
30
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
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;
56
57 @ExtendWith(SpringExtension.class)
58 class AutomationCompositionHandlerTest {
59
60     @Test
61     void handleAutomationCompositionStateChangeNullTest() {
62         var participantMessagePublisher = mock(ParticipantMessagePublisher.class);
63         var cacheProvider = mock(CacheProvider.class);
64         var ach =
65                 new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, mock(ThreadHandler.class));
66
67         var automationCompositionStateChange = new AutomationCompositionStateChange();
68         assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(automationCompositionStateChange));
69
70         automationCompositionStateChange.setAutomationCompositionId(UUID.randomUUID());
71         automationCompositionStateChange.setDeployOrderedState(DeployOrder.DELETE);
72         assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(automationCompositionStateChange));
73         verify(participantMessagePublisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
74
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));
81     }
82
83     @Test
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());
90
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());
97         }
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);
102
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());
107         }
108     }
109
110     @Test
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());
117
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());
124         }
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());
133         }
134     }
135
136     @Test
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());
143
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());
150         }
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());
159         }
160     }
161
162     @Test
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());
169
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());
176         }
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());
185         }
186     }
187
188     @Test
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);
194
195         var updateMsg = new PropertiesUpdate();
196         assertDoesNotThrow(() -> ach.handleAcPropertyUpdate(updateMsg));
197
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);
203
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);
212
213         Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
214         for (var element : automationComposition.getElements().values()) {
215             map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
216         }
217         when(cacheProvider.getAcElementsDefinitions())
218             .thenReturn(Map.of(automationComposition.getCompositionId(), map));
219         ach.handleAcPropertyUpdate(updateMsg);
220         verify(listener).update(any(), any(), any(), any());
221     }
222
223     @Test
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);
229
230         var deployMsg = new AutomationCompositionDeploy();
231         assertDoesNotThrow(() -> ach.handleAutomationCompositionDeploy(deployMsg));
232
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);
238
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());
250         }
251         when(cacheProvider.getAcElementsDefinitions())
252             .thenReturn(Map.of(automationComposition.getCompositionId(), map));
253
254         ach.handleAutomationCompositionDeploy(deployMsg);
255         verify(listener, times(automationComposition.getElements().size())).deploy(any(), any(), any());
256     }
257
258     @Test
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),
270             listener);
271         ach.prime(messageId, compositionId, list);
272         verify(listener).prime(any(UUID.class), any(CompositionDto.class));
273     }
274
275     @Test
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),
286             listener);
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));
292     }
293
294     @Test
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());
313     }
314
315     @Test
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());
340         }
341         when(cacheProvider.getAcElementsDefinitions())
342             .thenReturn(Map.of(automationComposition.getCompositionId(), map,
343                 migrationMsg.getCompositionTargetId(), map));
344
345         ach.handleAutomationCompositionMigration(migrationMsg);
346         verify(listener, times(automationComposition.getElements().size())).migrate(any(), any(), any(), any(), any());
347     }
348 }