2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2021 Nordix Foundation.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.drools.lifecycle;
24 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertSame;
30 import static org.junit.Assert.assertTrue;
32 import java.io.IOException;
33 import java.util.Arrays;
34 import java.util.Collections;
35 import java.util.concurrent.TimeUnit;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.onap.policy.common.utils.coder.CoderException;
39 import org.onap.policy.common.utils.coder.StandardCoder;
40 import org.onap.policy.common.utils.network.NetworkUtil;
41 import org.onap.policy.models.pdp.concepts.PdpStateChange;
42 import org.onap.policy.models.pdp.concepts.PdpStatus;
43 import org.onap.policy.models.pdp.concepts.PdpUpdate;
44 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
45 import org.onap.policy.models.pdp.enums.PdpMessageType;
46 import org.onap.policy.models.pdp.enums.PdpState;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
51 * Lifecycle State Passive Tests.
53 public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
56 * Start tests in the Passive state.
59 public void startPassive() {
60 /* start every test in passive mode */
61 fsm = makeFsmWithPseudoTime();
62 fsm.setStatusTimerSeconds(15L);
67 public void constructor() {
68 assertThatIllegalArgumentException().isThrownBy(() -> new LifecycleStatePassive(null));
73 public void testController() {
74 fsm.start(controllerSupport.getController());
75 assertSame(controllerSupport.getController(),
76 ((PolicyTypeDroolsController) fsm.getController(
77 new ToscaConceptIdentifier(
78 ControllerSupport.POLICY_TYPE_COMPLIANT_OP, ControllerSupport.POLICY_TYPE_VERSION)))
79 .controllers().get(0));
81 fsm.stop(controllerSupport.getController());
82 assertNull(fsm.getController(new ToscaConceptIdentifier(ControllerSupport.POLICY_TYPE_COMPLIANT_OP,
83 ControllerSupport.POLICY_TYPE_VERSION)));
89 public void testStart() {
90 assertEquals(0, fsm.client.getSink().getRecentEvents().length);
91 assertFalse(fsm.start());
100 assertBasicTerminated();
103 private void simpleStart() {
104 assertTrue(fsm.start());
105 assertBasicPassive();
108 private void simpleStop() {
109 assertTrue(fsm.stop());
110 assertBasicTerminated();
114 public void testShutdown() throws Exception {
118 assertExtendedTerminated();
122 public void testStatus() {
123 assertTrue(fsm.client.getSink().isAlive());
124 assertTrue(fsm.status());
125 assertSame(1, fsm.client.getSink().getRecentEvents().length);
128 fsm.start(controllerSupport.getController());
129 status(PdpState.PASSIVE, 1);
130 fsm.stop(controllerSupport.getController());
134 private void status(PdpState state, int initial) {
135 waitUntil(5, TimeUnit.SECONDS, isStatus(state, initial));
136 waitUntil(fsm.statusTimerSeconds + 2, TimeUnit.SECONDS, isStatus(state, initial + 1));
137 waitUntil(fsm.statusTimerSeconds + 2, TimeUnit.SECONDS, isStatus(state, initial + 2));
138 assertTrue(fsm.status());
139 waitUntil(200, TimeUnit.MILLISECONDS, isStatus(state, initial + 3));
143 public void testUpdate() throws CoderException {
144 controllerSupport.getController().getDrools().delete(ToscaPolicy.class);
145 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
147 PdpUpdate update = new PdpUpdate();
148 update.setName(NetworkUtil.getHostname());
149 update.setPdpGroup("Z");
150 update.setPdpSubgroup("z");
151 update.setPolicies(Collections.emptyList());
153 long interval = 2 * fsm.getStatusTimerSeconds();
154 update.setPdpHeartbeatIntervalMs(interval * 1000L);
156 assertTrue(fsm.update(update));
158 int qlength = fsm.client.getSink().getRecentEvents().length;
159 PdpStatus lastStatus = new StandardCoder().decode(fsm.client.getSink().getRecentEvents()[qlength - 1],
161 assertEquals("foo", lastStatus.getPdpType());
162 assertEquals(update.getRequestId(), lastStatus.getRequestId());
163 assertEquals(update.getRequestId(), lastStatus.getResponse().getResponseTo());
165 assertEquals(PdpState.PASSIVE, fsm.state());
166 assertEquals(interval, fsm.getStatusTimerSeconds());
167 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
168 assertEquals("z", fsm.getSubGroup());
169 assertBasicPassive();
171 ToscaPolicy toscaPolicy =
172 getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
173 toscaPolicy.getProperties().put("controllerName", "lifecycle");
174 update.setPolicies(Arrays.asList(toscaPolicy));
176 assertFalse(fsm.update(update));
178 assertEquals(PdpState.PASSIVE, fsm.state());
179 assertEquals(interval, fsm.getStatusTimerSeconds());
180 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
181 assertEquals("z", fsm.getSubGroup());
182 assertBasicPassive();
184 assertEquals(2, fsm.policyTypesMap.size());
185 assertTrue(fsm.policiesMap.isEmpty());
187 update.setPdpGroup(null);
188 update.setPdpSubgroup(null);
190 assertFalse(fsm.update(update));
192 assertEquals(PdpState.PASSIVE, fsm.state());
193 assertEquals(interval, fsm.getStatusTimerSeconds());
194 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
195 assertNull(fsm.getSubGroup());
196 assertBasicPassive();
197 assertEquals(2, fsm.policyTypesMap.size());
198 assertTrue(fsm.policiesMap.isEmpty());
200 update.setPdpGroup("A");
201 update.setPdpSubgroup("a");
203 assertFalse(fsm.update(update));
205 assertEquals(PdpState.PASSIVE, fsm.state());
206 assertEquals(interval, fsm.getStatusTimerSeconds());
207 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
208 assertEquals("a", fsm.getSubGroup());
209 assertBasicPassive();
210 assertEquals(2, fsm.policyTypesMap.size());
211 assertTrue(fsm.policiesMap.isEmpty());
213 fsm.start(controllerSupport.getController());
214 assertEquals(3, fsm.policyTypesMap.size());
215 assertTrue(fsm.policiesMap.isEmpty());
217 assertTrue(fsm.update(update));
218 assertEquals(3, fsm.policyTypesMap.size());
219 assertEquals(1, fsm.policiesMap.size());
220 assertEquals(fsm.policiesMap.get(toscaPolicy.getIdentifier()), toscaPolicy);
221 assertEquals(PdpState.PASSIVE, fsm.state());
222 assertEquals(interval, fsm.getStatusTimerSeconds());
223 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
224 assertEquals("a", fsm.getSubGroup());
225 assertBasicPassive();
226 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
228 // The "update" event will undeploy "toscaPolicy" and deploy "toscaPolicy2"
229 ToscaPolicy toscaPolicy2 =
230 getExamplesPolicy("policies/vFirewall.policy.operational.input.tosca.json", "operational.modifyconfig");
231 toscaPolicy.getProperties().remove("controllerName");
232 update.setPolicies(Arrays.asList(toscaPolicy2));
233 assertTrue(fsm.update(update));
234 assertEquals(3, fsm.policyTypesMap.size());
235 assertEquals(1, fsm.policiesMap.size());
236 assertEquals(toscaPolicy2, fsm.policiesMap.get(toscaPolicy2.getIdentifier()));
237 assertNull(fsm.policiesMap.get(toscaPolicy.getIdentifier()));
238 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
240 update.setPdpGroup(null);
241 update.setPdpSubgroup(null);
242 update.setPolicies(Collections.emptyList());
243 assertTrue(fsm.update(update));
244 assertEquals(3, fsm.policyTypesMap.size());
245 assertEquals(0, fsm.policiesMap.size());
246 assertEquals(PdpState.PASSIVE, fsm.state());
247 assertEquals(interval, fsm.getStatusTimerSeconds());
248 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
249 assertNull(fsm.getSubGroup());
250 assertBasicPassive();
251 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
257 public void testStateChange() throws CoderException, IOException {
259 PdpStateChange change = new PdpStateChange();
260 change.setPdpGroup("A");
261 change.setPdpSubgroup("a");
262 change.setState(PdpState.ACTIVE);
265 change.setName("test");
266 fsm.source.offer(new StandardCoder().encode(change));
268 assertEquals(PdpState.PASSIVE, fsm.state());
269 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
270 assertNull(fsm.getSubGroup());
272 PdpUpdate update = new PdpUpdate();
273 update.setName(NetworkUtil.getHostname());
274 update.setPdpGroup("A");
275 update.setPdpSubgroup("a");
277 ToscaPolicy toscaPolicy =
278 getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
279 toscaPolicy.getProperties().put("controllerName", "lifecycle");
280 update.setPolicies(Arrays.asList(toscaPolicy));
282 controllerSupport.getController().start();
283 fsm.start(controllerSupport.getController());
284 assertEquals(3, fsm.policyTypesMap.size());
285 assertTrue(fsm.policiesMap.isEmpty());
287 assertTrue(fsm.update(update));
288 assertEquals(3, fsm.policyTypesMap.size());
289 assertEquals(1, fsm.policiesMap.size());
290 assertEquals(fsm.policiesMap.get(toscaPolicy.getIdentifier()), toscaPolicy);
291 assertEquals(PdpState.PASSIVE, fsm.state());
292 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
293 assertEquals("a", fsm.getSubGroup());
294 assertBasicPassive();
295 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
298 change.setName(fsm.getName());
299 fsm.source.offer(new StandardCoder().encode(change));
301 assertEquals(PdpState.ACTIVE, fsm.state());
302 assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
303 assertEquals("a", fsm.getSubGroup());
305 waitUntil(5, TimeUnit.SECONDS, () -> controllerSupport.getController().getDrools().factCount("junits") == 1);
307 assertTrue(controllerSupport.getController().getDrools().delete(ToscaPolicy.class));
308 assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
313 private void assertBasicTerminated() {
314 assertEquals(PdpState.TERMINATED, fsm.state.state());
315 assertFalse(fsm.isAlive());
316 assertFalse(fsm.state.isAlive());
319 private void assertExtendedTerminated() throws Exception {
320 assertBasicTerminated();
321 assertTrue(fsm.statusTask.isCancelled());
322 assertTrue(fsm.statusTask.isDone());
324 // verify there are no outstanding tasks that might change the state
325 assertTrue(time.isEmpty());
327 assertFalse(fsm.client.getSink().isAlive());
329 String[] events = fsm.client.getSink().getRecentEvents();
330 PdpStatus status = new StandardCoder().decode(events[events.length - 1], PdpStatus.class);
331 assertEquals("foo", status.getPdpType());
332 assertEquals(PdpState.TERMINATED, status.getState());
333 assertEquals(PdpHealthStatus.HEALTHY, status.getHealthy());
334 assertEquals(NetworkUtil.getHostname(), status.getName());
335 assertEquals(fsm.getName(), status.getName());
336 assertEquals(PdpMessageType.PDP_STATUS, status.getMessageName());
339 private void assertBasicPassive() {
340 assertEquals(PdpState.PASSIVE, fsm.state.state());
341 assertNotNull(fsm.source);
342 assertNotNull(fsm.client);
343 assertNotNull(fsm.statusTask);
345 assertTrue(fsm.isAlive());
346 assertTrue(fsm.source.isAlive());
347 assertTrue(fsm.client.getSink().isAlive());
349 assertFalse(fsm.statusTask.isCancelled());
350 assertFalse(fsm.statusTask.isDone());