2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2022 Bell Canada. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.pap.main.notification;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.mockito.ArgumentMatchers.anyString;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.List;
34 import lombok.NonNull;
35 import org.apache.commons.lang3.builder.CompareToBuilder;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.ArgumentCaptor;
40 import org.mockito.Captor;
41 import org.mockito.Mock;
42 import org.mockito.junit.MockitoJUnitRunner;
43 import org.onap.policy.models.base.PfModelException;
44 import org.onap.policy.models.pap.concepts.PolicyNotification;
45 import org.onap.policy.models.pap.concepts.PolicyStatus;
46 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
47 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.PdpPolicyStatusBuilder;
48 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
50 import org.onap.policy.pap.main.notification.StatusAction.Action;
51 import org.onap.policy.pap.main.service.PolicyStatusService;
53 @RunWith(MockitoJUnitRunner.class)
54 public class DeploymentStatusTest {
56 private static final String VERSION = "1.2.3";
57 private static final @NonNull String GROUP_A = "groupA";
58 private static final String PDP_A = "pdpA";
59 private static final String PDP_B = "pdpB";
60 private static final String PDP_C = "pdpC";
61 private static final String PDP_D = "pdpD";
62 private static final String PDP_TYPE = "MyPdpType";
63 private static final ToscaConceptIdentifier POLICY_A = new ToscaConceptIdentifier("MyPolicyA", VERSION);
64 private static final ToscaConceptIdentifier POLICY_B = new ToscaConceptIdentifier("MyPolicyB", VERSION);
65 private static final ToscaConceptIdentifier POLICY_C = new ToscaConceptIdentifier("MyPolicyC", VERSION);
66 private static final ToscaConceptIdentifier POLICY_D = new ToscaConceptIdentifier("MyPolicyD", VERSION);
67 private static final ToscaConceptIdentifier POLICY_TYPE = new ToscaConceptIdentifier("MyPolicyType", VERSION);
69 private PdpPolicyStatusBuilder builder;
72 private ArgumentCaptor<List<PdpPolicyStatus>> created;
74 private ArgumentCaptor<List<PdpPolicyStatus>> updated;
76 private ArgumentCaptor<List<PdpPolicyStatus>> deleted;
79 private PolicyStatusService policyStatusService;
81 private DeploymentStatus tracker;
88 tracker = new DeploymentStatus(policyStatusService);
91 builder = PdpPolicyStatus.builder()
96 .policyType(POLICY_TYPE)
98 .state(State.SUCCESS);
103 public void testAddNotifications() {
104 PdpPolicyStatus create = builder.pdpId("created").state(State.FAILURE).build();
105 PdpPolicyStatus update = builder.pdpId("updated").state(State.SUCCESS).build();
106 PdpPolicyStatus delete = builder.pdpId("deleted").state(State.SUCCESS).build();
107 PdpPolicyStatus unchange = builder.pdpId("unchanged").state(State.FAILURE).build();
110 tracker.getRecordMap().putAll(makeMap(
111 Action.CREATED, create,
112 Action.UPDATED, update,
113 Action.DELETED, delete,
114 Action.UNCHANGED, unchange
118 PolicyNotification notif = new PolicyNotification();
120 tracker.addNotifications(notif);
121 assertThat(notif.getAdded()).hasSize(1);
122 assertThat(notif.getDeleted()).isEmpty();
124 PolicyStatus status = notif.getAdded().get(0);
125 assertThat(status.getFailureCount()).isEqualTo(2);
126 assertThat(status.getIncompleteCount()).isZero();
127 assertThat(status.getSuccessCount()).isEqualTo(1);
128 assertThat(status.getPolicy()).isEqualTo(POLICY_A);
129 assertThat(status.getPolicyType()).isEqualTo(POLICY_TYPE);
132 * repeat - should be no notifications
134 notif = new PolicyNotification();
135 tracker.addNotifications(notif);
136 assertThat(notif.getAdded()).isEmpty();
137 assertThat(notif.getDeleted()).isEmpty();
141 public void testLoadByGroup() throws PfModelException {
142 PdpPolicyStatus status1 = builder.build();
143 PdpPolicyStatus status2 = builder.policy(POLICY_B).build();
144 PdpPolicyStatus status3 = builder.policy(POLICY_A).pdpId(PDP_B).build();
146 when(policyStatusService.getGroupPolicyStatus(GROUP_A)).thenReturn(List.of(status1, status2, status3));
148 tracker.loadByGroup(GROUP_A);
151 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
152 Action.UNCHANGED, status1,
153 Action.UNCHANGED, status2,
154 Action.UNCHANGED, status3
158 // try again - should not reload
159 tracker.loadByGroup(GROUP_A);
160 verify(policyStatusService).getGroupPolicyStatus(anyString());
164 public void testFlushPdpNotification() {
165 PdpPolicyStatus create = builder.pdpId("created").state(State.FAILURE).build();
166 tracker.getRecordMap().putAll(makeMap(Action.CREATED, create));
168 PolicyNotification notif = new PolicyNotification();
170 tracker.flush(notif);
172 assertThat(notif.getAdded()).hasSize(1);
173 assertThat(notif.getDeleted()).isEmpty();
177 public void testFlush() throws PfModelException {
178 PdpPolicyStatus create1 = builder.pdpId("createA").build();
179 PdpPolicyStatus create2 = builder.pdpId("createB").build();
180 PdpPolicyStatus update1 = builder.pdpId("updateA").build();
181 PdpPolicyStatus update2 = builder.pdpId("updateB").build();
182 PdpPolicyStatus delete1 = builder.pdpId("deleteA").build();
183 PdpPolicyStatus delete2 = builder.pdpId("deleteB").build();
184 PdpPolicyStatus unchange1 = builder.pdpId("unchangeA").build();
185 PdpPolicyStatus unchange2 = builder.pdpId("unchangeB").build();
188 tracker.getRecordMap().putAll(makeMap(
189 Action.CREATED, create1,
190 Action.CREATED, create2,
191 Action.UPDATED, update1,
192 Action.UPDATED, update2,
193 Action.DELETED, delete1,
194 Action.DELETED, delete2,
195 Action.UNCHANGED, unchange1,
196 Action.UNCHANGED, unchange2
202 verify(policyStatusService).cudPolicyStatus(created.capture(), updated.capture(), deleted.capture());
204 assertThat(sort(created.getValue())).isEqualTo(List.of(create1, create2));
205 assertThat(sort(updated.getValue())).isEqualTo(List.of(update1, update2));
206 assertThat(sort(deleted.getValue())).isEqualTo(List.of(delete1, delete2));
209 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
210 Action.UNCHANGED, create1,
211 Action.UNCHANGED, create2,
212 Action.UNCHANGED, update1,
213 Action.UNCHANGED, update2,
214 Action.UNCHANGED, unchange1,
215 Action.UNCHANGED, unchange2
221 public void testDeleteUndeployments() {
222 builder.deploy(true);
223 PdpPolicyStatus delete = builder.policy(POLICY_A).build();
224 PdpPolicyStatus deployedComplete = builder.policy(POLICY_B).build();
226 builder.deploy(false);
227 PdpPolicyStatus undepComplete1 = builder.policy(POLICY_C).build();
228 PdpPolicyStatus undepIncomplete1 = builder.policy(POLICY_D).build();
230 builder.pdpId(PDP_B);
231 PdpPolicyStatus undepComplete2 = builder.policy(POLICY_C).build();
232 PdpPolicyStatus undepIncomplete2 = builder.policy(POLICY_D).state(State.WAITING).build();
235 Map<StatusKey, StatusAction> map = makeMap(
236 Action.DELETED, delete,
237 Action.UNCHANGED, deployedComplete,
238 Action.UNCHANGED, undepComplete1,
239 Action.UNCHANGED, undepComplete2,
240 Action.UNCHANGED, undepIncomplete1,
241 Action.UNCHANGED, undepIncomplete2
245 tracker.getRecordMap().putAll(map);
247 tracker.deleteUndeployments();
249 // the completed undeployments should now be marked DELETED
252 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
253 Action.DELETED, delete,
254 Action.UNCHANGED, deployedComplete,
255 Action.DELETED, undepComplete1,
256 Action.DELETED, undepComplete2,
257 Action.UNCHANGED, undepIncomplete1,
258 Action.UNCHANGED, undepIncomplete2
264 public void testDeleteDeploymentString() {
265 PdpPolicyStatus statusaa = builder.pdpId(PDP_A).policy(POLICY_A).build();
266 PdpPolicyStatus statusab = builder.pdpId(PDP_A).policy(POLICY_B).build();
267 PdpPolicyStatus statusba = builder.pdpId(PDP_B).policy(POLICY_A).build();
268 PdpPolicyStatus statuscb = builder.pdpId(PDP_C).policy(POLICY_B).build();
271 tracker.getRecordMap().putAll(makeMap(
272 Action.UNCHANGED, statusaa,
273 Action.UNCHANGED, statusab,
274 Action.UNCHANGED, statusba,
275 Action.UNCHANGED, statuscb
279 tracker.deleteDeployment(PDP_A);
282 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
283 Action.DELETED, statusaa,
284 Action.DELETED, statusab,
285 Action.UNCHANGED, statusba,
286 Action.UNCHANGED, statuscb
292 public void testDeleteDeploymentToscaConceptIdentifierBoolean() {
293 PdpPolicyStatus deploy1A = builder.policy(POLICY_A).build();
294 PdpPolicyStatus deploy2A = builder.policy(POLICY_A).pdpId(PDP_B).build();
295 PdpPolicyStatus deployB = builder.policy(POLICY_B).pdpId(PDP_A).build();
297 builder.deploy(false);
298 PdpPolicyStatus undeployA = builder.policy(POLICY_A).build();
299 PdpPolicyStatus undeployB = builder.policy(POLICY_B).build();
302 tracker.getRecordMap().putAll(makeMap(
303 Action.UNCHANGED, deploy1A,
304 Action.UNCHANGED, deploy2A,
305 Action.UNCHANGED, deployB,
306 Action.UNCHANGED, undeployA,
307 Action.UNCHANGED, undeployB
311 tracker.deleteDeployment(POLICY_A, true);
314 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
315 Action.DELETED, deploy1A,
316 Action.DELETED, deploy2A,
317 Action.UNCHANGED, deployB,
318 Action.UNCHANGED, undeployA,
319 Action.UNCHANGED, undeployB
323 tracker.deleteDeployment(POLICY_B, false);
326 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
327 Action.DELETED, deploy1A,
328 Action.DELETED, deploy2A,
329 Action.UNCHANGED, deployB,
330 Action.UNCHANGED, undeployA,
331 Action.DELETED, undeployB
337 public void testDeleteDeploymentBiPredicateOfStatusKeyStatusAction() {
338 PdpPolicyStatus create1 = builder.pdpId(PDP_A).build();
339 PdpPolicyStatus delete = builder.pdpId(PDP_B).build();
340 PdpPolicyStatus update = builder.pdpId(PDP_C).build();
341 PdpPolicyStatus unchange = builder.pdpId(PDP_D).build();
343 PdpPolicyStatus create2 = builder.pdpId(PDP_B).build();
346 tracker.getRecordMap().putAll(makeMap(
347 Action.CREATED, create1,
348 Action.CREATED, create2,
349 Action.DELETED, delete,
350 Action.UPDATED, update,
351 Action.UNCHANGED, unchange
355 tracker.deleteDeployment(POLICY_A, true);
358 assertThat(tracker.getRecordMap()).isEqualTo(makeMap(
359 Action.DELETED, delete,
360 Action.DELETED, update,
361 Action.DELETED, unchange
367 public void testDeploy() {
368 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, true);
370 assertThat(tracker.getRecordMap()).hasSize(1);
372 StatusAction status2 = tracker.getRecordMap().values().iterator().next();
374 assertThat(status2.getAction()).isEqualTo(Action.CREATED);
375 assertThat(status2.getStatus().getState()).isEqualTo(State.WAITING);
376 assertThat(status2.getStatus().isDeploy()).isTrue();
379 * repeat - should be the same status
381 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, true);
383 assertThat(tracker.getRecordMap()).hasSize(1);
384 assertThat(tracker.getRecordMap().values().iterator().next()).isSameAs(status2);
385 assertThat(status2.getAction()).isEqualTo(Action.CREATED);
386 assertThat(status2.getStatus().getState()).isEqualTo(State.WAITING);
387 assertThat(status2.getStatus().isDeploy()).isTrue();
390 * repeat, with different values - should be unchanged
392 status2.setAction(Action.UNCHANGED);
393 status2.getStatus().setDeploy(true);
394 status2.getStatus().setState(State.SUCCESS);
396 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, true);
398 assertThat(tracker.getRecordMap()).hasSize(1);
399 assertThat(tracker.getRecordMap().values().iterator().next()).isSameAs(status2);
400 assertThat(status2.getAction()).isEqualTo(Action.UNCHANGED);
401 assertThat(status2.getStatus().getState()).isEqualTo(State.SUCCESS);
402 assertThat(status2.getStatus().isDeploy()).isTrue();
405 * incorrect "deploy" value - should update it
407 status2.setAction(Action.UNCHANGED);
408 status2.getStatus().setDeploy(true);
410 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, false);
412 assertThat(status2.getAction()).isEqualTo(Action.UPDATED);
413 assertThat(status2.getStatus().getState()).isEqualTo(State.WAITING);
414 assertThat(status2.getStatus().isDeploy()).isFalse();
417 * marked for deletion - should reinstate it
419 status2.setAction(Action.DELETED);
420 status2.getStatus().setState(State.FAILURE);
421 status2.getStatus().setDeploy(false);
423 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, false);
425 assertThat(status2.getAction()).isEqualTo(Action.UPDATED);
426 assertThat(status2.getStatus().getState()).isEqualTo(State.FAILURE);
427 assertThat(status2.getStatus().isDeploy()).isFalse();
431 public void testCompleteDeploy() {
432 tracker.deploy(PDP_A, POLICY_A, POLICY_TYPE, GROUP_A, PDP_TYPE, true);
433 assertThat(tracker.getRecordMap()).hasSize(1);
435 // deployed, but not expected to be deployed - record should be left as is
436 checkCompleteDeploy(true, Set.of(), Set.of(), Action.UNCHANGED, State.WAITING);
437 checkCompleteDeploy(true, Set.of(), Set.of(POLICY_A), Action.UNCHANGED, State.WAITING);
439 // expected, but not actually deployed - failure
440 checkCompleteDeploy(true, Set.of(POLICY_A), Set.of(), Action.UPDATED, State.FAILURE);
442 // expected and actually deployed - success
443 checkCompleteDeploy(true, Set.of(POLICY_A), Set.of(POLICY_A), Action.UPDATED, State.SUCCESS);
444 checkCompleteDeploy(true, Set.of(POLICY_A, POLICY_B), Set.of(POLICY_A), Action.UPDATED, State.SUCCESS);
446 // not expected and not actually deployed - success
447 checkCompleteDeploy(false, Set.of(), Set.of(), Action.UPDATED, State.SUCCESS);
449 // not expected, but actually deployed - failure
450 checkCompleteDeploy(false, Set.of(), Set.of(POLICY_A), Action.UPDATED, State.FAILURE);
452 // undeployed, but expected to be deployed - record should be left as is
453 checkCompleteDeploy(false, Set.of(POLICY_A), Set.of(), Action.UNCHANGED, State.WAITING);
454 checkCompleteDeploy(false, Set.of(POLICY_A), Set.of(POLICY_A), Action.UNCHANGED, State.WAITING);
455 checkCompleteDeploy(false, Set.of(POLICY_A, POLICY_B), Set.of(POLICY_A), Action.UNCHANGED, State.WAITING);
458 * Try a case where the state is already correct.
460 StatusAction status = tracker.getRecordMap().values().iterator().next();
461 status.getStatus().setDeploy(false);
462 status.setAction(Action.UNCHANGED);
463 status.getStatus().setState(State.SUCCESS);
465 tracker.completeDeploy(PDP_A, Set.of(), Set.of());
467 assertThat(status.getAction()).isEqualTo(Action.UNCHANGED);
468 assertThat(status.getStatus().getState()).isEqualTo(State.SUCCESS);
471 * Try a case where the PDP does not match the record.
473 status.getStatus().setDeploy(false);
474 status.setAction(Action.UNCHANGED);
475 status.getStatus().setState(State.WAITING);
477 tracker.completeDeploy(PDP_B, Set.of(), Set.of());
479 assertThat(status.getAction()).isEqualTo(Action.UNCHANGED);
480 assertThat(status.getStatus().getState()).isEqualTo(State.WAITING);
483 private void checkCompleteDeploy(boolean deploy, Set<ToscaConceptIdentifier> expected,
484 Set<ToscaConceptIdentifier> actual, Action action, State state) {
486 StatusAction status = tracker.getRecordMap().values().iterator().next();
487 status.getStatus().setDeploy(deploy);
488 status.setAction(Action.UNCHANGED);
489 status.getStatus().setState(State.WAITING);
491 tracker.completeDeploy(PDP_A, expected, actual);
493 assertThat(status.getAction()).isEqualTo(action);
494 assertThat(status.getStatus().getState()).isEqualTo(state);
497 private List<PdpPolicyStatus> sort(List<PdpPolicyStatus> list) {
499 Collections.sort(list, (rec1, rec2) -> {
502 return new CompareToBuilder()
503 .append(rec1.getPdpId(), rec2.getPdpId())
504 .append(rec1.getPolicy(), rec2.getPolicy())
515 * @param data pairs of (Action, PdpPolicyStatus)
516 * @return a new map containing the given data
518 private Map<StatusKey, StatusAction> makeMap(Object... data) {
519 Map<StatusKey, StatusAction> map = new HashMap<>();
521 assert (data.length % 2 == 0);
523 for (int idata = 0; idata < data.length; idata += 2) {
524 Action action = (Action) data[idata];
525 PdpPolicyStatus status = (PdpPolicyStatus) data[idata + 1];
526 map.put(new StatusKey(status), new StatusAction(action, status));