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()));
173 var participantProvider = mock(ParticipantProvider.class);
174 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
176 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
177 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
178 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
179 mock(AcRuntimeParameterGroup.class));
180 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
181 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
182 .thenReturn(Optional.of(participant));
183 handler.handleParticipantMessage(participantStatusMessage);
185 verify(automationCompositionProvider).upgradeStates(any());
189 void testAcDefinitionOutProperties() {
190 var participantStatusMessage = createParticipantStatus();
191 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
192 var participantDefinition = new ParticipantDefinition();
193 participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition));
194 participantDefinition.setParticipantId(participantStatusMessage.getParticipantId());
195 var acElementDefinition = new AutomationCompositionElementDefinition();
196 acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("code", "1.0.0"));
197 participantDefinition.setAutomationCompositionElementDefinitionList(List.of(acElementDefinition));
199 var compositionId = UUID.randomUUID();
200 participantStatusMessage.setCompositionId(compositionId);
201 var acDefinition = new AutomationCompositionDefinition();
202 acDefinition.setState(AcTypeState.COMMISSIONED);
203 acDefinition.setCompositionId(compositionId);
204 var nodeTemplateState = new NodeTemplateState();
205 acDefinition.setElementStateMap(
206 Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState));
207 var acDefinitionProvider = mock(AcDefinitionProvider.class);
208 when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition));
210 var participantProvider = mock(ParticipantProvider.class);
212 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
213 mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class),
214 acDefinitionProvider, mock(ParticipantSyncPublisher.class),
215 CommonTestData.getTestParamaterGroup());
216 handler.handleParticipantMessage(participantStatusMessage);
218 verify(acDefinitionProvider).updateAcDefinition(acDefinition, CommonTestData.TOSCA_COMP_NAME);
222 void testHandleParticipantStatusNotRegisterd() {
223 var participantStatusMessage = createParticipantStatus();
224 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
226 var participantProvider = mock(ParticipantProvider.class);
227 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
229 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
230 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
231 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
232 mock(AcRuntimeParameterGroup.class));
233 handler.handleParticipantMessage(participantStatusMessage);
235 verify(participantProvider).saveParticipant(any());
236 verify(automationCompositionProvider).upgradeStates(any());
240 void testHandleParticipantStatusCheckOnline() {
241 var participantStatusMessage = createParticipantStatus();
242 participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo()));
244 var participantProvider = mock(ParticipantProvider.class);
245 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
247 new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class),
248 mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider,
249 mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class),
250 mock(AcRuntimeParameterGroup.class));
251 var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId());
252 when(participantProvider.findParticipant(CommonTestData.getParticipantId()))
253 .thenReturn(Optional.of(participant));
254 handler.handleParticipantMessage(participantStatusMessage);
256 verify(participantProvider).saveParticipant(any());
257 verify(automationCompositionProvider).upgradeStates(any());
260 private ParticipantStatus createParticipantStatus() {
261 var statusMessage = new ParticipantStatus();
262 statusMessage.setParticipantId(CommonTestData.getParticipantId());
263 statusMessage.setState(ParticipantState.ON_LINE);
264 var supportedElementType = CommonTestData.createParticipantSupportedElementType();
265 statusMessage.setParticipantSupportedElementType(List.of(supportedElementType));
266 return statusMessage;