Merge pull request #2 from bitnami/the-merge

switch to `gcr.io/stacksmith-images/ubuntu:14.04` base image
This commit is contained in:
Sameer Naik
2016-03-22 12:59:05 +05:30
12 changed files with 87 additions and 594 deletions

View File

@@ -1,24 +1,33 @@
FROM bitnami/base-ubuntu:14.04-onbuild
FROM gcr.io/stacksmith-images/ubuntu:14.04-r05
MAINTAINER Bitnami <containers@bitnami.com>
ENV BITNAMI_APP_NAME=mariadb \
BITNAMI_APP_USER=mysql \
BITNAMI_APP_DAEMON=mysqld \
BITNAMI_APP_VERSION=10.1.11-0 \
BITNAMI_APP_OPTIONS="--password bitnami" \
MARIADB_PACKAGE_SHA256="59cb45e66e7b9b3697296cca8ad8c988ddc089016fef94b7133587cb838c8505"
ENV BITNAMI_APP_DIR=$BITNAMI_PREFIX/$BITNAMI_APP_NAME \
ENV BITNAMI_APP_DIR=/opt/bitnami/$BITNAMI_APP_NAME \
BITNAMI_APP_VOL_PREFIX=/bitnami/$BITNAMI_APP_NAME
ENV PATH=$BITNAMI_APP_DIR/sbin:$BITNAMI_APP_DIR/bin:$PATH
COPY pkg-cache/ $BITNAMI_PKG_CACHE/
RUN bitnami-pkg unpack $BITNAMI_APP_NAME-$BITNAMI_APP_VERSION
RUN $BITNAMI_PREFIX/install.sh
# these symlinks should be setup by harpoon at unpack
RUN mkdir -p $BITNAMI_APP_VOL_PREFIX && \
ln -s $BITNAMI_APP_DIR/data $BITNAMI_APP_VOL_PREFIX/data && \
ln -s $BITNAMI_APP_DIR/conf $BITNAMI_APP_VOL_PREFIX/conf && \
ln -s $BITNAMI_APP_DIR/logs $BITNAMI_APP_VOL_PREFIX/logs
# temporary fix for mysql client
RUN mkdir $BITNAMI_APP_DIR/var && \
ln -sf $BITNAMI_APP_DIR/tmp $BITNAMI_APP_DIR/var/mysql
COPY rootfs/ /
EXPOSE 3306
VOLUME ["$BITNAMI_APP_VOL_PREFIX/data", "$BITNAMI_APP_VOL_PREFIX/conf", "$BITNAMI_APP_VOL_PREFIX/logs"]
ENTRYPOINT ["/entrypoint.sh"]
VOLUME ["$BITNAMI_APP_VOL_PREFIX/data"]
ENTRYPOINT ["/app-entrypoint.sh"]
CMD ["harpoon", "start", "--foreground", "mariadb"]

View File

@@ -1,34 +0,0 @@
$BITNAMI_APP_NAME cheatsheet:
ENVIRONMENT VARIABLES:
MARIADB_USER: User to be created on first boot (default: root).
MARIADB_PASSWORD: Password to be set for MARIADB_USER on first boot (default: none).
MARIADB_DATABASE: Database to be created on first boot, accessible by MARIADB_USER (default: none).
MARIADB_SERVER_ID: Unique server identifier (default: random number)
MARIADB_REPLICATION_MODE: Replication mode. Possible values master/slave (default: none).
MARIADB_REPLICATION_USER: Replication user. User is created on master on the first boot (default: none).
MARIADB_REPLICATION_PASSWORD: Replication users password. Password is set for MARIADB_REPLICATION_USER on master on the first boot (default: none).
MARIADB_MASTER_HOST: Replication masters hostname/ip (parameter available only on slave).
MARIADB_MASTER_USER: User on replication master with access to MARIADB_DATABASE. (default: root, parameter available only on slave).
MARIADB_MASTER_PASSWORD: Password of user on replication master with access to MARIADB_DATABASE (parameter available only on slave).
VOLUMES:
$BITNAMI_APP_VOL_PREFIX/data: Location of $BITNAMI_APP_NAME data files.
$BITNAMI_APP_VOL_PREFIX/conf: Location of my.cnf ($BITNAMI_APP_NAME config file).
$BITNAMI_APP_VOL_PREFIX/logs: Location of mysqld.log.
PORTS:
3306: $BITNAMI_APP_NAME default port.
MISC:
Options: You can add extra options during the docker run using the -- prefix.
Note: MARIADB_USER works in conjunction with MARIADB_DATABASE environment variable.
Tip: Back up the $BITNAMI_APP_VOL_PREFIX/data and $BITNAMI_APP_VOL_PREFIX/conf directories regularly.
COMMANDS:
print-help: Print this page.
check-updates: Check if a new version of the $BITNAMI_APP_NAME image is available.
Visit $GITHUB_PAGE for more information.

