25ce61122ab4108e0130e3fadfb258bea0e0a31c
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.controlloop.runtime.supervision;
22
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.anyMap;
27 import static org.mockito.ArgumentMatchers.eq;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31
32 import java.util.List;
33 import java.util.Map;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
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.tosca.authorative.concepts.ToscaConceptIdentifier;
61
62 class SupervisionHandlerTest {
63     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
64     private static final ToscaConceptIdentifier identifier = new ToscaConceptIdentifier("PMSHInstance0Crud", "1.0.1");
65     private static final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("ParticipantId", "1.0.0");
66     private static final ToscaConceptIdentifier participantType =
67             new ToscaConceptIdentifier("ParticipantType", "1.0.0");
68
69     @Test
70     void testTriggerControlLoopSupervisionEmpty() throws ControlLoopException, PfModelException, CoderException {
71         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
72                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
73                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
74                 mock(ParticipantUpdatePublisher.class));
75
76         assertThatThrownBy(() -> handler.triggerControlLoopSupervision(List.of()))
77                 .hasMessageMatching("The list of control loops for supervision is empty");
78     }
79
80     @Test
81     void testTriggerControlLoopSupervision() throws ControlLoopException, PfModelException, CoderException {
82         var controlLoopProvider = mock(ControlLoopProvider.class);
83         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
84         var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
85                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
86                 mock(ParticipantDeregisterAckPublisher.class), controlLoopUpdatePublisher,
87                 mock(ParticipantUpdatePublisher.class));
88
89         handler.triggerControlLoopSupervision(List.of(identifier));
90
91         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class));
92         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
93     }
94
95     @Test
96     void testHandleControlLoopStateChangeAckMessage() throws PfModelException, CoderException {
97         var controlLoopProvider = mock(ControlLoopProvider.class);
98         var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
99                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
100                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
101                 mock(ParticipantUpdatePublisher.class));
102         var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
103         controlLoopAckMessage.setControlLoopResultMap(Map.of());
104         controlLoopAckMessage.setControlLoopId(identifier);
105
106         handler.handleControlLoopStateChangeAckMessage(controlLoopAckMessage);
107
108         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
109     }
110
111     @Test
112     void testHandleControlLoopUpdateAckMessage() throws PfModelException, CoderException {
113         var controlLoopAckMessage = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_UPDATE_ACK);
114         controlLoopAckMessage.setParticipantId(participantId);
115         controlLoopAckMessage.setParticipantType(participantType);
116         controlLoopAckMessage.setControlLoopResultMap(Map.of());
117         controlLoopAckMessage.setControlLoopId(identifier);
118         var controlLoopProvider = mock(ControlLoopProvider.class);
119         var handler = createSupervisionHandler(controlLoopProvider, mock(ParticipantProvider.class),
120                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
121                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
122                 mock(ParticipantUpdatePublisher.class));
123
124         handler.handleControlLoopUpdateAckMessage(controlLoopAckMessage);
125
126         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
127     }
128
129     @Test
130     void testHandleParticipantDeregister() throws PfModelException, CoderException {
131         var participant = new Participant();
132         participant.setName(participantId.getName());
133         participant.setVersion(participantId.getVersion());
134         participant.setParticipantType(participantType);
135
136         var participantProvider = mock(ParticipantProvider.class);
137         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
138                 .thenReturn(List.of(participant));
139
140         var participantDeregisterMessage = new ParticipantDeregister();
141         participantDeregisterMessage.setMessageId(UUID.randomUUID());
142         participantDeregisterMessage.setParticipantId(participantId);
143         participantDeregisterMessage.setParticipantType(participantType);
144         var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class);
145         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
146                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
147                 participantDeregisterAckPublisher, mock(ControlLoopUpdatePublisher.class),
148                 mock(ParticipantUpdatePublisher.class));
149
150         handler.handleParticipantMessage(participantDeregisterMessage);
151
152         verify(participantProvider).updateParticipants(anyList());
153         verify(participantDeregisterAckPublisher).send(eq(participantDeregisterMessage.getMessageId()));
154     }
155
156     @Test
157     void testHandleParticipantRegister() throws PfModelException, CoderException {
158         var participant = new Participant();
159         participant.setName(participantId.getName());
160         participant.setVersion(participantId.getVersion());
161         participant.setParticipantType(participantType);
162
163         var participantRegisterMessage = new ParticipantRegister();
164         participantRegisterMessage.setMessageId(UUID.randomUUID());
165         participantRegisterMessage.setParticipantId(participantId);
166         participantRegisterMessage.setParticipantType(participantType);
167         var participantProvider = mock(ParticipantProvider.class);
168         var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class);
169         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
170                 mock(MonitoringProvider.class), participantRegisterAckPublisher,
171                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
172                 mock(ParticipantUpdatePublisher.class));
173
174         handler.handleParticipantMessage(participantRegisterMessage);
175
176         verify(participantProvider).createParticipants(anyList());
177         verify(participantRegisterAckPublisher).send(eq(participantRegisterMessage.getMessageId()), eq(participantId),
178                 eq(participantType));
179     }
180
181     @Test
182     void testParticipantUpdateAck() throws PfModelException, CoderException {
183         var participant = new Participant();
184         participant.setName(participantId.getName());
185         participant.setVersion(participantId.getVersion());
186         participant.setParticipantType(participantType);
187
188         var participantProvider = mock(ParticipantProvider.class);
189         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
190                 .thenReturn(List.of(participant));
191
192         var participantUpdateAckMessage = new ParticipantUpdateAck();
193         participantUpdateAckMessage.setParticipantId(participantId);
194         participantUpdateAckMessage.setParticipantType(participantType);
195         participantUpdateAckMessage.setState(ParticipantState.PASSIVE);
196         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider,
197                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
198                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
199                 mock(ParticipantUpdatePublisher.class));
200
201         handler.handleParticipantMessage(participantUpdateAckMessage);
202
203         verify(participantProvider).updateParticipants(anyList());
204     }
205
206     @Test
207     void testHandleParticipantStatus() throws PfModelException, CoderException {
208         var participantStatusMessage = new ParticipantStatus();
209         participantStatusMessage.setParticipantId(participantId);
210         participantStatusMessage.setParticipantType(participantType);
211         participantStatusMessage.setState(ParticipantState.PASSIVE);
212         participantStatusMessage.setHealthStatus(ParticipantHealthStatus.HEALTHY);
213         participantStatusMessage.setParticipantStatistics(new ParticipantStatistics());
214
215         var participantProvider = mock(ParticipantProvider.class);
216         var monitoringProvider = mock(MonitoringProvider.class);
217         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), participantProvider, monitoringProvider,
218                 mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class),
219                 mock(ControlLoopUpdatePublisher.class), mock(ParticipantUpdatePublisher.class));
220         handler.handleParticipantMessage(participantStatusMessage);
221
222         verify(participantProvider).createParticipants(anyList());
223         verify(monitoringProvider).createParticipantStatistics(anyList());
224     }
225
226     @Test
227     void testHandleSendCommissionMessage() throws PfModelException, CoderException {
228         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
229         var handler = createSupervisionHandler(mock(ControlLoopProvider.class), mock(ParticipantProvider.class),
230                 mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
231                 mock(ParticipantDeregisterAckPublisher.class), mock(ControlLoopUpdatePublisher.class),
232                 participantUpdatePublisher);
233         handler.handleSendCommissionMessage(Map.of());
234
235         verify(participantUpdatePublisher).send(anyMap(), eq(true));
236     }
237
238     @Test
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();
246
247         verify(participantUpdatePublisher).send(anyMap(), eq(false));
248     }
249
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");
257
258         var controlLoop = controlLoopsCreate.getControlLoopList().get(0);
259         controlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
260
261         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
262
263         when(controlLoopProvider.getControlLoop(eq(identifier))).thenReturn(controlLoop);
264
265         return new SupervisionHandler(controlLoopProvider, participantProvider, monitoringProvider,
266                 controlLoopUpdatePublisher, controlLoopStateChangePublisher, participantRegisterAckPublisher,
267                 participantDeregisterAckPublisher, participantUpdatePublisher);
268
269     }
270 }