From 0fdbdd8200b8a16243ce96a2a039dbc3922d3171 Mon Sep 17 00:00:00 2001 From: Prakhar Pandey Date: Thu, 10 Feb 2022 14:14:13 -0500 Subject: Improve PAP healthcheck api to verify DB connectivity This commit improves PAP healthcheck API to enable verification of PAP to DB connectivity. Issue-ID: POLICY-3763 Signed-off-by: Prakhar Pandey Change-Id: I14353572a00e68a89161bcffd2ec3476b4a4c303 --- .../policy/pap/main/rest/HealthCheckProvider.java | 34 ++++++++++++++++++++-- .../pap/main/rest/HealthCheckRestControllerV1.java | 4 +-- .../rest/PolicyComponentsHealthCheckProvider.java | 4 +-- .../main/rest/TestHealthCheckRestControllerV1.java | 19 ++++++++++-- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckProvider.java b/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckProvider.java index dbbb49e8..f7cfb363 100644 --- a/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckProvider.java +++ b/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckProvider.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. - * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. + * Modifications Copyright (C) 2021-2022 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. @@ -25,8 +25,12 @@ package org.onap.policy.pap.main.rest; import org.onap.policy.common.endpoints.report.HealthCheckReport; import org.onap.policy.common.utils.network.NetworkUtil; import org.onap.policy.common.utils.services.Registry; +import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.pap.main.PapConstants; import org.onap.policy.pap.main.startstop.PapActivator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -42,21 +46,45 @@ public class HealthCheckProvider { private static final String URL = NetworkUtil.getHostname(); private static final String NAME = "Policy PAP"; + @Autowired + private PolicyStatusProvider policyStatusProvider; + private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckProvider.class); + /** * Performs the health check of PAP service. * + * @param checkDbConnectivity flag to enable pap to db connectivity verification * @return Report containing health check status */ - public HealthCheckReport performHealthCheck() { + public HealthCheckReport performHealthCheck(boolean checkDbConnectivity) { final var report = new HealthCheckReport(); report.setName(NAME); report.setUrl(URL); boolean alive = Registry.get(PapConstants.REG_PAP_ACTIVATOR, PapActivator.class).isAlive(); + if (alive && checkDbConnectivity) { + alive = verifyPapDbConnectivity(); + } + report.setHealthy(alive); - report.setCode(alive ? 200 : 500); + report.setCode(alive ? 200 : 503); report.setMessage(alive ? ALIVE : NOT_ALIVE); return report; } + + /** + * Verifies the connectivity between pap component & policy database. + * + * @return boolean signaling the verification result + */ + private boolean verifyPapDbConnectivity() { + try { + policyStatusProvider.getPolicyStatus(); + return true; + } catch (PfModelRuntimeException pfModelRuntimeException) { + LOGGER.warn("Policy pap to database connection check failed. Details - ", pfModelRuntimeException); + return false; + } + } } diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckRestControllerV1.java b/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckRestControllerV1.java index 19e47646..896f2aac 100644 --- a/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckRestControllerV1.java +++ b/main/src/main/java/org/onap/policy/pap/main/rest/HealthCheckRestControllerV1.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019,2021 Nordix Foundation. * Modifications Copyright (C) 2019 AT&T Intellectual Property. - * Modifications Copyright (C) 2021 Bell Canada. All rights reserved. + * Modifications Copyright (C) 2021-2022 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. @@ -53,7 +53,7 @@ public class HealthCheckRestControllerV1 extends PapRestControllerV1 { @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)}) public ResponseEntity healthcheck() { - return ResponseEntity.ok().body(provider.performHealthCheck()); + return ResponseEntity.ok().body(provider.performHealthCheck(true)); } } 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 d2a730eb..3ad740d3 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 @@ -145,8 +145,8 @@ public class PolicyComponentsHealthCheckProvider { throw new PfModelRuntimeException(Status.BAD_REQUEST, "Client Health check interrupted ", exp); } - // Check PAP itself - HealthCheckReport papReport = new HealthCheckProvider().performHealthCheck(); + // Check PAP itself excluding connectivity to Policy DB + HealthCheckReport papReport = new HealthCheckProvider().performHealthCheck(false); papReport .setUrl(isHttps ? "https://" : "http://" + papReport.getUrl() + ":" + port + POLICY_PAP_HEALTHCHECK_URI); if (!papReport.isHealthy()) { diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/TestHealthCheckRestControllerV1.java b/main/src/test/java/org/onap/policy/pap/main/rest/TestHealthCheckRestControllerV1.java index 6dd7103b..bc97c634 100644 --- a/main/src/test/java/org/onap/policy/pap/main/rest/TestHealthCheckRestControllerV1.java +++ b/main/src/test/java/org/onap/policy/pap/main/rest/TestHealthCheckRestControllerV1.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. * Modifications Copyright (C) 2019 AT&T Intellectual Property. + * Modifications Copyright (C) 2022 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. @@ -22,10 +23,13 @@ package org.onap.policy.pap.main.rest; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; import javax.ws.rs.client.Invocation; import org.junit.Test; import org.onap.policy.common.endpoints.report.HealthCheckReport; +import org.onap.policy.models.base.PfModelRuntimeException; +import org.springframework.boot.test.mock.mockito.MockBean; /** * Class to perform unit test of {@link PapRestServer}. @@ -36,6 +40,9 @@ public class TestHealthCheckRestControllerV1 extends CommonPapRestServer { private static final String HEALTHCHECK_ENDPOINT = "healthcheck"; + @MockBean + private PolicyStatusProvider policyStatusProvider; + @Test public void testSwagger() throws Exception { super.testSwagger(HEALTHCHECK_ENDPOINT); @@ -52,13 +59,21 @@ public class TestHealthCheckRestControllerV1 extends CommonPapRestServer { } @Test - public void testHealthCheck_500() throws Exception { + public void testHealthCheckActivatorFailure() throws Exception { markActivatorDead(); final Invocation.Builder invocationBuilder = sendRequest(HEALTHCHECK_ENDPOINT); final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class); - validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report); + validateHealthCheckReport(NAME, SELF, false, 503, NOT_ALIVE, report); + } + + @Test + public void testHealthCheckDbConnectionFailure() throws Exception { + when(policyStatusProvider.getPolicyStatus()).thenThrow(PfModelRuntimeException.class); + final Invocation.Builder invocationBuilder = sendRequest(HEALTHCHECK_ENDPOINT); + final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class); + validateHealthCheckReport(NAME, SELF, false, 503, NOT_ALIVE, report); } private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code, -- cgit 1.2.3-korg