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.mockito.Mockito;
36 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
39 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
40 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
41 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
42 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
43 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
44 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
45 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
46 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
47 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
48 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
49 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
50 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
51 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
52 import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
53 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
54 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
55 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
56 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantRegisterAckPublisher;
57 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
58 import org.onap.policy.common.utils.coder.CoderException;
59 import org.onap.policy.models.base.PfModelException;
60 import org.onap.policy.models.provider.PolicyModelsProvider;
61 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
63 class SupervisionHandlerTest {
64 private static final String TOSCA_TEMPLATE_YAML =
65 "src/test/resources/rest/servicetemplates/tosca-for-smoke-testing.yaml";
66 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
67 private static final ToscaConceptIdentifier identifier = new ToscaConceptIdentifier("PMSHInstance0Crud", "1.0.1");
68 private static final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("ParticipantId", "1.0.0");
69 private static final ToscaConceptIdentifier participantType =
70 new ToscaConceptIdentifier("ParticipantType", "1.0.0");
73 void testTriggerControlLoopSupervisionEmpty() throws ControlLoopException, PfModelException, CoderException {
74 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
75 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
76 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
77 mock(ParticipantUpdatePublisher.class));
79 assertThatThrownBy(() -> handler.triggerControlLoopSupervision(List.of()))
80 .hasMessageMatching("The list of control loops for supervision is empty");
84 void testTriggerControlLoopSupervision() throws ControlLoopException, PfModelException, CoderException {
85 var controlLoopProvider = mock(ControlLoopProvider.class);
86 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
87 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
88 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
89 mock(ParticipantDeregisterAckPublisher.class), controlLoopUpdatePublisher,
90 mock(ParticipantUpdatePublisher.class));
92 handler.triggerControlLoopSupervision(List.of(identifier));
94 verify(controlLoopUpdatePublisher).send(any(ControlLoop.class));
95 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
99 void testHandleControlLoopStateChangeAckMessage() throws PfModelException, CoderException {
100 var controlLoopProvider = mock(ControlLoopProvider.class);
101 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
102 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
103 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
104 mock(ParticipantUpdatePublisher.class));
105 var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
106 controlLoopAckMessage.setControlLoopResultMap(Map.of());
107 controlLoopAckMessage.setControlLoopId(identifier);
109 handler.handleControlLoopStateChangeAckMessage(controlLoopAckMessage);
111 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
115 void testHandleControlLoopUpdateAckMessage() throws PfModelException, CoderException {
116 var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_UPDATE_ACK);
117 controlLoopAckMessage.setParticipantId(participantId);
118 controlLoopAckMessage.setParticipantType(participantType);
119 controlLoopAckMessage.setControlLoopResultMap(Map.of());
120 controlLoopAckMessage.setControlLoopId(identifier);
121 var controlLoopProvider = mock(ControlLoopProvider.class);
122 var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
123 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
124 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
125 mock(ParticipantUpdatePublisher.class));
127 handler.handleControlLoopUpdateAckMessage(controlLoopAckMessage);
129 verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
133 void testHandleParticipantDeregister() throws PfModelException, CoderException {
134 var participant = new Participant();
135 participant.setName(participantId.getName());
136 participant.setVersion(participantId.getVersion());
137 participant.setParticipantType(participantType);
139 var participantProvider = mock(ParticipantProvider.class);
140 when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
141 .thenReturn(List.of(participant));
143 var participantDeregisterMessage = new ParticipantDeregister();
144 participantDeregisterMessage.setMessageId(UUID.randomUUID());
145 participantDeregisterMessage.setParticipantId(participantId);
146 participantDeregisterMessage.setParticipantType(participantType);
147 var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class);
148 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
149 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
150 participantDeregisterAckPublisher, mock(ControlLoopUpdatePublisher.class),
151 mock(ParticipantUpdatePublisher.class));
153 handler.handleParticipantMessage(participantDeregisterMessage);
155 verify(participantProvider).updateParticipants(anyList());
156 verify(participantDeregisterAckPublisher).send(eq(participantDeregisterMessage.getMessageId()));
160 void testHandleParticipantRegister() throws PfModelException, CoderException {
161 var participant = new Participant();
162 participant.setName(participantId.getName());
163 participant.setVersion(participantId.getVersion());
164 participant.setParticipantType(participantType);
166 var participantRegisterMessage = new ParticipantRegister();
167 participantRegisterMessage.setMessageId(UUID.randomUUID());
168 participantRegisterMessage.setParticipantId(participantId);
169 participantRegisterMessage.setParticipantType(participantType);
170 var participantProvider = mock(ParticipantProvider.class);
171 var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
172 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
173 mock(MonitoringProvider.class), participantRegisterAckPublisher,
174 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
175 mock(ParticipantUpdatePublisher.class));
177 handler.handleParticipantMessage(participantRegisterMessage);
179 verify(participantProvider).createParticipants(anyList());
180 verify(participantRegisterAckPublisher).send(eq(participantRegisterMessage.getMessageId()), eq(participantId),
181 eq(participantType));
185 void testParticipantUpdateAck() throws PfModelException, CoderException {
186 var participant = new Participant();
187 participant.setName(participantId.getName());
188 participant.setVersion(participantId.getVersion());
189 participant.setParticipantType(participantType);
191 var participantProvider = mock(ParticipantProvider.class);
192 when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
193 .thenReturn(List.of(participant));
195 var participantUpdateAckMessage = new ParticipantUpdateAck();
196 participantUpdateAckMessage.setParticipantId(participantId);
197 participantUpdateAckMessage.setParticipantType(participantType);
198 participantUpdateAckMessage.setState(ParticipantState.PASSIVE);
199 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
200 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
201 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
202 mock(ParticipantUpdatePublisher.class));
204 handler.handleParticipantMessage(participantUpdateAckMessage);
206 verify(participantProvider).updateParticipants(anyList());
210 void testHandleParticipantStatus() throws PfModelException, CoderException {
211 var participantStatusMessage = new ParticipantStatus();
212 participantStatusMessage.setParticipantId(participantId);
213 participantStatusMessage.setParticipantType(participantType);
214 participantStatusMessage.setState(ParticipantState.PASSIVE);
215 participantStatusMessage.setHealthStatus(ParticipantHealthStatus.HEALTHY);
216 participantStatusMessage.setParticipantStatistics(new ParticipantStatistics());
218 var participantProvider = mock(ParticipantProvider.class);
219 var monitoringProvider = mock(MonitoringProvider.class);
220 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider, monitoringProvider,
221 mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
222 mock(ControlLoopUpdatePublisher.class), mock(ParticipantUpdatePublisher.class));
223 handler.handleParticipantMessage(participantStatusMessage);
225 verify(participantProvider).createParticipants(anyList());
226 verify(monitoringProvider).createParticipantStatistics(anyList());
230 void testHandleSendCommissionMessage() throws PfModelException, CoderException {
231 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
232 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
233 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
234 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
235 participantUpdatePublisher);
236 handler.handleSendCommissionMessage(participantId.getName(), participantId.getVersion());
238 verify(participantUpdatePublisher).sendComissioningBroadcast(eq(participantId.getName()),
239 eq(participantId.getVersion()));
243 void testHandleSendDeCommissionMessage() throws PfModelException, CoderException {
244 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
245 var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
246 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
247 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
248 participantUpdatePublisher);
249 handler.handleSendDeCommissionMessage();
251 verify(participantUpdatePublisher).sendDecomisioning();
254 private SupervisionHandler createSupervisionHandler(ControlLoopProvider controlLoopProvider,
255 ParticipantProvider participantProvider, MonitoringProvider monitoringProvider,
256 ParticipantRegisterAckPublisher participantRegisterAckPublisher,
257 ParticipantDeregisterAckPublisher participantDeregisterAckPublisher,
258 ControlLoopUpdatePublisher controlLoopUpdatePublisher,
259 ParticipantUpdatePublisher participantUpdatePublisher) throws PfModelException, CoderException {
260 var controlLoopsCreate = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
262 var controlLoop = controlLoopsCreate.getControlLoopList().get(0);
263 controlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
265 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
267 when(controlLoopProvider.getControlLoop(eq(identifier))).thenReturn(controlLoop);
269 var modelsProvider = Mockito.mock(PolicyModelsProvider.class);
270 when(modelsProvider.getServiceTemplateList(any(), any()))
271 .thenReturn(List.of(InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML)));
273 return new SupervisionHandler(controlLoopProvider, participantProvider, monitoringProvider, modelsProvider,
274 controlLoopUpdatePublisher, controlLoopStateChangePublisher, participantRegisterAckPublisher,
275 participantDeregisterAckPublisher, participantUpdatePublisher);