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