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;
32 import org.junit.jupiter.api.BeforeAll;
33 import org.junit.jupiter.api.Test;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
35 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
36 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
39 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
40 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
41 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
42 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider;
43 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
44 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
45 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
46 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStatusReqPublisher;
47 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
48 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
49 import org.onap.policy.common.utils.coder.CoderException;
50 import org.onap.policy.models.base.PfModelException;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
54 class SupervisionScannerTest {
56 private static final String TOSCA_SERVICE_TEMPLATE_YAML =
57 "src/test/resources/rest/servicetemplates/tosca-for-smoke-testing.yaml";
58 private static final String CONTROLLOOP_JSON = "src/test/resources/rest/controlloops/ControlLoopsSmoke.json";
60 private static ServiceTemplateProvider serviceTemplateProvider = mock(ServiceTemplateProvider.class);
63 public static void setUpBeforeAll() throws Exception {
64 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
65 when(serviceTemplateProvider.getServiceTemplateList(null, null)).thenReturn(List.of(serviceTemplate));
69 void testScannerOrderedStateEqualsToState() throws PfModelException, CoderException {
70 var controlLoopProvider = mock(ControlLoopProvider.class);
71 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
72 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
73 var participantProvider = mock(ParticipantProvider.class);
74 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
75 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
76 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
79 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
80 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(controlLoops);
82 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
83 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
84 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
85 supervisionScanner.run(false);
87 verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
91 void testScannerOrderedStateDifferentToState() throws PfModelException, CoderException {
93 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
94 controlLoops.get(0).setState(ControlLoopState.UNINITIALISED2PASSIVE);
95 controlLoops.get(0).setOrderedState(ControlLoopOrderedState.UNINITIALISED);
96 var controlLoopProvider = mock(ControlLoopProvider.class);
97 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(controlLoops);
99 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
100 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
101 var participantProvider = mock(ParticipantProvider.class);
102 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
103 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
104 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
106 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
107 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
108 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
109 supervisionScanner.run(false);
111 verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
115 void testScanner() throws PfModelException {
116 var controlLoopProvider = mock(ControlLoopProvider.class);
117 var controlLoop = new ControlLoop();
118 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
120 var participantProvider = mock(ParticipantProvider.class);
121 var participant = new Participant();
122 participant.setName("Participant0");
123 participant.setVersion("1.0.0");
124 when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant));
126 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
127 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
128 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
129 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
130 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
132 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
133 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
134 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
136 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
137 supervisionScanner.run(true);
138 verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
139 verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class));
143 void testSendControlLoopMsgUpdate() throws PfModelException, CoderException {
145 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
146 controlLoops.get(0).setState(ControlLoopState.UNINITIALISED2PASSIVE);
147 controlLoops.get(0).setOrderedState(ControlLoopOrderedState.PASSIVE);
148 for (var element : controlLoops.get(0).getElements().values()) {
149 if ("org.onap.domain.database.Http_PMSHMicroserviceControlLoopElement"
150 .equals(element.getDefinition().getName())) {
151 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
152 element.setState(ControlLoopState.UNINITIALISED);
154 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
155 element.setState(ControlLoopState.PASSIVE);
159 var controlLoopProvider = mock(ControlLoopProvider.class);
160 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(controlLoops);
162 var participantProvider = mock(ParticipantProvider.class);
163 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
164 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
165 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
166 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
167 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
169 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
170 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
171 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
173 supervisionScanner.run(false);
175 verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
179 void testScanParticipant() throws PfModelException {
180 var controlLoopProvider = mock(ControlLoopProvider.class);
181 var controlLoop = new ControlLoop();
182 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
184 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
185 clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
186 clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
188 var participant = new Participant();
189 participant.setName("Participant0");
190 participant.setVersion("1.0.0");
191 participant.setHealthStatus(ParticipantHealthStatus.HEALTHY);
192 participant.setParticipantState(ParticipantState.ACTIVE);
193 participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
194 participant.setParticipantType(new ToscaConceptIdentifier("ParticipantType1", "1.0.0"));
195 var participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
196 participantProvider.updateParticipants(List.of(participant));
198 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
199 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
200 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
201 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
203 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
204 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
205 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
207 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
208 supervisionScanner.run(true);
209 verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
211 List<Participant> participants = participantProvider.getParticipants(null, null);
212 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
214 supervisionScanner.run(true);
215 participants = participantProvider.getParticipants(null, null);
216 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);