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