bitnami-containers/bitnami/mariadb/test.sh

385 lines
14 KiB
Bash
Executable File

#!/usr/bin/env bats
CONTAINER_NAME=bitnami-mariadb-test
IMAGE_NAME=${IMAGE_NAME:-bitnami/mariadb}
SLEEP_TIME=5
MARIADB_DATABASE=test_database
MARIADB_USER=test_user
MARIADB_PASSWORD=test_password
REPLICATION_USER=repl_user
REPLICATION_PASSWORD=repl_password
VOL_PREFIX=/bitnami/mariadb
HOST_VOL_PREFIX=${HOST_VOL_PREFIX:-/tmp/bitnami/$CONTAINER_NAME}
cleanup_running_containers() {
if [ "$(docker ps -a | grep ${1:-$CONTAINER_NAME})" ]; then
docker rm -fv ${1:-$CONTAINER_NAME}
fi
}
setup() {
cleanup_running_containers
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
mkdir -p $HOST_VOL_PREFIX
}
teardown() {
cleanup_running_containers
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
cleanup_volumes_content() {
docker run --rm\
-v $HOST_VOL_PREFIX/data:$VOL_PREFIX/data\
-v $HOST_VOL_PREFIX/conf:$VOL_PREFIX/conf\
-v $HOST_VOL_PREFIX/logs:$VOL_PREFIX/logs\
$IMAGE_NAME rm -rf $VOL_PREFIX/data/ $VOL_PREFIX/logs/ $VOL_PREFIX/conf/
}
create_container(){
docker run "$@" $IMAGE_NAME; sleep $SLEEP_TIME
}
# $1 is the command
mysql_client(){
case "$1" in
master|slave)
SERVER_LINK="--link $CONTAINER_NAME-$1:$CONTAINER_NAME"
shift
;;
*)
SERVER_LINK="--link $CONTAINER_NAME:$CONTAINER_NAME"
;;
esac
docker run --rm $SERVER_LINK $IMAGE_NAME mysql -h $CONTAINER_NAME "$@"
}
create_full_container(){
create_container -d --name $CONTAINER_NAME\
-e MARIADB_USER=$MARIADB_USER\
-e MARIADB_DATABASE=$MARIADB_DATABASE\
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
}
create_full_container_mounted(){
create_container -d --name $CONTAINER_NAME\
-e MARIADB_USER=$MARIADB_USER\
-e MARIADB_DATABASE=$MARIADB_DATABASE\
-e MARIADB_PASSWORD=$MARIADB_PASSWORD\
-v $HOST_VOL_PREFIX/data:$VOL_PREFIX/data\
-v $HOST_VOL_PREFIX/conf:$VOL_PREFIX/conf\
-v $HOST_VOL_PREFIX/logs:$VOL_PREFIX/logs
}
@test "Root user created without password" {
create_container -d --name $CONTAINER_NAME
run mysql_client -e "select User from mysql.user where User=\"root\"\G"
[[ "$output" =~ "User: root" ]]
}
@test "Root user created with password" {
create_container -d --name $CONTAINER_NAME -e MARIADB_PASSWORD=$MARIADB_PASSWORD
# Can not login as root
run mysql_client -e 'show databases\G'
[ $status = 1 ]
run mysql_client -p$MARIADB_PASSWORD -e 'show databases\G'
[ $status = 0 ]
}
@test "Root user has access to admin database" {
create_container -d --name $CONTAINER_NAME
run mysql_client -e 'show databases\G'
[[ "$output" =~ 'Database: mysql' ]]
}
@test "Custom database created" {
create_container -d --name $CONTAINER_NAME -e MARIADB_DATABASE=$MARIADB_DATABASE
run mysql_client -e 'show databases\G'
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "Can't create a custom user without database" {
run create_container --name $CONTAINER_NAME -e MARIADB_USER=$MARIADB_USER
[[ "$output" =~ "you need to provide the MARIADB_DATABASE" ]]
}
@test "Create custom user and database without password" {
create_container -d --name $CONTAINER_NAME\
-e MARIADB_USER=$MARIADB_USER\
-e MARIADB_DATABASE=$MARIADB_DATABASE
# Can not login as root
run mysql_client -e 'show databases\G'
[ $status = 1 ]
run mysql_client -u $MARIADB_USER -e 'show databases\G'
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "Create custom user and database with password" {
create_full_container
# Can not login as root
run mysql_client -u $MARIADB_USER -e 'show databases\G'
[ $status = 1 ]
run mysql_client -u $MARIADB_USER -p$MARIADB_PASSWORD -e 'show databases\G'
[ $status = 0 ]
}
@test "User and password settings are preserved after restart" {
create_full_container
docker stop $CONTAINER_NAME
docker start $CONTAINER_NAME
sleep $SLEEP_TIME
run docker logs $CONTAINER_NAME
[[ "$output" =~ "The credentials were set on first boot." ]]
run mysql_client -u $MARIADB_USER -p$MARIADB_PASSWORD -e 'show databases\G'
[ $status = 0 ]
}
@test "If host mounted, password and settings are preserved after deletion" {
cleanup_volumes_content
create_full_container_mounted
docker rm -fv $CONTAINER_NAME
create_container -d --name $CONTAINER_NAME\
-v $HOST_VOL_PREFIX/data:$VOL_PREFIX/data\
-v $HOST_VOL_PREFIX/conf:$VOL_PREFIX/conf
run mysql_client -u $MARIADB_USER -p$MARIADB_PASSWORD -e 'show databases\G'
[ $status = 0 ]
cleanup_volumes_content
}
@test "Port 3306 exposed and accepting external connections" {
create_container -d --name $CONTAINER_NAME
run docker run --rm --name 'linked' --link $CONTAINER_NAME:$CONTAINER_NAME $IMAGE_NAME\
mysql -h $CONTAINER_NAME -P 3306 -e 'show databases\G'
[ $status = 0 ]
}
@test "All the volumes exposed" {
create_container -d --name $CONTAINER_NAME
run docker inspect $CONTAINER_NAME
[[ "$output" =~ "$VOL_PREFIX/data" ]]
[[ "$output" =~ "$VOL_PREFIX/conf" ]]
[[ "$output" =~ "$VOL_PREFIX/logs" ]]
}
@test "Data gets generated in conf and data if bind mounted in the host" {
create_full_container_mounted
run docker run -v $HOST_VOL_PREFIX:$HOST_VOL_PREFIX --rm $IMAGE_NAME ls -l $HOST_VOL_PREFIX/conf/my.cnf $HOST_VOL_PREFIX/logs/mysqld.log
[ $status = 0 ]
cleanup_volumes_content
}
@test "Master database is replicated on slave" {
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
create_container -d --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MASTER_HOST=$CONTAINER_NAME-master \
-e MASTER_USER=$MARIADB_USER \
-e MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(30), datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id))"
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Marko')"
run mysql_client slave -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[ $status = 0 ]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
@test "Can't setup replication slave without database" {
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
run create_container --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MASTER_HOST=$CONTAINER_NAME-master \
-e MASTER_USER=$MARIADB_USER \
-e MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e REPLICATION_MODE=slave \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
[[ "$output" =~ "you need to provide the MARIADB_DATABASE" ]]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
@test "Can't setup replication slave without replication user" {
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
run create_container --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:master \
-e MASTER_HOST=$CONTAINER_NAME-master \
-e MASTER_USER=$MARIADB_USER \
-e MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave
[[ "$output" =~ "you need to provide the REPLICATION_USER" ]]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
@test "Replication slave can automatically fetch connection parameters from master using docker links" {
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
create_container -d --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(30), datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id))"
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Marko')"
run mysql_client slave -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[ $status = 0 ]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
@test "Slave synchronizes with the master (delayed start)" {
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(30), datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id))"
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Marko')"
create_container -d --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Polo')"
run mysql_client slave -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[[ "$output" =~ "Polo" ]]
[ $status = 0 ]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
}
@test "Replication status is preserved after deletion" {
cleanup_volumes_content
create_container -d --name $CONTAINER_NAME-master \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=master \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD \
-v $HOST_VOL_PREFIX/data:$VOL_PREFIX/data \
-v $HOST_VOL_PREFIX/conf:$VOL_PREFIX/conf \
-v $HOST_VOL_PREFIX/logs:$VOL_PREFIX/logs
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(30), datum TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id))"
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Marko')"
create_container -d --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MASTER_HOST=$CONTAINER_NAME-master \
-e MASTER_USER=$MARIADB_USER \
-e MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
run mysql_client slave -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[ $status = 0 ]
docker rm -fv $CONTAINER_NAME-slave
docker rm -fv $CONTAINER_NAME-master
create_container -d --name $CONTAINER_NAME-master \
-v $HOST_VOL_PREFIX/data:$VOL_PREFIX/data \
-v $HOST_VOL_PREFIX/conf:$VOL_PREFIX/conf
run mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[ $status = 0 ]
mysql_client master -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Polo')"
create_container -d --name $CONTAINER_NAME-slave \
--link $CONTAINER_NAME-master:mariadb-master \
-e MASTER_HOST=$CONTAINER_NAME-master \
-e MASTER_USER=$MARIADB_USER \
-e MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e REPLICATION_MODE=slave \
-e REPLICATION_USER=$REPLICATION_USER \
-e REPLICATION_PASSWORD=$REPLICATION_PASSWORD
run mysql_client slave -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users"
[[ "$output" =~ "Marko" ]]
[[ "$output" =~ "Polo" ]]
[ $status = 0 ]
cleanup_running_containers $CONTAINER_NAME-master
cleanup_running_containers $CONTAINER_NAME-slave
cleanup_volumes_content
}