47cc6f1dca8c8d42e76be982156c167e03da0158
[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 java.util.Map;
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;
54
55 class SupervisionScannerTest {
56
57     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
58             "src/test/resources/rest/servicetemplates/tosca-for-smoke-testing.yaml";
59
60     @Test
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");
70
71         var controlLoop = new ControlLoop();
72         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
73
74         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
75                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
76                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
77         supervisionScanner.run(false);
78
79         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
80     }
81
82     @Test
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));
90
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");
97
98         var modelsProvider = mock(PolicyModelsProvider.class);
99         when(modelsProvider.getServiceTemplateList(null, null)).thenReturn(List.of(new ToscaServiceTemplate()));
100
101         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
102                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
103                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
104         supervisionScanner.run(false);
105
106         verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
107     }
108
109     @Test
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));
114
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));
120
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");
127
128         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
129                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
130                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
131
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));
136     }
137
138     @Test
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)));
145
146         var controlLoopProvider = mock(ControlLoopProvider.class);
147         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
148
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));
152
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");
159
160         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
161                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
162                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
163
164         supervisionScanner.run(false);
165
166         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
167     }
168
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"));
178
179         return element;
180     }
181
182     @Test
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));
187
188         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
189         clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
190         clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
191
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));
201
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);
207
208         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
209                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
210                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
211
212         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
213         supervisionScanner.run(true);
214         verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
215
216         List<Participant> participants = participantProvider.getParticipants(null, null);
217         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
218
219         supervisionScanner.run(true);
220         participants = participantProvider.getParticipants(null, null);
221         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);
222     }
223 }