From 94b4e3588363bc699e18759bd89da1120ad894e0 Mon Sep 17 00:00:00 2001 From: allanmckenzie Date: Fri, 25 Mar 2022 13:01:49 +0000 Subject: [PATCH] Add new healthcheck for the system database. --- CHANGELOG.md | 6 ++ .../SystemDatabaseHealthcheck.java | 60 ++++++++++++++ .../database/TableCheckerTest.java | 2 - .../EventStoreHealthcheckTest.java | 2 - .../FileStoreHealthcheckTest.java | 3 - .../SystemDatabaseHealthcheckTest.java | 81 +++++++++++++++++++ pom.xml | 2 +- 7 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 healthchecks/src/main/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheck.java create mode 100644 healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheckTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c97eb4fe4..1d4b540ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to ## [Unreleased] +## [11.0.0-M13] - 2022-03-25 +### Added +- Added new healthcheck for the system database. +### Changed +- Update framework to 11.0.0-M11 + ## [11.0.0-M12] - 2022-03-24 ### Added - Added healthcheck modules into the event store bom diff --git a/healthchecks/src/main/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheck.java b/healthchecks/src/main/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheck.java new file mode 100644 index 000000000..734556c6f --- /dev/null +++ b/healthchecks/src/main/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheck.java @@ -0,0 +1,60 @@ +package uk.gov.justice.services.healthcheck.healthchecks; + +import static java.lang.String.format; +import static java.util.List.of; +import static uk.gov.justice.services.healthcheck.api.HealthcheckResult.failure; + +import uk.gov.justice.services.healthcheck.api.Healthcheck; +import uk.gov.justice.services.healthcheck.api.HealthcheckResult; +import uk.gov.justice.services.healthcheck.database.TableChecker; +import uk.gov.justice.services.jdbc.persistence.SystemJdbcDataSourceProvider; + +import java.sql.SQLException; +import java.util.List; + +import javax.inject.Inject; +import javax.sql.DataSource; + +import org.slf4j.Logger; + +public class SystemDatabaseHealthcheck implements Healthcheck { + + public static final String SYSTEM_DATABASE_HEALTHCHECK_NAME = "system-database-healthcheck"; + + public static final List SYSTEM_DATABASE_TABLE_NAMES = of( + "system_command_status", + "stored_command"); + + @Inject + private SystemJdbcDataSourceProvider systemJdbcDataSourceProvider; + + @Inject + private TableChecker tableChecker; + + @Inject + private Logger logger; + + @Override + public String getHealthcheckName() { + return SYSTEM_DATABASE_HEALTHCHECK_NAME; + } + + @Override + public String healthcheckDescription() { + return "Checks connectivity to the system database and that all tables are available"; + } + + @Override + public HealthcheckResult runHealthcheck() { + + final DataSource jobStoreDataSource = systemJdbcDataSourceProvider.getDataSource(); + + try { + return tableChecker.checkTables(SYSTEM_DATABASE_TABLE_NAMES, jobStoreDataSource); + + } catch (final SQLException e) { + logger.error("Healthcheck for system database failed.", e); + return failure(format("Exception thrown accessing system database. %s: %s", e.getClass().getName(), e.getMessage())); + } + } +} diff --git a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/database/TableCheckerTest.java b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/database/TableCheckerTest.java index 3b8703fc9..6a0d2fd49 100644 --- a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/database/TableCheckerTest.java +++ b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/database/TableCheckerTest.java @@ -4,14 +4,12 @@ import static java.util.Optional.of; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import uk.gov.justice.services.healthcheck.api.HealthcheckResult; import java.util.List; -import java.util.Optional; import javax.sql.DataSource; diff --git a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/EventStoreHealthcheckTest.java b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/EventStoreHealthcheckTest.java index 9480e390d..b418fbb8d 100644 --- a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/EventStoreHealthcheckTest.java +++ b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/EventStoreHealthcheckTest.java @@ -13,9 +13,7 @@ import uk.gov.justice.services.healthcheck.database.TableChecker; import java.sql.SQLException; -import java.util.Optional; -import javax.inject.Inject; import javax.sql.DataSource; import org.junit.Test; diff --git a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/FileStoreHealthcheckTest.java b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/FileStoreHealthcheckTest.java index 0bff7f9f9..691fc58ae 100644 --- a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/FileStoreHealthcheckTest.java +++ b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/FileStoreHealthcheckTest.java @@ -6,7 +6,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static uk.gov.justice.services.healthcheck.healthchecks.EventStoreHealthcheck.EVENT_STORE_TABLE_NAMES; import static uk.gov.justice.services.healthcheck.healthchecks.FileStoreHealthcheck.FILE_STORE_TABLE_NAMES; import uk.gov.justice.services.fileservice.api.FileServiceException; @@ -14,8 +13,6 @@ import uk.gov.justice.services.healthcheck.api.HealthcheckResult; import uk.gov.justice.services.healthcheck.database.TableChecker; -import java.sql.SQLException; - import javax.sql.DataSource; import org.junit.Test; diff --git a/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheckTest.java b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheckTest.java new file mode 100644 index 000000000..e1b34185f --- /dev/null +++ b/healthchecks/src/test/java/uk/gov/justice/services/healthcheck/healthchecks/SystemDatabaseHealthcheckTest.java @@ -0,0 +1,81 @@ +package uk.gov.justice.services.healthcheck.healthchecks; + +import static java.util.Optional.of; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static uk.gov.justice.services.healthcheck.healthchecks.SystemDatabaseHealthcheck.SYSTEM_DATABASE_TABLE_NAMES; + +import uk.gov.justice.services.healthcheck.api.HealthcheckResult; +import uk.gov.justice.services.healthcheck.database.TableChecker; +import uk.gov.justice.services.jdbc.persistence.SystemJdbcDataSourceProvider; + +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.slf4j.Logger; +@RunWith(MockitoJUnitRunner.class) +public class SystemDatabaseHealthcheckTest { + + @Mock + private SystemJdbcDataSourceProvider systemJdbcDataSourceProvider; + + @Mock + private TableChecker tableChecker; + + @Mock + private Logger logger; + + @InjectMocks + private SystemDatabaseHealthcheck systemDatabaseHealthcheck; + + @Test + public void shouldReturnCorrectHealthcheckName() throws Exception { + + assertThat(systemDatabaseHealthcheck.getHealthcheckName(), is("system-database-healthcheck")); + } + + @Test + public void shouldReturnCorrectHealthcheckDescription() throws Exception { + + assertThat(systemDatabaseHealthcheck.healthcheckDescription(), is("Checks connectivity to the system database and that all tables are available")); + } + + @Test + public void shouldGetListOfExpectedTablesFromEventStoreAsHealthcheck() throws Exception { + + final DataSource systemDataSource = mock(DataSource.class); + final HealthcheckResult healthcheckResult = mock(HealthcheckResult.class); + + when(systemJdbcDataSourceProvider.getDataSource()).thenReturn(systemDataSource); + when(tableChecker.checkTables(SYSTEM_DATABASE_TABLE_NAMES, systemDataSource)).thenReturn(healthcheckResult); + + assertThat(systemDatabaseHealthcheck.runHealthcheck(), is(healthcheckResult)); + } + + @Test + public void shouldReturnHealthcheckFailureIfAccessingTheEventStoreThrowsSqlException() throws Exception { + + final SQLException sqlException = new SQLException("Oops"); + final DataSource systemDataSource = mock(DataSource.class); + + when(systemJdbcDataSourceProvider.getDataSource()).thenReturn(systemDataSource); + when(tableChecker.checkTables(SYSTEM_DATABASE_TABLE_NAMES, systemDataSource)).thenThrow(sqlException); + + final HealthcheckResult healthcheckResult = systemDatabaseHealthcheck.runHealthcheck(); + + assertThat(healthcheckResult.isPassed(), is(false)); + assertThat(healthcheckResult.getErrorMessage().isPresent(), is(true)); + assertThat(healthcheckResult.getErrorMessage(), is(of("Exception thrown accessing system database. java.sql.SQLException: Oops"))); + + verify(logger).error("Healthcheck for system database failed.", sqlException); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index f6a8a1bf5..e8dfa64f0 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ event-store - 11.0.0-M10 + 11.0.0-M11