315fb8c4853a39044926dafc312583a345fbb468
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2023-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;
22
23 import static org.mockito.ArgumentMatchers.any;
24 import static org.mockito.ArgumentMatchers.eq;
25 import static org.mockito.Mockito.clearInvocations;
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.List;
32 import java.util.Map;
33 import java.util.Optional;
34 import java.util.Set;
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.ParticipantDeregisterAckPublisher;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher;
40 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
41 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
42 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionInfo;
46 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
47 import org.onap.policy.clamp.models.acm.concepts.Participant;
48 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
49 import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica;
50 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
51 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
52 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
53 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
54 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
55 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
56 import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
57 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
59
60 class SupervisionParticipantHandlerTest {
61
62     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
63
64     @Test
65     void testHandleParticipantDeregister() {
66         var participantDeregisterMessage = new ParticipantDeregister();
67         participantDeregisterMessage.setMessageId(UUID.randomUUID());
68         participantDeregisterMessage.setParticipantId(CommonTestData.getParticipantId());
69         var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class);
70         var participantProvider = mock(ParticipantProvider.class);
71         var handler =
72                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
73                         participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class),
74                         mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
75                         mock(MessageProvider.class));
76
77         handler.handleParticipantMessage(participantDeregisterMessage);
78         verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId());
79
80         clearInvocations(participantDeregisterAckPublisher);
81         var replica = CommonTestData.createParticipantReplica(CommonTestData.getReplicaId());
82         participantDeregisterMessage.setReplicaId(replica.getReplicaId());
83         when(participantProvider.findParticipantReplica(replica.getReplicaId()))
84                 .thenReturn(Optional.of(replica));
85         handler.handleParticipantMessage(participantDeregisterMessage);
86         verify(participantProvider).deleteParticipantReplica(CommonTestData.getReplicaId());
87         verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId());
88     }
89
90     @Test
91     void testHandleParticipantRegister() {
92         var participantRegisterMessage = new ParticipantRegister();
93         participantRegisterMessage.setMessageId(UUID.randomUUID());
94         participantRegisterMessage.setParticipantId(CommonTestData.getParticipantId());
95         var supportedElementType = CommonTestData.createParticipantSupportedElementType();
96         participantRegisterMessage.setParticipantSupportedElementType(List.of(supportedElementType));
97
98         var participantProvider = mock(ParticipantProvider.class);
99         var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
100         var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
101                 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
102                 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
103                 mock(MessageProvider.class));
104         handler.handleParticipantMessage(participantRegisterMessage);
105
106         verify(participantProvider).saveParticipant(any());
107         verify(participantRegisterAckPublisher).send(participantRegisterMessage.getMessageId(),
108                 CommonTestData.getParticipantId(), null);
109     }
110
111     @Test
112     void testHandleParticipantSyncRestart() {
113         var participantRegisterMessage = new ParticipantRegister();
114         participantRegisterMessage.setMessageId(UUID.randomUUID());
115         var participantId = CommonTestData.getParticipantId();
116         participantRegisterMessage.setParticipantId(participantId);
117         var replicaId = CommonTestData.getReplicaId();
118         participantRegisterMessage.setReplicaId(replicaId);
119         var supportedElementType = CommonTestData.createParticipantSupportedElementType();
120         participantRegisterMessage.setParticipantSupportedElementType(List.of(supportedElementType));
121
122         var participant = new Participant();
123         var replica = new ParticipantReplica();
124         replica.setReplicaId(replicaId);
125         replica.setParticipantState(ParticipantState.OFF_LINE);
126         participant.setParticipantId(participantId);
127         participant.getReplicas().put(replica.getReplicaId(), replica);
128         var participantProvider = mock(ParticipantProvider.class);
129         when(participantProvider.findParticipant(participantId)).thenReturn(Optional.of(participant));
130         when(participantProvider.findParticipantReplica(replicaId)).thenReturn(Optional.of(replica));
131         var compositionId = UUID.randomUUID();
132         var composition2Id = UUID.randomUUID();
133         when(participantProvider.getCompositionIds(participantId)).thenReturn(Set.of(compositionId, composition2Id));
134
135         var acDefinitionProvider = mock(AcDefinitionProvider.class);
136         var acDefinition = new AutomationCompositionDefinition();
137         acDefinition.setState(AcTypeState.COMMISSIONED);
138         acDefinition.setCompositionId(composition2Id);
139         when(acDefinitionProvider.getAcDefinition(composition2Id)).thenReturn(acDefinition);
140
141         acDefinition = new AutomationCompositionDefinition();
142         acDefinition.setCompositionId(compositionId);
143         acDefinition.setState(AcTypeState.PRIMED);
144         var nodeTemplateState = new NodeTemplateState();
145         nodeTemplateState.setParticipantId(participantId);
146         acDefinition.setElementStateMap(Map.of("code", nodeTemplateState));
147         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
148
149         var automationComposition =
150                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
151         automationComposition.getElements().values().iterator().next().setParticipantId(participantId);
152         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
153         when(automationCompositionProvider.getAcInstancesByCompositionId(compositionId))
154                 .thenReturn(List.of(automationComposition));
155
156         var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
157         var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
158         var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
159                 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, acDefinitionProvider,
160                 participantSyncPublisher, mock(MessageProvider.class));
161         handler.handleParticipantMessage(participantRegisterMessage);
162
163         verify(participantRegisterAckPublisher)
164                 .send(participantRegisterMessage.getMessageId(), participantId, replicaId);
165         verify(acDefinitionProvider, times(0)).updateAcDefinition(any(AutomationCompositionDefinition.class),
166                 eq(CommonTestData.TOSCA_COMP_NAME));
167         verify(participantSyncPublisher)
168                 .sendRestartMsg(any(), any(), any(AutomationCompositionDefinition.class), any());
169     }
170
171     @Test
172     void testHandleParticipantStatus() {
173         var participantStatusMessage = createParticipantStatus();
174         participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
175         participantStatusMessage.setCompositionId(UUID.randomUUID());
176
177         var acDefinitionProvider = mock(AcDefinitionProvider.class);
178         var acDefinition = new AutomationCompositionDefinition();
179         acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
180         when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
181
182         var participantProvider = mock(ParticipantProvider.class);
183         var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
184         when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
185                 .thenReturn(Optional.of(participant));
186         var replica = CommonTestData.createParticipantReplica(CommonTestData.getReplicaId());
187         participantStatusMessage.setReplicaId(replica.getReplicaId());
188         when(participantProvider.findParticipantReplica(replica.getReplicaId()))
189                 .thenReturn(Optional.of(replica));
190
191         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
192         var messageProvider = mock(MessageProvider.class);
193         var handler =
194                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
195                         mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
196                         acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
197         handler.handleParticipantMessage(participantStatusMessage);
198
199         verify(messageProvider).save(any(ParticipantStatus.class));
200     }
201
202     @Test
203     void testAcDefinitionOutProperties() {
204         var participantStatusMessage = createParticipantStatus();
205         var participantDefinition = new ParticipantDefinition();
206         participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
207         participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
208         var acElementDefinition = new AutomationCompositionElementDefinition();
209         acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
210         participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
211
212         var compositionId = UUID.randomUUID();
213         participantStatusMessage.setCompositionId(compositionId);
214         var acDefinition = new AutomationCompositionDefinition();
215         acDefinition.setState(AcTypeState.COMMISSIONED);
216         acDefinition.setCompositionId(compositionId);
217         var nodeTemplateState = new NodeTemplateState();
218         acDefinition.setElementStateMap(
219                 Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState));
220         var acDefinitionProvider = mock(AcDefinitionProvider.class);
221         var messageProvider = mock(MessageProvider.class);
222         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
223         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
224
225         var participantProvider = mock(ParticipantProvider.class);
226         var handler =
227                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
228                         mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
229                         acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
230         handler.handleParticipantMessage(participantStatusMessage);
231         verify(messageProvider).save(participantStatusMessage);
232     }
233
234     @Test
235     void testAcOutProperties() {
236         var participantStatusMessage = createParticipantStatus();
237         participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
238
239         var compositionId = UUID.randomUUID();
240         participantStatusMessage.setCompositionId(compositionId);
241         var acDefinition = new AutomationCompositionDefinition();
242         acDefinition.setState(AcTypeState.COMMISSIONED);
243         acDefinition.setCompositionId(compositionId);
244         var acDefinitionProvider = mock(AcDefinitionProvider.class);
245         var messageProvider = mock(MessageProvider.class);
246         when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
247         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
248
249         var participantProvider = mock(ParticipantProvider.class);
250         var handler =
251                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
252                         mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
253                         acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
254         handler.handleParticipantMessage(participantStatusMessage);
255         verify(messageProvider).save(participantStatusMessage);
256     }
257
258     @Test
259     void testHandleParticipantStatusNotRegisterd() {
260         var participantStatusMessage = createParticipantStatus();
261         participantStatusMessage.setAutomationCompositionInfoList(List.of());
262         participantStatusMessage.setCompositionId(UUID.randomUUID());
263
264         var participantProvider = mock(ParticipantProvider.class);
265         var handler =
266                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
267                         mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
268                         mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
269                         mock(MessageProvider.class));
270         handler.handleParticipantMessage(participantStatusMessage);
271
272         verify(participantProvider).saveParticipant(any());
273     }
274
275     @Test
276     void testHandleParticipantStatusCheckOnline() {
277         var participantStatusMessage = createParticipantStatus();
278         participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
279         participantStatusMessage.setCompositionId(UUID.randomUUID());
280
281         var acDefinitionProvider = mock(AcDefinitionProvider.class);
282         var acDefinition = new AutomationCompositionDefinition();
283         acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
284         when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
285
286         var participantProvider = mock(ParticipantProvider.class);
287         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
288         var messageProvider = mock(MessageProvider.class);
289         var handler =
290                 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
291                         mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
292                         acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
293         var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
294         when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
295                 .thenReturn(Optional.of(participant));
296         handler.handleParticipantMessage(participantStatusMessage);
297
298         verify(participantProvider).saveParticipant(any());
299         verify(messageProvider).save(any(ParticipantStatus.class));
300     }
301
302     private ParticipantStatus createParticipantStatus() {
303         var statusMessage = new ParticipantStatus();
304         statusMessage.setParticipantId(CommonTestData.getParticipantId());
305         statusMessage.setState(ParticipantState.ON_LINE);
306         var supportedElementType = CommonTestData.createParticipantSupportedElementType();
307         statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
308         return statusMessage;
309     }
310 }