From 01611fb4abb90d6124e8d88df28d79a62c3d8f0c Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 12 Jan 2022 10:17:15 +0100 Subject: [PATCH] Add smoke test for UploadPartCopy & fix some bugs --- script/dev-cluster.sh | 2 +- script/test-smoke.sh | 51 +++++++++++++++++++++++++++++++++++++++++++ shell.nix | 1 + src/api/s3_copy.rs | 1 + src/api/signature.rs | 9 +++++--- 5 files changed, 60 insertions(+), 4 deletions(-) diff --git a/script/dev-cluster.sh b/script/dev-cluster.sh index d76c98a4..f9229bdc 100755 --- a/script/dev-cluster.sh +++ b/script/dev-cluster.sh @@ -11,7 +11,7 @@ PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" FANCYCOLORS=("41m" "42m" "44m" "45m" "100m" "104m") export RUST_BACKTRACE=1 -export RUST_LOG=garage=info,garage_api=debug +export RUST_LOG=garage=info,garage_api=debug,garage_api::signature=trace MAIN_LABEL="\e[${FANCYCOLORS[0]}[main]\e[49m" WHICH_GARAGE=$(which garage || exit 1) diff --git a/script/test-smoke.sh b/script/test-smoke.sh index 1f900ece..27fccb83 100755 --- a/script/test-smoke.sh +++ b/script/test-smoke.sh @@ -52,6 +52,57 @@ if [ -z "$SKIP_AWS" ]; then done fi +# AWS advanced testing +if [ -z "$SKIP_AWS" ]; then + aws s3 cp "/tmp/garage.3.rnd" "s3://eprouvette/copy_part_source" + UPLOAD_ID=$(aws s3api create-multipart-upload --bucket eprouvette --key test_multipart | jq -r .UploadId) + PART1=$(aws s3api upload-part \ + --bucket eprouvette --key test_multipart \ + --upload-id $UPLOAD_ID --part-number 1 \ + --body /tmp/garage.2.rnd | jq .ETag) + PART2=$(aws s3api upload-part-copy \ + --bucket eprouvette --key test_multipart \ + --upload-id $UPLOAD_ID --part-number 2 \ + --copy-source "/eprouvette/copy_part_source" \ + --copy-source-range "bytes=500-5000500" \ + | jq .CopyPartResult.ETag) + PART3=$(aws s3api upload-part \ + --bucket eprouvette --key test_multipart \ + --upload-id $UPLOAD_ID --part-number 3 \ + --body /tmp/garage.3.rnd | jq .ETag) + cat >/tmp/garage.multipart_struct < /tmp/garage.test_multipart_reference + diff /tmp/garage.test_multipart /tmp/garage.test_multipart_reference >/tmp/garage.test_multipart_diff 2>&1 + + aws s3 rm "s3://eprouvette/copy_part_source" + aws s3 rm "s3://eprouvette/test_multipart" + + rm /tmp/garage.multipart_struct + rm /tmp/garage.test_multipart +fi + # S3CMD if [ -z "$SKIP_S3CMD" ]; then echo "🛠️ Testing with s3cmd" diff --git a/shell.nix b/shell.nix index a4062f79..1d70730e 100644 --- a/shell.nix +++ b/shell.nix @@ -83,6 +83,7 @@ function refresh_toolchain { pkgs.which pkgs.openssl pkgs.curl + pkgs.jq ] else []) ++ (if release then [ diff --git a/src/api/s3_copy.rs b/src/api/s3_copy.rs index c37bb138..7e91ecd8 100644 --- a/src/api/s3_copy.rs +++ b/src/api/s3_copy.rs @@ -537,6 +537,7 @@ impl CopyPreconditionHeaders { } (None, None, Some(inm), None) => !inm.iter().any(|x| x == etag || x == "*"), (None, None, None, Some(ims)) => v_date > *ims, + (None, None, None, None) => true, _ => { return Err(Error::BadRequest( "Invalid combination of x-amz-copy-source-if-xxxxx headers".into(), diff --git a/src/api/signature.rs b/src/api/signature.rs index c580cb3a..311e6a9a 100644 --- a/src/api/signature.rs +++ b/src/api/signature.rs @@ -266,10 +266,13 @@ fn canonical_header_string(headers: &HashMap, signed_headers: &s let mut items = headers .iter() .filter(|(key, _)| signed_headers_vec.contains(&key.as_str())) - .map(|(key, value)| key.to_lowercase() + ":" + value.trim()) .collect::>(); - items.sort(); - items.join("\n") + items.sort_by(|(k1, _), (k2, _)| k1.cmp(k2)); + items + .iter() + .map(|(key, value)| key.to_lowercase() + ":" + value.trim()) + .collect::>() + .join("\n") } fn canonical_query_string(uri: &hyper::Uri) -> String {