b7a3fe005172955a1bbe9743de05415fab7898e1
[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.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;
29
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;
52
53 class SupervisionScannerTest {
54
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";
58
59     private static ServiceTemplateProvider serviceTemplateProvider = mock(ServiceTemplateProvider.class);
60
61     @BeforeAll
62     public static void setUpBeforeAll() throws Exception {
63         ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
64         when(serviceTemplateProvider.getAllServiceTemplates()).thenReturn(List.of(serviceTemplate));
65     }
66
67     @Test
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");
76
77         var controlLoops =
78                 InstantiationUtils.getControlLoopsFromResource(CONTROLLOOP_JSON, "Crud").getControlLoopList();
79         when(controlLoopProvider.getControlLoops()).thenReturn(controlLoops);
80
81         var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
82                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
83                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
84         supervisionScanner.run(false);
85
86         verify(controlLoopProvider, times(0)).saveControlLoop(any(ControlLoop.class));
87     }
88
89     @Test
90     void testScannerOrderedStateDifferentToState() throws PfModelException, CoderException {
91         var controlLoops =
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);
97
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");
104
105         var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
106                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
107                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
108         supervisionScanner.run(false);
109
110         verify(controlLoopProvider, times(1)).saveControlLoop(any(ControlLoop.class));
111     }
112
113     @Test
114     void testScanner() throws PfModelException {
115         var controlLoopProvider = mock(ControlLoopProvider.class);
116         var controlLoop = new ControlLoop();
117         when(controlLoopProvider.getControlLoops()).thenReturn(List.of(controlLoop));
118
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));
124
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");
130
131         var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
132                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
133                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
134
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));
139     }
140
141     @Test
142     void testSendControlLoopMsgUpdate() throws PfModelException, CoderException {
143         var controlLoops =
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);
152             } else {
153                 element.setOrderedState(ControlLoopOrderedState.PASSIVE);
154                 element.setState(ControlLoopState.PASSIVE);
155             }
156         }
157
158         var controlLoopProvider = mock(ControlLoopProvider.class);
159         when(controlLoopProvider.getControlLoops()).thenReturn(controlLoops);
160
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");
167
168         var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
169                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
170                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
171
172         supervisionScanner.run(false);
173
174         verify(controlLoopUpdatePublisher).send(any(ControlLoop.class), anyInt());
175     }
176
177     @Test
178     void testScanParticipant() throws PfModelException {
179         var controlLoopProvider = mock(ControlLoopProvider.class);
180         var controlLoop = new ControlLoop();
181         when(controlLoopProvider.getControlLoops()).thenReturn(List.of(controlLoop));
182
183         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
184         clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
185         clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
186
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));
196
197         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
198         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
199         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
200         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
201
202         var supervisionScanner = new SupervisionScanner(controlLoopProvider, serviceTemplateProvider,
203                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
204                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
205
206         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
207         supervisionScanner.run(true);
208         verify(participantStatusReqPublisher).send(any(ToscaConceptIdentifier.class));
209         verify(participantProvider).saveParticipant(any());
210
211         supervisionScanner.run(true);
212         verify(participantProvider, times(2)).saveParticipant(any());
213     }
214 }