Packages
testcontainers
1.5.1
2.3.1
2.3.0
2.2.0
2.1.0
2.1.0-rc1
2.0.0
2.0.0-rc3
2.0.0-rc2
2.0.0-rc
1.14.1
1.14.0
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.0
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-beta.1
1.0.0-beta
0.9.3
0.9.2
0.9.1
0.9.0
Testcontainers is an Elixir library that supports ExUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
Current section
Files
Jump to
Current section
Files
lib/container/cassandra_container.ex
# SPDX-License-Identifier: MIT
defmodule Testcontainers.CassandraContainer do
@moduledoc """
Provides functionality for creating and managing Cassandra container configurations.
"""
alias Testcontainers.CassandraContainer
alias Testcontainers.LogWaitStrategy
alias Testcontainers.ContainerBuilder
alias Testcontainers.Container
@default_image "cassandra"
@default_tag "3.11.2"
@default_image_with_tag "#{@default_image}:#{@default_tag}"
@default_username "cassandra"
@default_password "cassandra"
@default_port 9042
@default_wait_timeout 60_000
@enforce_keys [:image, :wait_timeout]
defstruct [:image, :wait_timeout]
def new,
do: %__MODULE__{
image: @default_image_with_tag,
wait_timeout: @default_wait_timeout
}
def with_image(%__MODULE__{} = config, image) when is_binary(image) do
%{config | image: image}
end
def default_image, do: @default_image
def default_port, do: @default_port
def get_username, do: @default_username
def get_password, do: @default_password
@doc """
Retrieves the port mapped by the Docker host for the Cassandra container.
"""
def port(%Container{} = container), do: Container.mapped_port(container, @default_port)
@doc """
Generates the connection URL for accessing the Cassandra service running within the container.
"""
def connection_uri(%Container{} = container) do
"#{Testcontainers.get_host()}:#{port(container)}"
end
defimpl ContainerBuilder do
import Container
@impl true
@spec build(%CassandraContainer{}) :: %Container{}
def build(%CassandraContainer{} = config) do
if not String.starts_with?(config.image, CassandraContainer.default_image()) do
raise ArgumentError,
message:
"Image #{config.image} is not compatible with #{CassandraContainer.default_image()}"
end
new(config.image)
|> with_exposed_port(CassandraContainer.default_port())
|> with_environment(:CASSANDRA_SNITCH, "GossipingPropertyFileSnitch")
|> with_environment(
:JVM_OPTS,
"-Dcassandra.skip_wait_for_gossip_to_settle=0 -Dcassandra.initial_token=0"
)
|> with_environment(:HEAP_NEWSIZE, "128M")
|> with_environment(:MAX_HEAP_SIZE, "1024M")
|> with_environment(:CASSANDRA_ENDPOINT_SNITCH, "GossipingPropertyFileSnitch")
|> with_environment(:CASSANDRA_DC, "datacenter1")
|> with_waiting_strategy(
LogWaitStrategy.new(
~r/Starting listening for CQL clients on \/0\.0\.0\.0:#{CassandraContainer.default_port()}.*/,
config.wait_timeout
)
)
end
@impl true
@spec is_starting(%CassandraContainer{}, %Container{}, %Tesla.Env{}) :: :ok
def is_starting(_config, _container, _conn), do: :ok
end
end