1bf445734d6ebe510c1e8ab75641a4b8787494d8
[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.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 java.util.Map;
32 import java.util.UUID;
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.ControlLoopElement;
36 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
37 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
39 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
40 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
41 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
42 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
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.models.base.PfModelException;
49 import org.onap.policy.models.provider.PolicyModelsProvider;
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     @Test
56     void testScannerOrderedStateEqualsToState() throws PfModelException {
57         var controlLoopProvider = mock(ControlLoopProvider.class);
58         var modelsProvider = mock(PolicyModelsProvider.class);
59         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
60         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
61         var participantProvider = mock(ParticipantProvider.class);
62         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
63         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
64         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
65
66         var controlLoop = new ControlLoop();
67         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
68
69         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
70                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
71                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
72         supervisionScanner.run(false);
73
74         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
75     }
76
77     @Test
78     void testScannerOrderedStateDifferentToState() throws PfModelException {
79         var controlLoop = new ControlLoop();
80         controlLoop.setState(ControlLoopState.UNINITIALISED2PASSIVE);
81         controlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
82         controlLoop.setElements(Map.of(UUID.randomUUID(), new ControlLoopElement()));
83         var controlLoopProvider = mock(ControlLoopProvider.class);
84         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
85
86         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
87         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
88         var participantProvider = mock(ParticipantProvider.class);
89         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
90         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
91         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
92
93         var modelsProvider = mock(PolicyModelsProvider.class);
94         when(modelsProvider.getServiceTemplateList(null, null)).thenReturn(List.of(new ToscaServiceTemplate()));
95
96         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
97                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
98                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
99         supervisionScanner.run(false);
100
101         verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
102     }
103
104     @Test
105     void testScanner() throws PfModelException {
106         var controlLoopProvider = mock(ControlLoopProvider.class);
107         var controlLoop = new ControlLoop();
108         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
109
110         var participantProvider = mock(ParticipantProvider.class);
111         var participant = new Participant();
112         participant.setName("Participant0");
113         participant.setVersion("1.0.0");
114         when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant));
115
116         var modelsProvider = mock(PolicyModelsProvider.class);
117         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
118         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
119         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
120         var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class);
121         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
122
123         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
124                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
125                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
126
127         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
128         supervisionScanner.run(true);
129         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
130         verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class));
131     }
132
133     @Test
134     void testScanParticipant() throws PfModelException {
135         var controlLoopProvider = mock(ControlLoopProvider.class);
136         var controlLoop = new ControlLoop();
137         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
138
139         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
140         clRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().setMaxWaitMs(-1);
141         clRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
142
143         var participant = new Participant();
144         participant.setName("Participant0");
145         participant.setVersion("1.0.0");
146         participant.setHealthStatus(ParticipantHealthStatus.HEALTHY);
147         participant.setParticipantState(ParticipantState.ACTIVE);
148         participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
149         participant.setParticipantType(new ToscaConceptIdentifier("ParticipantType1", "1.0.0"));
150         var participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
151         participantProvider.updateParticipants(List.of(participant));
152
153         var modelsProvider = mock(PolicyModelsProvider.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
159         var supervisionScanner = new SupervisionScanner(controlLoopProvider, modelsProvider,
160                 controlLoopStateChangePublisher, controlLoopUpdatePublisher, participantProvider,
161                 participantStatusReqPublisher, participantUpdatePublisher, clRuntimeParameterGroup);
162
163         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
164         supervisionScanner.run(true);
165         verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
166
167         List<Participant> participants = participantProvider.getParticipants(null, null);
168         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
169
170         supervisionScanner.run(true);
171         participants = participantProvider.getParticipants(null, null);
172         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);
173     }
174 }