View File

@@ -1,22 +0,0 @@
environment_variables:
MARIADB_USER: "User to be created on first boot (default: root)."
MARIADB_PASSWORD: "Password to be set for MARIADB_USER on first boot (default: none)."
MARIADB_DATABASE: "Database to be created on first boot, accessible by MARIADB_USER (default: none)."
MARIADB_SERVER_ID: "Unique server identifier (default: random number)"
MARIADB_REPLICATION_MODE: "Replication mode. Possible values master/slave (default: none)."
MARIADB_REPLICATION_USER: "Replication user. User is created on master on the first boot (default: none)."
MARIADB_REPLICATION_PASSWORD: "Replication users password. Password is set for MARIADB_REPLICATION_USER on master on the first boot (default: none)."
MARIADB_MASTER_HOST: "Replication masters hostname/ip (parameter available only on slave)."
MARIADB_MASTER_USER: "User on replication master with access to MARIADB_DATABASE. (default: root, parameter available only on slave)."
MARIADB_MASTER_PASSWORD: "Password of user on replication master with access to MARIADB_DATABASE (parameter available only on slave)."
volumes:
$BITNAMI_APP_VOL_PREFIX/data: "Location of $BITNAMI_APP_NAME data files."
$BITNAMI_APP_VOL_PREFIX/conf: "Location of my.cnf ($BITNAMI_APP_NAME config file)."
$BITNAMI_APP_VOL_PREFIX/logs: "Location of mysqld.log."
ports:
3306: "$BITNAMI_APP_NAME default port."
misc:
Options: "You can add extra options during the docker run using the -- prefix."
Note: "The user and database creation happens only the first time you run the container."
Note: "MARIADB_USER works in conjunction with MARIADB_DATABASE environment variable."
Tip: "Back up the $BITNAMI_APP_VOL_PREFIX/data and $BITNAMI_APP_VOL_PREFIX/conf directories regularly."

View File

@@ -1,19 +0,0 @@
#!/bin/bash
# disable DNS lookups
(
echo "[mysqld]"
echo "skip-name-resolve"
) >> $BITNAMI_APP_DIR/conf/my.cnf
# set up default config
mv $BITNAMI_APP_DIR/conf $BITNAMI_APP_DIR/conf.defaults
# remove existing default data and logs
rm -rf $BITNAMI_APP_DIR/data
rm -rf $BITNAMI_APP_DIR/logs
# symlink mount points at root to install dir
ln -s $BITNAMI_APP_DIR/conf $BITNAMI_APP_VOL_PREFIX/conf
ln -s $BITNAMI_APP_DIR/data $BITNAMI_APP_VOL_PREFIX/data
ln -s $BITNAMI_APP_DIR/logs $BITNAMI_APP_VOL_PREFIX/logs

View File

