From eba6c907e96b37f5c30f75a88ce12cef517eb6a1 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 17 Jun 2020 16:05:53 +0100 Subject: [PATCH 01/12] wip: status handler --- .../wlgitbridge/server/GitBridgeServer.java | 1 + .../ic/wlgitbridge/server/StatusHandler.java | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index 3008ed1028..e39dbb3a41 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -128,6 +128,7 @@ public class GitBridgeServer { api.setContextPath("/api"); HandlerCollection handlers = new HandlerList(); + handlers.addHandler(new StatusHandler(bridge)); handlers.addHandler(initResourceHandler()); handlers.addHandler(new PostbackHandler(bridge)); handlers.addHandler(new DefaultHandler()); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java new file mode 100644 index 0000000000..fc60aa8057 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java @@ -0,0 +1,40 @@ +package uk.ac.ic.wlgitbridge.server; + +import org.eclipse.jetty.server.HttpConnection; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uk.ac.ic.wlgitbridge.bridge.Bridge; +import uk.ac.ic.wlgitbridge.util.Log; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class StatusHandler extends AbstractHandler { + + private final Bridge bridge; + + public StatusHandler(Bridge bridge) { + this.bridge = bridge; + } + + @Override + public void handle( + String target, + Request baseRequest, + HttpServletRequest request, + HttpServletResponse response + ) throws IOException { + if ("GET".equals(baseRequest.getMethod()) && "/status".equals(target)) { + Log.info("GET <- /api/status"); + baseRequest.setHandled(true); + response.setContentType("text/plain"); + response.setStatus(200); + response.getWriter().println("ok"); + } + } + +} From 1befc3582b759d44f6b46e0ad597431f53a73b7e Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 17 Jun 2020 16:15:40 +0100 Subject: [PATCH 02/12] wip: add skeleton health-check handler --- .../wlgitbridge/server/GitBridgeServer.java | 1 + .../server/HealthCheckHandler.java | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index e39dbb3a41..86c7e193c0 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -129,6 +129,7 @@ public class GitBridgeServer { HandlerCollection handlers = new HandlerList(); handlers.addHandler(new StatusHandler(bridge)); + handlers.addHandler(new HealthCheckHandler(bridge)); handlers.addHandler(initResourceHandler()); handlers.addHandler(new PostbackHandler(bridge)); handlers.addHandler(new DefaultHandler()); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java new file mode 100644 index 0000000000..c7f30b3497 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java @@ -0,0 +1,40 @@ +package uk.ac.ic.wlgitbridge.server; + +import org.eclipse.jetty.server.HttpConnection; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uk.ac.ic.wlgitbridge.bridge.Bridge; +import uk.ac.ic.wlgitbridge.util.Log; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class HealthCheckHandler extends AbstractHandler { + + private final Bridge bridge; + + public HealthCheckHandler(Bridge bridge) { + this.bridge = bridge; + } + + @Override + public void handle( + String target, + Request baseRequest, + HttpServletRequest request, + HttpServletResponse response + ) throws IOException { + if ("GET".equals(baseRequest.getMethod()) && "/health_check".equals(target)) { + Log.info("GET <- /api/health_check"); + baseRequest.setHandled(true); + response.setContentType("text/plain"); + response.setStatus(200); + response.getWriter().println("ok"); + } + } + +} From 86769eedea22fc8136e48ec7cafecab1877faccc Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 11:45:04 +0100 Subject: [PATCH 03/12] Add a healthCheck method to the Bridge, check db --- .../main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java index 9246eb988f..3e54cd1920 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java @@ -263,6 +263,17 @@ public class Bridge { gcJob.start(); } + public boolean healthCheck() { + try { + dbStore.getNumProjects(); + Log.error("[HealthCheck] passed"); + return true; + } catch (Exception e) { + Log.error("[HealthCheck] FAILED!", e); + return false; + } + } + /** * Performs a check of inconsistencies in the DB. This was used to upgrade * the schema. From 689362b24f98126c482f2d2632ba0cc2bd594d06 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 11:45:21 +0100 Subject: [PATCH 04/12] Use the bridge.healthCheck method --- .../uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java index c7f30b3497..74f962fb65 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java @@ -32,8 +32,13 @@ public class HealthCheckHandler extends AbstractHandler { Log.info("GET <- /api/health_check"); baseRequest.setHandled(true); response.setContentType("text/plain"); - response.setStatus(200); - response.getWriter().println("ok"); + if (bridge.healthCheck()) { + response.setStatus(200); + response.getWriter().println("ok"); + } else { + response.setStatus(500); + response.getWriter().println("failed"); + } } } From badeea3e0ba73e5eabc13f6d44ec61f4be2054a1 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 13:54:10 +0100 Subject: [PATCH 05/12] Add test for status and health-check endpoints --- .../WLGitBridgeIntegrationTest.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index 2aeedde531..4a1ab04adb 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -3,6 +3,13 @@ package uk.ac.ic.wlgitbridge.application; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import static org.asynchttpclient.Dsl.*; + +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClients; import org.asynchttpclient.*; import org.eclipse.jgit.api.errors.GitAPIException; import org.junit.After; @@ -891,7 +898,29 @@ public class WLGitBridgeIntegrationTest { wlgb.stop(); } - private String makeConfigFile( + @Test + public void testStatusAndHealthCheckEndpoints() throws ClientProtocolException, IOException { + int gitBridgePort = 33887; + int mockServerPort = 3887; + server = new MockSnapshotServer(mockServerPort, getResource("/canCloneARepository").toFile()); + server.start(); + server.setState(states.get("canCloneARepository").get("state")); + wlgb = new GitBridgeApp(new String[] { + makeConfigFile(gitBridgePort, mockServerPort) + }); + wlgb.run(); + HttpClient client = HttpClients.createDefault(); + // Status + HttpGet statusRequest = new HttpGet("http://127.0.0.1:"+gitBridgePort+"/api/status"); + HttpResponse statusResponse = client.execute(statusRequest); + assertEquals(statusResponse.getStatusLine().getStatusCode(), 200); + // Health Check + HttpGet healthCheckRequest = new HttpGet("http://127.0.0.1:"+gitBridgePort+"/api/health_check"); + HttpResponse healthCheckResponse = client.execute(healthCheckRequest); + assertEquals(healthCheckResponse.getStatusLine().getStatusCode(), 200); + } + + private String makeConfigFile( int port, int apiPort ) throws IOException { From 973a18b1b843717acebd70062370661edbcc554a Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 14:56:38 +0100 Subject: [PATCH 06/12] Clean up new healthcheck test --- .../wlgitbridge/application/WLGitBridgeIntegrationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index 4a1ab04adb..b2fb4e08a5 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -910,12 +910,13 @@ public class WLGitBridgeIntegrationTest { }); wlgb.run(); HttpClient client = HttpClients.createDefault(); + String urlBase = "http://127.0.0.1:" + gitBridgePort; // Status - HttpGet statusRequest = new HttpGet("http://127.0.0.1:"+gitBridgePort+"/api/status"); + HttpGet statusRequest = new HttpGet(urlBase+"/api/status"); HttpResponse statusResponse = client.execute(statusRequest); assertEquals(statusResponse.getStatusLine().getStatusCode(), 200); // Health Check - HttpGet healthCheckRequest = new HttpGet("http://127.0.0.1:"+gitBridgePort+"/api/health_check"); + HttpGet healthCheckRequest = new HttpGet(urlBase+"/api/health_check"); HttpResponse healthCheckResponse = client.execute(healthCheckRequest); assertEquals(healthCheckResponse.getStatusLine().getStatusCode(), 200); } From 40a171d44a153a5f35e8ba48dfd3bc35fb43729c Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 14:56:50 +0100 Subject: [PATCH 07/12] Also check we can touch the filesystem in healthcheck --- .../src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java index 3e54cd1920..6bd5df2a59 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java @@ -266,6 +266,10 @@ public class Bridge { public boolean healthCheck() { try { dbStore.getNumProjects(); + File rootDirectory = new File("/"); + if (!rootDirectory.exists()) { + throw new Exception("bad filesystem state, root directory does not exist"); + } Log.error("[HealthCheck] passed"); return true; } catch (Exception e) { From 3c6ef380364cc8f63056f322a19087918b34bcaa Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 18 Jun 2020 15:00:17 +0100 Subject: [PATCH 08/12] Fix alignment of function --- .../ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index b2fb4e08a5..07373b40a4 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -921,7 +921,7 @@ public class WLGitBridgeIntegrationTest { assertEquals(healthCheckResponse.getStatusLine().getStatusCode(), 200); } - private String makeConfigFile( + private String makeConfigFile( int port, int apiPort ) throws IOException { From 8def058d85a29bedf5946524f139761bbd24c817 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 19 Jun 2020 15:50:16 +0100 Subject: [PATCH 09/12] Fix log level --- .../src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java index 6bd5df2a59..c5b82cb142 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java @@ -270,7 +270,7 @@ public class Bridge { if (!rootDirectory.exists()) { throw new Exception("bad filesystem state, root directory does not exist"); } - Log.error("[HealthCheck] passed"); + Log.info("[HealthCheck] passed"); return true; } catch (Exception e) { Log.error("[HealthCheck] FAILED!", e); From ed778639a87acdd258638d12c4262a1b5888fc38 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 19 Jun 2020 15:50:27 +0100 Subject: [PATCH 10/12] Move the status and healthcheck to root level --- .../ac/ic/wlgitbridge/server/GitBridgeServer.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index 86c7e193c0..7424c98056 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -119,17 +119,26 @@ public class GitBridgeServer { ) throws ServletException { HandlerCollection handlers = new HandlerList(); handlers.addHandler(initApiHandler()); + handlers.addHandler(initBaseHandler()); handlers.addHandler(initGitHandler(config, repoStore, snapshotApi)); jettyServer.setHandler(handlers); } + private Handler initBaseHandler() { + ContextHandler base = new ContextHandler(); + base.setContextPath("/"); + HandlerCollection handlers = new HandlerList(); + handlers.addHandler(new StatusHandler(bridge)); + handlers.addHandler(new HealthCheckHandler(bridge)); + base.setHandler(handlers); + return base; + } + private Handler initApiHandler() { ContextHandler api = new ContextHandler(); api.setContextPath("/api"); HandlerCollection handlers = new HandlerList(); - handlers.addHandler(new StatusHandler(bridge)); - handlers.addHandler(new HealthCheckHandler(bridge)); handlers.addHandler(initResourceHandler()); handlers.addHandler(new PostbackHandler(bridge)); handlers.addHandler(new DefaultHandler()); From ec278ffe0acbaa2cf3a7dd77324fb927e9953945 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 19 Jun 2020 15:50:42 +0100 Subject: [PATCH 11/12] Fix log lines --- .../java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java | 2 +- .../main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java index 74f962fb65..120b2d6163 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java @@ -29,7 +29,7 @@ public class HealthCheckHandler extends AbstractHandler { HttpServletResponse response ) throws IOException { if ("GET".equals(baseRequest.getMethod()) && "/health_check".equals(target)) { - Log.info("GET <- /api/health_check"); + Log.info("GET <- /health_check"); baseRequest.setHandled(true); response.setContentType("text/plain"); if (bridge.healthCheck()) { diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java index fc60aa8057..802db35bd1 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java @@ -29,7 +29,7 @@ public class StatusHandler extends AbstractHandler { HttpServletResponse response ) throws IOException { if ("GET".equals(baseRequest.getMethod()) && "/status".equals(target)) { - Log.info("GET <- /api/status"); + Log.info("GET <- /status"); baseRequest.setHandled(true); response.setContentType("text/plain"); response.setStatus(200); From 6ff3877dd1f0d2dee2c91b8c06875eb7b943f0b4 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Fri, 19 Jun 2020 15:50:51 +0100 Subject: [PATCH 12/12] Fix status and healthcheck tests --- .../application/WLGitBridgeIntegrationTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index 07373b40a4..482fe8de8d 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -912,13 +912,13 @@ public class WLGitBridgeIntegrationTest { HttpClient client = HttpClients.createDefault(); String urlBase = "http://127.0.0.1:" + gitBridgePort; // Status - HttpGet statusRequest = new HttpGet(urlBase+"/api/status"); + HttpGet statusRequest = new HttpGet(urlBase+"/status"); HttpResponse statusResponse = client.execute(statusRequest); - assertEquals(statusResponse.getStatusLine().getStatusCode(), 200); + assertEquals(200, statusResponse.getStatusLine().getStatusCode()); // Health Check - HttpGet healthCheckRequest = new HttpGet(urlBase+"/api/health_check"); + HttpGet healthCheckRequest = new HttpGet(urlBase+"/health_check"); HttpResponse healthCheckResponse = client.execute(healthCheckRequest); - assertEquals(healthCheckResponse.getStatusLine().getStatusCode(), 200); + assertEquals(200, healthCheckResponse.getStatusLine().getStatusCode()); } private String makeConfigFile(