27813988da899d24dbb65c0621d02c1c94d4f19c
[policy/clamp.git] /
1 /*-
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
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.assertj.core.api.Assertions.assertThat;
24 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.times;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31
32 import java.util.Map;
33 import java.util.UUID;
34 import org.junit.jupiter.api.Test;
35 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
36 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
37 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
38 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
39 import org.onap.policy.clamp.models.acm.concepts.DeployState;
40 import org.onap.policy.clamp.models.acm.concepts.LockState;
41 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
42 import org.onap.policy.clamp.models.acm.concepts.SubState;
43 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
44 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
45 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
47
48 class AutomationCompositionOutHandlerTest {
49
50     @Test
51     void updateAutomationCompositionElementStateNullTest() {
52         var cacheProvider = mock(CacheProvider.class);
53         var acOutHandler = new AutomationCompositionOutHandler(mock(ParticipantMessagePublisher.class), cacheProvider);
54
55         assertDoesNotThrow(
56                 () -> acOutHandler.updateAutomationCompositionElementState(null, null, null, null, null, null));
57
58         assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
59                 UUID.randomUUID(), null, null, null, null));
60
61         assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
62                 UUID.randomUUID(), DeployState.DEPLOYED, null, null, null));
63
64         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
65         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
66                 .thenReturn(automationComposition);
67         assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
68                 automationComposition.getInstanceId(), UUID.randomUUID(), DeployState.DEPLOYED, null, null, null));
69
70         var elementId = automationComposition.getElements().values().iterator().next().getId();
71         assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
72                 automationComposition.getInstanceId(), elementId, null, null, null, null));
73     }
74
75     @Test
76     void updateAutomationCompositionElementStateDeployedTest() {
77         var publisher = mock(ParticipantMessagePublisher.class);
78         var cacheProvider = mock(CacheProvider.class);
79         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
80
81         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
82         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
83                 .thenReturn(automationComposition);
84         var elementId = automationComposition.getElements().values().iterator().next().getId();
85         acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
86                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
87         verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
88     }
89
90     @Test
91     void updateAutomationCompositionElementStatePrepareTest() {
92         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
93         automationComposition.setSubState(SubState.PREPARING);
94         var cacheProvider = mock(CacheProvider.class);
95         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
96                 .thenReturn(automationComposition);
97         var element = automationComposition.getElements().values().iterator().next();
98         element.setSubState(SubState.PREPARING);
99         var elementId = element.getId();
100         var publisher = mock(ParticipantMessagePublisher.class);
101         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
102         acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
103                 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
104         verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
105     }
106
107     @Test
108     void updateAutomationCompositionElementStateLockTest() {
109         var publisher = mock(ParticipantMessagePublisher.class);
110         var cacheProvider = mock(CacheProvider.class);
111         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
112
113         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
114         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
115                 .thenReturn(automationComposition);
116         var elementId = automationComposition.getElements().values().iterator().next().getId();
117         acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId, null,
118                 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
119         verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
120     }
121
122     @Test
123     void updateAutomationCompositionElementStateRestartedTest() {
124         var publisher = mock(ParticipantMessagePublisher.class);
125         var cacheProvider = mock(CacheProvider.class);
126         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
127
128         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
129         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
130                 .thenReturn(automationComposition);
131         var element = automationComposition.getElements().values().iterator().next();
132         element.setRestarting(true);
133         acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
134                 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
135         verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
136         assertThat(element.getRestarting()).isNull();
137     }
138
139     @Test
140     void updateAutomationCompositionElementStateDeleteTest() {
141         var publisher = mock(ParticipantMessagePublisher.class);
142         var cacheProvider = mock(CacheProvider.class);
143         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
144
145         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
146         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
147                 .thenReturn(automationComposition);
148         for (var element : automationComposition.getElements().values()) {
149             acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
150                     DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
151         }
152         verify(publisher, times(automationComposition.getElements().size()))
153                 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
154         verify(cacheProvider).removeAutomationComposition(automationComposition.getInstanceId());
155     }
156
157     @Test
158     void sendAcElementInfoTestNull() {
159         var publisher = mock(ParticipantMessagePublisher.class);
160         var cacheProvider = mock(CacheProvider.class);
161         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
162
163         assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(null, null, null, null, null));
164         assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), null, null, null, null));
165         assertDoesNotThrow(
166                 () -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), UUID.randomUUID(), null, null, null));
167
168         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
169         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
170                 .thenReturn(automationComposition);
171         assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(),
172                 UUID.randomUUID(), null, null, null));
173     }
174
175     @Test
176     void sendAcElementInfoTest() {
177         var publisher = mock(ParticipantMessagePublisher.class);
178         var cacheProvider = mock(CacheProvider.class);
179         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
180
181         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
182         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
183                 .thenReturn(automationComposition);
184         var elementId = automationComposition.getElements().values().iterator().next().getId();
185         acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(), elementId, "", "", Map.of());
186         verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
187     }
188
189     @Test
190     void updateCompositionStatePrimedTest() {
191         var cacheProvider = mock(CacheProvider.class);
192         when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
193         var publisher = mock(ParticipantMessagePublisher.class);
194         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
195         var compositionId = UUID.randomUUID();
196         acOutHandler.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
197         verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
198         verify(cacheProvider, times(0)).removeElementDefinition(compositionId);
199     }
200
201     @Test
202     void updateCompositionStateDeprimingTest() {
203         var cacheProvider = mock(CacheProvider.class);
204         when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
205         var publisher = mock(ParticipantMessagePublisher.class);
206         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
207         var compositionId = UUID.randomUUID();
208         acOutHandler.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
209                 "Deprimed");
210         verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
211         verify(cacheProvider).removeElementDefinition(compositionId);
212     }
213
214     @Test
215     void sendAcDefinitionInfoTest() {
216         var cacheProvider = mock(CacheProvider.class);
217         when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
218         var compositionId = UUID.randomUUID();
219         var elementId = new ToscaConceptIdentifier("code", "1.0.0");
220         var mapAcElementsDefinitions =
221                 Map.of(compositionId, Map.of(elementId, new AutomationCompositionElementDefinition()));
222         when(cacheProvider.getAcElementsDefinitions()).thenReturn(mapAcElementsDefinitions);
223         var publisher = mock(ParticipantMessagePublisher.class);
224         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
225
226         acOutHandler.sendAcDefinitionInfo(null, null, Map.of());
227         verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
228
229         acOutHandler.sendAcDefinitionInfo(UUID.randomUUID(), null, Map.of());
230         verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
231
232         acOutHandler.sendAcDefinitionInfo(compositionId, new ToscaConceptIdentifier("wrong", "1.0.0"), Map.of());
233         verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
234
235         acOutHandler.sendAcDefinitionInfo(compositionId, elementId, Map.of());
236         verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
237     }
238
239     @Test
240     void updateMigrationStatusTest() {
241         var cacheProvider = mock(CacheProvider.class);
242         when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
243         var publisher = mock(ParticipantMessagePublisher.class);
244         var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
245
246         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
247         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
248                 .thenReturn(automationComposition);
249
250         var compositionTarget = UUID.randomUUID();
251         automationComposition.setCompositionTargetId(compositionTarget);
252         automationComposition.setDeployState(DeployState.DEPLOYED);
253         when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(compositionTarget, Map.of()));
254
255         for (var element : automationComposition.getElements().values()) {
256             acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
257                     DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "");
258         }
259         verify(publisher, times(automationComposition.getElements().size()))
260                 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
261         assertEquals(compositionTarget, automationComposition.getCompositionId());
262     }
263 }