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.assertThat;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyInt;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.times;
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.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
36 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
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.persistence.provider.ControlLoopProvider;
43 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
44 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
45 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
46 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
47 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStatusReqPublisher;
48 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
49 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
50 import org.onap.policy.models.base.PfModelException;
51 import org.onap.policy.models.provider.PolicyModelsProvider;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
55 class SupervisionScannerTest {
57 private static final String TOSCA_SERVICE_TEMPLATE_YAML =
58 "src/test/resources/rest/servicetemplates/tosca-for-smoke-testing.yaml";
61 void testScannerOrderedStateEqualsToState() throws PfModelException {
62 var controlLoopProvider = mock(ControlLoopProvider.class);
63 var modelsProvider = mock(PolicyModelsProvider.class);
64 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
65 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
66 var participantProvider = mock(ParticipantProvider.class);
67 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
68 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
69 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
71 var controlLoop = new ControlLoop();
72 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
74 var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
75 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
76 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
77 supervisionScanner.run(false);
79 verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
83 void testScannerOrderedStateDifferentToState() throws PfModelException {
84 var controlLoop = new ControlLoop();
85 controlLoop.setState(ControlLoopState.UNINITIALISED2PASSIVE);
86 controlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
87 controlLoop.setElements(Map.of(UUID.randomUUID(), new ControlLoopElement()));
88 var controlLoopProvider = mock(ControlLoopProvider.class);
89 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
91 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
92 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
93 var participantProvider = mock(ParticipantProvider.class);
94 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
95 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
96 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
98 var modelsProvider = mock(PolicyModelsProvider.class);
99 when(modelsProvider.getServiceTemplateList(null, null)).thenReturn(List.of(new ToscaServiceTemplate()));
101 var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
102 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
103 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
104 supervisionScanner.run(false);
106 verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
110 void testScanner() throws PfModelException {
111 var controlLoopProvider = mock(ControlLoopProvider.class);
112 var controlLoop = new ControlLoop();
113 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
115 var participantProvider = mock(ParticipantProvider.class);
116 var participant = new Participant();
117 participant.setName("Participant0");
118 participant.setVersion("1.0.0");
119 when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant));
121 var modelsProvider = mock(PolicyModelsProvider.class);
122 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
123 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
124 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
125 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
126 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
128 var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
129 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
130 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
132 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
133 supervisionScanner.run(true);
134 verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
135 verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class));
139 void testSendControlLoopMsgUpdate() throws PfModelException {
140 var controlLoop = new ControlLoop();
141 controlLoop.setState(ControlLoopState.UNINITIALISED2PASSIVE);
142 controlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
143 controlLoop.setElements(Map.of(UUID.randomUUID(),
144 createHttpElement(ControlLoopState.UNINITIALISED, ControlLoopOrderedState.PASSIVE)));
146 var controlLoopProvider = mock(ControlLoopProvider.class);
147 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
149 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
150 var modelsProvider = mock(PolicyModelsProvider.class);
151 when(modelsProvider.getServiceTemplateList(null, null)).thenReturn(List.of(serviceTemplate));
153 var participantProvider = mock(ParticipantProvider.class);
154 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
155 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
156 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
157 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
158 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
160 var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
161 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
162 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
164 supervisionScanner.run(false);
166 verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
169 private ControlLoopElement createHttpElement(ControlLoopState state, ControlLoopOrderedState orderedState) {
170 var element = new ControlLoopElement();
171 element.setDefinition(new ToscaConceptIdentifier(
172 "org.onap.domain.database.Http_PMSHMicroserviceControlLoopElement", "1.2.3"));
173 element.setState(state);
174 element.setOrderedState(orderedState);
175 element.setParticipantId(new ToscaConceptIdentifier("HttpParticipant0", "1.0.0"));
176 element.setParticipantType(
177 new ToscaConceptIdentifier("org.onap.k8s.controlloop.HttpControlLoopParticipant", "2.3.4"));
183 void testScanParticipant() throws PfModelException {
184 var controlLoopProvider = mock(ControlLoopProvider.class);
185 var controlLoop = new ControlLoop();
186 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
188 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
189 clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
190 clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
192 var participant = new Participant();
193 participant.setName("Participant0");
194 participant.setVersion("1.0.0");
195 participant.setHealthStatus(ParticipantHealthStatus.HEALTHY);
196 participant.setParticipantState(ParticipantState.ACTIVE);
197 participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
198 participant.setParticipantType(new ToscaConceptIdentifier("ParticipantType1", "1.0.0"));
199 var participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
200 participantProvider.updateParticipants(List.of(participant));
202 var modelsProvider = mock(PolicyModelsProvider.class);
203 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
204 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
205 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
206 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
208 var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
209 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
210 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
212 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
213 supervisionScanner.run(true);
214 verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
216 List<Participant> participants = participantProvider.getParticipants(null, null);
217 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
219 supervisionScanner.run(true);
220 participants = participantProvider.getParticipants(null, null);
221 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);