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 testHandleParticipantStatusWithInstanceOutProperties() {
173 var participantStatusMessage = createParticipantStatus();
174 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
175 participantStatusMessage.setCompositionId(UUID.randomUUID());
177 var participantProvider = mock(ParticipantProvider.class);
178 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
179 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
180 .thenReturn(Optional.of(participant));
181 var replica = CommonTestData.createParticipantReplica(CommonTestData.getReplicaId());
182 participantStatusMessage.setReplicaId(replica.getReplicaId());
183 when(participantProvider.findParticipantReplica(replica.getReplicaId()))
184 .thenReturn(Optional.of(replica));
186 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
187 var messageProvider = mock(MessageProvider.class);
188 var acDefinitionProvider = mock(AcDefinitionProvider.class);
190 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
191 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
192 acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
193 handler.handleParticipantMessage(participantStatusMessage);
195 verify(messageProvider).saveInstanceOutProperties(any(ParticipantStatus.class));
199 void testHandleParticipantStatusWithCompositionOutProperties() {
200 var participantStatusMessage = createParticipantStatus();
201 var participantDefinition = new ParticipantDefinition();
202 participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
203 participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
204 var acElementDefinition = new AutomationCompositionElementDefinition();
205 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
206 participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
208 var compositionId = UUID.randomUUID();
209 participantStatusMessage.setCompositionId(compositionId);
210 var acDefinition = new AutomationCompositionDefinition();
211 acDefinition.setState(AcTypeState.COMMISSIONED);
212 acDefinition.setCompositionId(compositionId);
213 var nodeTemplateState = new NodeTemplateState();
214 acDefinition.setElementStateMap(
215 Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState));
216 var acDefinitionProvider = mock(AcDefinitionProvider.class);
217 var messageProvider = mock(MessageProvider.class);
218 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
219 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
221 var participantProvider = mock(ParticipantProvider.class);
223 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
224 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
225 acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
226 handler.handleParticipantMessage(participantStatusMessage);
227 verify(messageProvider).saveCompositionOutProperties(any(), any());
231 void testAcOutPropertiesNotValid() {
232 var participantStatusMessage = createParticipantStatus();
233 var participantDefinition = new ParticipantDefinition();
234 participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
235 participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
236 var acElementDefinition = new AutomationCompositionElementDefinition();
237 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
238 participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
240 var compositionId = UUID.randomUUID();
241 participantStatusMessage.setCompositionId(compositionId);
242 var acDefinitionProvider = mock(AcDefinitionProvider.class);
243 var messageProvider = mock(MessageProvider.class);
244 var participantProvider = mock(ParticipantProvider.class);
246 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
247 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
248 acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
249 handler.handleParticipantMessage(participantStatusMessage);
250 verify(messageProvider, times(0)).saveCompositionOutProperties(any(), any());
254 void testHandleParticipantStatusNotRegisterd() {
255 var participantStatusMessage = createParticipantStatus();
256 participantStatusMessage.setAutomationCompositionInfoList(List.of());
257 participantStatusMessage.setCompositionId(UUID.randomUUID());
259 var participantProvider = mock(ParticipantProvider.class);
261 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
262 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
263 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
264 mock(MessageProvider.class));
265 handler.handleParticipantMessage(participantStatusMessage);
267 verify(participantProvider).saveParticipant(any());
271 void testHandleParticipantStatusCheckOnline() {
272 var participantStatusMessage = createParticipantStatus();
273 participantStatusMessage.setCompositionId(UUID.randomUUID());
275 var acDefinitionProvider = mock(AcDefinitionProvider.class);
276 var acDefinition = new AutomationCompositionDefinition();
277 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
278 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
280 var participantProvider = mock(ParticipantProvider.class);
281 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
282 var messageProvider = mock(MessageProvider.class);
284 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
285 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
286 acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider);
287 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
288 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
289 .thenReturn(Optional.of(participant));
290 handler.handleParticipantMessage(participantStatusMessage);
292 verify(participantProvider).saveParticipant(any());
295 private ParticipantStatus createParticipantStatus() {
296 var statusMessage = new ParticipantStatus();
297 statusMessage.setParticipantId(CommonTestData.getParticipantId());
298 statusMessage.setState(ParticipantState.ON_LINE);
299 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
300 statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
301 return statusMessage;