0ad8aad43ed2d2c0504d7f040dcdec8de1ba38a6
[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.eq;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30
31 import java.util.List;
32 import java.util.Map;
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;
60
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");
67
68     @Test
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));
74
75         assertThatThrownBy(() -> handler.triggerControlLoopSupervision(List.of()))
76                 .hasMessageMatching("The list of control loops for supervision is empty");
77     }
78
79     @Test
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));
87
88         handler.triggerControlLoopSupervision(List.of(identifier));
89
90         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class));
91         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
92     }
93
94     @Test
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);
104
105         handler.handleControlLoopStateChangeAckMessage(controlLoopAckMessage);
106
107         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
108     }
109
110     @Test
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));
122
123         handler.handleControlLoopUpdateAckMessage(controlLoopAckMessage);
124
125         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
126     }
127
128     @Test
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);
134
135         var participantProvider = mock(ParticipantProvider.class);
136         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
137                 .thenReturn(List.of(participant));
138
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));
148
149         handler.handleParticipantMessage(participantDeregisterMessage);
150
151         verify(participantProvider).updateParticipants(anyList());
152         verify(participantDeregisterAckPublisher).send(eq(participantDeregisterMessage.getMessageId()));
153     }
154
155     @Test
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);
161
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));
172
173         handler.handleParticipantMessage(participantRegisterMessage);
174
175         verify(participantProvider).createParticipants(anyList());
176         verify(participantRegisterAckPublisher).send(eq(participantRegisterMessage.getMessageId()), eq(participantId),
177                 eq(participantType));
178     }
179
180     @Test
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);
186
187         var participantProvider = mock(ParticipantProvider.class);
188         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
189                 .thenReturn(List.of(participant));
190
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));
199
200         handler.handleParticipantMessage(participantUpdateAckMessage);
201
202         verify(participantProvider).updateParticipants(anyList());
203     }
204
205     @Test
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());
213
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);
220
221         verify(participantProvider).createParticipants(anyList());
222         verify(monitoringProvider).createParticipantStatistics(anyList());
223     }
224
225     @Test
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());
233
234         verify(participantUpdatePublisher).sendComissioningBroadcast(eq(participantId.getName()),
235                 eq(participantId.getVersion()));
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).sendDecomisioning();
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 }