@@ -0,0 +1,24 @@
#!/bin/bash
set -e
#!/bin/bash
set -e
if [[ "$1" == "harpoon" && "$2" == "start" ]]; then
status=`harpoon inspect $BITNAMI_APP_NAME`
if [[ "$status" == *'"lifecycle": "unpacked"'* ]]; then
harpoon initialize $BITNAMI_APP_NAME --password ${MARIADB_PASSWORD:-password}
## disable DNS lookups
# this should happen in harpoon initialize, controlled by a argument, eg. --skip-name-resolve
(
echo ""
echo "[mysqld]"
echo "skip-name-resolve"
) >> $BITNAMI_APP_DIR/conf/my.cnf
fi
chown -R $BITNAMI_APP_USER: $BITNAMI_APP_DIR/data || true
fi
exec /entrypoint.sh "$@"

View File

@@ -1,153 +0,0 @@
# MariaDB Utility functions
PROGRAM_OPTIONS="--defaults-file=$BITNAMI_APP_DIR/conf/my.cnf --log-error=$BITNAMI_APP_DIR/logs/mysqld.log --basedir=$BITNAMI_APP_DIR --datadir=$BITNAMI_APP_DIR/data --plugin-dir=$BITNAMI_APP_DIR/lib/plugin --user=$BITNAMI_APP_USER --socket=$BITNAMI_APP_DIR/tmp/mysql.sock --lower-case-table-names=1"
case "$MARIADB_REPLICATION_MODE" in
master )
PROGRAM_OPTIONS+=" --server-id=${MARIADB_SERVER_ID:-$RANDOM} --binlog-format=ROW --log-bin=mysql-bin --innodb_flush_log_at_trx_commit=1 --sync-binlog=1"
;;
slave)
PROGRAM_OPTIONS+=" --server-id=${MARIADB_SERVER_ID:-$RANDOM} --binlog-format=ROW --log-bin=mysql-bin --relay-log=mysql-relay-bin --log-slave-updates=1 --read-only=1 ${MARIADB_DATABASE:+--replicate-do-db=$MARIADB_DATABASE}"
;;
esac
initialize_database() {
echo "==> Initializing MySQL database..."
echo ""
mysql_install_db --port=3306 --socket=$BITNAMI_APP_DIR/tmp/mysql.sock --basedir=$BITNAMI_APP_DIR --datadir=$BITNAMI_APP_DIR/data > /dev/null 2>&1
chown -R $BITNAMI_APP_USER:$BITNAMI_APP_USER $BITNAMI_APP_DIR/data
}
create_custom_database() {
if [ "$MARIADB_DATABASE" ]; then
echo "==> Creating database $MARIADB_DATABASE..."
echo ""
echo "CREATE DATABASE IF NOT EXISTS \`$MARIADB_DATABASE\`;" >> /tmp/init_mysql.sql
fi
}
create_mysql_user() {
if [ "$MARIADB_REPLICATION_MODE" == "slave" ]; then
if [ ! "$MARIADB_USER" ] || [ ! "${MARIADB_PASSWORD}" ] || [ ! "$MARIADB_DATABASE" ]; then
echo "==> Trying to fetch MariaDB user/password from the master link..."
MARIADB_USER=${MARIADB_USER:-$MASTER_ENV_MARIADB_USER}
MARIADB_PASSWORD=${MARIADB_PASSWORD:-$MASTER_ENV_MARIADB_PASSWORD}
MARIADB_DATABASE=${MARIADB_DATABASE:-$MASTER_ENV_MARIADB_DATABASE}
fi
fi
if [ ! "$MARIADB_USER" ]; then
MARIADB_USER=root
fi
if [ "$MARIADB_USER" != "root" ] && [ ! $MARIADB_DATABASE ]; then
echo "In order to use a custom MARIADB_USER you need to provide the MARIADB_DATABASE as well"
echo ""
exit -1
fi
echo "==> Creating user $MARIADB_USER..."
echo ""
echo "DELETE FROM mysql.user ;" >> /tmp/init_mysql.sql
echo "CREATE USER '${MARIADB_USER}'@'%' IDENTIFIED BY '${MARIADB_PASSWORD}' ;" >> /tmp/init_mysql.sql
if [ "$MARIADB_USER" = root ]; then
echo "==> Creating root user with unrestricted access..."
echo "GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;" >> /tmp/init_mysql.sql
else
echo "==> Granting access to $MARIADB_USER to the database $MARIADB_DATABASE..."
echo ""
echo "GRANT ALL ON \`${MARIADB_DATABASE}\`.* TO \`${MARIADB_USER}\`@'%' ;" >> /tmp/init_mysql.sql
echo "GRANT RELOAD, REPLICATION CLIENT ON *.* TO \`${MARIADB_USER}\`@'%' ;" >> /tmp/init_mysql.sql
fi
echo "FLUSH PRIVILEGES ;" >> /tmp/init_mysql.sql
echo "DROP DATABASE IF EXISTS test ; " >> /tmp/init_mysql.sql
}
configure_replication() {
case "$MARIADB_REPLICATION_MODE" in
master)
if [ "$MARIADB_REPLICATION_USER" ]; then
echo "==> Creating replication user $MARIADB_REPLICATION_USER..."
echo ""
echo "CREATE USER '$MARIADB_REPLICATION_USER'@'%' IDENTIFIED BY '$MARIADB_REPLICATION_PASSWORD' ;" >> /tmp/init_mysql.sql
echo "GRANT REPLICATION SLAVE ON *.* TO '$MARIADB_REPLICATION_USER'@'%' ;" >> /tmp/init_mysql.sql
echo "FLUSH PRIVILEGES ;" >> /tmp/init_mysql.sql
else
echo "In order to setup a replication master you need to provide the MARIADB_REPLICATION_USER as well"
echo ""
exit -1
fi
;;
slave)
echo "==> Setting up MariaDB slave..."
echo "==> Trying to fetch MariaDB replication parameters from the master link..."
MARIADB_MASTER_HOST=${MARIADB_MASTER_HOST:-$MASTER_PORT_3306_TCP_ADDR}
MARIADB_MASTER_USER=${MARIADB_MASTER_USER:-$MASTER_ENV_MARIADB_USER}
MARIADB_MASTER_PASSWORD=${MARIADB_MASTER_PASSWORD:-$MASTER_ENV_MARIADB_PASSWORD}
MARIADB_REPLICATION_USER=${MARIADB_REPLICATION_USER:-$MASTER_ENV_MARIADB_REPLICATION_USER}
MARIADB_REPLICATION_PASSWORD=${MARIADB_REPLICATION_PASSWORD:-$MASTER_ENV_MARIADB_REPLICATION_PASSWORD}
if [ ! $MARIADB_MASTER_HOST ]; then
echo "In order to setup a replication slave you need to provide the MARIADB_MASTER_HOST as well"
echo ""
exit -1
fi
if [ ! $MARIADB_MASTER_USER ]; then
echo "MARIADB_MASTER_USER not specified. Defaulting to root"
MARIADB_MASTER_USER=${MARIADB_MASTER_USER:-root}
fi
if [ ! $MARIADB_DATABASE ]; then
echo "In order to setup a replication slave you need to provide the MARIADB_DATABASE as well"
echo ""
exit -1
fi
if [ ! $MARIADB_REPLICATION_USER ]; then
echo "In order to setup a replication slave you need to provide the MARIADB_REPLICATION_USER as well"
echo ""
exit -1
fi
echo "==> Setting the master configuration..."
echo "CHANGE MASTER TO MASTER_HOST='$MARIADB_MASTER_HOST', MASTER_USER='$MARIADB_REPLICATION_USER', MASTER_PASSWORD='$MARIADB_REPLICATION_PASSWORD';" >> /tmp/init_mysql.sql
echo "==> Checking if replication master is ready to accept connection (60s timeout)..."
timeout=60
while ! mysqladmin -u$MARIADB_MASTER_USER ${MARIADB_MASTER_PASSWORD:+-p$MARIADB_MASTER_PASSWORD} -h $MARIADB_MASTER_HOST status >/dev/null 2>&1
do
timeout=$(expr $timeout - 1)
if [[ $timeout -eq 0 ]]; then
echo "Could not connect to replication master"
echo ""
exit -1
fi
sleep 1
done
echo
echo "==> Creating a data snapshot..."
mysqldump -u$MARIADB_MASTER_USER ${MARIADB_MASTER_PASSWORD:+-p$MARIADB_MASTER_PASSWORD} -h $MARIADB_MASTER_HOST \
--databases $MARIADB_DATABASE --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data --apply-slave-statements --comments=false | tr -d '\012' | sed -e 's/;/;\n/g' >> /tmp/init_mysql.sql
echo ""
;;
esac
}
print_mysql_password() {
if [ -z $MARIADB_PASSWORD ]; then
echo "**none**"
else
echo $MARIADB_PASSWORD
fi
}
print_mysql_database() {
if [ $MARIADB_DATABASE ]; then
echo "Database: $MARIADB_DATABASE"
fi
}

