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.mock;
26 import static org.mockito.Mockito.times;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
30 import java.util.List;
32 import java.util.Optional;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
36 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
37 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
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.ParticipantProvider;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
59 class SupervisionParticipantHandlerTest {
61 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
64 void testHandleParticipantDeregister() {
65 var replica = CommonTestData.createParticipantReplica(CommonTestData.getReplicaId());
67 var participantProvider = mock(ParticipantProvider.class);
68 when(participantProvider.findParticipantReplica(replica.getReplicaId()))
69 .thenReturn(Optional.of(replica));
71 var participantDeregisterMessage = new ParticipantDeregister();
72 participantDeregisterMessage.setMessageId(UUID.randomUUID());
73 participantDeregisterMessage.setParticipantId(CommonTestData.getParticipantId());
74 participantDeregisterMessage.setReplicaId(replica.getReplicaId());
75 var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class);
77 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
78 participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class),
79 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
80 mock(AcRuntimeParameterGroup.class));
82 handler.handleParticipantMessage(participantDeregisterMessage);
84 verify(participantProvider).deleteParticipantReplica(CommonTestData.getReplicaId());
85 verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId());
89 void testHandleParticipantRegister() {
90 var participantRegisterMessage = new ParticipantRegister();
91 participantRegisterMessage.setMessageId(UUID.randomUUID());
92 participantRegisterMessage.setParticipantId(CommonTestData.getParticipantId());
93 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
94 participantRegisterMessage.setParticipantSupportedElementType(List.of(supportedElementType));
96 var participantProvider = mock(ParticipantProvider.class);
97 var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
98 var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
99 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
100 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
101 mock(AcRuntimeParameterGroup.class));
102 handler.handleParticipantMessage(participantRegisterMessage);
104 verify(participantProvider).saveParticipant(any());
105 verify(participantRegisterAckPublisher).send(participantRegisterMessage.getMessageId(),
106 CommonTestData.getParticipantId(), null);
110 void testHandleParticipantSyncRestart() {
111 var participantRegisterMessage = new ParticipantRegister();
112 participantRegisterMessage.setMessageId(UUID.randomUUID());
113 var participantId = CommonTestData.getParticipantId();
114 participantRegisterMessage.setParticipantId(participantId);
115 var replicaId = CommonTestData.getReplicaId();
116 participantRegisterMessage.setReplicaId(replicaId);
117 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
118 participantRegisterMessage.setParticipantSupportedElementType(List.of(supportedElementType));
120 var participant = new Participant();
121 var replica = new ParticipantReplica();
122 replica.setReplicaId(replicaId);
123 participant.setParticipantId(participantId);
124 participant.getReplicas().put(replica.getReplicaId(), replica);
125 var participantProvider = mock(ParticipantProvider.class);
126 when(participantProvider.findParticipant(participantId)).thenReturn(Optional.of(participant));
127 when(participantProvider.findParticipantReplica(replicaId)).thenReturn(Optional.of(replica));
128 var compositionId = UUID.randomUUID();
129 var composition2Id = UUID.randomUUID();
130 when(participantProvider.getCompositionIds(participantId)).thenReturn(Set.of(compositionId, composition2Id));
132 var acDefinitionProvider = mock(AcDefinitionProvider.class);
133 var acDefinition = new AutomationCompositionDefinition();
134 acDefinition.setState(AcTypeState.COMMISSIONED);
135 acDefinition.setCompositionId(composition2Id);
136 when(acDefinitionProvider.getAcDefinition(composition2Id)).thenReturn(acDefinition);
138 acDefinition = new AutomationCompositionDefinition();
139 acDefinition.setCompositionId(compositionId);
140 acDefinition.setState(AcTypeState.PRIMED);
141 var nodeTemplateState = new NodeTemplateState();
142 nodeTemplateState.setParticipantId(participantId);
143 acDefinition.setElementStateMap(Map.of("code", nodeTemplateState));
144 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
146 var automationComposition =
147 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
148 automationComposition.getElements().values().iterator().next().setParticipantId(participantId);
149 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
150 when(automationCompositionProvider.getAcInstancesByCompositionId(compositionId))
151 .thenReturn(List.of(automationComposition));
153 var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
154 var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
155 var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher,
156 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, acDefinitionProvider,
157 participantSyncPublisher, CommonTestData.getTestParamaterGroup());
158 handler.handleParticipantMessage(participantRegisterMessage);
160 verify(participantRegisterAckPublisher)
161 .send(participantRegisterMessage.getMessageId(), participantId, replicaId);
162 verify(acDefinitionProvider, times(0)).updateAcDefinition(any(AutomationCompositionDefinition.class),
163 eq(CommonTestData.TOSCA_COMP_NAME));
164 verify(participantSyncPublisher)
165 .sendRestartMsg(any(), any(), any(AutomationCompositionDefinition.class), any());
169 void testHandleParticipantStatus() {
170 var participantStatusMessage = createParticipantStatus();
171 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
172 participantStatusMessage.setCompositionId(UUID.randomUUID());
174 var acDefinitionProvider = mock(AcDefinitionProvider.class);
175 var acDefinition = new AutomationCompositionDefinition();
176 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
177 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
179 var participantProvider = mock(ParticipantProvider.class);
180 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
182 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
183 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
184 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
185 mock(AcRuntimeParameterGroup.class));
186 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
187 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
188 .thenReturn(Optional.of(participant));
189 handler.handleParticipantMessage(participantStatusMessage);
191 verify(automationCompositionProvider).upgradeStates(any());
195 void testAcDefinitionOutProperties() {
196 var participantStatusMessage = createParticipantStatus();
197 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
198 var participantDefinition = new ParticipantDefinition();
199 participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
200 participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
201 var acElementDefinition = new AutomationCompositionElementDefinition();
202 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
203 participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
205 var compositionId = UUID.randomUUID();
206 participantStatusMessage.setCompositionId(compositionId);
207 var acDefinition = new AutomationCompositionDefinition();
208 acDefinition.setState(AcTypeState.COMMISSIONED);
209 acDefinition.setCompositionId(compositionId);
210 var nodeTemplateState = new NodeTemplateState();
211 acDefinition.setElementStateMap(
212 Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState));
213 var acDefinitionProvider = mock(AcDefinitionProvider.class);
214 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
215 when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition);
217 var participantProvider = mock(ParticipantProvider.class);
219 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
220 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
221 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
222 CommonTestData.getTestParamaterGroup());
223 handler.handleParticipantMessage(participantStatusMessage);
225 verify(acDefinitionProvider).updateAcDefinition(acDefinition, CommonTestData.TOSCA_COMP_NAME);
229 void testHandleParticipantStatusNotRegisterd() {
230 var participantStatusMessage = createParticipantStatus();
231 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
232 participantStatusMessage.setCompositionId(UUID.randomUUID());
234 var acDefinitionProvider = mock(AcDefinitionProvider.class);
235 var acDefinition = new AutomationCompositionDefinition();
236 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
237 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
239 var participantProvider = mock(ParticipantProvider.class);
240 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
242 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
243 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
244 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
245 mock(AcRuntimeParameterGroup.class));
246 handler.handleParticipantMessage(participantStatusMessage);
248 verify(participantProvider).saveParticipant(any());
249 verify(automationCompositionProvider).upgradeStates(any());
253 void testHandleParticipantStatusCheckOnline() {
254 var participantStatusMessage = createParticipantStatus();
255 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
256 participantStatusMessage.setCompositionId(UUID.randomUUID());
258 var acDefinitionProvider = mock(AcDefinitionProvider.class);
259 var acDefinition = new AutomationCompositionDefinition();
260 acDefinition.setCompositionId(participantStatusMessage.getCompositionId());
261 when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())).thenReturn(acDefinition);
263 var participantProvider = mock(ParticipantProvider.class);
264 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
266 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
267 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
268 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
269 mock(AcRuntimeParameterGroup.class));
270 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
271 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
272 .thenReturn(Optional.of(participant));
273 handler.handleParticipantMessage(participantStatusMessage);
275 verify(participantProvider).saveParticipant(any());
276 verify(automationCompositionProvider).upgradeStates(any());
279 private ParticipantStatus createParticipantStatus() {
280 var statusMessage = new ParticipantStatus();
281 statusMessage.setParticipantId(CommonTestData.getParticipantId());
282 statusMessage.setState(ParticipantState.ON_LINE);
283 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
284 statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
285 return statusMessage;