Skip to content

Commit af00b41

Browse files
committed
add custom config file. add ssl test and document it
1 parent b5fa599 commit af00b41

File tree

11 files changed

+833
-67
lines changed

11 files changed

+833
-67
lines changed

docs/modules/databases/scylladb.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,20 @@ You can start a ScyllaDB container instance from any Java application by using:
1010
[Create container](../../../modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java) inside_block:container
1111
<!--/codeinclude-->
1212

13+
<!--codeinclude-->
14+
[Custom config file](../../../modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java) inside_block:custom_configuration
15+
<!--/codeinclude-->
16+
1317
### Building CqlSession
1418

1519
<!--codeinclude-->
1620
[Using CQL port](../../../modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java) inside_block:session
1721
<!--/codeinclude-->
1822

23+
<!--codeinclude-->
24+
[Using SSL](../../../modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java) inside_block:sslContext
25+
<!--/codeinclude-->
26+
1927
<!--codeinclude-->
2028
[Using Shard Awareness port](../../../modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java) inside_block:shardAwarenessSession
2129
<!--/codeinclude-->

modules/scylladb/src/main/java/org/testcontainers/scylladb/ScyllaDBContainer.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import org.testcontainers.containers.GenericContainer;
44
import org.testcontainers.containers.wait.strategy.Wait;
55
import org.testcontainers.utility.DockerImageName;
6+
import org.testcontainers.utility.MountableFile;
67

78
import java.net.InetSocketAddress;
9+
import java.util.Optional;
810

