From c8de1a9e71bd356e9fa55066b671160df1479dfd Mon Sep 17 00:00:00 2001 From: odidev Date: Fri, 25 Sep 2020 13:38:19 +0000 Subject: [PATCH] Add support for java-driver-core - Upgrade cassandra-driver-core(3.7.1) to java-driver-core(4.9.0) as cassandra-driver-core is moved to java-driver-core - java-driver-core is using netty(4.1.51.Final) which includes both security fixes and AArch64 performance improvements - Refer release notes for detail: - https://netty.io/news/2020/05/13/4-1-50-Final.html - https://netty.io/news/2020/07/09/4-1-51-Final.html --- docs/modules/databases/cassandra.md | 24 ++++---- modules/cassandra/build.gradle | 2 +- .../containers/CassandraContainer.java | 31 +++++----- .../delegate/CassandraDatabaseDelegate.java | 14 ++--- .../containers/CassandraContainerTest.java | 56 ++++++++++--------- .../cassandra/src/test/resources/initial.cql | 6 +- 6 files changed, 63 insertions(+), 70 deletions(-) diff --git a/docs/modules/databases/cassandra.md b/docs/modules/databases/cassandra.md index d15304afa81..acf47aadeab 100644 --- a/docs/modules/databases/cassandra.md +++ b/docs/modules/databases/cassandra.md @@ -7,29 +7,27 @@ This example connects to the Cassandra Cluster, creates a keyspaces and asserts ```java tab="JUnit 4 example" public class SomeTest { - @Rule - public CassandraContainer cassandra = new CassandraContainer(); - - @Test public void test(){ - Cluster cluster = cassandra.getCluster(); + try (CassandraContainer cassandra = new CassandraContainer<>(CASSANDRA_IMAGE)) { + cassandra.start(); - try(Session session = cluster.connect()) { + CqlSession session = CqlSession.builder() + .addContactPoint(new InetSocketAddress(cassandra.getHost(), cassandra.getMappedPort(cassandra.CQL_PORT))) + .withLocalDatacenter("datacenter1") + .build(); session.execute("CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + "{'class':'SimpleStrategy','replication_factor':'1'};"); - List keyspaces = session.getCluster().getMetadata().getKeyspaces(); - List filteredKeyspaces = keyspaces - .stream() - .filter(km -> km.getName().equals("test")) - .collect(Collectors.toList()); + KeyspaceMetadata keyspace = session + .getMetadata() + .getKeyspaces() + .get(CqlIdentifier.fromCql("test")); - assertEquals(1, filteredKeyspaces.size()); + assertNotNull("Failed to create test keyspace", keyspace); } } - } ``` diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index 9704a05b69d..a7d8c1319cd 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -2,5 +2,5 @@ description = "TestContainers :: Cassandra" dependencies { compile project(":database-commons") - compile "com.datastax.cassandra:cassandra-driver-core:3.7.1" + compile "com.datastax.oss:java-driver-core:4.9.0" } 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 681c58f4efb..bd60516bf9c 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.session.Session; 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; @@ -165,29 +167,22 @@ public String getPassword() { return PASSWORD; } - /** - * Get configured Cluster - * - * Can be used to obtain connections to Cassandra in the container - */ - public Cluster getCluster() { - return getCluster(this, enableJmxReporting); + public CqlSession getSession() { + return getSession(this, enableJmxReporting); } - 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(); - } - return builder.build(); + public static CqlSession getSession(ContainerState containerState, boolean enableJmxReporting) { + CqlSession session = CqlSession.builder() + .addContactPoint(new InetSocketAddress(containerState.getHost(), containerState.getMappedPort(CQL_PORT))) + .withLocalDatacenter("datacenter1").build(); + return session; } - public static Cluster getCluster(ContainerState containerState) { - return getCluster(containerState, false); + public static CqlSession getSession(ContainerState containerState) { + return getSession(containerState, false); } + private DatabaseDelegate getDatabaseDelegate() { return new CassandraDatabaseDelegate(this); } 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..b208ceefaee 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.cql.ResultSet; +import com.datastax.oss.driver.api.core.session.Session; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.DriverException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.testcontainers.containers.CassandraContainer; @@ -25,8 +26,7 @@ public class CassandraDatabaseDelegate extends AbstractDatabaseDelegate @Override protected Session createNewConnection() { try { - return CassandraContainer.getCluster(container) - .newSession(); + return CassandraContainer.getSession(container); } catch (DriverException e) { log.error("Could not obtain cassandra connection"); throw new ConnectionCreationException("Could not obtain cassandra connection", e); @@ -36,7 +36,7 @@ protected Session createNewConnection() { @Override public void execute(String statement, String scriptPath, int lineNumber, boolean continueOnError, boolean ignoreFailedDrops) { try { - ResultSet result = getConnection().execute(statement); + ResultSet result = CassandraContainer.getSession(container).execute(statement); if (result.wasApplied()) { log.debug("Statement {} was applied", statement); } else { @@ -50,7 +50,7 @@ public void execute(String statement, String scriptPath, int lineNumber, boolean @Override protected void closeConnectionQuietly(Session session) { try { - session.getCluster().close(); + session.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..74ac0adaae3 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.CqlIdentifier; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.datastax.oss.driver.api.core.session.Session; +import java.net.InetSocketAddress; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.testcontainers.containers.wait.CassandraQueryWaitStrategy; import org.testcontainers.utility.DockerImageName; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -89,6 +91,24 @@ public void testInitScriptWithLegacyCassandra() { } } + @Test + public void testKeyspace(){ + try (CassandraContainer cassandra = new CassandraContainer<>(CASSANDRA_IMAGE)) { + cassandra.start(); + CqlSession session = CqlSession.builder() + .addContactPoint(new InetSocketAddress(cassandra.getHost(), cassandra.getMappedPort(cassandra.CQL_PORT))) + .withLocalDatacenter("datacenter1") + .build(); + session.execute("CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + + "{'class':'SimpleStrategy','replication_factor':'1'};"); + KeyspaceMetadata keyspace = session + .getMetadata() + .getKeyspaces() + .get(CqlIdentifier.fromCql("test")); + assertNotNull("Failed to create test keyspace", keyspace); + } + } + @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test public void testCassandraQueryWaitStrategy() { @@ -102,17 +122,6 @@ public void testCassandraQueryWaitStrategy() { } } - @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility - @Test - public void testCassandraGetCluster() { - try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { - cassandraContainer.start(); - ResultSet resultSet = performQuery(cassandraContainer.getCluster(), "SELECT release_version FROM system.local"); - assertTrue("Query was not applied", resultSet.wasApplied()); - assertNotNull("Result set has no release_version", resultSet.one().getString(0)); - } - } - private void testInitScript(CassandraContainer cassandraContainer) { ResultSet resultSet = performQuery(cassandraContainer, "SELECT * FROM keySpaceTest.catalog_category"); assertTrue("Query was not applied", resultSet.wasApplied()); @@ -122,17 +131,10 @@ 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)) + CqlSession session = CqlSession.builder() + .addContactPoint(new InetSocketAddress(cassandraContainer.getHost(), cassandraContainer.getMappedPort(CassandraContainer.CQL_PORT))) + .withLocalDatacenter("datacenter1") .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 session.execute(cql); } } diff --git a/modules/cassandra/src/test/resources/initial.cql b/modules/cassandra/src/test/resources/initial.cql index 2caad3746f8..e6511698196 100644 --- a/modules/cassandra/src/test/resources/initial.cql +++ b/modules/cassandra/src/test/resources/initial.cql @@ -1,7 +1,5 @@ CREATE KEYSPACE keySpaceTest WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1}; -USE keySpaceTest; +CREATE TABLE keySpaceTest.catalog_category (id bigint primary key, name text); -CREATE TABLE catalog_category (id bigint primary key, name text); - -INSERT INTO catalog_category (id, name) VALUES (1, 'test_category'); \ No newline at end of file +INSERT INTO keySpaceTest.catalog_category (id, name) VALUES (1, 'test_category');