aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2023-09-27 13:38:17 +0200
committerAlex Auvolat <alex@adnab.me>2023-09-27 14:57:37 +0200
commit9ac1d5be0eba1b3b35f7fb2f99fe8df549044197 (patch)
tree43be0581776a16f56b5882678121042619912d59
parent897cbf2c27e4477dde51eee5b73fa3267b4c7098 (diff)
downloadgarage-9ac1d5be0eba1b3b35f7fb2f99fe8df549044197.tar.gz
garage-9ac1d5be0eba1b3b35f7fb2f99fe8df549044197.zip
add upgrade test for garage 0.8 -> 0.9
-rw-r--r--.drone.yml8
-rwxr-xr-xscript/dev-bucket.sh17
-rwxr-xr-xscript/dev-cluster.sh18
-rwxr-xr-xscript/dev-configure.sh34
-rwxr-xr-xscript/test-upgrade.sh75
5 files changed, 133 insertions, 19 deletions
diff --git a/.drone.yml b/.drone.yml
index 04663a22..a274be29 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -42,6 +42,12 @@ steps:
- nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
+ - name: upgrade tests
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
+ - nix-shell --attr integration --run "./script/test-upgrade.sh v0.8.4 x86_64-unknown-linux-musl" || (cat /tmp/garage.log; false)
+
trigger:
event:
- custom
@@ -285,6 +291,6 @@ trigger:
---
kind: signature
-hmac: 24aebbcdba84fd0cdf963061d7bb72ae5b915bfdd0f50c7b019001126fb7fa56
+hmac: dcf68ed6536e3fd9b359377e4c6c1d321fa9cc0f6fe5645d69c8f1d604569b4c
...
diff --git a/script/dev-bucket.sh b/script/dev-bucket.sh
index 33d739fa..708c2c43 100755
--- a/script/dev-bucket.sh
+++ b/script/dev-bucket.sh
@@ -9,11 +9,22 @@ GARAGE_RELEASE="${REPO_FOLDER}/target/release/"
NIX_RELEASE="${REPO_FOLDER}/result/bin/"
PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH"
-garage -c /tmp/config.1.toml bucket create eprouvette
-KEY_INFO=$(garage -c /tmp/config.1.toml key create opérateur)
+if [ -z "$GARAGE_BIN" ]; then
+ GARAGE_BIN=$(which garage || exit 1)
+ echo -en "Found garage at: ${GARAGE_BIN}\n"
+else
+ echo -en "Using garage binary at: ${GARAGE_BIN}\n"
+fi
+
+$GARAGE_BIN -c /tmp/config.1.toml bucket create eprouvette
+if [ "$GARAGE_08" = "1" ]; then
+ KEY_INFO=$($GARAGE_BIN -c /tmp/config.1.toml key new --name opérateur)
+else
+ KEY_INFO=$($GARAGE_BIN -c /tmp/config.1.toml key create opérateur)
+fi
ACCESS_KEY=`echo $KEY_INFO|grep -Po 'GK[a-f0-9]+'`
SECRET_KEY=`echo $KEY_INFO|grep -Po 'Secret key: [a-f0-9]+'|grep -Po '[a-f0-9]+$'`
-garage -c /tmp/config.1.toml bucket allow eprouvette --read --write --owner --key $ACCESS_KEY
+$GARAGE_BIN -c /tmp/config.1.toml bucket allow eprouvette --read --write --owner --key $ACCESS_KEY
echo "$ACCESS_KEY $SECRET_KEY" > /tmp/garage.s3
echo "Bucket s3://eprouvette created. Credentials stored in /tmp/garage.s3."
diff --git a/script/dev-cluster.sh b/script/dev-cluster.sh
index fa0a950e..6b39255a 100755
--- a/script/dev-cluster.sh
+++ b/script/dev-cluster.sh
@@ -14,8 +14,13 @@ export RUST_BACKTRACE=1
export RUST_LOG=garage=info,garage_api=debug
MAIN_LABEL="\e[${FANCYCOLORS[0]}[main]\e[49m"
-WHICH_GARAGE=$(which garage || exit 1)
-echo -en "${MAIN_LABEL} Found garage at: ${WHICH_GARAGE}\n"
+if [ -z "$GARAGE_BIN" ]; then
+ GARAGE_BIN=$(which garage || exit 1)
+ echo -en "${MAIN_LABEL} Found garage at: ${GARAGE_BIN}\n"
+else
+ echo -en "${MAIN_LABEL} Using garage binary at: ${GARAGE_BIN}\n"
+fi
+$GARAGE_BIN --version
NETWORK_SECRET="$(openssl rand -hex 32)"
@@ -28,6 +33,7 @@ LABEL="\e[${FANCYCOLORS[$count]}[$count]\e[49m"
cat > $CONF_PATH <<EOF
block_size = 1048576 # objects are split in blocks of maximum this number of bytes
metadata_dir = "/tmp/garage-meta-$count"
+db_engine = "lmdb"
data_dir = "/tmp/garage-data-$count"
rpc_bind_addr = "0.0.0.0:$((3900+$count))" # the port other Garage nodes will use to talk to this node
rpc_public_addr = "127.0.0.1:$((3900+$count))"
@@ -51,7 +57,7 @@ EOF
echo -en "$LABEL configuration written to $CONF_PATH\n"
-(garage -c /tmp/config.$count.toml server 2>&1|while read r; do echo -en "$LABEL $r\n"; done) &
+($GARAGE_BIN -c /tmp/config.$count.toml server 2>&1|while read r; do echo -en "$LABEL $r\n"; done) &
done
# >>>>>>>>>>>>>>>> END FOR LOOP ON NODES
@@ -73,14 +79,14 @@ fi
sleep 3
# Establish connections between nodes
for count in $(seq 1 3); do
- NODE=$(garage -c /tmp/config.$count.toml node id -q)
+ NODE=$($GARAGE_BIN -c /tmp/config.$count.toml node id -q)
for count2 in $(seq 1 3); do
- garage -c /tmp/config.$count2.toml node connect $NODE
+ $GARAGE_BIN -c /tmp/config.$count2.toml node connect $NODE
done
done
RETRY=120
-until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do
+until $GARAGE_BIN -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do
(( RETRY-- ))
if (( RETRY <= 0 )); then
echo -en "${MAIN_LABEL} Garage did not start"
diff --git a/script/dev-configure.sh b/script/dev-configure.sh
index 9c24bf4b..0649cdbe 100755
--- a/script/dev-configure.sh
+++ b/script/dev-configure.sh
@@ -9,9 +9,17 @@ GARAGE_RELEASE="${REPO_FOLDER}/target/release/"
NIX_RELEASE="${REPO_FOLDER}/result/bin/"
PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH"
+if [ -z "$GARAGE_BIN" ]; then
+ GARAGE_BIN=$(which garage || exit 1)
+ echo -en "Found garage at: ${GARAGE_BIN}\n"
+else
+ echo -en "Using garage binary at: ${GARAGE_BIN}\n"
+fi
+$GARAGE_BIN --version
+
sleep 5
RETRY=120
-until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do
+until $GARAGE_BIN -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do
(( RETRY-- ))
if (( RETRY <= 0 )); then
echo "garage did not start in time, failing."
@@ -21,12 +29,20 @@ until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do
sleep 1
done
-garage -c /tmp/config.1.toml status \
- | grep 'NO ROLE' \
- | grep -Po '^[0-9a-f]+' \
- | while read id; do
- garage -c /tmp/config.1.toml layout assign $id -z dc1 -c 1G
- done
+if [ "$GARAGE_08" = "1" ]; then
+ $GARAGE_BIN -c /tmp/config.1.toml status \
+ | grep 'NO ROLE' \
+ | grep -Po '^[0-9a-f]+' \
+ | while read id; do
+ $GARAGE_BIN -c /tmp/config.1.toml layout assign $id -z dc1 -c 1
+ done
+else
+ $GARAGE_BIN -c /tmp/config.1.toml status \
+ | grep 'NO ROLE' \
+ | grep -Po '^[0-9a-f]+' \
+ | while read id; do
+ $GARAGE_BIN -c /tmp/config.1.toml layout assign $id -z dc1 -c 1G
+ done
+fi
-garage -c /tmp/config.1.toml layout config -r 1
-garage -c /tmp/config.1.toml layout apply --version 1
+$GARAGE_BIN -c /tmp/config.1.toml layout apply --version 1
diff --git a/script/test-upgrade.sh b/script/test-upgrade.sh
new file mode 100755
index 00000000..dc25e7c6
--- /dev/null
+++ b/script/test-upgrade.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+
+set -ex
+
+export LC_ALL=C.UTF-8
+export LANG=C.UTF-8
+SCRIPT_FOLDER="`dirname \"$0\"`"
+REPO_FOLDER="${SCRIPT_FOLDER}/../"
+GARAGE_DEBUG="${REPO_FOLDER}/target/debug/"
+GARAGE_RELEASE="${REPO_FOLDER}/target/release/"
+NIX_RELEASE="${REPO_FOLDER}/result/bin/:${REPO_FOLDER}/result-bin/bin/"
+PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH"
+
+OLD_VERSION="$1"
+ARCH="$2"
+
+
+echo "Downloading old garage binary..."
+curl https://garagehq.deuxfleurs.fr/_releases/$OLD_VERSION/$ARCH/garage > /tmp/old_garage
+chmod +x /tmp/old_garage
+
+echo "============= insert data into old version cluster ================="
+
+export GARAGE_BIN=/tmp/old_garage
+if echo $OLD_VERSION | grep 'v0\.8\.'; then
+ echo "Detected Garage v0.8.x"
+ export GARAGE_08=1
+fi
+
+echo "⏳ Setup cluster using old version"
+$GARAGE_BIN --version
+${SCRIPT_FOLDER}/dev-clean.sh
+${SCRIPT_FOLDER}/dev-cluster.sh > /tmp/garage.log 2>&1 &
+sleep 6
+${SCRIPT_FOLDER}/dev-configure.sh
+${SCRIPT_FOLDER}/dev-bucket.sh
+
+echo "🛠️ Inserting data in old cluster"
+source ${SCRIPT_FOLDER}/dev-env-rclone.sh
+rclone copy "${SCRIPT_FOLDER}/../.git/" garage:eprouvette/test_dotgit --stats=1s --stats-log-level=NOTICE --stats-one-line
+
+echo "🏁 Stopping old cluster"
+killall -INT old_garage
+sleep 2
+killall -9 old_garage || true
+
+echo "🏁 Removing old garage version"
+rm -rv $GARAGE_BIN
+export -n GARAGE_BIN
+export -n GARAGE_08
+
+echo "================ read data from new cluster ==================="
+
+echo "⏳ Setup cluster using new version"
+pwd
+ls
+export GARAGE_BIN=$(which garage)
+$GARAGE_BIN --version
+${SCRIPT_FOLDER}/dev-cluster.sh >> /tmp/garage.log 2>&1 &
+sleep 3
+
+echo "🛠️ Retrieving data from old cluster"
+rclone copy garage:eprouvette/test_dotgit /tmp/test_dotgit --stats=1s --stats-log-level=NOTICE --stats-one-line --fast-list
+
+if ! diff <(find "${SCRIPT_FOLDER}/../.git" -type f | xargs md5sum | cut -d ' ' -f 1 | sort) <(find /tmp/test_dotgit -type f | xargs md5sum | cut -d ' ' -f 1 | sort); then
+ echo "TEST FAILURE: directories are different"
+ exit 1
+fi
+rm -r /tmp/test_dotgit
+
+echo "🏁 Teardown"
+rm -rf /tmp/garage-{data,meta}-*
+rm -rf /tmp/config.*.toml
+
+echo "✅ Success"