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