PAP should discard old PDP messages
[policy/pap.git] / main / src / test / java / org / onap / policy / pap / main / comm / PdpHeartbeatListenerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2020 Nordix Foundation.
4  *  Modifications Copyright (C) 2020 AT&T Intellectual Property.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.pap.main.comm;
23
24 import static org.junit.Assert.assertEquals;
25
26 import java.text.ParseException;
27 import java.text.SimpleDateFormat;
28 import java.util.Arrays;
29 import java.util.Date;
30 import java.util.List;
31 import org.junit.Test;
32 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
33 import org.onap.policy.common.utils.coder.CoderException;
34 import org.onap.policy.models.base.PfModelException;
35 import org.onap.policy.models.pdp.concepts.PdpGroup;
36 import org.onap.policy.models.pdp.concepts.PdpStatistics;
37 import org.onap.policy.models.pdp.concepts.PdpStatus;
38 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
39 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
40 import org.onap.policy.models.pdp.enums.PdpState;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
42 import org.onap.policy.pap.main.parameters.PdpParameters;
43 import org.onap.policy.pap.main.rest.e2e.End2EndBase;
44
45 /**
46  * Class to perform unit test of {@link PdpHeartbeatListener}.
47  *
48  * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
49  */
50 public class PdpHeartbeatListenerTest extends End2EndBase {
51
52     private static final String POLICY_VERSION = "1.0.0";
53     private static final String POLICY_NAME = "onap.policies.controlloop.operational.Apex.SampleDomain";
54     private static final String APEX_TYPE = "apex";
55     private static final String DEFAULT_GROUP = "defaultGroup";
56     private static final String PDP_NAME = "pdp_1";
57     private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
58     private static final String TOPIC = "my-topic";
59
60     private Date timeStamp;
61     private PdpHeartbeatListener pdpHeartbeatListener;
62
63     @Test
64     public void testPdpHeartbeatListener() throws CoderException, PfModelException {
65         addGroups("PdpGroups.json");
66         pdpHeartbeatListener = new PdpHeartbeatListener(new PdpParameters());
67
68         // Testing pdp registration success case
69         final PdpStatus status1 = new PdpStatus();
70         status1.setName(PDP_NAME);
71         status1.setState(PdpState.ACTIVE);
72         status1.setPdpGroup(DEFAULT_GROUP);
73         status1.setPdpType(APEX_TYPE);
74         status1.setHealthy(PdpHealthStatus.HEALTHY);
75         final List<ToscaPolicyIdentifier> idents1 =
76                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
77         status1.setPolicies(idents1);
78         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
79         verifyPdpGroup(DEFAULT_GROUP, 1);
80
81         // Testing pdp heartbeat success case
82         final PdpStatus status2 = new PdpStatus();
83         status2.setName(PDP_NAME);
84         status2.setState(PdpState.ACTIVE);
85         status2.setPdpGroup(DEFAULT_GROUP);
86         status2.setPdpType(APEX_TYPE);
87         status2.setHealthy(PdpHealthStatus.HEALTHY);
88         status2.setPdpSubgroup(APEX_TYPE);
89         final List<ToscaPolicyIdentifier> idents2 =
90                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
91         status2.setPolicies(idents2);
92         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
93         verifyPdpGroup(DEFAULT_GROUP, 1);
94
95         // Testing pdp heartbeat failure case with pdp missing
96         final PdpStatus status3 = new PdpStatus();
97         status3.setName("pdp_2");
98         status3.setState(PdpState.ACTIVE);
99         status3.setPdpGroup(DEFAULT_GROUP);
100         status3.setPdpType(APEX_TYPE);
101         status3.setHealthy(PdpHealthStatus.HEALTHY);
102         status3.setPdpSubgroup(APEX_TYPE);
103         final List<ToscaPolicyIdentifier> idents3 =
104                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
105         status3.setPolicies(idents3);
106         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
107         verifyPdpGroup(DEFAULT_GROUP, 2);
108
109         // Testing pdp registration failure case
110         final PdpStatus status4 = new PdpStatus();
111         status4.setName("pdp_3");
112         status4.setState(PdpState.ACTIVE);
113         status4.setPdpGroup("wrongGroup");
114         status4.setPdpType(APEX_TYPE);
115         status4.setHealthy(PdpHealthStatus.HEALTHY);
116         final List<ToscaPolicyIdentifier> idents4 =
117                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
118         status4.setPolicies(idents4);
119         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
120         verifyPdpGroup(DEFAULT_GROUP, 2);
121
122         // Testing pdp heartbeat failure case with pdp state mismatch
123         final PdpStatus status5 = new PdpStatus();
124         status5.setName(PDP_NAME);
125         status5.setState(PdpState.PASSIVE);
126         status5.setPdpGroup(DEFAULT_GROUP);
127         status5.setPdpType(APEX_TYPE);
128         status5.setHealthy(PdpHealthStatus.HEALTHY);
129         status5.setPdpSubgroup(APEX_TYPE);
130         final List<ToscaPolicyIdentifier> idents5 =
131                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
132         status5.setPolicies(idents5);
133         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
134         verifyPdpGroup(DEFAULT_GROUP, 2);
135
136         // Testing pdp heartbeat failure case with pdp policies mismatch
137         final PdpStatus status6 = new PdpStatus();
138         status6.setName(PDP_NAME);
139         status6.setState(PdpState.ACTIVE);
140         status6.setPdpGroup(DEFAULT_GROUP);
141         status6.setPdpType(APEX_TYPE);
142         status6.setHealthy(PdpHealthStatus.HEALTHY);
143         status6.setPdpSubgroup(APEX_TYPE);
144         final List<ToscaPolicyIdentifier> idents6 =
145                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION),
146                         new ToscaPolicyIdentifier("onap.restart.tca", POLICY_VERSION));
147         status6.setPolicies(idents6);
148         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status6);
149         verifyPdpGroup(DEFAULT_GROUP, 2);
150
151         // Testing pdp heartbeat failure case with pdp no policies
152         final PdpStatus status7 = new PdpStatus();
153         status7.setName(PDP_NAME);
154         status7.setState(PdpState.ACTIVE);
155         status7.setPdpGroup(DEFAULT_GROUP);
156         status7.setPdpType(APEX_TYPE);
157         status7.setHealthy(PdpHealthStatus.HEALTHY);
158         status7.setPdpSubgroup(APEX_TYPE);
159         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7);
160         verifyPdpGroup(DEFAULT_GROUP, 2);
161
162         // Testing old message for pdp_1 - should have no effect
163         final PdpStatus status7b = new PdpStatus();
164         status7b.setTimestampMs(System.currentTimeMillis() - PdpParameters.DEFAULT_MAX_AGE_MS - 1);
165         status7b.setName(PDP_NAME);
166         status7b.setState(PdpState.TERMINATED);
167         status7b.setPdpGroup(DEFAULT_GROUP);
168         status7b.setPdpType(APEX_TYPE);
169         status7b.setPdpSubgroup(APEX_TYPE);
170         status7b.setHealthy(PdpHealthStatus.HEALTHY);
171         final List<ToscaPolicyIdentifier> idents7b =
172                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
173         status7b.setPolicies(idents7b);
174         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7b);
175         verifyPdpGroup(DEFAULT_GROUP, 2);
176
177         // Testing pdp termination case for pdp_1
178         final PdpStatus status8 = new PdpStatus();
179         status8.setName(PDP_NAME);
180         status8.setState(PdpState.TERMINATED);
181         status8.setPdpGroup(DEFAULT_GROUP);
182         status8.setPdpType(APEX_TYPE);
183         status8.setPdpSubgroup(APEX_TYPE);
184         status8.setHealthy(PdpHealthStatus.HEALTHY);
185         final List<ToscaPolicyIdentifier> idents8 =
186                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
187         status8.setPolicies(idents8);
188         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status8);
189         verifyPdpGroup(DEFAULT_GROUP, 1);
190
191         // Testing pdp termination case for pdp_2
192         final PdpStatus status9 = new PdpStatus();
193         status9.setName("pdp_2");
194         status9.setState(PdpState.TERMINATED);
195         status9.setPdpGroup(DEFAULT_GROUP);
196         status9.setPdpType(APEX_TYPE);
197         status9.setPdpSubgroup(APEX_TYPE);
198         status9.setHealthy(PdpHealthStatus.HEALTHY);
199         final List<ToscaPolicyIdentifier> idents9 =
200                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
201         status9.setPolicies(idents9);
202         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status9);
203         verifyPdpGroup(DEFAULT_GROUP, 0);
204     }
205
206     @Test
207     public void testPdpStatistics() throws CoderException, PfModelException, ParseException {
208         addGroups("PdpGroups.json");
209         pdpHeartbeatListener = new PdpHeartbeatListener(new PdpParameters());
210         timeStamp = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-01");
211
212         // init default pdp group
213         final PdpStatus status1 = new PdpStatus();
214         status1.setName(PDP_NAME);
215         status1.setState(PdpState.ACTIVE);
216         status1.setPdpGroup(DEFAULT_GROUP);
217         status1.setPdpType(APEX_TYPE);
218         status1.setHealthy(PdpHealthStatus.HEALTHY);
219         final List<ToscaPolicyIdentifier> idents1 =
220                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
221         status1.setPolicies(idents1);
222         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
223         verifyPdpGroup(DEFAULT_GROUP, 1);
224
225         // init pdp instance
226         final PdpStatus status2 = new PdpStatus();
227         status2.setName(PDP_NAME);
228         status2.setState(PdpState.ACTIVE);
229         status2.setPdpGroup(DEFAULT_GROUP);
230         status2.setPdpType(APEX_TYPE);
231         status2.setHealthy(PdpHealthStatus.HEALTHY);
232         status2.setPdpSubgroup(APEX_TYPE);
233         final List<ToscaPolicyIdentifier> idents2 =
234                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
235         status2.setPolicies(idents2);
236         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
237
238         // Testing passing pdp statistics success case
239         final PdpStatus status3 = new PdpStatus();
240         status3.setName(PDP_NAME);
241         status3.setState(PdpState.ACTIVE);
242         status3.setPdpGroup(DEFAULT_GROUP);
243         status3.setPdpType(APEX_TYPE);
244         status3.setHealthy(PdpHealthStatus.HEALTHY);
245         status3.setPdpSubgroup(APEX_TYPE);
246         final List<ToscaPolicyIdentifier> idents3 =
247                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
248         status3.setPolicies(idents3);
249
250         PdpStatistics pdpStatistics03 = new PdpStatistics();
251         pdpStatistics03.setPdpInstanceId(PDP_NAME);
252         pdpStatistics03.setPdpGroupName(DEFAULT_GROUP);
253         pdpStatistics03.setPdpSubGroupName(APEX_TYPE);
254         pdpStatistics03.setTimeStamp(timeStamp);
255         status3.setStatistics(pdpStatistics03);
256         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
257         verifyPdpStatistics(PDP_NAME, DEFAULT_GROUP, null, 1);
258
259         // Testing pdp statistics failure having the pdpStatistics null in the heartbeat for already registered pdp
260         final PdpStatus status4 = new PdpStatus();
261         status4.setName(PDP_NAME);
262         status4.setState(PdpState.ACTIVE);
263         status4.setPdpGroup(DEFAULT_GROUP);
264         status4.setPdpType(APEX_TYPE);
265         status4.setHealthy(PdpHealthStatus.HEALTHY);
266         status4.setPdpSubgroup(APEX_TYPE);
267         final List<ToscaPolicyIdentifier> idents4 =
268                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
269         status4.setPolicies(idents4);
270         status4.setStatistics(null);
271         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
272         verifyPdpStatistics(PDP_NAME, DEFAULT_GROUP, null, 1);
273
274         // Testing pdp statistics failure passing different pdpGroup, PdpSubGroup & pdpInstanceId
275         final PdpStatus status5 = new PdpStatus();
276         status5.setName(PDP_NAME);
277         status5.setState(PdpState.ACTIVE);
278         status5.setPdpGroup(DEFAULT_GROUP);
279         status5.setPdpType(APEX_TYPE);
280         status5.setHealthy(PdpHealthStatus.HEALTHY);
281         status5.setPdpSubgroup(APEX_TYPE);
282         final List<ToscaPolicyIdentifier> idents5 =
283                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
284         status5.setPolicies(idents5);
285
286         PdpStatistics pdpStatistics05 = new PdpStatistics();
287         pdpStatistics05.setPdpInstanceId("pdp_2");
288         pdpStatistics05.setPdpGroupName("defaultGroup_1");
289         pdpStatistics05.setPdpSubGroupName("apex_1");
290         pdpStatistics03.setTimeStamp(timeStamp);
291         status5.setStatistics(pdpStatistics05);
292
293         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
294         verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
295
296         // Test pdp statistics failure passing negative values
297         final PdpStatus status6 = new PdpStatus();
298         status6.setName(PDP_NAME);
299         status6.setState(PdpState.ACTIVE);
300         status6.setPdpGroup(DEFAULT_GROUP);
301         status6.setPdpType(APEX_TYPE);
302         status6.setHealthy(PdpHealthStatus.HEALTHY);
303         status6.setPdpSubgroup(APEX_TYPE);
304         final List<ToscaPolicyIdentifier> idents6 =
305                 Arrays.asList(new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION));
306         status5.setPolicies(idents6);
307
308         PdpStatistics pdpStatistics06 = new PdpStatistics();
309         pdpStatistics06.setPdpInstanceId(PDP_NAME);
310         pdpStatistics06.setPdpGroupName(DEFAULT_GROUP);
311         pdpStatistics06.setPdpSubGroupName(APEX_TYPE);
312         pdpStatistics03.setTimeStamp(timeStamp);
313
314         pdpStatistics06.setPolicyDeployCount(-1);
315         pdpStatistics06.setPolicyDeployFailCount(-1);
316         status5.setStatistics(pdpStatistics06);
317
318         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
319         verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
320     }
321
322     private void verifyPdpGroup(final String name, final int count) throws PfModelException {
323         final List<PdpGroup> fetchedGroups = fetchGroups(name);
324         for (final PdpSubGroup subGroup : fetchedGroups.get(0).getPdpSubgroups()) {
325             if (subGroup.getPdpType().equals(APEX_TYPE)) {
326                 assertEquals(count, subGroup.getPdpInstances().size());
327                 assertEquals(count, subGroup.getCurrentInstanceCount());
328                 if (count > 0) {
329                     assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
330                 }
331             }
332         }
333     }
334
335     private void verifyPdpStatistics(final String pdpInstanceId, final String pdpGroupName,
336             final String pdpSubGroupName, final int count) throws  PfModelException {
337         final List<PdpStatistics> fetchedPdpStatistics =
338                 fetchPdpStatistics(pdpInstanceId, pdpGroupName, pdpSubGroupName);
339         assertEquals(count, fetchedPdpStatistics.size());
340     }
341 }