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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.pap.main.comm;
24 import static org.junit.Assert.assertEquals;
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;
47 * Class to perform unit test of {@link PdpHeartbeatListener}.
49 * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
51 public class PdpHeartbeatListenerTest extends End2EndBase {
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";
61 private Instant timeStamp;
62 private PdpHeartbeatListener pdpHeartbeatListener;
65 public void testPdpHeartbeatListener() throws CoderException, PfModelException {
66 addGroups("PdpGroups.json");
67 pdpHeartbeatListener = new PdpHeartbeatListener(new PdpParameters());
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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");
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);
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);
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);
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);
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);
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);
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);
294 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
295 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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);
309 PdpStatistics pdpStatistics06 = new PdpStatistics();
310 pdpStatistics06.setPdpInstanceId(PDP_NAME);
311 pdpStatistics06.setPdpGroupName(DEFAULT_GROUP);
312 pdpStatistics06.setPdpSubGroupName(APEX_TYPE);
313 pdpStatistics03.setTimeStamp(timeStamp);
315 pdpStatistics06.setPolicyDeployCount(-1);
316 pdpStatistics06.setPolicyDeployFailCount(-1);
317 status5.setStatistics(pdpStatistics06);
319 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
320 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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());
330 assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
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());