diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index 9704a05b69d..29c671bd5ea 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -1,6 +1,10 @@ description = "TestContainers :: Cassandra" dependencies { - compile project(":database-commons") - compile "com.datastax.cassandra:cassandra-driver-core:3.7.1" + implementation project(":database-commons") + implementation("com.datastax.oss:java-driver-core:4.10.0") { + // fasterxml 2.12 not compatible for com.github.docker-java + exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' + exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' + } } diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java index 597b1c9b017..73d03247285 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; -import com.datastax.driver.core.Cluster; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; import com.github.dockerjava.api.command.InspectContainerResponse; import org.apache.commons.io.IOUtils; import org.testcontainers.containers.delegate.CassandraDatabaseDelegate; @@ -12,6 +13,7 @@ import javax.script.ScriptException; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Optional; @@ -35,10 +37,11 @@ public class CassandraContainer> extends G private static final String CONTAINER_CONFIG_LOCATION = "/etc/cassandra"; private static final String USERNAME = "cassandra"; private static final String PASSWORD = "cassandra"; + protected static final String LOCAL_DC = "datacenter1"; private String configLocation; private String initScriptPath; - private boolean enableJmxReporting; + private Object metricRegistry; /** * @deprecated use {@link #CassandraContainer(DockerImageName)} instead @@ -59,7 +62,6 @@ public CassandraContainer(DockerImageName dockerImageName) { addExposedPort(CQL_PORT); setStartupAttempts(3); - this.enableJmxReporting = false; } @Override @@ -136,10 +138,13 @@ public SELF withInitScript(String initScriptPath) { } /** - * Initialize Cassandra client with JMX reporting enabled or disabled + * Register an external Metric Registry object in the Cassandra driver, + * see https://docs.datastax.com/en/developer/java-driver/4.10/manual/core/metrics/#metric-registry + * + * @param metricRegistry */ - public SELF withJmxReporting(boolean enableJmxReporting) { - this.enableJmxReporting = enableJmxReporting; + public SELF withMetricRegistry(Object metricRegistry) { + this.metricRegistry = metricRegistry; return self(); } @@ -167,27 +172,35 @@ public String getPassword() { return PASSWORD; } + public String getCqlHostAddress() { + return getHost() + ":" + getMappedPort(CassandraContainer.CQL_PORT); + } + + public String getLocalDc() { return CassandraContainer.LOCAL_DC; } + /** * Get configured Cluster * * Can be used to obtain connections to Cassandra in the container */ - public Cluster getCluster() { - return getCluster(this, enableJmxReporting); + public CqlSession getCqlSession() { + return getCqlSession(this, this.metricRegistry); } - public static Cluster getCluster(ContainerState containerState, boolean enableJmxReporting) { - final Cluster.Builder builder = Cluster.builder() - .addContactPoint(containerState.getHost()) - .withPort(containerState.getMappedPort(CQL_PORT)); - if (!enableJmxReporting) { - builder.withoutJMXReporting(); + public static CqlSession getCqlSession(ContainerState containerState, Object meterRegistry) { + InetSocketAddress endpoint = new InetSocketAddress(containerState.getHost(), containerState.getMappedPort(CQL_PORT)); + final CqlSessionBuilder builder = CqlSession.builder() + .addContactPoint(endpoint) + .withLocalDatacenter(LOCAL_DC); + + if (meterRegistry != null) { + builder.withMetricRegistry(meterRegistry); } return builder.build(); } - public static Cluster getCluster(ContainerState containerState) { - return getCluster(containerState, false); + public CqlSession getCqlSession(ContainerState containerState) { + return getCqlSession(containerState, false); } private DatabaseDelegate getDatabaseDelegate() { diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java index e55dd31b0ff..f5eb566a042 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java @@ -1,8 +1,9 @@ package org.testcontainers.containers.delegate; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Session; -import com.datastax.driver.core.exceptions.DriverException; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.DriverException; +import com.datastax.oss.driver.api.core.cql.ResultSet; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.testcontainers.containers.CassandraContainer; @@ -18,15 +19,14 @@ */ @Slf4j @RequiredArgsConstructor -public class CassandraDatabaseDelegate extends AbstractDatabaseDelegate { +public class CassandraDatabaseDelegate extends AbstractDatabaseDelegate { private final ContainerState container; @Override - protected Session createNewConnection() { + protected CqlSession createNewConnection() { try { - return CassandraContainer.getCluster(container) - .newSession(); + return CassandraContainer.getCqlSession(container, false); } catch (DriverException e) { log.error("Could not obtain cassandra connection"); throw new ConnectionCreationException("Could not obtain cassandra connection", e); @@ -48,9 +48,9 @@ public void execute(String statement, String scriptPath, int lineNumber, boolean } @Override - protected void closeConnectionQuietly(Session session) { + protected void closeConnectionQuietly(CqlSession cqlSession) { try { - session.getCluster().close(); + cqlSession.close(); } catch (Exception e) { log.error("Could not close cassandra connection", e); } diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java index 76c8c8438d7..191ada68c2f 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java @@ -1,14 +1,16 @@ package org.testcontainers.containers; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.testcontainers.containers.wait.CassandraQueryWaitStrategy; import org.testcontainers.utility.DockerImageName; +import java.net.InetSocketAddress; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -107,7 +109,7 @@ public void testCassandraQueryWaitStrategy() { public void testCassandraGetCluster() { try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { cassandraContainer.start(); - ResultSet resultSet = performQuery(cassandraContainer.getCluster(), "SELECT release_version FROM system.local"); + ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local"); assertTrue("Query was not applied", resultSet.wasApplied()); assertNotNull("Result set has no release_version", resultSet.one().getString(0)); } @@ -122,17 +124,13 @@ private void testInitScript(CassandraContainer cassandraContainer) { } private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) { - Cluster explicitCluster = Cluster.builder() - .addContactPoint(cassandraContainer.getHost()) - .withPort(cassandraContainer.getMappedPort(CassandraContainer.CQL_PORT)) + InetSocketAddress endpoint = new InetSocketAddress( + cassandraContainer.getHost(), + cassandraContainer.getMappedPort(CassandraContainer.CQL_PORT)); + CqlSession cqlSession = CqlSession.builder() + .addContactPoint(endpoint) + .withLocalDatacenter(CassandraContainer.LOCAL_DC) .build(); - return performQuery(explicitCluster, cql); - } - - private ResultSet performQuery(Cluster cluster, String cql) { - try (Cluster closeableCluster = cluster) { - Session session = closeableCluster.newSession(); - return session.execute(cql); - } + return cqlSession.execute(cql); } }