From ef4d6e782a67bd422489d643e8807eaf7fb853c4 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 28 Apr 2021 11:35:10 +0200 Subject: [PATCH] Add minio & rclone to our functional tests It is now possible to configure which clients you do not want to test with the env variable SKIP_XXX=1, XXX being the client name. eg. SKIP_S3CMD=1 ./script/test-smoke.sh --- .drone.yml | 8 +-- script/builder_image/Dockerfile | 3 +- script/dev-clean.sh | 1 + script/dev-cluster.sh | 15 ++++ script/dev-env-aws.sh | 11 +-- script/dev-env-mc.sh | 22 ++++++ script/dev-env-rclone.sh | 21 ++++++ script/dev-env-s3cmd.sh | 26 +++---- script/test-smoke.sh | 123 ++++++++++++++++++++------------ 9 files changed, 155 insertions(+), 75 deletions(-) create mode 100644 script/dev-env-mc.sh create mode 100644 script/dev-env-rclone.sh diff --git a/.drone.yml b/.drone.yml index b0b54792..1c2362ff 100644 --- a/.drone.yml +++ b/.drone.yml @@ -37,7 +37,7 @@ steps: - nonexistent_skip_this_step - name: build - image: lxpz/garage_builder_amd64:1 + image: superboum/garage_builder_amd64:3 volumes: - name: cargo_home path: /drone/cargo @@ -49,7 +49,7 @@ steps: - cargo build - name: cargo-test - image: lxpz/garage_builder_amd64:1 + image: superboum/garage_builder_amd64:3 volumes: - name: cargo_home path: /drone/cargo @@ -85,7 +85,7 @@ steps: - nonexistent_skip_this_step - name: smoke-test - image: lxpz/garage_builder_amd64:1 + image: superboum/garage_builder_amd64:3 volumes: - name: cargo_home path: /drone/cargo @@ -129,6 +129,6 @@ steps: --- kind: signature -hmac: de82026387bd09e547dbc9cc5d232fd865204b4f393d32508c50b58f8e60611d +hmac: d584c2a15ede6d5702fbe27ae5ae2b2bf7a04461ae7aed2d53cbda83b7fd503e ... diff --git a/script/builder_image/Dockerfile b/script/builder_image/Dockerfile index 292d551d..00dea191 100644 --- a/script/builder_image/Dockerfile +++ b/script/builder_image/Dockerfile @@ -1,6 +1,7 @@ FROM rust:buster RUN apt-get update && \ - apt-get install --yes libsodium-dev awscli python-pip && \ + apt-get install --yes libsodium-dev awscli python-pip wget rclone openssl socat && \ rm -rf /var/lib/apt/lists/* +RUN wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc && chmod +x /usr/local/bin/mc RUN rustup component add rustfmt RUN pip install s3cmd diff --git a/script/dev-clean.sh b/script/dev-clean.sh index 151c5547..60065a3d 100755 --- a/script/dev-clean.sh +++ b/script/dev-clean.sh @@ -3,5 +3,6 @@ set -ex killall -9 garage || echo "garage is not running" +killall -9 socat || echo "socat is not running" rm -rf /tmp/garage* rm -rf /tmp/config.*.toml diff --git a/script/dev-cluster.sh b/script/dev-cluster.sh index addbf4b4..96147ca0 100755 --- a/script/dev-cluster.sh +++ b/script/dev-cluster.sh @@ -47,6 +47,21 @@ EOF echo -en "$LABEL configuration written to $CONF_PATH\n" +if [ -z "$SKIP_HTTPS" ]; then + echo -en "$LABEL Starting dummy HTTPS reverse proxy\n" + mkdir -p /tmp/garagessl + openssl req \ + -new \ + -x509 \ + -keyout /tmp/garagessl/test.key \ + -out /tmp/garagessl/test.crt \ + -nodes \ + -subj "/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=localhost/emailAddress=X@X.XX" \ + -addext "subjectAltName = DNS:localhost, IP:127.0.0.1" + cat /tmp/garagessl/test.key /tmp/garagessl/test.crt > /tmp/garagessl/test.pem + socat openssl-listen:4443,reuseaddr,fork,cert=/tmp/garagessl/test.pem,verify=0 tcp4-connect:localhost:3911 & +fi + (garage server -c /tmp/config.$count.toml 2>&1|while read r; do echo -en "$LABEL $r\n"; done) & done diff --git a/script/dev-env-aws.sh b/script/dev-env-aws.sh index c9a57660..864fd4c2 100644 --- a/script/dev-env-aws.sh +++ b/script/dev-env-aws.sh @@ -1,14 +1,9 @@ #!/bin/bash -SCRIPT_FOLDER="`dirname \"${BASH_SOURCE[0]}\"`" -REPO_FOLDER="${SCRIPT_FOLDER}/../" -GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" -GARAGE_RELEASE="${REPO_FOLDER}/target/release/" -PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:$PATH" - export AWS_ACCESS_KEY_ID=`cat /tmp/garage.s3 |cut -d' ' -f1` export AWS_SECRET_ACCESS_KEY=`cat /tmp/garage.s3 |cut -d' ' -f2` export AWS_DEFAULT_REGION='garage' -alias awsgrg="aws s3 \ - --endpoint-url http://127.0.0.1:3911" +function aws { command aws --endpoint-url http://127.0.0.1:3911 $@ ; } + +aws --version diff --git a/script/dev-env-mc.sh b/script/dev-env-mc.sh new file mode 100644 index 00000000..98b63047 --- /dev/null +++ b/script/dev-env-mc.sh @@ -0,0 +1,22 @@ +ACCESS_KEY=`cat /tmp/garage.s3 |cut -d' ' -f1` +SECRET_KEY=`cat /tmp/garage.s3 |cut -d' ' -f2` + +mkdir -p /tmp/garage.mc/certs/CAs + +cat > /tmp/garage.mc/config.json < /tmp/garage.rclone.conf < /tmp/garage.s3cmd.cfg < /tmp/garage.log 2>&1 & ${SCRIPT_FOLDER}/dev-configure.sh ${SCRIPT_FOLDER}/dev-bucket.sh -source ${SCRIPT_FOLDER}/dev-env-aws.sh -source ${SCRIPT_FOLDER}/dev-env-s3cmd.sh +which garage garage status garage key list garage bucket list @@ -25,58 +26,86 @@ dd if=/dev/urandom of=/tmp/garage.1.rnd bs=1k count=2 # No multipart, inline sto dd if=/dev/urandom of=/tmp/garage.2.rnd bs=1M count=5 # No multipart but file will be chunked dd if=/dev/urandom of=/tmp/garage.3.rnd bs=1M count=10 # by default, AWS starts using multipart at 8MB -echo "s3 api testing..." -awsgrg --version -s3cmd --version -python3 --version +echo "🧪 S3 API testing..." -for idx in $(seq 1 3); do - # AWS sends - awsgrg cp "/tmp/garage.$idx.rnd" "s3://eprouvette/&+-é\"/garage.$idx.aws" +# AWS +if [ -z "$SKIP_AWS" ]; then + echo "🛠️ Testing with awscli" + source ${SCRIPT_FOLDER}/dev-env-aws.sh + for idx in $(seq 1 3); do + aws s3 cp "/tmp/garage.$idx.rnd" "s3://eprouvette/&+-é\"/garage.$idx.aws" + aws s3 ls s3://eprouvette + aws s3 cp "s3://eprouvette/&+-é\"/garage.$idx.aws" "/tmp/garage.$idx.dl" + diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl + rm /tmp/garage.$idx.dl + aws s3 rm "s3://eprouvette/&+-é\"/garage.$idx.aws" + done +fi - awsgrg ls s3://eprouvette +# S3CMD +if [ -z "$SKIP_S3CMD" ]; then + echo "🛠️ Testing with s3cmd" + source ${SCRIPT_FOLDER}/dev-env-s3cmd.sh + for idx in $(seq 1 3); do + s3cmd put "/tmp/garage.$idx.rnd" "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" + s3cmd ls s3://eprouvette + s3cmd get "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" "/tmp/garage.$idx.dl" + diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl + rm /tmp/garage.$idx.dl + s3cmd rm "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" + done +fi - awsgrg cp "s3://eprouvette/&+-é\"/garage.$idx.aws" "/tmp/garage.$idx.dl" - diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl - rm /tmp/garage.$idx.dl +# Minio Client +if [ -z "$SKIP_MC" ]; then + echo "🛠️ Testing with mc (minio client)" + source ${SCRIPT_FOLDER}/dev-env-mc.sh + for idx in $(seq 1 3); do + mc cp "/tmp/garage.$idx.rnd" "garage/eprouvette/&+-é\"/garage.$idx.mc" + mc ls garage/eprouvette + mc cp "garage/eprouvette/&+-é\"/garage.$idx.mc" "/tmp/garage.$idx.dl" + diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl + rm /tmp/garage.$idx.dl + mc rm "garage/eprouvette/&+-é\"/garage.$idx.mc" + done +fi - s3grg get "s3://eprouvette/&+-é\"/garage.$idx.aws" "/tmp/garage.$idx.dl" - diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl - rm /tmp/garage.$idx.dl +# RClone +if [ -z "$SKIP_RCLONE" ]; then + echo "🛠️ Testing with rclone" + source ${SCRIPT_FOLDER}/dev-env-rclone.sh + for idx in $(seq 1 3); do + cp /tmp/garage.$idx.rnd /tmp/garage.$idx.dl + rclone copy "/tmp/garage.$idx.dl" "garage:eprouvette/&+-é\"/" + rm /tmp/garage.$idx.dl + rclone ls garage:eprouvette + rclone copy "garage:eprouvette/&+-é\"/garage.$idx.dl" "/tmp/" + diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl + rm /tmp/garage.$idx.dl + rclone delete "garage:eprouvette/&+-é\"/garage.$idx.dl" + done +fi - awsgrg rm "s3://eprouvette/&+-é\"/garage.$idx.aws" - - # S3CMD sends - s3grg put "/tmp/garage.$idx.rnd" "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" - - s3grg ls s3://eprouvette - - s3grg get "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" "/tmp/garage.$idx.dl" - diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl - rm /tmp/garage.$idx.dl - - awsgrg cp "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" "/tmp/garage.$idx.dl" - diff /tmp/garage.$idx.rnd /tmp/garage.$idx.dl - rm /tmp/garage.$idx.dl - - s3grg rm "s3://eprouvette/&+-é\"/garage.$idx.s3cmd" -done rm /tmp/garage.{1,2,3}.rnd -echo "website testing" -echo "

hello world

" > /tmp/garage-index.html -awsgrg cp /tmp/garage-index.html s3://eprouvette/index.html -[ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 404 ] -garage bucket website --allow eprouvette -[ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 200 ] -garage bucket website --deny eprouvette -[ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 404 ] -awsgrg rm s3://eprouvette/index.html -rm /tmp/garage-index.html +if [ -z "$SKIP_AWS" ]; then + echo "🧪 Website Testing" + echo "

hello world

" > /tmp/garage-index.html + aws s3 cp /tmp/garage-index.html s3://eprouvette/index.html + [ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 404 ] + garage bucket website --allow eprouvette + [ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 200 ] + garage bucket website --deny eprouvette + [ `curl -s -o /dev/null -w "%{http_code}" --header "Host: eprouvette.garage.tld" http://127.0.0.1:3923/ ` == 404 ] + aws s3 rm s3://eprouvette/index.html + rm /tmp/garage-index.html +fi -echo "teardown" +echo "🏁 Teardown" +AWS_ACCESS_KEY_ID=`cat /tmp/garage.s3 |cut -d' ' -f1` +AWS_SECRET_ACCESS_KEY=`cat /tmp/garage.s3 |cut -d' ' -f2` garage bucket deny --read --write eprouvette --key $AWS_ACCESS_KEY_ID garage bucket delete --yes eprouvette garage key delete --yes $AWS_ACCESS_KEY_ID -echo "success" +echo "✅ Success"