From 0b004ff4a8438d1085251a938196253db7ab33fa Mon Sep 17 00:00:00 2001 From: Luke McCrone Date: Sat, 10 May 2025 20:41:37 -0300 Subject: [PATCH] test: convert eight or so setup operations to REST --- tests/commands/abort_multipart_upload.sh | 15 ++++++++ tests/commands/delete_bucket.sh | 2 +- tests/commands/delete_bucket_policy.sh | 15 ++++++++ tests/commands/delete_object.sh | 35 ----------------- tests/commands/list_multipart_uploads.sh | 17 ++++++++ tests/logger.sh | 13 ------- tests/rest_scripts/delete_bucket_policy.sh | 37 ++++++++++++++++++ tests/test_rest_bucket.sh | 8 ++-- tests/util/util_acl.sh | 18 --------- tests/util/util_bucket.sh | 45 ++++------------------ tests/util/util_multipart_abort.sh | 44 ++++++++++++++++++--- tests/util/util_object.sh | 2 +- tests/util/util_policy.sh | 2 +- 13 files changed, 136 insertions(+), 117 deletions(-) create mode 100755 tests/rest_scripts/delete_bucket_policy.sh diff --git a/tests/commands/abort_multipart_upload.sh b/tests/commands/abort_multipart_upload.sh index 20c9d0c2..ad0085ca 100644 --- a/tests/commands/abort_multipart_upload.sh +++ b/tests/commands/abort_multipart_upload.sh @@ -27,6 +27,21 @@ abort_multipart_upload() { return 0 } +abort_multipart_upload_rest() { + if ! check_param_count "abort_multipart_upload_rest" "bucket, key, upload ID" 3 $#; then + return 1 + fi + if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" UPLOAD_ID="$3" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/abort_multipart_upload.sh); then + log 2 "error aborting multipart upload: $result" + return 1 + fi + if [ "$result" != "204" ]; then + log 2 "expected '204' response, actual was '$result' (error: $(cat "$TEST_FILE_FOLDER"/result.txt)" + return 1 + fi + return 0 +} + abort_multipart_upload_with_user() { if [ $# -ne 5 ]; then log 2 "'abort multipart upload' command requires bucket, key, upload ID, username, password" diff --git a/tests/commands/delete_bucket.sh b/tests/commands/delete_bucket.sh index 8e85c1df..9704570b 100644 --- a/tests/commands/delete_bucket.sh +++ b/tests/commands/delete_bucket.sh @@ -61,7 +61,7 @@ delete_bucket_rest() { return 1 fi if [ "$result" != "204" ]; then - log 2 "expected '204', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt")" + log 2 "expected '204', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt"))" return 1 fi return 0 diff --git a/tests/commands/delete_bucket_policy.sh b/tests/commands/delete_bucket_policy.sh index 6939910f..38333b6e 100644 --- a/tests/commands/delete_bucket_policy.sh +++ b/tests/commands/delete_bucket_policy.sh @@ -38,6 +38,21 @@ delete_bucket_policy() { return 0 } +delete_bucket_policy_rest() { + if ! check_param_count "delete_bucket_policy_rest" "bucket" 1 $#; then + return 1 + fi + if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/delete_bucket_policy.sh 2>&1); then + log 2 "error deleting bucket policy: $result" + return 1 + fi + if [ "$result" != "204" ]; then + log 2 "expected '204', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt"))" + return 1 + fi + return 0 +} + delete_bucket_policy_with_user() { record_command "delete-bucket-policy" "client:s3api" if [[ $# -ne 3 ]]; then diff --git a/tests/commands/delete_object.sh b/tests/commands/delete_object.sh index 0ee231fb..68d73643 100644 --- a/tests/commands/delete_object.sh +++ b/tests/commands/delete_object.sh @@ -45,24 +45,6 @@ delete_object() { return 0 } -# shellcheck disable=SC2317 -delete_object_rest() { - if [ $# -ne 2 ]; then - log 2 "'delete_object_rest' requires bucket name, object name" - return 1 - fi - if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/delete_object.sh 2>&1); then - log 2 "error deleting object: $result" - return 1 - fi - if [ "$result" != "204" ]; then - delete_object_error=$(cat "$TEST_FILE_FOLDER/result.txt") - log 2 "expected '204', was '$result' ($delete_object_error)" - return 1 - fi - return 0 -} - delete_object_bypass_retention() { if ! check_param_count "delete_object_bypass_retention" "client, bucket, key, user, password" 5 $#; then return 1 @@ -83,23 +65,6 @@ delete_object_bypass_retention() { return 0 } -# shellcheck disable=SC2317 -delete_object_rest() { - if ! check_param_count "delete_object_rest" "bucket, key" 2 $#; then - return 1 - fi - if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/delete_object.sh 2>&1); then - log 2 "error deleting object: $result" - return 1 - fi - if [ "$result" != "204" ]; then - delete_object_error=$(cat "$TEST_FILE_FOLDER/result.txt") - log 2 "expected '204', was '$result' ($delete_object_error)" - return 1 - fi - return 0 -} - delete_object_version() { if ! check_param_count "delete_object_version" "bucket, key, version ID" 3 $#; then return 1 diff --git a/tests/commands/list_multipart_uploads.sh b/tests/commands/list_multipart_uploads.sh index 9720a005..fecac844 100644 --- a/tests/commands/list_multipart_uploads.sh +++ b/tests/commands/list_multipart_uploads.sh @@ -26,6 +26,23 @@ list_multipart_uploads() { fi } +list_multipart_uploads_rest() { + record_command "list_multipart_uploads_rest" "client:rest" + if ! check_param_count "list_multipart_upload_rest" "bucket" 1 $#; then + return 1 + fi + if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/uploads.txt" ./tests/rest_scripts/list_multipart_uploads.sh 2>&1); then + log 2 "error listing multipart uploads: $result" + return 1 + fi + uploads=$(cat "$TEST_FILE_FOLDER/uploads.txt") + if [ "$result" != "200" ]; then + log 2 "expected '200', was '$result' ($uploads)" + return 1 + fi + return 0 +} + list_multipart_uploads_with_user() { record_command "list-multipart-uploads" "client:s3api" if [[ $# -ne 3 ]]; then diff --git a/tests/logger.sh b/tests/logger.sh index dd20ca7f..e6a0d775 100644 --- a/tests/logger.sh +++ b/tests/logger.sh @@ -39,23 +39,10 @@ log() { return 0 } -# shellcheck disable=SC2317 log_with_stack_ref() { if ! check_log_params "log_with_stack_ref" "level, message, stack reference" 3 $#; then return 1 fi - if ! log_with_stack_ref "$1" "$2" 2; then - echo "error logging with stack ref" - return 1 - fi - return 0 -} - -log_with_stack_ref() { - if [[ $# -ne 3 ]]; then - echo "log_with_stack_ref function requires level, message, stack reference" - return 1 - fi # shellcheck disable=SC2153 if [[ $1 -gt ${LOG_LEVEL_INT:=4} ]]; then return 0 diff --git a/tests/rest_scripts/delete_bucket_policy.sh b/tests/rest_scripts/delete_bucket_policy.sh new file mode 100755 index 00000000..2f9c956e --- /dev/null +++ b/tests/rest_scripts/delete_bucket_policy.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# Copyright 2024 Versity Software +# This file is licensed under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http:#www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +source ./tests/rest_scripts/rest.sh + +# shellcheck disable=SC2153 +bucket_name="$BUCKET_NAME" + +current_date_time=$(date -u +"%Y%m%dT%H%M%SZ") + +cr_data=("DELETE" "/$bucket_name" "policy=") +cr_data+=("host:$host") +cr_data+=("x-amz-content-sha256:UNSIGNED-PAYLOAD" "x-amz-date:$current_date_time") +build_canonical_request "${cr_data[@]}" + +# shellcheck disable=SC2119 +create_canonical_hash_sts_and_signature + +curl_command+=(curl -ks -w "\"%{http_code}\"" -X DELETE "https://$host/$bucket_name?policy" +-H "\"Authorization: AWS4-HMAC-SHA256 Credential=$aws_access_key_id/$year_month_day/$aws_region/s3/aws4_request,SignedHeaders=$param_list,Signature=$signature\"") +curl_command+=("${header_fields[@]}") +curl_command+=(-o "$OUTPUT_FILE") +# shellcheck disable=SC2154 +eval "${curl_command[*]}" 2>&1 diff --git a/tests/test_rest_bucket.sh b/tests/test_rest_bucket.sh index b9f5247b..f36d59c7 100755 --- a/tests/test_rest_bucket.sh +++ b/tests/test_rest_bucket.sh @@ -105,8 +105,8 @@ source ./tests/util/util_tags.sh @test "REST - can set object lock enabled on existing buckets" { if [ "$DIRECT" != "true" ]; then - skip "https://github.com/versity/versitygw/issues/1300" - fi + skip "https://github.com/versity/versitygw/issues/1300" + fi run setup_bucket "$BUCKET_ONE_NAME" assert_success @@ -120,8 +120,8 @@ source ./tests/util/util_tags.sh @test "REST - cannot set object lock enabled without content-md5" { if [ "$DIRECT" != "true" ]; then - skip "https://github.com/versity/versitygw/issues/1301" - fi + skip "https://github.com/versity/versitygw/issues/1301" + fi run bucket_cleanup_if_bucket_exists "$BUCKET_ONE_NAME" assert_success diff --git a/tests/util/util_acl.sh b/tests/util/util_acl.sh index 4d76a4c6..e11db392 100644 --- a/tests/util/util_acl.sh +++ b/tests/util/util_acl.sh @@ -399,24 +399,6 @@ check_ownership_rule_and_reset_acl() { fi } -# param: bucket name -# return 1 for failure, 0 for success -get_object_ownership_rule_and_update_acl() { - if [ $# -ne 1 ]; then - log 2 "'get_object_ownership_rule_and_update_acl' requires bucket name" - return 1 - fi - if ! get_object_ownership_rule "$1"; then - log 2 "error getting object ownership rule" - return 1 - fi - log 5 "object ownership rule: $object_ownership_rule" - if [[ "$object_ownership_rule" != "BucketOwnerEnforced" ]] && ! put_bucket_canned_acl "$1" "private"; then - log 2 "error resetting bucket ACLs" - return 1 - fi -} - # get object acl # param: object path # export acl for success, return 1 for error diff --git a/tests/util/util_bucket.sh b/tests/util/util_bucket.sh index ba86e786..c2f74d18 100644 --- a/tests/util/util_bucket.sh +++ b/tests/util/util_bucket.sh @@ -6,27 +6,11 @@ source ./tests/util/util_multipart_abort.sh source ./tests/util/util_policy.sh source ./tests/util/util_retention.sh -# recursively delete an AWS bucket -# param: client, bucket name -# fail if error -delete_bucket_recursive() { - log 6 "delete_bucket_recursive" - if ! check_param_count "delete_bucket_recursive" "bucket name" 1 $#; then - return 1 - fi - - if ! delete_bucket_recursive_s3api "$1"; then - log 2 "error deleting bucket recursively (s3api)" - return 1 - fi - return 0 -} - # restore bucket to pre-test state (or prep for deletion) # param: bucket name # return 0 on success, 1 on error -clear_bucket_s3api() { - log 6 "clear_bucket_s3api" +reset_bucket() { + log 6 "reset_bucket" if ! check_param_count "clear_bucket_s3api" "bucket" 1 $#; then return 1 fi @@ -50,7 +34,7 @@ clear_bucket_s3api() { return 1 fi - if ! abort_all_multipart_uploads "$1"; then + if ! abort_all_multipart_uploads_rest "$1"; then log 2 "error aborting all multipart uploads" return 1 fi @@ -60,7 +44,7 @@ clear_bucket_s3api() { return 1 fi - if ! delete_bucket_policy "s3api" "$1"; then + if ! delete_bucket_policy_rest "$1"; then log 2 "error deleting bucket policy" return 1 fi @@ -79,13 +63,13 @@ clear_bucket_s3api() { # params: bucket name # return 0 if able to delete recursively, 1 if not -delete_bucket_recursive_s3api() { +delete_bucket_recursive() { log 6 "delete_bucket_recursive_s3api" if ! check_param_count "delete_bucket_recursive_s3api" "bucket" 1 $#; then return 1 fi - if ! clear_bucket_s3api "$1"; then + if ! reset_bucket "$1"; then log 2 "error clearing bucket (s3api)" return 1 fi @@ -97,21 +81,6 @@ delete_bucket_recursive_s3api() { return 0 } -# params: client, bucket name -# return 0 on success, 1 on error -delete_bucket_contents() { - log 6 "delete_bucket_contents" - if ! check_param_count "delete_bucket_contents" "bucket name" 1 $#; then - return 1 - fi - - if ! clear_bucket_s3api "$1"; then - log 2 "error clearing bucket (s3api)" - return 1 - fi - return 0 -} - # check if bucket exists # param: bucket name # return 0 for true, 1 for false, 2 for error @@ -157,7 +126,7 @@ bucket_cleanup() { return 1 fi if [[ $RECREATE_BUCKETS == "false" ]]; then - if ! delete_bucket_contents "$1"; then + if ! reset_bucket "$1"; then log 2 "error deleting bucket contents" return 1 fi diff --git a/tests/util/util_multipart_abort.sh b/tests/util/util_multipart_abort.sh index fb4a2a58..58da1ab3 100644 --- a/tests/util/util_multipart_abort.sh +++ b/tests/util/util_multipart_abort.sh @@ -36,12 +36,8 @@ create_abort_multipart_upload_rest() { return 1 fi log 5 "uploads after upload creation: $(cat "$TEST_FILE_FOLDER/uploads.txt")" - if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" UPLOAD_ID="$upload_id" OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" ./tests/rest_scripts/abort_multipart_upload.sh); then - log 2 "error aborting multipart upload: $result" - return 1 - fi - if [ "$result" != "204" ]; then - log 2 "expected '204' response, actual was '$result' (error: $(cat "$TEST_FILE_FOLDER"/result.txt)" + if ! abort_multipart_upload_rest "$1" "$2" "$upload_id"; then + log 2 "error aborting multipart upload" return 1 fi log 5 "final uploads: $(cat "$TEST_FILE_FOLDER/uploads.txt")" @@ -93,6 +89,42 @@ abort_all_multipart_uploads() { done } +# param: bucket name +# return 0 for success, 1 for error +abort_all_multipart_uploads_rest() { + if ! check_param_count "abort_all_multipart_uploads_rest" "bucket" 1 $#; then + return 1 + fi + if ! list_multipart_uploads_rest "$1"; then + log 2 "error listing multipart uploads" + return 1 + fi + # shellcheck disable=SC2154 + log 5 "UPLOADS: $uploads" + if ! upload_data=$(xmllint --xpath '//*[local-name()="Upload"]' "$TEST_FILE_FOLDER/uploads.txt" 2>&1); then + if [[ "$upload_data" == *"XPath set is empty"* ]]; then + return 0 + fi + log 2 "error retrieving upload data: $upload_data" + return 1 + fi + for upload in $upload_data; do + if ! key=$(echo -n "$upload" | xmllint --xpath '//*[local-name()="Key"]/text()' - 2>&1); then + log 2 "error retrieving key: $key" + return 1 + fi + if ! upload_id=$(echo -n "$upload" | xmllint --xpath '//*[local-name()="UploadId"]/text()' - 2>&1); then + log 2 "error retrieving upload ID: $upload_id" + return 1 + fi + log 5 "Aborting multipart upload for key: $key, UploadId: $upload_id" + if ! abort_multipart_upload_rest "$1" "$key" "$upload_id"; then + log 2 "error aborting multipart upload" + return 1 + fi + done +} + # run upload, then abort it # params: bucket, key, local file location, number of parts to split into before uploading # return 0 for success, 1 for failure diff --git a/tests/util/util_object.sh b/tests/util/util_object.sh index 69324374..4a8b18d3 100644 --- a/tests/util/util_object.sh +++ b/tests/util/util_object.sh @@ -117,7 +117,7 @@ clear_object_in_bucket() { object_exists() { log 6 "object_exists" if ! check_param_count "object_exists" "command type, bucket, key" 3 $#; then - return 1 + return 2 fi head_object "$1" "$2" "$3" || local head_object_result=$? if [[ $head_object_result -eq 2 ]]; then diff --git a/tests/util/util_policy.sh b/tests/util/util_policy.sh index ba5049c7..2d59d1e6 100644 --- a/tests/util/util_policy.sh +++ b/tests/util/util_policy.sh @@ -334,7 +334,7 @@ put_and_check_policy_rest() { log_bucket_policy() { log 6 "log_bucket_policy" if ! check_param_count "log_bucket_policy" "bucket" 1 $#; then - return 1 + return fi if ! get_bucket_policy "rest" "$1"; then log 2 "error getting bucket policy"