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
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.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;
31 import java.util.List;
33 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.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;
60 class SupervisionParticipantHandlerTest {
62 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
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);
72 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
73 participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class),
74 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
75 mock(MessageProvider.class));
77 handler.handleParticipantMessage(participantDeregisterMessage);
78 verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId());
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());
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));
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);
106 verify(participantProvider).saveParticipant(any());
107 verify(participantRegisterAckPublisher).send(participantRegisterMessage.getMessageId(),
108 CommonTestData.getParticipantId(), null);
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));
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));
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);
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);
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));
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);
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());
172 void testHandleParticipantStatus() {
173 var participantStatusMessage = createParticipantStatus();
174 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
175 participantStatusMessage.setCompositionId(UUID.randomUUID());
177 var acDefinitionProvider = mock(AcDefinitionProvider.class);
178 var acDefinition = new AutomationCompositionDefinition();
179 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
180 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
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));
191 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
192 var messageProvider = mock(MessageProvider.class);
194 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
195 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
196 acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
197 handler.handleParticipantMessage(participantStatusMessage);
199 verify(messageProvider).save(any(ParticipantStatus.class));
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));
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);
225 var participantProvider = mock(ParticipantProvider.class);
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);
235 void testAcOutProperties() {
236 var participantStatusMessage = createParticipantStatus();
237 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
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);
249 var participantProvider = mock(ParticipantProvider.class);
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);
259 void testHandleParticipantStatusNotRegisterd() {
260 var participantStatusMessage = createParticipantStatus();
261 participantStatusMessage.setAutomationCompositionInfoList(List.of());
262 participantStatusMessage.setCompositionId(UUID.randomUUID());
264 var participantProvider = mock(ParticipantProvider.class);
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);
272 verify(participantProvider).saveParticipant(any());
276 void testHandleParticipantStatusCheckOnline() {
277 var participantStatusMessage = createParticipantStatus();
278 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
279 participantStatusMessage.setCompositionId(UUID.randomUUID());
281 var acDefinitionProvider = mock(AcDefinitionProvider.class);
282 var acDefinition = new AutomationCompositionDefinition();
283 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
284 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
286 var participantProvider = mock(ParticipantProvider.class);
287 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
288 var messageProvider = mock(MessageProvider.class);
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);
298 verify(participantProvider).saveParticipant(any());
299 verify(messageProvider).save(any(ParticipantStatus.class));
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;