JAMES-2563 Add Cassandra Healthcheck

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4ab19212
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4ab19212
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4ab19212

Branch: refs/heads/master
Commit: 4ab1921262478a364278cf8b507faa2828c6d2b2
Parents: e53eb32
Author: matzepan <[email protected]>
Authored: Sat Oct 20 14:02:36 2018 +0200
Committer: Benoit Tellier <[email protected]>
Committed: Mon Oct 29 19:15:00 2018 +0700

----------------------------------------------------------------------
 backends-common/cassandra/pom.xml               |  4 +
 .../cassandra/utils/CassandraHealthCheck.java   | 65 ++++++++++++++++
 .../utils/CassandraHealthCheckTest.java         | 78 ++++++++++++++++++++
 3 files changed, 147 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4ab19212/backends-common/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/pom.xml 
b/backends-common/cassandra/pom.xml
index c9a9e9a..1358325 100644
--- a/backends-common/cassandra/pom.xml
+++ b/backends-common/cassandra/pom.xml
@@ -37,6 +37,10 @@
     <dependencies>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-lifecycle-api</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/4ab19212/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java
----------------------------------------------------------------------
diff --git 
a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java
 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java
new file mode 100644
index 0000000..b5fca40
--- /dev/null
+++ 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java
@@ -0,0 +1,65 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.backends.cassandra.utils;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.healthcheck.ComponentName;
+import org.apache.james.core.healthcheck.HealthCheck;
+import org.apache.james.core.healthcheck.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.datastax.driver.core.Session;
+
+/**
+ * Health check for the Cassandra backend.
+ *
+ */
+public class CassandraHealthCheck implements HealthCheck {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(CassandraHealthCheck.class);
+    private static final ComponentName COMPONENT_NAME = new 
ComponentName("Cassandra backend");
+
+    private Session session;
+
+    @Inject
+    public CassandraHealthCheck(Session session) {
+        this.session = session;
+    }
+
+    @Override
+    public ComponentName componentName() {
+        return COMPONENT_NAME;
+    }
+
+    @Override
+    public Result check() {
+        try {
+            // execute a simple query to check if cassandra is responding
+            // idea from: https://stackoverflow.com/questions/10246287
+            session.execute("SELECT NOW() FROM system.local");
+            return Result.healthy(COMPONENT_NAME);
+        } catch (Exception e) {
+            LOGGER.error("Error checking cassandra backend", e);
+            return Result.unhealthy(COMPONENT_NAME);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/4ab19212/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheckTest.java
----------------------------------------------------------------------
diff --git 
a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheckTest.java
 
b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheckTest.java
new file mode 100644
index 0000000..bff49df
--- /dev/null
+++ 
b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheckTest.java
@@ -0,0 +1,78 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.backends.cassandra.utils;
+
+import org.apache.james.backends.cassandra.*;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.core.healthcheck.Result;
+
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CassandraHealthCheckTest {
+
+    @Rule
+    public DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
+    private CassandraHealthCheck healthCheck;
+
+    @BeforeEach
+    void setUp() {
+        CassandraCluster cassandra = 
CassandraCluster.create(CassandraModule.builder().build(), 
cassandraServer.getHost());
+        healthCheck = new CassandraHealthCheck(cassandra.getConf());
+    }
+
+    @Test
+    void checkShouldReturnHealthyWhenCassandraIsRunning() {
+        Result check = healthCheck.check();
+
+        assertThat(check.isHealthy()).isTrue();
+    }
+
+    @Test
+    void checkShouldReturnUnhealthyWhenCassandraIsNotRunning() {
+        cassandraServer.pause();
+
+        Result check = healthCheck.check();
+
+        assertThat(check.isUnHealthy()).isTrue();
+    }
+
+    @Test
+    void checkShouldDetectWhenCassandraRecovered() {
+        cassandraServer.pause();
+
+        healthCheck.check();
+
+        cassandraServer.unpause();
+
+        Result check = healthCheck.check();
+
+        assertThat(check.isHealthy()).isTrue();
+    }
+
+
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to