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.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.ToscaConceptIdentifier;
42 import org.onap.policy.pap.main.parameters.PdpParameters;
43 import org.onap.policy.pap.main.rest.e2e.End2EndBase;
46 * Class to perform unit test of {@link PdpHeartbeatListener}.
48 * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
50 public class PdpHeartbeatListenerTest extends End2EndBase {
52 private static final String POLICY_VERSION = "1.0.0";
53 private static final String POLICY_NAME = "onap.policies.controlloop.operational.common.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";
60 private Date timeStamp;
61 private PdpHeartbeatListener pdpHeartbeatListener;
64 public void testPdpHeartbeatListener() throws CoderException, PfModelException {
65 addGroups("PdpGroups.json");
66 pdpHeartbeatListener = new PdpHeartbeatListener(new PdpParameters());
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<ToscaConceptIdentifier> idents1 =
76 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
77 status1.setPolicies(idents1);
78 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
79 verifyPdpGroup(DEFAULT_GROUP, 1);
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<ToscaConceptIdentifier> idents2 =
90 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
91 status2.setPolicies(idents2);
92 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
93 verifyPdpGroup(DEFAULT_GROUP, 1);
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<ToscaConceptIdentifier> idents3 =
104 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
105 status3.setPolicies(idents3);
106 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
107 verifyPdpGroup(DEFAULT_GROUP, 2);
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<ToscaConceptIdentifier> idents4 =
117 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
118 status4.setPolicies(idents4);
119 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
120 verifyPdpGroup(DEFAULT_GROUP, 2);
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<ToscaConceptIdentifier> idents5 =
131 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
132 status5.setPolicies(idents5);
133 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
134 verifyPdpGroup(DEFAULT_GROUP, 2);
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<ToscaConceptIdentifier> idents6 =
145 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION),
146 new ToscaConceptIdentifier("onap.restart.tca", POLICY_VERSION));
147 status6.setPolicies(idents6);
148 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status6);
149 verifyPdpGroup(DEFAULT_GROUP, 2);
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);
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<ToscaConceptIdentifier> idents7b =
172 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
173 status7b.setPolicies(idents7b);
174 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7b);
175 verifyPdpGroup(DEFAULT_GROUP, 2);
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<ToscaConceptIdentifier> idents8 =
186 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
187 status8.setPolicies(idents8);
188 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status8);
189 verifyPdpGroup(DEFAULT_GROUP, 1);
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<ToscaConceptIdentifier> idents9 =
200 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
201 status9.setPolicies(idents9);
202 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status9);
203 verifyPdpGroup(DEFAULT_GROUP, 0);
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");
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<ToscaConceptIdentifier> idents1 =
220 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
221 status1.setPolicies(idents1);
222 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
223 verifyPdpGroup(DEFAULT_GROUP, 1);
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<ToscaConceptIdentifier> idents2 =
234 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
235 status2.setPolicies(idents2);
236 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
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<ToscaConceptIdentifier> idents3 =
247 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
248 status3.setPolicies(idents3);
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);
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<ToscaConceptIdentifier> idents4 =
268 Arrays.asList(new ToscaConceptIdentifier(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);
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<ToscaConceptIdentifier> idents5 =
283 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
284 status5.setPolicies(idents5);
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);
293 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
294 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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<ToscaConceptIdentifier> idents6 =
305 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
306 status5.setPolicies(idents6);
308 PdpStatistics pdpStatistics06 = new PdpStatistics();
309 pdpStatistics06.setPdpInstanceId(PDP_NAME);
310 pdpStatistics06.setPdpGroupName(DEFAULT_GROUP);
311 pdpStatistics06.setPdpSubGroupName(APEX_TYPE);
312 pdpStatistics03.setTimeStamp(timeStamp);
314 pdpStatistics06.setPolicyDeployCount(-1);
315 pdpStatistics06.setPolicyDeployFailCount(-1);
316 status5.setStatistics(pdpStatistics06);
318 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
319 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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());
329 assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
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());