2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2021, 2023 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.jupiter.api.Assertions.assertEquals;
27 import static org.junit.jupiter.api.Assertions.assertSame;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32 import java.util.stream.Collectors;
33 import org.junit.jupiter.api.Test;
34 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
35 import org.onap.policy.models.pdp.concepts.PdpGroup;
36 import org.onap.policy.models.pdp.concepts.PdpStatus;
37 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
38 import org.onap.policy.models.pdp.concepts.PdpUpdate;
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.models.tosca.authorative.concepts.ToscaPolicy;
43 import org.onap.policy.pap.main.parameters.CommonTestData;
44 import org.onap.policy.pap.main.parameters.PapParameterGroup;
45 import org.onap.policy.pap.main.parameters.PdpParameters;
46 import org.onap.policy.pap.main.rest.e2e.End2EndBase;
47 import org.springframework.beans.factory.annotation.Autowired;
50 * Class to perform unit test of {@link PdpHeartbeatListener}.
52 * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
54 class PdpHeartbeatListenerTest extends End2EndBase {
56 private static final String POLICY_VERSION = "1.0.0";
57 private static final String POLICY_NAME = "onap.policies.controlloop.operational.common.apex.SampleDomain";
58 private static final String APEX_TYPE = "apex";
59 private static final String DEFAULT_GROUP = "defaultGroup";
60 private static final String PDP_NAME = "pdp_1";
61 private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
62 private static final String TOPIC = "my-topic";
65 private PdpHeartbeatListener pdpHeartbeatListener;
68 void testPdpHeartbeatListener() {
69 addGroups("PdpGroups.json");
70 PapParameterGroup parameterGroup = new PapParameterGroup();
71 parameterGroup.setPdpParameters(new PdpParameters());
73 // Testing pdp registration success case
74 final PdpStatus status1 = new PdpStatus();
75 status1.setName(PDP_NAME);
76 status1.setState(PdpState.ACTIVE);
77 status1.setPdpGroup(DEFAULT_GROUP);
78 status1.setPdpType(APEX_TYPE);
79 status1.setHealthy(PdpHealthStatus.HEALTHY);
80 final List<ToscaConceptIdentifier> idents1 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
81 status1.setPolicies(idents1);
82 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
85 // Testing pdp heartbeat success case
86 final PdpStatus status2 = new PdpStatus();
87 status2.setName(PDP_NAME);
88 status2.setState(PdpState.ACTIVE);
89 status2.setPdpGroup(DEFAULT_GROUP);
90 status2.setPdpType(APEX_TYPE);
91 status2.setHealthy(PdpHealthStatus.HEALTHY);
92 status2.setPdpSubgroup(APEX_TYPE);
93 final List<ToscaConceptIdentifier> idents2 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
94 status2.setPolicies(idents2);
95 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
98 // Testing pdp heartbeat failure case with pdp missing
99 final PdpStatus status3 = new PdpStatus();
100 status3.setName("pdp_2");
101 status3.setState(PdpState.ACTIVE);
102 status3.setPdpGroup(DEFAULT_GROUP);
103 status3.setPdpType(APEX_TYPE);
104 status3.setHealthy(PdpHealthStatus.HEALTHY);
105 status3.setPdpSubgroup(APEX_TYPE);
106 final List<ToscaConceptIdentifier> idents3 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
107 status3.setPolicies(idents3);
108 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
111 // Testing pdp registration failure case
112 final PdpStatus status4 = new PdpStatus();
113 status4.setName("pdp_3");
114 status4.setState(PdpState.ACTIVE);
115 status4.setPdpGroup("wrongGroup");
116 status4.setPdpType(APEX_TYPE);
117 status4.setHealthy(PdpHealthStatus.HEALTHY);
118 final List<ToscaConceptIdentifier> idents4 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
119 status4.setPolicies(idents4);
120 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
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 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
132 status5.setPolicies(idents5);
133 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
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);
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);
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 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
172 status7b.setPolicies(idents7b);
173 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7b);
176 // Testing pdp termination case for pdp_1
177 final PdpStatus status8 = new PdpStatus();
178 status8.setName(PDP_NAME);
179 status8.setState(PdpState.TERMINATED);
180 status8.setPdpGroup(DEFAULT_GROUP);
181 status8.setPdpType(APEX_TYPE);
182 status8.setPdpSubgroup(APEX_TYPE);
183 status8.setHealthy(PdpHealthStatus.HEALTHY);
184 final List<ToscaConceptIdentifier> idents8 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
185 status8.setPolicies(idents8);
186 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status8);
189 // Testing pdp termination case for pdp_2
190 final PdpStatus status9 = new PdpStatus();
191 status9.setName("pdp_2");
192 status9.setState(PdpState.TERMINATED);
193 status9.setPdpGroup(DEFAULT_GROUP);
194 status9.setPdpType(APEX_TYPE);
195 status9.setPdpSubgroup(APEX_TYPE);
196 status9.setHealthy(PdpHealthStatus.HEALTHY);
197 final List<ToscaConceptIdentifier> idents9 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
198 status9.setPolicies(idents9);
199 pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status9);
202 // Test policy lists updated in createUpdate
203 ToscaPolicy polA = new ToscaPolicy();
204 polA.setName("pol-a-1.1.1");
205 polA.setVersion("1.1.1");
206 ToscaPolicy polB = new ToscaPolicy();
207 polB.setName("pol-b-1.1.1");
208 polB.setVersion("1.1.1");
209 List<ToscaPolicy> policies = new ArrayList<>();
212 final PapParameterGroup testGroup = new CommonTestData().getPapParameterGroup(1);
213 List<ToscaConceptIdentifier> polsUndep =
214 policies.stream().map(ToscaPolicy::getIdentifier).collect(Collectors.toList());
215 PdpStatusMessageHandler handler = new PdpStatusMessageHandler(testGroup, pdpGroupService);
217 handler.createPdpUpdateMessage(status3.getPdpGroup(), new PdpSubGroup(), "pdp_2", policies, polsUndep);
218 assertSame(update10.getPoliciesToBeDeployed(), policies);
219 assertSame(update10.getPoliciesToBeUndeployed(), polsUndep);
220 assertThat(update10.getPoliciesToBeDeployed()).isInstanceOf(List.class);
223 private void verifyPdpGroup(final int count) {
224 final List<PdpGroup> fetchedGroups = fetchGroups(PdpHeartbeatListenerTest.DEFAULT_GROUP);
225 for (final PdpSubGroup subGroup : fetchedGroups.get(0).getPdpSubgroups()) {
226 if (subGroup.getPdpType().equals(APEX_TYPE)) {
227 assertEquals(count, subGroup.getPdpInstances().size());
228 assertEquals(count, subGroup.getCurrentInstanceCount());
230 assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());