-
-
Notifications
You must be signed in to change notification settings - Fork 509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(scylladb): add scylladb provider #2919
base: main
Are you sure you want to change the base?
Conversation
✅ Deploy Preview for testcontainers-go ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
…rd-awareness port
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for a PR @DanielHe4rt, have done an initial review with some suggestions and questions for you.
shardAwarePort = "19042/tcp" | ||
) | ||
|
||
type Container struct { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: Add a doc comment to describe.
cf := testcontainers.ContainerFile{ | ||
HostFilePath: configFile, | ||
ContainerFilePath: "/etc/scylla/scylla.yaml", | ||
FileMode: 0o755, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: no need for the file to be executable
// WithAlternator enables the Alternator (DynamoDB Compatible API) service in the ScyllaDB container. | ||
// It will set the "alternator-port" parameter to the specified port. | ||
// It will also set the "alternator-write-isolation" parameter to "always" as a command line argument to the container. | ||
func WithAlternator(alternatorPort int) testcontainers.CustomizeRequestOption { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: use the in type which matches a port definition
func WithAlternator(alternatorPort int) testcontainers.CustomizeRequestOption { | |
func WithAlternator(alternatorPort uint16) testcontainers.CustomizeRequestOption { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think having WithAlternator()
would be enough, simplifying user setup. Regarding to alternator-write-isolation
, is always
recommended for testing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
depend on the application. for testing it's "slower" but you probably wont be doing stress testing in the cluster.
// ConnectionHost returns the host and port of the Scylladb container with the default port | ||
// and obtaining the host and exposed port from the container | ||
// Eg: "host:port" -> "localhost:9042" -> "localhost:19042" -> "localhost:8000" | ||
func (c Container) ConnectionHost(ctx context.Context, port int) (string, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: use uint16 to match port requirement.
func (c Container) ConnectionHost(ctx context.Context, port int) (string, error) { | |
func (c Container) ConnectionHost(ctx context.Context, port uint16) (string, error) { |
testcontainers.CleanupContainer(t, ctr) | ||
require.NoError(t, err) | ||
|
||
t.Run("test without shard awareness", func(t *testing.T) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: we're standardising on simple names without spaces to ensure they match the output
t.Run("test without shard awareness", func(t *testing.T) { | |
t.Run("without-shard-awareness", func(t *testing.T) { |
More below
|
||
ctr, err := scylladb.Run(ctx, | ||
"scylladb/scylla:6.2", | ||
scylladb.WithConfigFile(filepath.Join("testdata", "scylla.yaml")), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: with the change to reader, you can leverage embed
//go:embed testdata/scylla.yaml
var testConfig []byte
scylladb.WithConfigFile(filepath.Join("testdata", "scylla.yaml")), | |
scylladb.WithConfig(bytes.NewReader(testConfig)), |
}) | ||
} | ||
|
||
func TestScyllaWithAlternator(t *testing.T) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: These next two tests look like duplicates of the above, or could be combined?
return dynamodb.NewFromConfig(cfg, dynamodb.WithEndpointResolverV2(&scyllaAlternatorResolver{HostPort: hostPort})), errors.Join(errs...) | ||
} | ||
|
||
func createTable(client *dynamodb.Client) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: pass in t and require.NoError as thats the only use of this.
murmur3_partitioner_ignore_msb_bits: 12 | ||
strict_is_not_null_in_views: true | ||
maintenance_socket: ignore | ||
enable_tablets: true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: add trailing newline.
@@ -0,0 +1,194 @@ | |||
package scylladb_test |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we include a test using ssl? I think would be nice to have.
host, err := ctr.ConnectionHost(ctx, 19042) | ||
require.NoError(t, err) | ||
|
||
cluster := gocql.NewCluster(host) | ||
session, err := cluster.CreateSession() | ||
require.NoError(t, err) | ||
defer session.Close() | ||
|
||
var address string | ||
err = session.Query("SELECT address FROM system.clients").Scan(&address) | ||
require.NoError(t, err) | ||
}) | ||
|
||
t.Run("test with shard awareness", func(t *testing.T) { | ||
host, err := ctr.ConnectionHost(ctx, 19042) | ||
require.NoError(t, err) | ||
|
||
cluster := gocql.NewCluster(host) | ||
session, err := cluster.CreateSession() | ||
require.NoError(t, err) | ||
defer session.Close() | ||
|
||
var address string | ||
err = session.Query("SELECT address FROM system.clients").Scan(&address) | ||
require.NoError(t, err) | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see both tests are the same. should one of them use 9042 instead? Is it enough testing the connection?
} | ||
|
||
// WithShardAwareness enable shard-awareness in the ScyllaDB container so you can use the `19042` port. | ||
func WithShardAwareness() testcontainers.CustomizeRequestOption { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
scylladb starts both ports 9042 and 19042 by default. IMO we should expose a fn to get the mapped port for 19042 and omit this one.
Co-authored-by: Steven Hartland <[email protected]>
What does this PR do?
Implements the Database ScyllaDB as a new provider.
Under the
ScyllaDBContainer
you will have the possibility of:Shard Awareness
port usingWithShardAwareness
;WithCommand
ConnectionHost
API Example
Why is it important?
ScyllaDB is a NoSQL Database that is being constantly used by big companies and acts as a Drop-in Replacement to
CassandraDB
andDynamoDB
.How to test this PR
Clone the repository and enter the
scylladb
module folder: