f884e0129fe57e820c9fce677b818316f7abcf3f
[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.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;
30
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.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.provider.PolicyModelsProvider;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53
54 class SupervisionScannerTest {
55
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";
59
60     private static PolicyModelsProvider modelsProvider = mock(PolicyModelsProvider.class);
61
62     @BeforeAll
63     public static void setUpBeforeAll() throws Exception {
64         ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
65         when(modelsProvider.getServiceTemplateList(null, null)).thenReturn(List.of(serviceTemplate));
66     }
67
68     @Test
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");
77
78         var controlLoops =
79                 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
80         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(controlLoops);
81
82         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
83                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
84                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
85         supervisionScanner.run(false);
86
87         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
88     }
89
90     @Test
91     void testScannerOrderedStateDifferentToState() throws PfModelException, CoderException {
92         var controlLoops =
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);
98
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");
105
106         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
107                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
108                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
109         supervisionScanner.run(false);
110
111         verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
112     }
113
114     @Test
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));
119
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));
125
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");
131
132         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
133                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
134                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
135
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));
140     }
141
142     @Test
143     void testSendControlLoopMsgUpdate() throws PfModelException, CoderException {
144         var controlLoops =
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);
153             } else {
154                 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
155                 element.setState(ControlLoopState.PASSIVE);
156             }
157         }
158
159         var controlLoopProvider = mock(ControlLoopProvider.class);
160         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(controlLoops);
161
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");
168
169         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
170                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
171                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
172
173         supervisionScanner.run(false);
174
175         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
176     }
177
178     @Test
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));
183
184         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
185         clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
186         clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
187
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));
197
198         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
199         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
200         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
201         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
202
203         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
204                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
205                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
206
207         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
208         supervisionScanner.run(true);
209         verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
210
211         List<Participant> participants = participantProvider.getParticipants(null, null);
212         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
213
214         supervisionScanner.run(true);
215         participants = participantProvider.getParticipants(null, null);
216         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);
217     }
218 }