View File

@@ -1,27 +0,0 @@
#!/usr/bin/with-contenv bash
set -e
source $BITNAMI_PREFIX/bitnami-utils.sh
if [ ! "$(ls -A $BITNAMI_APP_VOL_PREFIX/conf)" ]; then
generate_conf_files
fi
if [ ! -d $BITNAMI_APP_VOL_PREFIX/data/mysql ]; then
initialize_database
create_custom_database
create_mysql_user
configure_replication
print_app_credentials $BITNAMI_APP_NAME $MARIADB_USER `print_mysql_password` `print_mysql_database`
else
print_container_already_initialized $BITNAMI_APP_NAME
fi
chown -R $BITNAMI_APP_USER:$BITNAMI_APP_USER \
$BITNAMI_APP_VOL_PREFIX/conf/ \
$BITNAMI_APP_VOL_PREFIX/logs/ \
$BITNAMI_APP_VOL_PREFIX/data/ || true

View File

@@ -1 +0,0 @@
/bin/true

View File

@@ -1,5 +0,0 @@
#!/usr/bin/with-contenv bash
set -e
source $BITNAMI_PREFIX/bitnami-utils.sh
exec s6-setuidgid $BITNAMI_APP_USER tail -f -n 1000 $BITNAMI_APP_VOL_PREFIX/logs/*.log 2>/dev/null

View File

@@ -1,21 +0,0 @@
#!/usr/bin/with-contenv bash
failcount=0
if [ -f $BITNAMI_APP_DIR/tmp/failcount ]; then
failcount=$(cat $BITNAMI_APP_DIR/tmp/failcount)
fi
start=$(cat $BITNAMI_APP_DIR/tmp/start)
stop=`date '+%d%H%M%S'`
interval=`expr $stop - $start`
if test $interval -lt 30 ; then
failcount=`expr $failcount + 1`
else
failcount=0
fi
echo -n $failcount > $BITNAMI_APP_DIR/tmp/failcount
# bring down container on frequent failures. something is definitely wrong
if test $failcount -ge 3 ; then
s6-svscanctl -t /var/run/s6/services
fi

View File

@@ -1,13 +0,0 @@
#!/usr/bin/with-contenv bash
set -e
source $BITNAMI_PREFIX/bitnami-utils.sh
mkdir -p $BITNAMI_APP_DIR/tmp
chown -R $BITNAMI_APP_USER:$BITNAMI_APP_USER $BITNAMI_APP_DIR/tmp || true
if [ -f /tmp/init_mysql.sql ]; then
PROGRAM_OPTIONS="$PROGRAM_OPTIONS --init-file=/tmp/init_mysql.sql"
fi
date '+%d%H%M%S' > $BITNAMI_APP_DIR/tmp/start
exec $BITNAMI_APP_DAEMON $PROGRAM_OPTIONS ${EXTRA_OPTIONS:+"$EXTRA_OPTIONS"}

View File

@@ -1,25 +1,25 @@
#!/usr/bin/env bats
MARIADB_DEFAULT_PASSWORD=password
MARIADB_DATABASE=test_database
MARIADB_USER=test_user
MARIADB_PASSWORD=test_password
MARIADB_REPLICATION_USER=repl_user
MARIADB_REPLICATION_PASSWORD=repl_password
# source the helper script
APP_NAME=mariadb
SLEEP_TIME=10
SLEEP_TIME=20
VOL_PREFIX=/bitnami/$APP_NAME
VOLUMES=$VOL_PREFIX/data
load tests/docker_helper
# Link to container and execute mysql client
# $1 : name of the container to link to
# ${@:2} : arguments for the mysql command
mysql_client() {
container_link_and_run_command $1 mysql --no-defaults -h $APP_NAME -P 3306 "${@:2}"
container_link_and_run_command $1 mysql --no-defaults -h$APP_NAME -P3306 "${@:2}"
}
cleanup_environment() {
container_remove_full slave0
container_remove_full default
}
@@ -34,91 +34,74 @@ cleanup_environment
container_create default -d
# ping mysqld server
run container_link_and_run_command default mysqladmin --no-defaults -h $APP_NAME -P 3306 ping
run container_link_and_run_command default mysqladmin --no-defaults \
-h$APP_NAME -P3306 -uroot -p$MARIADB_DEFAULT_PASSWORD ping
[[ "$output" =~ "mysqld is alive" ]]
}
@test "Root user created without password" {
@test "Root user can't access server without a password" {
container_create default -d
# auth as root user and list all databases
run mysql_client default -uroot -e 'SHOW DATABASES\G;'
[[ "$output" =~ "Access denied for user" ]]
}
@test "Root user created with default password" {
container_create default -d
# auth as root user and list all databases
run mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e 'SHOW DATABASES\G;'
[[ "$output" =~ "Database: mysql" ]]
}
@test "Root user created with password" {
container_create default -d \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
# cannot auth as root without password
run mysql_client default -uroot -e "SHOW DATABASES\G"
[[ "$output" =~ "Access denied for user" ]]
@test "Root user created with custom password" {
container_create default -d
# auth as root with password and list all databases
run mysql_client default -uroot -p$MARIADB_PASSWORD -e "SHOW DATABASES\G"
run mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: mysql" ]]
}
@test "Root user has access to admin database" {
container_create default -d
run mysql_client default -uroot -e "SHOW DATABASES\G"
run mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ 'Database: mysql' ]]
}
@test "Custom database created" {
container_create default -d \
-e MARIADB_DATABASE=$MARIADB_DATABASE
@test "Root user can create new databases" {
container_create default -d
# auth as root and check if MARIADB_DATABASE exists
run mysql_client default -uroot -e "SHOW DATABASES\G"
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "CREATE DATABASE \`$MARIADB_DATABASE\`;"
# check if database was created
run mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "Can't create a custom user without database" {
# create container without specifying MARIADB_DATABASE
run container_create default \
-e MARIADB_USER=$MARIADB_USER
[[ "$output" =~ "you need to provide the MARIADB_DATABASE" ]]
}
@test "Root user can create new users" {
container_create default -d
@test "Create custom user and database without password" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD';"
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "CREATE DATABASE \`$MARIADB_DATABASE\`;"
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "GRANT ALL ON \`$MARIADB_DATABASE\`.* TO \`$MARIADB_USER\`@'%' ;"
# cannot auth as root
run mysql_client default -uroot -e "SHOW DATABASES\G"
[[ "$output" =~ "Access denied for user" ]]
# auth as MARIADB_USER and check of MARIADB_DATABASE exists
run mysql_client default -u$MARIADB_USER -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "Create custom user and database with password" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
# auth as MARIADB_USER with password and check if MARIADB_DATABASE exists
# check if user was created
run mysql_client default -u$MARIADB_USER -p$MARIADB_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "User and password settings are preserved after restart" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
@test "Data is preserved on container restart" {
container_create default -d
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASSWORD';"
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "CREATE DATABASE \`$MARIADB_DATABASE\`;"
mysql_client default -uroot -p$MARIADB_DEFAULT_PASSWORD -e "GRANT ALL ON \`$MARIADB_DATABASE\`.* TO \`$MARIADB_USER\`@'%' ;"
# restart container
container_restart default
# get container logs
run container_logs default
[[ "$output" =~ "The credentials were set on first boot." ]]
# auth as MARIADB_USER and check if MARIADB_DATABASE exists
run mysql_client default -u$MARIADB_USER -p$MARIADB_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
@@ -130,34 +113,22 @@ cleanup_environment
# get container introspection details and check if volumes are exposed
run container_inspect default --format {{.Mounts}}
[[ "$output" =~ "$VOL_PREFIX/data" ]]
[[ "$output" =~ "$VOL_PREFIX/conf" ]]
[[ "$output" =~ "$VOL_PREFIX/logs" ]]
}
@test "Data gets generated in conf, data and logs if bind mounted in the host" {
container_create_with_host_volumes default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
# files expected in conf volume
run container_exec default ls -la $VOL_PREFIX/conf/
[[ "$output" =~ "my.cnf" ]]
@test "Data gets generated in data volume if bind mounted in the host" {
container_create_with_host_volumes default -d
# files expected in data volume (subset)
run container_exec default ls -la $VOL_PREFIX/data/
[[ "$output" =~ "mysql" ]]
[[ "$output" =~ "ibdata1" ]]
# files expected in logs volume
run container_exec default ls -la $VOL_PREFIX/logs/
[[ "$output" =~ "mysqld.log" ]]
}
@test "If host mounted, password and settings are preserved after deletion" {
# known to fail
skip
container_create_with_host_volumes default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD
# stop and remove container
@@ -166,222 +137,6 @@ cleanup_environment
# recreate container without specifying any env parameters
container_create_with_host_volumes default -d
# auth as MARIADB_USER and check of MARIADB_DATABASE exists
run mysql_client default -u$MARIADB_USER -p$MARIADB_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: $MARIADB_DATABASE" ]]
}
@test "Configuration changes are preserved after deletion" {
container_create_with_host_volumes default -d
# modify my.cnf
container_exec default sed -i 's|^[#]*[ ]*max_allowed_packet[ ]*=.*|max_allowed_packet=64M|' $VOL_PREFIX/conf/my.cnf
container_exec default sed -i 's|^[#]*[ ]*bind-address[ ]*=.*|bind-address=0.0.0.0|' $VOL_PREFIX/conf/my.cnf
# stop and remove container
container_remove default
# relaunch container with host volumes
container_create_with_host_volumes default -d
run container_exec default cat $VOL_PREFIX/conf/my.cnf
[[ "$output" =~ "max_allowed_packet=64M" ]]
[[ "$output" =~ "bind-address=0.0.0.0" ]]
}
@test "Can't setup replication master without replication user" {
# create replication master without specifying MARIADB_REPLICATION_USER
run container_create default \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master
[[ "$output" =~ "you need to provide the MARIADB_REPLICATION_USER" ]]
}
@test "Can't setup replication slave without master host" {
# create replication slave without specifying MARIADB_MASTER_HOST
run container_create slave0 \
-e MARIADB_REPLICATION_MODE=slave
[[ "$output" =~ "you need to provide the MARIADB_MASTER_HOST" ]]
}
@test "Can't setup replication slave without database" {
# create replication slave without specifying MARIADB_DATABASE
run container_create slave0 \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_MASTER_HOST=master \
-e MARIADB_MASTER_USER=$MARIADB_USER
[[ "$output" =~ "you need to provide the MARIADB_DATABASE" ]]
}
@test "Can't setup replication slave without replication user" {
# create replication slave without specifying MARIADB_REPLICATION_USER
run container_create slave0 \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_MASTER_HOST=master \
-e MARIADB_MASTER_USER=$MARIADB_USER \
-e MARIADB_DATABASE=$MARIADB_DATABASE
[[ "$output" =~ "you need to provide the MARIADB_REPLICATION_USER" ]]
}
@test "Master database is replicated on slave" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
container_create slave0 -d \
$(container_link default $CONTAINER_NAME) \
-e MARIADB_MASTER_HOST=$CONTAINER_NAME \
-e MARIADB_MASTER_USER=$MARIADB_USER \
-e MARIADB_MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# create users table on master and insert a record
mysql_client default -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)); \
INSERT INTO users(name) VALUES ('Marko');"
# verify that record is replicated on slave0
run mysql_client slave0 -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users\G"
[[ "$output" =~ "name: Marko" ]]
}
@test "Can setup replication without password for replication user" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER
container_create slave0 -d \
$(container_link default $CONTAINER_NAME) \
-e MARIADB_MASTER_HOST=$CONTAINER_NAME \
-e MARIADB_MASTER_USER=$MARIADB_USER \
-e MARIADB_MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER
# create users table on master and insert a record
mysql_client default -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)); \
INSERT INTO users(name) VALUES ('Marko');"
# verify that record is replicated on slave0
run mysql_client slave0 -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users\G"
[[ "$output" =~ "name: Marko" ]]
}
@test "Replication slave can fetch replication parameters from link alias \"master\"" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# create replication slave0 linked to master with alias named master
container_create slave0 -d \
$(container_link default master) \
-e MARIADB_REPLICATION_MODE=slave
# create users table on master and insert a new row
mysql_client default -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)); \
INSERT INTO users(name) VALUES ('Marko');"
# check if row is replicated on slave0
run mysql_client slave0 -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users\G"
[[ "$output" =~ "name: Marko" ]]
}
@test "Slave synchronizes with the master (delayed start)" {
container_create default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# create users table on master and insert a new row
mysql_client default -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)) ;
INSERT INTO users(name) VALUES ('Marko');"
# start slave0 linked to the master
container_create slave0 -d \
$(container_link default $CONTAINER_NAME) \
-e MARIADB_MASTER_HOST=$CONTAINER_NAME \
-e MARIADB_MASTER_USER=$MARIADB_USER \
-e MARIADB_MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# verify that master data is replicated on slave
run mysql_client slave0 -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users\G"
[[ "$output" =~ "name: Marko" ]]
}
@test "Replication status is preserved after deletion" {
# create master container with host mounted volumes
container_create_with_host_volumes default -d \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=master \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# create users table on master and insert a new row
mysql_client default -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)) ;
INSERT INTO users(name) VALUES ('Marko');"
# create slave0 container with host mounted volumes, should replicate the master data
container_create_with_host_volumes slave0 -d \
$(container_link default $CONTAINER_NAME) \
-e MARIADB_MASTER_HOST=$CONTAINER_NAME \
-e MARIADB_MASTER_USER=$MARIADB_USER \
-e MARIADB_MASTER_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_USER=$MARIADB_USER \
-e MARIADB_PASSWORD=$MARIADB_PASSWORD \
-e MARIADB_DATABASE=$MARIADB_DATABASE \
-e MARIADB_REPLICATION_MODE=slave \
-e MARIADB_REPLICATION_USER=$MARIADB_REPLICATION_USER \
-e MARIADB_REPLICATION_PASSWORD=$MARIADB_REPLICATION_PASSWORD
# stop and remove master and slave0 containers
container_remove default
container_remove slave0
# start master and slave0 containers with existing host volumes and no additional env arguments other than MARIADB_REPLICATION_MODE
container_create_with_host_volumes default -d -e MARIADB_REPLICATION_MODE=master
container_create_with_host_volumes slave0 -d $(container_link default $CONTAINER_NAME) -e MARIADB_REPLICATION_MODE=slave
# insert new row into the master database
mysql_client default -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "INSERT INTO users(name) VALUES ('Polo')"
# verify that all previous and new data is replicated on slave0
run mysql_client slave0 -u$MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE -e "SELECT * FROM users\G"
[[ "$output" =~ "name: Marko" ]]
[[ "$output" =~ "name: Polo" ]]
run mysql_client default -uroot -p$MARIADB_PASSWORD -e "SHOW DATABASES\G"
[[ "$output" =~ "Database: mysql" ]]
}