911
/**
1012
* Testcontainers implementation for ScyllaDB.
@@ -30,8 +32,12 @@ public class ScyllaDBContainer extends GenericContainer<ScyllaDBContainer> {
3032

3133
private static final String COMMAND = "--developer-mode=1 --overprovisioned=1";
3234

35+
private static final String CONTAINER_CONFIG_LOCATION = "/etc/scylla";
36+
3337
private boolean alternatorEnabled = false;
3438

39+
private String configLocation;
40+
3541
public ScyllaDBContainer(String dockerImageName) {
3642
this(DockerImageName.parse(dockerImageName));
3743
}
@@ -54,6 +60,18 @@ protected void configure() {
5460
COMMAND + " --alternator-port=" + ALTERNATOR_PORT + " --alternator-write-isolation=always";
5561
withCommand(newCommand);
5662
}
63+
64+
// Map (effectively replace) directory in Docker with the content of resourceLocation if resource location is
65+
// not null.
66+
Optional
67+
.ofNullable(configLocation)
68+
.map(MountableFile::forClasspathResource)
69+
.ifPresent(mountableFile -> withCopyFileToContainer(mountableFile, CONTAINER_CONFIG_LOCATION));
70+
}
71+
72+
public ScyllaDBContainer withConfigurationOverride(String configLocation) {
73+
this.configLocation = configLocation;
74+
return this;
5775
}
5876

5977
public ScyllaDBContainer withAlternator() {

modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,34 @@
1515
import software.amazon.awssdk.services.dynamodb.model.KeyType;
1616
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;
1717

18+
import javax.net.ssl.KeyManagerFactory;
19+
import javax.net.ssl.SSLContext;
20+
import javax.net.ssl.TrustManagerFactory;
21+
import java.io.IOException;
1822
import java.net.URI;
23+
import java.nio.file.Files;
24+
import java.nio.file.Paths;
25+
import java.security.KeyManagementException;
26+
import java.security.KeyStore;
27+
import java.security.KeyStoreException;
28+
import java.security.NoSuchAlgorithmException;
29+
import java.security.UnrecoverableKeyException;
30+
import java.security.cert.CertificateException;
1931

2032
import static org.assertj.core.api.Assertions.assertThat;
2133
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2234

2335
public class ScyllaDBContainerTest {
2436

25-
private static final DockerImageName SCYLLADB_IMAGE = DockerImageName.parse("scylladb/scylla:5.2.9");
37+
private static final DockerImageName SCYLLADB_IMAGE = DockerImageName.parse("scylladb/scylla:6.2");
2638

2739
private static final String BASIC_QUERY = "SELECT release_version FROM system.local";
2840

2941
@Test
3042
public void testSimple() {
3143
try ( // container {
32-
ScyllaDBContainer scylladb = new ScyllaDBContainer("scylladb/scylla:5.2.9")
33-
// }
44+
ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)
45+
// }
3446
) {
3547
scylladb.start();
3648
// session {
@@ -47,6 +59,49 @@ public void testSimple() {
4759
}
4860
}
4961

62+
@Test
63+
public void testSimpleSsl() throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException {
64+
try (
65+
// custom_configuration {
66+
ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)
67+
.withConfigurationOverride("scylla-test-ssl")
68+
// }
69+
) {
70+
71+
// sslContext {
72+
String testResourcesDir = getClass().getClassLoader().getResource("scylla-test-ssl/").getPath();
73+
74+
KeyStore keyStore = KeyStore.getInstance("PKCS12");
75+
keyStore.load(Files.newInputStream(Paths.get(testResourcesDir + "keystore.node0")), "scylla".toCharArray());
76+
77+
KeyStore trustStore = KeyStore.getInstance("PKCS12");
78+
trustStore.load(Files.newInputStream(Paths.get(testResourcesDir + "truststore.node0")), "scylla".toCharArray());
79+
80+
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
81+
keyManagerFactory.init(keyStore, "scylla".toCharArray());
82+
83+
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
84+
trustManagerFactory.init(trustStore);
85+
86+
SSLContext sslContext = SSLContext.getInstance("TLS");
87+
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
88+
// }
89+
90+
scylladb.start();
91+
92+
CqlSession session = CqlSession
93+
.builder()
94+
.addContactPoint(scylladb.getContactPoint())
95+
.withLocalDatacenter("datacenter1")
96+
.withSslContext(sslContext)
97+
.build();
98+
ResultSet resultSet = session.execute(BASIC_QUERY);
99+
assertThat(resultSet.wasApplied()).isTrue();
100+
assertThat(resultSet.one().getString(0)).isNotNull();
101+
assertThat(session.getMetadata().getNodes().values()).hasSize(1);
102+
}
103+
}
104+
50105
@Test
51106
public void testShardAwareness() {
52107
try (ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)) {
@@ -67,8 +122,8 @@ public void testShardAwareness() {
67122
@Test
68123
public void testAlternator() {
69124
try ( // alternator {
70-
ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE).withAlternator()
71-
// }
125+
ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE).withAlternator()
126+
// }
72127
) {
73128
scylladb.start();
74129

@@ -104,4 +159,15 @@ public void throwExceptionWhenAlternatorDisabled() {
104159
.hasMessageContaining("Alternator is not enabled");
105160
}
106161
}
162+
163+
@Test
164+
public void testSslConfiguration() {
165+
try (ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)) {
166+
scylladb.start();
167+
assertThat(scylladb.getEnvMap().get("SCYLLA_SSL")).isEqualTo("1");
168+
assertThat(scylladb.getEnvMap().get("SCYLLA_SSL_CERT_FILE")).isEqualTo("/etc/scylla/certs/scylla.crt");
169+
assertThat(scylladb.getEnvMap().get("SCYLLA_SSL_KEY_FILE")).isEqualTo("/etc/scylla/certs/scylla.key");
170+
assertThat(scylladb.getEnvMap().get("SCYLLA_SSL_CA_FILE")).isEqualTo("/etc/scylla/certs/ca.crt");
171+
}
172+
}
107173
}

modules/scylladb/src/test/resources/scylla-test-configuration-example/scylla.yaml

Lines changed: 0 additions & 62 deletions
This file was deleted.
Binary file not shown.
1.06 KB
Binary file not shown.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Bag Attributes
2+
friendlyName: node0
3+
localKeyID: 54 69 6D 65 20 31 37 33 35 39 34 30 37 38 39 31 39 34
4+
subject=C=None, L=None, O=None, OU=None, CN=None
5+
issuer=C=None, L=None, O=None, OU=None, CN=None
6+
-----BEGIN CERTIFICATE-----
7+
MIIEOzCCAqOgAwIBAgIIY4iVNsJSWiEwDQYJKoZIhvcNAQEMBQAwSzENMAsGA1UE
8+
BhMETm9uZTENMAsGA1UEBxMETm9uZTENMAsGA1UEChMETm9uZTENMAsGA1UECxME
9+
Tm9uZTENMAsGA1UEAxMETm9uZTAgFw0yNTAxMDMyMTM5MzFaGA8yMTI0MTIxMDIx
10+
MzkzMVowSzENMAsGA1UEBhMETm9uZTENMAsGA1UEBxMETm9uZTENMAsGA1UEChME
11+
Tm9uZTENMAsGA1UECxMETm9uZTENMAsGA1UEAxMETm9uZTCCAaIwDQYJKoZIhvcN
12+
AQEBBQADggGPADCCAYoCggGBAJuC18n+jlDcmR8CWxSK3fR2t1Am8P7IK5FY3ky8
13+
vEJSCMh+GoiqXVq67zhpOJnlgvEEZIDJGzBmJ/nIZvQwIAMxs792fHIEpEI2GTpf
14+
oaMf/9AAuPXuscg+5i4us1eVyVbrq3sREJ2NXHIPylcjtbwLjuepvmXTLp1d7oOJ
15+
Ad0X0W3UN/uwrlV3NPBuVLjJiCvJijWrCv1lFTuIcclqs478ozllp8UfcwJ57OH2
16+
Hq1ee9Ex9y7HouDPfFzmMRp1/jEcb0xbefpdW3Am6P9AXQuw2JMempwt5KbrAE+Z
17+
V1JnZCjSYSkspwid2bt5To/o60ypZUUswElasgAV/k8AxxDOkJGZusEqqVH7EFvk
18+
h3FiY/jb9cM1t5eLcpjx0wA+GOuErW3dgH5/WYugY2iiYjP1IQTb8Pk+gfAvq+2p
19+
SX3wISDCAh53j+aceUvNf+lItXsz66V9e+VH1xcOZcyO4gAMUVNYQFv/2wZ9knK4
20+
o30Aiqir1g2Hd5F/rWYNum+UbQIDAQABoyEwHzAdBgNVHQ4EFgQUqAWcYa3l/OHI
21+
JACasy+bZUwHP9kwDQYJKoZIhvcNAQEMBQADggGBAJQo55VJd8aEv6uiC5bKdACo
22+
M1GMvxWXUFzTdh2XKTOMF5GWwGJ3WRuW9o9wMZwXjvRihPfnx+DnfCCgZBOTGLXB
23+
3ObsogR9rij4uquUIkGJsshggY2gO82NVD7dRwGClncwTI+/RU7qGUym4SEdg6GP
24+
yfad3eTvqscQU1mNTxkaH0IDzPm0SWF8lcgGnrdHWlN+Nb8MJSHL5NFc9DA9pZck
25+
5/4MG1X8Hsk/UT04ln+8VrhYFkxkDv4fSKlr65slrst5721J0j+VLEwnuEl1onpW
26+
WHTTTIcOTDR5asrN9ZACCUsBxST8yfoJQ5G4HMO+UI1/1d928Ug6kHNWw2WR5FGG
27+
pJVu9vpTdA01MNkSeCuZhaPe2XgZcNPyHXcVxslNvFFZ0FVt6pSIhtmZ+4a8dRsm
28+
eU4NQ+PJ24En/8dErxaPqmi31wRZBg5Y9YlugJV4GQszCKHr0OYNK+Lpdq9dboUj
29+
6lxX7+gshUgKMzunUl/rTvddG7e/WuZbi9IvmJ4MYw==
30+
-----END CERTIFICATE-----
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
Bag Attributes
2+
friendlyName: node0
3+
localKeyID: 54 69 6D 65 20 31 37 33 35 39 34 30 37 38 39 31 39 34
4+
Key Attributes: <No Attributes>
5+
-----BEGIN PRIVATE KEY-----
6+
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
43+
fMq1U6czbhYvEjp3Y42Exw==
44+
-----END PRIVATE KEY-----
3.43 KB
Binary file not shown.

0 commit comments

Comments
 (0)