support pdp-type configuration for PAP status
[policy/drools-pdp.git] / feature-lifecycle / src / test / java / org / onap / policy / drools / lifecycle / LifecycleStatePassiveTest.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21
22 package org.onap.policy.drools.lifecycle;
23
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;
31
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;
49
50 /**
51  * Lifecycle State Passive Tests.
52  */
53 public class LifecycleStatePassiveTest extends LifecycleStateRunningTest {
54
55     /**
56      * Start tests in the Passive state.
57      */
58     @Before
59     public void startPassive() {
60         /* start every test in passive mode */
61         fsm = makeFsmWithPseudoTime();
62         fsm.setStatusTimerSeconds(15L);
63         simpleStart();
64     }
65
66     @Test
67     public void constructor() {
68         assertThatIllegalArgumentException().isThrownBy(() -> new LifecycleStatePassive(null));
69         fsm.shutdown();
70     }
71
72     @Test
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));
80
81         fsm.stop(controllerSupport.getController());
82         assertNull(fsm.getController(new ToscaConceptIdentifier(ControllerSupport.POLICY_TYPE_COMPLIANT_OP,
83                         ControllerSupport.POLICY_TYPE_VERSION)));
84
85         fsm.shutdown();
86     }
87
88     @Test
89     public void testStart() {
90         assertEquals(0, fsm.client.getSink().getRecentEvents().length);
91         assertFalse(fsm.start());
92         assertBasicPassive();
93
94         fsm.shutdown();
95     }
96
97     @Test
98     public void stop() {
99         simpleStop();
100         assertBasicTerminated();
101     }
102
103     private void simpleStart() {
104         assertTrue(fsm.start());
105         assertBasicPassive();
106     }
107
108     private void simpleStop() {
109         assertTrue(fsm.stop());
110         assertBasicTerminated();
111     }
112
113     @Test
114     public void testShutdown() throws Exception {
115         simpleStop();
116
117         fsm.shutdown();
118         assertExtendedTerminated();
119     }
120
121     @Test
122     public void testStatus() {
123         assertTrue(fsm.client.getSink().isAlive());
124         assertTrue(fsm.status());
125         assertSame(1, fsm.client.getSink().getRecentEvents().length);
126
127
128         fsm.start(controllerSupport.getController());
129         status(PdpState.PASSIVE, 1);
130         fsm.stop(controllerSupport.getController());
131         fsm.shutdown();
132     }
133
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));
140     }
141
142     @Test
143     public void testUpdate() throws CoderException {
144         controllerSupport.getController().getDrools().delete(ToscaPolicy.class);
145         assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
146
147         PdpUpdate update = new PdpUpdate();
148         update.setName(NetworkUtil.getHostname());
149         update.setPdpGroup("Z");
150         update.setPdpSubgroup("z");
151         update.setPolicies(Collections.emptyList());
152
153         long interval = 2 * fsm.getStatusTimerSeconds();
154         update.setPdpHeartbeatIntervalMs(interval * 1000L);
155
156         assertTrue(fsm.update(update));
157
158         int qlength = fsm.client.getSink().getRecentEvents().length;
159         PdpStatus lastStatus = new StandardCoder().decode(fsm.client.getSink().getRecentEvents()[qlength - 1],
160                         PdpStatus.class);
161         assertEquals("foo", lastStatus.getPdpType());
162         assertEquals(update.getRequestId(), lastStatus.getRequestId());
163         assertEquals(update.getRequestId(), lastStatus.getResponse().getResponseTo());
164
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();
170
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));
175
176         assertFalse(fsm.update(update));
177
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();
183
184         assertEquals(2, fsm.policyTypesMap.size());
185         assertTrue(fsm.policiesMap.isEmpty());
186
187         update.setPdpGroup(null);
188         update.setPdpSubgroup(null);
189
190         assertFalse(fsm.update(update));
191
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());
199
200         update.setPdpGroup("A");
201         update.setPdpSubgroup("a");
202
203         assertFalse(fsm.update(update));
204
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());
212
213         fsm.start(controllerSupport.getController());
214         assertEquals(3, fsm.policyTypesMap.size());
215         assertTrue(fsm.policiesMap.isEmpty());
216
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"));
227
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"));
239
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"));
252
253         fsm.shutdown();
254     }
255
256     @Test
257     public void testStateChange() throws CoderException, IOException {
258         /* no name */
259         PdpStateChange change = new PdpStateChange();
260         change.setPdpGroup("A");
261         change.setPdpSubgroup("a");
262         change.setState(PdpState.ACTIVE);
263
264         /* invalid name */
265         change.setName("test");
266         fsm.source.offer(new StandardCoder().encode(change));
267
268         assertEquals(PdpState.PASSIVE, fsm.state());
269         assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
270         assertNull(fsm.getSubGroup());
271
272         PdpUpdate update = new PdpUpdate();
273         update.setName(NetworkUtil.getHostname());
274         update.setPdpGroup("A");
275         update.setPdpSubgroup("a");
276
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));
281
282         controllerSupport.getController().start();
283         fsm.start(controllerSupport.getController());
284         assertEquals(3, fsm.policyTypesMap.size());
285         assertTrue(fsm.policiesMap.isEmpty());
286
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"));
296
297         /* correct name */
298         change.setName(fsm.getName());
299         fsm.source.offer(new StandardCoder().encode(change));
300
301         assertEquals(PdpState.ACTIVE, fsm.state());
302         assertEquals(LifecycleFsm.DEFAULT_PDP_GROUP, fsm.getGroup());
303         assertEquals("a", fsm.getSubGroup());
304
305         waitUntil(5, TimeUnit.SECONDS, () -> controllerSupport.getController().getDrools().factCount("junits") == 1);
306
307         assertTrue(controllerSupport.getController().getDrools().delete(ToscaPolicy.class));
308         assertEquals(0, controllerSupport.getController().getDrools().factCount("junits"));
309
310         fsm.shutdown();
311     }
312
313     private void assertBasicTerminated() {
314         assertEquals(PdpState.TERMINATED, fsm.state.state());
315         assertFalse(fsm.isAlive());
316         assertFalse(fsm.state.isAlive());
317     }
318
319     private void assertExtendedTerminated() throws Exception {
320         assertBasicTerminated();
321         assertTrue(fsm.statusTask.isCancelled());
322         assertTrue(fsm.statusTask.isDone());
323
324         // verify there are no outstanding tasks that might change the state
325         assertTrue(time.isEmpty());
326
327         assertFalse(fsm.client.getSink().isAlive());
328
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());
337     }
338
339     private void assertBasicPassive() {
340         assertEquals(PdpState.PASSIVE, fsm.state.state());
341         assertNotNull(fsm.source);
342         assertNotNull(fsm.client);
343         assertNotNull(fsm.statusTask);
344
345         assertTrue(fsm.isAlive());
346         assertTrue(fsm.source.isAlive());
347         assertTrue(fsm.client.getSink().isAlive());
348
349         assertFalse(fsm.statusTask.isCancelled());
350         assertFalse(fsm.statusTask.isDone());
351     }
352 }