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
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.main.parameters.AcRuntimeParameterGroup;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
40 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher;
41 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
42 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
43 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionInfo;
47 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
48 import org.onap.policy.clamp.models.acm.concepts.Participant;
49 import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
50 import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica;
51 import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
52 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
53 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
54 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
55 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
56 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
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(AcRuntimeParameterGroup.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(AcRuntimeParameterGroup.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, CommonTestData.getTestParamaterGroup());
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);
193 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
194 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
195 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
196 mock(AcRuntimeParameterGroup.class));
197 handler.handleParticipantMessage(participantStatusMessage);
199 verify(automationCompositionProvider).upgradeStates(any());
203 void testAcDefinitionOutProperties() {
204 var participantStatusMessage = createParticipantStatus();
205 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
206 var participantDefinition = new ParticipantDefinition();
207 participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
208 participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
209 var acElementDefinition = new AutomationCompositionElementDefinition();
210 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
211 participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
213 var compositionId = UUID.randomUUID();
214 participantStatusMessage.setCompositionId(compositionId);
215 var acDefinition = new AutomationCompositionDefinition();
216 acDefinition.setState(AcTypeState.COMMISSIONED);
217 acDefinition.setCompositionId(compositionId);
218 var nodeTemplateState = new NodeTemplateState();
219 acDefinition.setElementStateMap(
220 Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState));
221 var acDefinitionProvider = mock(AcDefinitionProvider.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),
230 CommonTestData.getTestParamaterGroup());
231 handler.handleParticipantMessage(participantStatusMessage);
233 verify(acDefinitionProvider).updateAcDefinition(acDefinition, CommonTestData.TOSCA_COMP_NAME);
237 void testHandleParticipantStatusNotRegisterd() {
238 var participantStatusMessage = createParticipantStatus();
239 participantStatusMessage.setAutomationCompositionInfoList(List.of());
240 participantStatusMessage.setCompositionId(UUID.randomUUID());
242 var participantProvider = mock(ParticipantProvider.class);
244 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
245 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
246 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
247 mock(AcRuntimeParameterGroup.class));
248 handler.handleParticipantMessage(participantStatusMessage);
250 verify(participantProvider).saveParticipant(any());
254 void testHandleParticipantStatusCheckOnline() {
255 var participantStatusMessage = createParticipantStatus();
256 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
257 participantStatusMessage.setCompositionId(UUID.randomUUID());
259 var acDefinitionProvider = mock(AcDefinitionProvider.class);
260 var acDefinition = new AutomationCompositionDefinition();
261 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
262 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
264 var participantProvider = mock(ParticipantProvider.class);
265 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
267 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
268 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
269 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
270 mock(AcRuntimeParameterGroup.class));
271 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
272 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
273 .thenReturn(Optional.of(participant));
274 handler.handleParticipantMessage(participantStatusMessage);
276 verify(participantProvider).saveParticipant(any());
277 verify(automationCompositionProvider).upgradeStates(any());
280 private ParticipantStatus createParticipantStatus() {
281 var statusMessage = new ParticipantStatus();
282 statusMessage.setParticipantId(CommonTestData.getParticipantId());
283 statusMessage.setState(ParticipantState.ON_LINE);
284 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
285 statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
286 return statusMessage;