485f58dbae0411f5c5ef9ef604f45bb82dab972c
[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.util.CommonTestData;
47 import org.onap.policy.models.base.PfModelException;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
49
50 class SupervisionScannerTest {
51
52     @Test
53     void testScannerOrderedStateEqualsToState() throws PfModelException {
54         var controlLoopProvider = mock(ControlLoopProvider.class);
55         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
56         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
57         var participantProvider = mock(ParticipantProvider.class);
58         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
59         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
60
61         var controlLoop = new ControlLoop();
62         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
63
64         var supervisionScanner =
65                 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
66                         participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
67         supervisionScanner.run(false);
68
69         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
70     }
71
72     @Test
73     void testScannerOrderedStateDifferentToState() throws PfModelException {
74         var controlLoop = new ControlLoop();
75         controlLoop.setState(ControlLoopState.UNINITIALISED2PASSIVE);
76         controlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
77         controlLoop.setElements(Map.of(UUID.randomUUID(), new ControlLoopElement()));
78         var controlLoopProvider = mock(ControlLoopProvider.class);
79         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
80
81         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
82         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
83         var participantProvider = mock(ParticipantProvider.class);
84         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
85         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
86
87         var supervisionScanner =
88                 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
89                         participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
90         supervisionScanner.run(false);
91
92         verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
93     }
94
95     @Test
96     void testScanner() throws PfModelException {
97         var controlLoopProvider = mock(ControlLoopProvider.class);
98         var controlLoop = new ControlLoop();
99         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
100
101         var participantProvider = mock(ParticipantProvider.class);
102         var participant = new Participant();
103         participant.setName("Participant0");
104         participant.setVersion("1.0.0");
105         when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant));
106
107         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
108         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
109         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
110         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
111
112         var supervisionScanner =
113                 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
114                         participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
115
116         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
117         supervisionScanner.run(true);
118         verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
119         verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class));
120     }
121
122     @Test
123     void testScanParticipant() throws PfModelException {
124         var controlLoopProvider = mock(ControlLoopProvider.class);
125         var controlLoop = new ControlLoop();
126         when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
127
128         var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
129         clRuntimeParameterGroup.getParticipantParameters().setMaxMessageAgeMs(0);
130
131         var participant = new Participant();
132         participant.setName("Participant0");
133         participant.setVersion("1.0.0");
134         participant.setHealthStatus(ParticipantHealthStatus.HEALTHY);
135         participant.setParticipantState(ParticipantState.ACTIVE);
136         participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0"));
137         var participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
138         participantProvider.updateParticipants(List.of(participant));
139
140         var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
141         var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
142         var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
143
144         var supervisionScanner =
145                 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
146                         participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
147
148         supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
149         supervisionScanner.run(true);
150         verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
151
152         List<Participant> participants = participantProvider.getParticipants(null, null);
153         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
154
155         supervisionScanner.run(true);
156         supervisionScanner.run(true);
157         participants = participantProvider.getParticipants(null, null);
158         assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);
159     }
160 }