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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.pap.main.comm;
23 import static org.junit.Assert.assertEquals;
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;
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;
45 * Class to perform unit test of {@link PdpHeartbeatListener}.
47 * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
49 public class PdpHeartbeatListenerTest extends End2EndBase {
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";
59 private Date timeStamp;
60 private PdpHeartbeatListener pdpHeartbeatListener;
63 public void testPdpHeartbeatListener() throws CoderException, PfModelException {
64 addGroups("PdpGroups.json");
65 pdpHeartbeatListener = new PdpHeartbeatListener();
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);
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);
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);
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);
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);
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);
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);
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);
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);
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");
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);
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);
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);
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);
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);
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);
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);
277 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
278 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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);
292 PdpStatistics pdpStatistics06 = new PdpStatistics();
293 pdpStatistics06.setPdpInstanceId(PDP_NAME);
294 pdpStatistics06.setPdpGroupName(DEFAULT_GROUP);
295 pdpStatistics06.setPdpSubGroupName(APEX_TYPE);
296 pdpStatistics03.setTimeStamp(timeStamp);
298 pdpStatistics06.setPolicyDeployCount(-1);
299 pdpStatistics06.setPolicyDeployFailCount(-1);
300 status5.setStatistics(pdpStatistics06);
302 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
303 verifyPdpStatistics(null, DEFAULT_GROUP, null, 1);
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());
313 assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
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());