2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2021 Nordix Foundation.
4 * Modifications Copyright (C) 2020-2021 AT&T Intellectual Property.
5 * Modifications Copyright (C) 2021-2023 Bell Canada. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.pap.main.comm;
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertSame;
29 import java.time.Instant;
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.stream.Collectors;
34 import org.junit.Test;
35 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
36 import org.onap.policy.common.utils.coder.CoderException;
37 import org.onap.policy.models.base.PfModelException;
38 import org.onap.policy.models.pdp.concepts.PdpGroup;
39 import org.onap.policy.models.pdp.concepts.PdpStatus;
40 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
41 import org.onap.policy.models.pdp.concepts.PdpUpdate;
42 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
43 import org.onap.policy.models.pdp.enums.PdpState;
44 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
46 import org.onap.policy.pap.main.parameters.CommonTestData;
47 import org.onap.policy.pap.main.parameters.PapParameterGroup;
48 import org.onap.policy.pap.main.parameters.PdpParameters;
49 import org.onap.policy.pap.main.rest.e2e.End2EndBase;
50 import org.springframework.beans.factory.annotation.Autowired;
53 * Class to perform unit test of {@link PdpHeartbeatListener}.
55 * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
57 public class PdpHeartbeatListenerTest extends End2EndBase {
59 private static final String POLICY_VERSION = "1.0.0";
60 private static final String POLICY_NAME = "onap.policies.controlloop.operational.common.apex.SampleDomain";
61 private static final String APEX_TYPE = "apex";
62 private static final String DEFAULT_GROUP = "defaultGroup";
63 private static final String PDP_NAME = "pdp_1";
64 private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
65 private static final String TOPIC = "my-topic";
67 private Instant timeStamp;
70 private PdpHeartbeatListener pdpHeartbeatListener;
73 public void testPdpHeartbeatListener() throws CoderException, PfModelException {
74 addGroups("PdpGroups.json");
75 PapParameterGroup parameterGroup = new PapParameterGroup();
76 parameterGroup.setPdpParameters(new PdpParameters());
78 // Testing pdp registration success case
79 final PdpStatus status1 = new PdpStatus();
80 status1.setName(PDP_NAME);
81 status1.setState(PdpState.ACTIVE);
82 status1.setPdpGroup(DEFAULT_GROUP);
83 status1.setPdpType(APEX_TYPE);
84 status1.setHealthy(PdpHealthStatus.HEALTHY);
85 final List<ToscaConceptIdentifier> idents1 =
86 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
87 status1.setPolicies(idents1);
88 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
89 verifyPdpGroup(DEFAULT_GROUP, 1);
91 // Testing pdp heartbeat success case
92 final PdpStatus status2 = new PdpStatus();
93 status2.setName(PDP_NAME);
94 status2.setState(PdpState.ACTIVE);
95 status2.setPdpGroup(DEFAULT_GROUP);
96 status2.setPdpType(APEX_TYPE);
97 status2.setHealthy(PdpHealthStatus.HEALTHY);
98 status2.setPdpSubgroup(APEX_TYPE);
99 final List<ToscaConceptIdentifier> idents2 =
100 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
101 status2.setPolicies(idents2);
102 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
103 verifyPdpGroup(DEFAULT_GROUP, 1);
105 // Testing pdp heartbeat failure case with pdp missing
106 final PdpStatus status3 = new PdpStatus();
107 status3.setName("pdp_2");
108 status3.setState(PdpState.ACTIVE);
109 status3.setPdpGroup(DEFAULT_GROUP);
110 status3.setPdpType(APEX_TYPE);
111 status3.setHealthy(PdpHealthStatus.HEALTHY);
112 status3.setPdpSubgroup(APEX_TYPE);
113 final List<ToscaConceptIdentifier> idents3 =
114 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
115 status3.setPolicies(idents3);
116 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
117 verifyPdpGroup(DEFAULT_GROUP, 2);
119 // Testing pdp registration failure case
120 final PdpStatus status4 = new PdpStatus();
121 status4.setName("pdp_3");
122 status4.setState(PdpState.ACTIVE);
123 status4.setPdpGroup("wrongGroup");
124 status4.setPdpType(APEX_TYPE);
125 status4.setHealthy(PdpHealthStatus.HEALTHY);
126 final List<ToscaConceptIdentifier> idents4 =
127 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
128 status4.setPolicies(idents4);
129 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
130 verifyPdpGroup(DEFAULT_GROUP, 2);
132 // Testing pdp heartbeat failure case with pdp state mismatch
133 final PdpStatus status5 = new PdpStatus();
134 status5.setName(PDP_NAME);
135 status5.setState(PdpState.PASSIVE);
136 status5.setPdpGroup(DEFAULT_GROUP);
137 status5.setPdpType(APEX_TYPE);
138 status5.setHealthy(PdpHealthStatus.HEALTHY);
139 status5.setPdpSubgroup(APEX_TYPE);
140 final List<ToscaConceptIdentifier> idents5 =
141 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
142 status5.setPolicies(idents5);
143 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
144 verifyPdpGroup(DEFAULT_GROUP, 2);
146 // Testing pdp heartbeat failure case with pdp policies mismatch
147 final PdpStatus status6 = new PdpStatus();
148 status6.setName(PDP_NAME);
149 status6.setState(PdpState.ACTIVE);
150 status6.setPdpGroup(DEFAULT_GROUP);
151 status6.setPdpType(APEX_TYPE);
152 status6.setHealthy(PdpHealthStatus.HEALTHY);
153 status6.setPdpSubgroup(APEX_TYPE);
154 final List<ToscaConceptIdentifier> idents6 =
155 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION),
156 new ToscaConceptIdentifier("onap.restart.tca", POLICY_VERSION));
157 status6.setPolicies(idents6);
158 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status6);
159 verifyPdpGroup(DEFAULT_GROUP, 2);
161 // Testing pdp heartbeat failure case with pdp no policies
162 final PdpStatus status7 = new PdpStatus();
163 status7.setName(PDP_NAME);
164 status7.setState(PdpState.ACTIVE);
165 status7.setPdpGroup(DEFAULT_GROUP);
166 status7.setPdpType(APEX_TYPE);
167 status7.setHealthy(PdpHealthStatus.HEALTHY);
168 status7.setPdpSubgroup(APEX_TYPE);
169 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7);
170 verifyPdpGroup(DEFAULT_GROUP, 2);
172 // Testing old message for pdp_1 - should have no effect
173 final PdpStatus status7b = new PdpStatus();
174 status7b.setTimestampMs(System.currentTimeMillis() - PdpParameters.DEFAULT_MAX_AGE_MS - 1);
175 status7b.setName(PDP_NAME);
176 status7b.setState(PdpState.TERMINATED);
177 status7b.setPdpGroup(DEFAULT_GROUP);
178 status7b.setPdpType(APEX_TYPE);
179 status7b.setPdpSubgroup(APEX_TYPE);
180 status7b.setHealthy(PdpHealthStatus.HEALTHY);
181 final List<ToscaConceptIdentifier> idents7b =
182 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
183 status7b.setPolicies(idents7b);
184 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7b);
185 verifyPdpGroup(DEFAULT_GROUP, 2);
187 // Testing pdp termination case for pdp_1
188 final PdpStatus status8 = new PdpStatus();
189 status8.setName(PDP_NAME);
190 status8.setState(PdpState.TERMINATED);
191 status8.setPdpGroup(DEFAULT_GROUP);
192 status8.setPdpType(APEX_TYPE);
193 status8.setPdpSubgroup(APEX_TYPE);
194 status8.setHealthy(PdpHealthStatus.HEALTHY);
195 final List<ToscaConceptIdentifier> idents8 =
196 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
197 status8.setPolicies(idents8);
198 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status8);
199 verifyPdpGroup(DEFAULT_GROUP, 1);
201 // Testing pdp termination case for pdp_2
202 final PdpStatus status9 = new PdpStatus();
203 status9.setName("pdp_2");
204 status9.setState(PdpState.TERMINATED);
205 status9.setPdpGroup(DEFAULT_GROUP);
206 status9.setPdpType(APEX_TYPE);
207 status9.setPdpSubgroup(APEX_TYPE);
208 status9.setHealthy(PdpHealthStatus.HEALTHY);
209 final List<ToscaConceptIdentifier> idents9 =
210 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
211 status9.setPolicies(idents9);
212 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status9);
213 verifyPdpGroup(DEFAULT_GROUP, 0);
215 // Test policy lists updated in createUpdate
216 ToscaPolicy polA = new ToscaPolicy();
217 polA.setName("pol-a-1.1.1");
218 polA.setVersion("1.1.1");
219 ToscaPolicy polB = new ToscaPolicy();
220 polB.setName("pol-b-1.1.1");
221 polB.setVersion("1.1.1");
222 List<ToscaPolicy> policies = new ArrayList<>();
225 final PapParameterGroup testGroup = new CommonTestData().getPapParameterGroup(1);
226 List<ToscaConceptIdentifier> polsUndep =
227 policies.stream().map(ToscaPolicy::getIdentifier).collect(Collectors.toList());
228 PdpStatusMessageHandler handler = new PdpStatusMessageHandler(testGroup, pdpGroupService);
230 handler.createPdpUpdateMessage(status3.getPdpGroup(), new PdpSubGroup(), "pdp_2", policies, polsUndep);
231 assertSame(update10.getPoliciesToBeDeployed(), policies);
232 assertSame(update10.getPoliciesToBeUndeployed(), polsUndep);
233 assertThat(update10.getPoliciesToBeDeployed()).isInstanceOf(List.class);
236 private void verifyPdpGroup(final String name, final int count) throws PfModelException {
237 final List<PdpGroup> fetchedGroups = fetchGroups(name);
238 for (final PdpSubGroup subGroup : fetchedGroups.get(0).getPdpSubgroups()) {
239 if (subGroup.getPdpType().equals(APEX_TYPE)) {
240 assertEquals(count, subGroup.getPdpInstances().size());
241 assertEquals(count, subGroup.getCurrentInstanceCount());
243 assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());