Skip to content

YugabyteDB

Since v0.34.0

Introduction

The Testcontainers module for yugabyteDB.

Adding this module to your project dependencies

Please run the following command to add the yugabyteDB module to your Go dependencies:

go get github.com/testcontainers/testcontainers-go/modules/yugabytedb

Usage example

ctx := context.Background()

yugabytedbContainer, err := yugabytedb.Run(
    ctx,
    "yugabytedb/yugabyte:2024.1.3.0-b105",
    yugabytedb.WithKeyspace("custom-keyspace"),
    yugabytedb.WithUser("custom-user"),
    yugabytedb.WithDatabaseName("custom-db"),
    yugabytedb.WithDatabaseUser("custom-user"),
    yugabytedb.WithDatabasePassword("custom-password"),
)
if err != nil {
    log.Printf("failed to start container: %s", err)
    return
}

defer func() {
    if err := testcontainers.TerminateContainer(yugabytedbContainer); err != nil {
        log.Printf("failed to terminate container: %s", err)
    }
}()

Module Reference

Run function

The yugabyteDB module exposes one entrypoint function to create the yugabyteDB container, and this function receives three parameters:

func Run(
    ctx context.Context, 
    img string, 
    opts ...testcontainers.ContainerCustomizer,
) (*Container, error)
  • context.Context, the Go context.
  • string, the Docker image to use.
  • testcontainers.ContainerCustomizer, a variadic argument for passing options.

Image

Use the second argument in the Run function to set a valid Docker image. In example: Run(context.Background(), "yugabytedb/yugabyte").

Container Options

When starting the yugabyteDB container, you can pass options in a variadic way to configure it.

Initial Database

By default the yugabyteDB container will start with a database named yugabyte and the default credentials yugabyte and yugabyte.

If you need to set a different database, and its credentials, you can use the WithDatabaseName(dbName string), WithDatabaseUser(dbUser string) and WithDatabasePassword(dbPassword string) options.

Initial Cluster Configuration

By default the yugabyteDB container will start with a cluster keyspace named yugabyte and the default credentials yugabyte and yugabyte.

If you need to set a different cluster keyspace, and its credentials, you can use the WithKeyspace(keyspace string), WithUser(user string) and WithPassword(password string) options.

The following options are exposed by the testcontainers package.

Basic Options

Lifecycle Options

Files & Mounts Options

Build Options

Logging Options

Image Options

Networking Options

Advanced Options

Experimental Options

Container Methods

The yugabyteDB container exposes the following methods:

YSQLConnectionString

This method returns the connection string for the yugabyteDB container when using the YSQL query language. The connection string can then be used to connect to the yugabyteDB container using a standard PostgreSQL client.

func ExampleContainer_YSQLConnectionString() {
    ctx := context.Background()

    yugabytedbContainer, err := yugabytedb.Run(
        ctx,
        "yugabytedb/yugabyte:2024.1.3.0-b105",
    )
    if err != nil {
        log.Printf("failed to start container: %s", err)
        return
    }

    defer func() {
        if err := testcontainers.TerminateContainer(yugabytedbContainer); err != nil {
            log.Printf("failed to terminate container: %s", err)
        }
    }()

    connStr, err := yugabytedbContainer.YSQLConnectionString(ctx, "sslmode=disable")
    if err != nil {
        log.Printf("failed to get connection string: %s", err)
        return
    }

    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Printf("failed to open connection: %s", err)
        return
    }

    defer db.Close()

    var i int
    row := db.QueryRowContext(ctx, "SELECT 1")
    if err := row.Scan(&i); err != nil {
        log.Printf("failed to scan row: %s", err)
        return
    }

    fmt.Println(i)

    // Output: 1
}

Usage examples

Usage with YSQL and gocql

To use the YCQL query language, you need to configure the cluster with the keyspace, user, and password.

By default, the yugabyteDB container will start with a cluster keyspace named yugabyte and the default credentials yugabyte and yugabyte but you can change it using the WithKeyspace, WithUser and WithPassword options.

In order to get the appropriate host and port to connect to the yugabyteDB container, you can use the GetHost and GetMappedPort methods on the Container struct. See the examples below:

func TestYugabyteDB_YCQL(t *testing.T) {
    t.Run("Run", func(t *testing.T) {
        ctx := context.Background()

        ctr, err := yugabytedb.Run(ctx, "yugabytedb/yugabyte:2024.1.3.0-b105")
        testcontainers.CleanupContainer(t, ctr)
        require.NoError(t, err)

        ctrHost, err := ctr.Host(ctx)
        require.NoError(t, err)

        ctrPort, err := ctr.MappedPort(ctx, "9042/tcp")
        require.NoError(t, err)

        cluster := gocql.NewCluster(net.JoinHostPort(ctrHost, ctrPort.Port()))
        cluster.Keyspace = "yugabyte"
        cluster.Authenticator = gocql.PasswordAuthenticator{
            Username: "yugabyte",
            Password: "yugabyte",
        }

        session, err := cluster.CreateSession()
        require.NoError(t, err)
        session.Close()
    })

    t.Run("custom-options", func(t *testing.T) {
        ctx := context.Background()

        ctr, err := yugabytedb.Run(ctx, "yugabytedb/yugabyte:2024.1.3.0-b105",
            yugabytedb.WithKeyspace("custom-keyspace"),
            yugabytedb.WithUser("custom-user"),
            yugabytedb.WithPassword("custom-password"),
        )

        testcontainers.CleanupContainer(t, ctr)
        require.NoError(t, err)

        ctrHost, err := ctr.Host(ctx)
        require.NoError(t, err)

        ctrPort, err := ctr.MappedPort(ctx, "9042/tcp")
        require.NoError(t, err)

        cluster := gocql.NewCluster(net.JoinHostPort(ctrHost, ctrPort.Port()))
        cluster.Keyspace = "custom-keyspace"
        cluster.Authenticator = gocql.PasswordAuthenticator{
            Username: "custom-user",
            Password: "custom-password",
        }

        session, err := cluster.CreateSession()
        require.NoError(t, err)
        session.Close()
    })
}