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.mockito.ArgumentMatchers.any;
24 import static org.mockito.ArgumentMatchers.anyInt;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.times;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
30 import java.util.List;
31 import org.junit.jupiter.api.BeforeAll;
32 import org.junit.jupiter.api.Test;
33 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
35 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
36 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
39 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
40 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
41 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider;
42 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
43 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
44 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
45 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantStatusReqPublisher;
46 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
47 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
48 import org.onap.policy.common.utils.coder.CoderException;
49 import org.onap.policy.models.base.PfModelException;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 class SupervisionScannerTest {
55 private static final String TOSCA_SERVICE_TEMPLATE_YAML =
56 "src/test/resources/rest/servicetemplates/tosca-for-smoke-testing.yaml";
57 private static final String CONTROLLOOP_JSON = "src/test/resources/rest/controlloops/ControlLoopsSmoke.json";
59 private static ServiceTemplateProvider serviceTemplateProvider = mock(ServiceTemplateProvider.class);
62 public static void setUpBeforeAll() throws Exception {
63 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
64 when(serviceTemplateProvider.getAllServiceTemplates()).thenReturn(List.of(serviceTemplate));
68 void testScannerOrderedStateEqualsToState() throws PfModelException, CoderException {
69 var controlLoopProvider = mock(ControlLoopProvider.class);
70 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
71 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
72 var participantProvider = mock(ParticipantProvider.class);
73 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
74 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
75 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
78 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
79 when(controlLoopProvider.getControlLoops()).thenReturn(controlLoops);
81 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
82 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
83 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
84 supervisionScanner.run(false);
86 verify(controlLoopProvider, times(0)).saveControlLoop(any(ControlLoop.class));
90 void testScannerOrderedStateDifferentToState() throws PfModelException, CoderException {
92 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
93 controlLoops.get(0).setState(ControlLoopState.UNINITIALISED2PASSIVE);
94 controlLoops.get(0).setOrderedState(ControlLoopOrderedState.UNINITIALISED);
95 var controlLoopProvider = mock(ControlLoopProvider.class);
96 when(controlLoopProvider.getControlLoops()).thenReturn(controlLoops);
98 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
99 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
100 var participantProvider = mock(ParticipantProvider.class);
101 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
102 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
103 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
105 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
106 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
107 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
108 supervisionScanner.run(false);
110 verify(controlLoopProvider, times(1)).saveControlLoop(any(ControlLoop.class));
114 void testScanner() throws PfModelException {
115 var controlLoopProvider = mock(ControlLoopProvider.class);
116 var controlLoop = new ControlLoop();
117 when(controlLoopProvider.getControlLoops()).thenReturn(List.of(controlLoop));
119 var participantProvider = mock(ParticipantProvider.class);
120 var participant = new Participant();
121 participant.setName("Participant0");
122 participant.setVersion("1.0.0");
123 when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant));
125 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
126 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
127 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
128 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
129 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
131 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
132 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
133 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
135 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
136 supervisionScanner.run(true);
137 verify(controlLoopProvider, times(0)).saveControlLoop(any(ControlLoop.class));
138 verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class));
142 void testSendControlLoopMsgUpdate() throws PfModelException, CoderException {
144 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
145 controlLoops.get(0).setState(ControlLoopState.UNINITIALISED2PASSIVE);
146 controlLoops.get(0).setOrderedState(ControlLoopOrderedState.PASSIVE);
147 for (var element : controlLoops.get(0).getElements().values()) {
148 if ("org.onap.domain.database.Http_PMSHMicroserviceControlLoopElement"
149 .equals(element.getDefinition().getName())) {
150 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
151 element.setState(ControlLoopState.UNINITIALISED);
153 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
154 element.setState(ControlLoopState.PASSIVE);
158 var controlLoopProvider = mock(ControlLoopProvider.class);
159 when(controlLoopProvider.getControlLoops()).thenReturn(controlLoops);
161 var participantProvider = mock(ParticipantProvider.class);
162 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
163 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
164 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
165 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
166 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
168 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
169 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
170 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
172 supervisionScanner.run(false);
174 verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
178 void testScanParticipant() throws PfModelException {
179 var controlLoopProvider = mock(ControlLoopProvider.class);
180 var controlLoop = new ControlLoop();
181 when(controlLoopProvider.getControlLoops()).thenReturn(List.of(controlLoop));
183 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
184 clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
185 clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
187 var participant = new Participant();
188 participant.setName("Participant0");
189 participant.setVersion("1.0.0");
190 participant.setHealthStatus(ParticipantHealthStatus.HEALTHY);
191 participant.setParticipantState(ParticipantState.ACTIVE);
192 participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
193 participant.setParticipantType(new ToscaConceptIdentifier("ParticipantType1", "1.0.0"));
194 var participantProvider = mock(ParticipantProvider.class);
195 when(participantProvider.getParticipants()).thenReturn(List.of(participant));
197 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
198 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
199 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
200 var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
202 var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
203 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
204 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
206 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
207 supervisionScanner.run(true);
208 verify(participantStatusReqPublisher).send(any(ToscaConceptIdentifier.class));
209 verify(participantProvider).saveParticipant(any());
211 supervisionScanner.run(true);
212 verify(participantProvider, times(2)).saveParticipant(any());