2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 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.controlloop.runtime.supervision;
23 import static org.assertj.core.api.Assertions.assertThatThrownBy;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyList;
26 import static org.mockito.ArgumentMatchers.eq;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import java.util.List;
33 import java.util.UUID;
34 import org.junit.jupiter.api.Test;
35 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
36 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
39 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
40 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
41 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
42 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
43 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
44 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
45 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
46 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
47 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
48 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
49 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
50 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
51 import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
52 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
53 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
54 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
55 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantRegisterAckPublisher;
56 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
57 import org.onap.policy.common.utils.coder.CoderException;
58 import org.onap.policy.models.base.PfModelException;
59 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
61 class SupervisionHandlerTest {
62 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
63 private static final ToscaConceptIdentifier identifier = new ToscaConceptIdentifier("PMSHInstance0Crud", "1.0.1");
64 private static final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("ParticipantId", "1.0.0");
65 private static final ToscaConceptIdentifier participantType =
66 new ToscaConceptIdentifier("ParticipantType", "1.0.0");
69 void testTriggerControlLoopSupervisionEmpty() throws ControlLoopException, PfModelException, CoderException {
70 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
71 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
72 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
73 mock(ParticipantUpdatePublisher.class));
75 assertThatThrownBy(() -> handler.triggerControlLoopSupervision(List.of()))
76 .hasMessageMatching("The list of control loops for supervision is empty");
80 void testTriggerControlLoopSupervision() throws ControlLoopException, PfModelException, CoderException {
81 var controlLoopProvider = mock(ControlLoopProvider.class);
82 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
83 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
84 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
85 mock(ParticipantDeregisterAckPublisher.class), controlLoopUpdatePublisher,
86 mock(ParticipantUpdatePublisher.class));
88 handler.triggerControlLoopSupervision(List.of(identifier));
90 verify(controlLoopUpdatePublisher).send(any(ControlLoop.class));
91 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
95 void testHandleControlLoopStateChangeAckMessage() throws PfModelException, CoderException {
96 var controlLoopProvider = mock(ControlLoopProvider.class);
97 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
98 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
99 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
100 mock(ParticipantUpdatePublisher.class));
101 var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
102 controlLoopAckMessage.setControlLoopResultMap(Map.of());
103 controlLoopAckMessage.setControlLoopId(identifier);
105 handler.handleControlLoopStateChangeAckMessage(controlLoopAckMessage);
107 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
111 void testHandleControlLoopUpdateAckMessage() throws PfModelException, CoderException {
112 var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_UPDATE_ACK);
113 controlLoopAckMessage.setParticipantId(participantId);
114 controlLoopAckMessage.setParticipantType(participantType);
115 controlLoopAckMessage.setControlLoopResultMap(Map.of());
116 controlLoopAckMessage.setControlLoopId(identifier);
117 var controlLoopProvider = mock(ControlLoopProvider.class);
118 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
119 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
120 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
121 mock(ParticipantUpdatePublisher.class));
123 handler.handleControlLoopUpdateAckMessage(controlLoopAckMessage);
125 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
129 void testHandleParticipantDeregister() throws PfModelException, CoderException {
130 var participant = new Participant();
131 participant.setName(participantId.getName());
132 participant.setVersion(participantId.getVersion());
133 participant.setParticipantType(participantType);
135 var participantProvider = mock(ParticipantProvider.class);
136 when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
137 .thenReturn(List.of(participant));
139 var participantDeregisterMessage = new ParticipantDeregister();
140 participantDeregisterMessage.setMessageId(UUID.randomUUID());
141 participantDeregisterMessage.setParticipantId(participantId);
142 participantDeregisterMessage.setParticipantType(participantType);
143 var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class);
144 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
145 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
146 participantDeregisterAckPublisher, mock(ControlLoopUpdatePublisher.class),
147 mock(ParticipantUpdatePublisher.class));
149 handler.handleParticipantMessage(participantDeregisterMessage);
151 verify(participantProvider).updateParticipants(anyList());
152 verify(participantDeregisterAckPublisher).send(eq(participantDeregisterMessage.getMessageId()));
156 void testHandleParticipantRegister() throws PfModelException, CoderException {
157 var participant = new Participant();
158 participant.setName(participantId.getName());
159 participant.setVersion(participantId.getVersion());
160 participant.setParticipantType(participantType);
162 var participantRegisterMessage = new ParticipantRegister();
163 participantRegisterMessage.setMessageId(UUID.randomUUID());
164 participantRegisterMessage.setParticipantId(participantId);
165 participantRegisterMessage.setParticipantType(participantType);
166 var participantProvider = mock(ParticipantProvider.class);
167 var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
168 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
169 mock(MonitoringProvider.class), participantRegisterAckPublisher,
170 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
171 mock(ParticipantUpdatePublisher.class));
173 handler.handleParticipantMessage(participantRegisterMessage);
175 verify(participantProvider).createParticipants(anyList());
176 verify(participantRegisterAckPublisher).send(eq(participantRegisterMessage.getMessageId()), eq(participantId),
177 eq(participantType));
181 void testParticipantUpdateAck() throws PfModelException, CoderException {
182 var participant = new Participant();
183 participant.setName(participantId.getName());
184 participant.setVersion(participantId.getVersion());
185 participant.setParticipantType(participantType);
187 var participantProvider = mock(ParticipantProvider.class);
188 when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
189 .thenReturn(List.of(participant));
191 var participantUpdateAckMessage = new ParticipantUpdateAck();
192 participantUpdateAckMessage.setParticipantId(participantId);
193 participantUpdateAckMessage.setParticipantType(participantType);
194 participantUpdateAckMessage.setState(ParticipantState.PASSIVE);
195 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
196 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
197 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
198 mock(ParticipantUpdatePublisher.class));
200 handler.handleParticipantMessage(participantUpdateAckMessage);
202 verify(participantProvider).updateParticipants(anyList());
206 void testHandleParticipantStatus() throws PfModelException, CoderException {
207 var participantStatusMessage = new ParticipantStatus();
208 participantStatusMessage.setParticipantId(participantId);
209 participantStatusMessage.setParticipantType(participantType);
210 participantStatusMessage.setState(ParticipantState.PASSIVE);
211 participantStatusMessage.setHealthStatus(ParticipantHealthStatus.HEALTHY);
212 participantStatusMessage.setParticipantStatistics(new ParticipantStatistics());
214 var participantProvider = mock(ParticipantProvider.class);
215 var monitoringProvider = mock(MonitoringProvider.class);
216 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider, monitoringProvider,
217 mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
218 mock(ControlLoopUpdatePublisher.class), mock(ParticipantUpdatePublisher.class));
219 handler.handleParticipantMessage(participantStatusMessage);
221 verify(participantProvider).createParticipants(anyList());
222 verify(monitoringProvider).createParticipantStatistics(anyList());
226 void testHandleSendCommissionMessage() throws PfModelException, CoderException {
227 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
228 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
229 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
230 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
231 participantUpdatePublisher);
232 handler.handleSendCommissionMessage(participantId.getName(), participantId.getVersion());
234 verify(participantUpdatePublisher).sendComissioningBroadcast(eq(participantId.getName()),
235 eq(participantId.getVersion()));
239 void testHandleSendDeCommissionMessage() throws PfModelException, CoderException {
240 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
241 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
242 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
243 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
244 participantUpdatePublisher);
245 handler.handleSendDeCommissionMessage();
247 verify(participantUpdatePublisher).sendDecomisioning();
250 private SupervisionHandler createSupervisionHandler(ControlLoopProvider controlLoopProvider,
251 ParticipantProvider participantProvider, MonitoringProvider monitoringProvider,
252 ParticipantRegisterAckPublisher participantRegisterAckPublisher,
253 ParticipantDeregisterAckPublisher participantDeregisterAckPublisher,
254 ControlLoopUpdatePublisher controlLoopUpdatePublisher,
255 ParticipantUpdatePublisher participantUpdatePublisher) throws PfModelException, CoderException {
256 var controlLoopsCreate = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
258 var controlLoop = controlLoopsCreate.getControlLoopList().get(0);
259 controlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
261 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
263 when(controlLoopProvider.getControlLoop(eq(identifier))).thenReturn(controlLoop);
265 return new SupervisionHandler(controlLoopProvider, participantProvider, monitoringProvider,
266 controlLoopUpdatePublisher, controlLoopStateChangePublisher, participantRegisterAckPublisher,
267 participantDeregisterAckPublisher, participantUpdatePublisher);