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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.controlloop.runtime.supervision;
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;
30 import java.util.List;
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;
50 class SupervisionScannerTest {
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");
61 var controlLoop = new ControlLoop();
62 when(controlLoopProvider.getControlLoops(null, null)).thenReturn(List.of(controlLoop));
64 var supervisionScanner =
65 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
66 participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
67 supervisionScanner.run(false);
69 verify(controlLoopProvider, times(0)).updateControlLoop(any(ControlLoop.class));
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));
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");
87 var supervisionScanner =
88 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
89 participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
90 supervisionScanner.run(false);
92 verify(controlLoopProvider, times(1)).updateControlLoop(any(ControlLoop.class));
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));
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));
107 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
108 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
109 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
110 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
112 var supervisionScanner =
113 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
114 participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
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));
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));
128 var clRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanParticipant");
129 clRuntimeParameterGroup.getParticipantParameters().setMaxMessageAgeMs(0);
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));
140 var controlLoopUpdatePublisher = mock(ControlLoopUpdatePublisher.class);
141 var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class);
142 var controlLoopStateChangePublisher = mock(ControlLoopStateChangePublisher.class);
144 var supervisionScanner =
145 new SupervisionScanner(controlLoopProvider, controlLoopStateChangePublisher, controlLoopUpdatePublisher,
146 participantProvider, participantStatusReqPublisher, clRuntimeParameterGroup);
148 supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier());
149 supervisionScanner.run(true);
150 verify(participantStatusReqPublisher, times(1)).send(any(ToscaConceptIdentifier.class));
152 List<Participant> participants = participantProvider.getParticipants(null, null);
153 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.NOT_HEALTHY);
155 supervisionScanner.run(true);
156 supervisionScanner.run(true);
157 participants = participantProvider.getParticipants(null, null);
158 assertThat(participants.get(0).getHealthStatus()).isEqualTo(ParticipantHealthStatus.OFF_LINE);