Skip to content

Commit c38ba11

Browse files
emerkle826kivieweddumelendez
authored
Update Cassandra driver to 4.x (#2830)
Also, deprecate Driver 3.x methods and remove some driver coupling. Co-authored-by: Kevin Wittek <[email protected]> Co-authored-by: Eddú Meléndez <[email protected]>
1 parent 7c3c00e commit c38ba11

File tree

6 files changed

+126
-37
lines changed

6 files changed

+126
-37
lines changed

docs/modules/databases/cassandra.md

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,12 @@
44

55
This example connects to the Cassandra Cluster, creates a keyspaces and asserts that is has been created.
66

7-
=== "JUnit 4 example"
8-
```java
9-
public class SomeTest {
10-
11-
@Rule
12-
public CassandraContainer cassandra = new CassandraContainer();
13-
14-
15-
@Test
16-
public void test(){
17-
Cluster cluster = cassandra.getCluster();
18-
19-
try(Session session = cluster.connect()) {
20-
21-
session.execute("CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" +
22-
"{'class':'SimpleStrategy','replication_factor':'1'};");
23-
24-
List<KeyspaceMetadata> keyspaces = session.getCluster().getMetadata().getKeyspaces();
25-
List<KeyspaceMetadata> filteredKeyspaces = keyspaces
26-
.stream()
27-
.filter(km -> km.getName().equals("test"))
28-
.collect(Collectors.toList());
29-
30-
assertEquals(1, filteredKeyspaces.size());
31-
}
32-
}
33-
34-
}
35-
```
7+
<!--codeinclude-->
8+
[Building CqlSession](../../../modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java) inside_block:cassandra
9+
<!--/codeinclude-->
10+
11+
!!! warning
12+
All methods returning instances of the Cassandra Driver's Cluster object in `CassandraContainer` have been deprecated. Providing these methods unnecessarily couples the Container to the Driver and creates potential breaking changes if the driver is updated.
3613

3714
## Adding this module to your project dependencies
3815

modules/cassandra/build.gradle

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
description = "TestContainers :: Cassandra"
22

3+
configurations.all {
4+
resolutionStrategy {
5+
force 'io.dropwizard.metrics:metrics-core:3.2.4'
6+
}
7+
}
8+
39
dependencies {
410
api project(":database-commons")
5-
api "com.datastax.cassandra:cassandra-driver-core:3.7.1"
11+
api "com.datastax.cassandra:cassandra-driver-core:3.10.0"
12+
testImplementation 'com.datastax.oss:java-driver-core:4.8.0'
613
}

modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.testcontainers.utility.MountableFile;
1212

1313
import java.io.IOException;
14+
import java.net.InetSocketAddress;
1415
import java.net.URL;
1516
import java.nio.charset.StandardCharsets;
1617
import java.util.Optional;
@@ -35,6 +36,8 @@ public class CassandraContainer<SELF extends CassandraContainer<SELF>> extends G
3536

3637
public static final Integer CQL_PORT = 9042;
3738

39+
private static final String DEFAULT_LOCAL_DATACENTER = "datacenter1";
40+
3841
private static final String CONTAINER_CONFIG_LOCATION = "/etc/cassandra";
3942

4043
private static final String USERNAME = "cassandra";
@@ -70,6 +73,8 @@ public CassandraContainer(DockerImageName dockerImageName) {
7073
withEnv("JVM_OPTS", "-Dcassandra.skip_wait_for_gossip_to_settle=0 -Dcassandra.initial_token=0");
7174
withEnv("HEAP_NEWSIZE", "128M");
7275
withEnv("MAX_HEAP_SIZE", "1024M");
76+
withEnv("CASSANDRA_ENDPOINT_SNITCH", "GossipingPropertyFileSnitch");
77+
withEnv("CASSANDRA_DC", DEFAULT_LOCAL_DATACENTER);
7378
}
7479

7580
@Override
@@ -187,11 +192,20 @@ public String getPassword() {
187192
* Get configured Cluster
188193
*
189194
* Can be used to obtain connections to Cassandra in the container
195+
*
196+
* @deprecated For Cassandra driver 3.x, use {@link #getHost()} and {@link #getMappedPort(int)} with
197+
* the driver's {@link Cluster#builder() Cluster.Builder} {@code addContactPoint(String)} and
198+
* {@code withPort(int)} methods to create a Cluster object. For Cassandra driver 4.x, use
199+
* {@link #getContactPoint()} and {@link #getLocalDatacenter()} with the driver's {@code CqlSession.builder()}
200+
* {@code addContactPoint(InetSocketAddress)} and {@code withLocalDatacenter(String)} methods to create
201+
* a Session Object. See https://docs.datastax.com/en/developer/java-driver/ for more on the driver.
190202
*/
203+
@Deprecated
191204
public Cluster getCluster() {
192205
return getCluster(this, enableJmxReporting);
193206
}
194207

208+
@Deprecated
195209
public static Cluster getCluster(ContainerState containerState, boolean enableJmxReporting) {
196210
final Cluster.Builder builder = Cluster
197211
.builder()
@@ -203,10 +217,30 @@ public static Cluster getCluster(ContainerState containerState, boolean enableJm
203217
return builder.build();
204218
}
205219

220+
@Deprecated
206221
public static Cluster getCluster(ContainerState containerState) {
207222
return getCluster(containerState, false);
208223
}
209224

225+
/**
226+
* Retrieve an {@link InetSocketAddress} for connecting to the Cassandra container via the driver.
227+
*
228+
* @return A InetSocketAddrss representation of this Cassandra container's host and port.
229+
*/
230+
public InetSocketAddress getContactPoint() {
231+
return new InetSocketAddress(getHost(), getMappedPort(CQL_PORT));
232+
}
233+
234+
/**
235+
* Retrieve the Local Datacenter for connecting to the Cassandra container via the driver.
236+
*
237+
* @return The configured local Datacenter name.
238+
*/
239+
public String getLocalDatacenter() {
240+
return getEnvMap().getOrDefault("CASSANDRA_DC", DEFAULT_LOCAL_DATACENTER);
241+
}
242+
243+
@Deprecated
210244
private DatabaseDelegate getDatabaseDelegate() {
211245
return new CassandraDatabaseDelegate(this);
212246
}

modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ public class CassandraContainerTest {
2323

2424
private static final String TEST_CLUSTER_NAME_IN_CONF = "Test Cluster Integration Test";
2525

26+
private static final String BASIC_QUERY = "SELECT release_version FROM system.local";
27+
2628
@Test
2729
public void testSimple() {
2830
try (CassandraContainer<?> cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE)) {
2931
cassandraContainer.start();
30-
ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local");
32+
ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY);
3133
assertTrue("Query was not applied", resultSet.wasApplied());
3234
assertNotNull("Result set has no release_version", resultSet.one().getString(0));
3335
}
@@ -42,7 +44,7 @@ public void testSpecificVersion() {
4244
)
4345
) {
4446
cassandraContainer.start();
45-
ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local");
47+
ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY);
4648
assertTrue("Query was not applied", resultSet.wasApplied());
4749
assertEquals("Cassandra has wrong version", cassandraVersion, resultSet.one().getString(0));
4850
}
@@ -107,7 +109,7 @@ public void testCassandraQueryWaitStrategy() {
107109
.waitingFor(new CassandraQueryWaitStrategy())
108110
) {
109111
cassandraContainer.start();
110-
ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local");
112+
ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY);
111113
assertTrue("Query was not applied", resultSet.wasApplied());
112114
}
113115
}
@@ -117,10 +119,7 @@ public void testCassandraQueryWaitStrategy() {
117119
public void testCassandraGetCluster() {
118120
try (CassandraContainer<?> cassandraContainer = new CassandraContainer<>()) {
119121
cassandraContainer.start();
120-
ResultSet resultSet = performQuery(
121-
cassandraContainer.getCluster(),
122-
"SELECT release_version FROM system.local"
123-
);
122+
ResultSet resultSet = performQuery(cassandraContainer.getCluster(), BASIC_QUERY);
124123
assertTrue("Query was not applied", resultSet.wasApplied());
125124
assertNotNull("Result set has no release_version", resultSet.one().getString(0));
126125
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.testcontainers.containers;
2+
3+
import com.datastax.oss.driver.api.core.CqlIdentifier;
4+
import com.datastax.oss.driver.api.core.CqlSession;
5+
import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata;
6+
import org.junit.Rule;
7+
import org.junit.Test;
8+
9+
import static org.junit.Assert.assertNotNull;
10+
11+
public class CassandraDriver3Test {
12+
13+
@Rule
14+
public CassandraContainer<?> cassandra = new CassandraContainer<>("cassandra:3.11.2");
15+
16+
@Test
17+
public void testCassandraGetContactPoint() {
18+
try (
19+
// cassandra {
20+
CqlSession session = CqlSession
21+
.builder()
22+
.addContactPoint(this.cassandra.getContactPoint())
23+
.withLocalDatacenter(this.cassandra.getLocalDatacenter())
24+
.build()
25+
// }
26+
) {
27+
session.execute(
28+
"CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" +
29+
"{'class':'SimpleStrategy','replication_factor':'1'};"
30+
);
31+
32+
KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test"));
33+
34+
assertNotNull("Failed to create test keyspace", keyspace);
35+
}
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.testcontainers.containers;
2+
3+
import com.datastax.oss.driver.api.core.CqlIdentifier;
4+
import com.datastax.oss.driver.api.core.CqlSession;
5+
import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata;
6+
import org.junit.Rule;
7+
import org.junit.Test;
8+
9+
import static org.junit.Assert.assertNotNull;
10+
11+
public class CassandraDriver4Test {
12+
13+
@Rule
14+
public CassandraContainer<?> cassandra = new CassandraContainer<>("cassandra:3.11.2");
15+
16+
@Test
17+
public void testCassandraGetContactPoint() {
18+
try (
19+
CqlSession session = CqlSession
20+
.builder()
21+
.addContactPoint(this.cassandra.getContactPoint())
22+
.withLocalDatacenter(this.cassandra.getLocalDatacenter())
23+
.build()
24+
) {
25+
session.execute(
26+
"CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" +
27+
"{'class':'SimpleStrategy','replication_factor':'1'};"
28+
);
29+
30+
KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test"));
31+
32+
assertNotNull("Failed to create test keyspace", keyspace);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)