All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.testcontainers.containers.YugabyteDBYCQLContainer Maven / Gradle / Ivy

package org.testcontainers.containers;

import com.github.dockerjava.api.command.InspectContainerResponse;
import org.testcontainers.containers.delegate.YugabyteDBYCQLDelegate;
import org.testcontainers.containers.strategy.YugabyteDBYCQLWaitStrategy;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.utility.DockerImageName;

import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.Collections;
import java.util.Set;

/**
 * Testcontainers implementation for YugabyteDB YCQL API.
 *
 * @author srinivasa-vasu
 * @see YCQL API
 */
public class YugabyteDBYCQLContainer extends GenericContainer {

    private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("yugabytedb/yugabyte");

    private static final Integer YCQL_PORT = 9042;

    private static final Integer MASTER_DASHBOARD_PORT = 7000;

    private static final Integer TSERVER_DASHBOARD_PORT = 9000;

    private static final String ENTRYPOINT = "bin/yugabyted start --background=false";

    private static final String LOCAL_DC = "datacenter1";

    private String keyspace;

    private String username;

    private String password;

    private String initScript;

    /**
     * @param imageName image name
     */
    public YugabyteDBYCQLContainer(final String imageName) {
        this(DockerImageName.parse(imageName));
    }

    /**
     * @param imageName image name
     */
    public YugabyteDBYCQLContainer(final DockerImageName imageName) {
        super(imageName);
        imageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
        withExposedPorts(YCQL_PORT, MASTER_DASHBOARD_PORT, TSERVER_DASHBOARD_PORT);
        waitingFor(new YugabyteDBYCQLWaitStrategy(this).withStartupTimeout(Duration.ofSeconds(60)));
        withCommand(ENTRYPOINT);
    }

    @Override
    public Set getLivenessCheckPortNumbers() {
        return Collections.singleton(getMappedPort(YCQL_PORT));
    }

    /**
     * Configures the environment variables. Setting up these variables would create the
     * custom objects. Setting {@link #withKeyspaceName(String)},
     * {@link #withUsername(String)}, {@link #withPassword(String)} these parameters will
     * initilaize the database with those custom values
     */
    @Override
    protected void configure() {
        addEnv("YCQL_KEYSPACE", keyspace);
        addEnv("YCQL_USER", username);
        addEnv("YCQL_PASSWORD", password);
    }

    /**
     * @param initScript path of the initialization script file
     * @return {@link YugabyteDBYCQLContainer} instance
     */
    public YugabyteDBYCQLContainer withInitScript(String initScript) {
        this.initScript = initScript;
        return this;
    }

    /**
     * Setting this would create the keyspace
     * @param keyspace keyspace
     * @return {@link YugabyteDBYCQLContainer} instance
     */
    public YugabyteDBYCQLContainer withKeyspaceName(final String keyspace) {
        this.keyspace = keyspace;
        return this;
    }

    /**
     * Setting this would create the custom user role
     * @param username user name
     * @return {@link YugabyteDBYCQLContainer} instance
     */
    public YugabyteDBYCQLContainer withUsername(final String username) {
        this.username = username;
        return this;
    }

    /**
     * Setting this along with {@link #withUsername(String)} would enable authentication
     * @param password password
     * @return {@link YugabyteDBYCQLContainer} instance
     */
    public YugabyteDBYCQLContainer withPassword(final String password) {
        this.password = password;
        return this;
    }

    /**
     * Executes the initilization script
     * @param containerInfo containerInfo
     */
    @Override
    protected void containerIsStarted(InspectContainerResponse containerInfo) {
        if (this.initScript != null) {
            ScriptUtils.runInitScript(new YugabyteDBYCQLDelegate(this), initScript);
        }
    }

    /**
     * Returns a {@link InetSocketAddress} representation of YCQL's contact point info
     * @return contactpoint
     */
    public InetSocketAddress getContactPoint() {
        return new InetSocketAddress(getHost(), getMappedPort(YCQL_PORT));
    }

    /**
     * Returns the local datacenter name
     * @return localdc name
     */
    public String getLocalDc() {
        return LOCAL_DC;
    }

    /**
     * Username getter method
     * @return username
     */
    public String getUsername() {
        return this.username;
    }

    /**
     * Password getter method
     * @return password
     */
    public String getPassword() {
        return this.password;
    }

    /**
     * Keyspace getter method
     * @return keyspace
     */
    public String getKeyspace() {
        return this.keyspace;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy