20e34f62cafe9e66079825f0d9ae84435eb795bc
[policy/pap.git] / main / src / test / java / org / onap / policy / pap / main / comm / PdpHeartbeatListenerTest.java
1 /*-
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.pap.main.comm;
24
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertSame;
28
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;
51
52 /**
53  * Class to perform unit test of {@link PdpHeartbeatListener}.
54  *
55  * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
56  */
57 public class PdpHeartbeatListenerTest extends End2EndBase {
58
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";
66
67     private Instant timeStamp;
68
69     @Autowired
70     private PdpHeartbeatListener pdpHeartbeatListener;
71
72     @Test
73     public void testPdpHeartbeatListener() throws CoderException, PfModelException {
74         addGroups("PdpGroups.json");
75         PapParameterGroup parameterGroup = new PapParameterGroup();
76         parameterGroup.setPdpParameters(new PdpParameters());
77
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);
90
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);
104
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);
118
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);
131
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);
145
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);
160
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);
171
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);
186
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);
200
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);
214
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<>();
223         policies.add(polA);
224         policies.add(polB);
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);
229         PdpUpdate update10 =
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);
234     }
235   
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());
242                 if (count > 0) {
243                     assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
244                 }
245             }
246         }
247     }
248 }