From ef4d6e782a67bd422489d643e8807eaf7fb853c4 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 28 Apr 2021 11:35:10 +0200 Subject: 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 --- 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 | 28 ++++----- script/test-smoke.sh | 133 ++++++++++++++++++++++++---------------- 8 files changed, 157 insertions(+), 77 deletions(-) create mode 100644 script/dev-env-mc.sh create mode 100644 script/dev-env-rclone.sh (limited to 'script') 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..." + +# 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 + +# 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 + +# 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 + +# 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 -for idx in $(seq 1 3); do - # AWS sends - awsgrg cp "/tmp/garage.$idx.rnd" "s3://eprouvette/&+-é\"/garage.$idx.aws" - - awsgrg ls s3://eprouvette - - 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 - - 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 - - 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 - -echo "teardown" +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" +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" -- cgit v1.2.3