Repository navigation
Expand file tree
/
Copy pathdocker-gh-ost-replica-tests
More file actions
executable file
·105 lines (91 loc) · 3.38 KB
/
Copy pathdocker-gh-ost-replica-tests
File metadata and controls
executable file
·105 lines (91 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/bash
# This script starts two MySQL docker containers in a primary-replica setup
# which can be used for running the replica tests in localtests/ .
# Set the environment var TEST_MYSQL_IMAGE to change the docker image.
#
# Usage:
# docker-gh-ost-replica-tests up start the containers
# docker-gh-ost-replica-tests down remove the containers
# docker-gh-ost-replica-tests run run replica tests on the containers
set -e
GH_OST_ROOT=$(git rev-parse --show-toplevel)
if [[ ":$PATH:" != *":$GH_OST_ROOT:"* ]]; then
export PATH="${PATH}:${GH_OST_ROOT}/script"
fi
poll_mysql() {
CTR=0
cmd="gh-ost-test-mysql-$1"
while ! $cmd -e "select 1;" >/dev/null 2>&1; do
sleep 1
CTR=$((CTR + 1))
if [ $CTR -gt 30 ]; then
echo " ❌ MySQL $1 failed to start"
return 1
fi
done
echo " ✔ MySQL $1 OK"
return 0
}
mysql-source() {
if [[ $TEST_MYSQL_IMAGE =~ "mysql:8.4" ]]; then
gh-ost-test-mysql-master --ssl-mode=required "$@"
else
gh-ost-test-mysql-master "$@"
fi
}
mysql-replica() {
if [[ $TEST_MYSQL_IMAGE =~ "mysql:8.4" ]]; then
gh-ost-test-mysql-replica --ssl-mode=required "$@"
else
gh-ost-test-mysql-replica "$@"
fi
}
setup() {
[ -z "$TEST_MYSQL_IMAGE" ] && TEST_MYSQL_IMAGE="mysql:8.0.41"
echo "Starting MySQL $TEST_MYSQL_IMAGE containers..."
compose_file="$GH_OST_ROOT/localtests/docker-compose.yml"
MYSQL_SHA2_RSA_KEYS_FLAG=""
MYSQL_PASSWORD_HASHING_ALGORITHM="mysql_native_password"
if [[ $TEST_MYSQL_IMAGE =~ "mysql:8.4" ]]; then
MYSQL_PASSWORD_HASHING_ALGORITHM="caching_sha2_password"
MYSQL_SHA2_RSA_KEYS_FLAG="--caching-sha2-password-auto-generate-rsa-keys=ON"
fi
(TEST_MYSQL_IMAGE="$TEST_MYSQL_IMAGE" MYSQL_SHA2_RSA_KEYS_FLAG="$MYSQL_SHA2_RSA_KEYS_FLAG" envsubst <"$compose_file") >"$compose_file.tmp"
docker compose -f "$compose_file.tmp" up -d --wait
echo "Waiting for MySQL..."
poll_mysql "master" || exit 1
poll_mysql "replica" || exit 1
echo -n "Setting up replication..."
mysql-source -e "create user if not exists 'repl'@'%' identified with $MYSQL_PASSWORD_HASHING_ALGORITHM by 'repl';"
mysql-source -e "grant replication slave on *.* to 'repl'@'%'; flush privileges;"
mysql-source -e "create user if not exists 'gh-ost'@'%' identified with $MYSQL_PASSWORD_HASHING_ALGORITHM by 'gh-ost';"
mysql-source -e "grant all on *.* to 'gh-ost'@'%';"
sleep 1
if [[ $TEST_MYSQL_IMAGE =~ "mysql:8.4" ]]; then
mysql-replica -e "change replication source to source_host='mysql-primary', source_port=3307, source_user='repl', source_password='repl', source_auto_position=1, source_ssl=1;"
mysql-replica -e "start replica;"
else
mysql-replica -e "change master to master_host='mysql-primary', master_port=3307, master_user='repl', master_password='repl', master_auto_position=1;"
mysql-replica -e "start slave;"
fi
echo "OK"
}
teardown() {
echo "Stopping containers..."
docker stop mysql-replica
docker stop mysql-primary
echo "Removing containers..."
docker rm mysql-replica
docker rm mysql-primary
}
main() {
if [[ "$1" == "up" ]]; then
setup
elif [[ "$1" == "down" ]]; then
teardown
elif [[ "$1" == "run" ]]; then
shift 1
"$GH_OST_ROOT/localtests/test.sh" -d "$@"
fi
}
main "$@"