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