0fcf52ab97d1dfa0b726f82a86609a6981cb6d29
[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.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;
62
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");
71
72     @Test
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));
78
79         assertThatThrownBy(() -> handler.triggerControlLoopSupervision(List.of()))
80                 .hasMessageMatching("The list of control loops for supervision is empty");
81     }
82
83     @Test
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));
91
92         handler.triggerControlLoopSupervision(List.of(identifier));
93
94         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class));
95         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
96     }
97
98     @Test
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);
108
109         handler.handleControlLoopStateChangeAckMessage(controlLoopAckMessage);
110
111         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
112     }
113
114     @Test
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));
126
127         handler.handleControlLoopUpdateAckMessage(controlLoopAckMessage);
128
129         verify(controlLoopProvider).updateControlLoop(any(ControlLoop.class));
130     }
131
132     @Test
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);
138
139         var participantProvider = mock(ParticipantProvider.class);
140         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
141                 .thenReturn(List.of(participant));
142
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));
152
153         handler.handleParticipantMessage(participantDeregisterMessage);
154
155         verify(participantProvider).updateParticipants(anyList());
156         verify(participantDeregisterAckPublisher).send(eq(participantDeregisterMessage.getMessageId()));
157     }
158
159     @Test
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);
165
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));
176
177         handler.handleParticipantMessage(participantRegisterMessage);
178
179         verify(participantProvider).createParticipants(anyList());
180         verify(participantRegisterAckPublisher).send(eq(participantRegisterMessage.getMessageId()), eq(participantId),
181                 eq(participantType));
182     }
183
184     @Test
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);
190
191         var participantProvider = mock(ParticipantProvider.class);
192         when(participantProvider.getParticipants(eq(participantId.getName()), eq(participantId.getVersion())))
193                 .thenReturn(List.of(participant));
194
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));
203
204         handler.handleParticipantMessage(participantUpdateAckMessage);
205
206         verify(participantProvider).updateParticipants(anyList());
207     }
208
209     @Test
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());
217
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);
224
225         verify(participantProvider).createParticipants(anyList());
226         verify(monitoringProvider).createParticipantStatistics(anyList());
227     }
228
229     @Test
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());
237
238         verify(participantUpdatePublisher).sendComissioningBroadcast(eq(participantId.getName()),
239                 eq(participantId.getVersion()));
240     }
241
242     @Test
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();
250
251         verify(participantUpdatePublisher).sendDecomisioning();
252     }
253
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");
261
262         var controlLoop = controlLoopsCreate.getControlLoopList().get(0);
263         controlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
264
265         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
266
267         when(controlLoopProvider.getControlLoop(eq(identifier))).thenReturn(controlLoop);
268
269         var modelsProvider = Mockito.mock(PolicyModelsProvider.class);
270         when(modelsProvider.getServiceTemplateList(any(), any()))
271                 .thenReturn(List.of(InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML)));
272
273         return new SupervisionHandler(controlLoopProvider, participantProvider, monitoringProvider, modelsProvider,
274                 controlLoopUpdatePublisher, controlLoopStateChangePublisher, participantRegisterAckPublisher,
275                 participantDeregisterAckPublisher, participantUpdatePublisher);
276
277     }
278 }