From c0d20132b774b1fa43b4fb9b322e13b6d19d33ee Mon Sep 17 00:00:00 2001 From: Ram Krishna Verma Date: Thu, 6 Aug 2020 18:06:17 -0400 Subject: Fail component health check if PDP is down Changing the policy component health check to fail if the required PDP instances are down or not registered with PAP. The check is performed by comparing the "currentInstanceCount" & "desiredInstanceCount" fields of PdpSubGroup. Issue-ID: POLICY-2718 Change-Id: Iad1075d0812f4ef166dfed4f110eff4d9e5f995e Signed-off-by: Ram Krishna Verma --- .../rest/PolicyComponentsHealthCheckProvider.java | 46 ++++++++++++++++------ .../main/rest/TestPdpGroupHealthCheckProvider.java | 3 +- .../TestPolicyComponentsHealthCheckProvider.java | 9 +++++ main/src/test/resources/rest/pdpGroup.json | 7 ++++ 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/PolicyComponentsHealthCheckProvider.java b/main/src/main/java/org/onap/policy/pap/main/rest/PolicyComponentsHealthCheckProvider.java index 36f25a08..3ce8aa64 100644 --- a/main/src/main/java/org/onap/policy/pap/main/rest/PolicyComponentsHealthCheckProvider.java +++ b/main/src/main/java/org/onap/policy/pap/main/rest/PolicyComponentsHealthCheckProvider.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019-2020 Nordix Foundation. * Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -141,9 +142,10 @@ public class PolicyComponentsHealthCheckProvider { // Check PDPs, read status from DB try { - Map> pdpListWithType = fetchPdpsHealthStatus(); - if (isHealthy && (pdpListWithType.isEmpty() || pdpListWithType.values().stream().flatMap(List::stream) - .anyMatch(pdp -> !PdpHealthStatus.HEALTHY.equals(pdp.getHealthy())))) { + List groups = fetchPdpGroups(); + Map> pdpListWithType = fetchPdpsHealthStatus(groups); + if (isHealthy && (!verifyNumberOfPdps(groups) || pdpListWithType.values().stream().flatMap(List::stream) + .anyMatch(pdp -> !PdpHealthStatus.HEALTHY.equals(pdp.getHealthy())))) { isHealthy = false; } result.put(PapConstants.POLICY_PDPS, pdpListWithType); @@ -157,22 +159,40 @@ public class PolicyComponentsHealthCheckProvider { return Pair.of(Status.OK, result); } - private Map> fetchPdpsHealthStatus() throws PfModelException { + private Map> fetchPdpsHealthStatus(List groups) { Map> pdpListWithType = new HashMap<>(); - final PolicyModelsProviderFactoryWrapper modelProviderWrapper = Registry - .get(PapConstants.REG_PAP_DAO_FACTORY, PolicyModelsProviderFactoryWrapper.class); - try (PolicyModelsProvider databaseProvider = modelProviderWrapper.create()) { - final List groups = databaseProvider.getPdpGroups(null); - for (final PdpGroup group : groups) { - for (final PdpSubGroup subGroup : group.getPdpSubgroups()) { - List pdpList = new ArrayList<>(subGroup.getPdpInstances()); - pdpListWithType.computeIfAbsent(subGroup.getPdpType(), k -> new ArrayList<>()).addAll(pdpList); - } + for (final PdpGroup group : groups) { + for (final PdpSubGroup subGroup : group.getPdpSubgroups()) { + List pdpList = new ArrayList<>(subGroup.getPdpInstances()); + pdpListWithType.computeIfAbsent(subGroup.getPdpType(), k -> new ArrayList<>()).addAll(pdpList); } } return pdpListWithType; } + private boolean verifyNumberOfPdps(List groups) { + boolean flag = true; + for (final PdpGroup group : groups) { + for (final PdpSubGroup subGroup : group.getPdpSubgroups()) { + if (subGroup.getCurrentInstanceCount() < subGroup.getDesiredInstanceCount()) { + flag = false; + break; + } + } + } + return flag; + } + + private List fetchPdpGroups() throws PfModelException { + List groups = new ArrayList<>(); + final PolicyModelsProviderFactoryWrapper modelProviderWrapper = + Registry.get(PapConstants.REG_PAP_DAO_FACTORY, PolicyModelsProviderFactoryWrapper.class); + try (PolicyModelsProvider databaseProvider = modelProviderWrapper.create()) { + groups = databaseProvider.getPdpGroups(null); + } + return groups; + } + private HealthCheckReport fetchPolicyComponentHealthStatus(HttpClient httpClient) { HealthCheckReport clientReport; try { diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupHealthCheckProvider.java b/main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupHealthCheckProvider.java index c910a986..0babb71d 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupHealthCheckProvider.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupHealthCheckProvider.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,7 +89,7 @@ public class TestPdpGroupHealthCheckProvider { } private void verifyPdps(final List pdpList, final List groups) { - assertEquals(5, pdpList.size()); + assertEquals(6, pdpList.size()); for (final PdpGroup group : groups) { for (final PdpSubGroup subGroup : group.getPdpSubgroups()) { pdpList.containsAll(subGroup.getPdpInstances()); diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyComponentsHealthCheckProvider.java b/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyComponentsHealthCheckProvider.java index bdf4700c..ff2159d2 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyComponentsHealthCheckProvider.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyComponentsHealthCheckProvider.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2020 Nordix Foundation. * Modifications Copyright (C) 2020 AT&T Corp. + * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -192,6 +193,14 @@ public class TestPolicyComponentsHealthCheckProvider { assertFalse((Boolean) result.get(HEALTHY)); } + @Test + public void testFetchPolicyComponentsHealthStatus_PdpDown() { + // Set currentInstanceCount as 0 to simulate PDP down + groups.get(0).getPdpSubgroups().get(0).setCurrentInstanceCount(0); + Map result = callFetchPolicyComponentsHealthStatus(); + assertFalse((Boolean) result.get(HEALTHY)); + } + @Test public void testFetchPolicyComponentsHealthStatus_unhealthyPap() { when(papActivator.isAlive()).thenReturn(false); diff --git a/main/src/test/resources/rest/pdpGroup.json b/main/src/test/resources/rest/pdpGroup.json index 2a7b4edc..279d8079 100644 --- a/main/src/test/resources/rest/pdpGroup.json +++ b/main/src/test/resources/rest/pdpGroup.json @@ -25,6 +25,11 @@ "instanceId": "pdpAA_2", "pdpState": "PASSIVE", "healthy": "HEALTHY" + }, + { + "instanceId": "pdpAA_3", + "pdpState": "PASSIVE", + "healthy": "HEALTHY" } ], "supportedPolicyTypes": [ @@ -42,6 +47,7 @@ }, { "pdpType": "pdpTypeB", + "currentInstanceCount": 1, "desiredInstanceCount": 1, "pdpInstances": [ { @@ -66,6 +72,7 @@ "pdpSubgroups": [ { "pdpType": "pdpTypeA", + "currentInstanceCount": 2, "desiredInstanceCount": 2, "pdpInstances": [ { -- cgit 1.2.3-korg