mirror of
https://github.com/versity/versitygw.git
synced 2026-08-17 12:46:23 +00:00
Merge pull request #2121 from versity/test/test_rest_delete_objects
This commit is contained in:
@@ -37,15 +37,22 @@ list_object_versions_rest() {
|
||||
log 2 "'list_object_versions_rest' requires bucket name"
|
||||
return 1
|
||||
fi
|
||||
if ! result=$(BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/object_versions.txt" ./tests/rest_scripts/list_object_versions.sh 2>&1); then
|
||||
if ! response=$(get_file_name 2>&1); then
|
||||
log 2 "error getting file name: $response"
|
||||
return 1
|
||||
fi
|
||||
file_name="$response"
|
||||
|
||||
if ! result=$(BUCKET_NAME="$1" OUTPUT_FILE="$TEST_FILE_FOLDER/$file_name" ./tests/rest_scripts/list_object_versions.sh 2>&1); then
|
||||
log 2 "error listing object versions: $result"
|
||||
return 1
|
||||
fi
|
||||
if [ "$result" != "200" ]; then
|
||||
log 2 "expected '200', was '$result' ($(cat "$TEST_FILE_FOLDER/object_versions.txt"))"
|
||||
log 2 "expected '200', was '$result' ($(cat "$TEST_FILE_FOLDER/$file_name"))"
|
||||
return 1
|
||||
fi
|
||||
versions=$(cat "$TEST_FILE_FOLDER/object_versions.txt")
|
||||
versions=$(cat "$TEST_FILE_FOLDER/$file_name")
|
||||
echo "$TEST_FILE_FOLDER/$file_name"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ source ./tests/drivers/xml.sh
|
||||
source ./tests/util/util_legal_hold.sh
|
||||
|
||||
list_and_delete_objects() {
|
||||
log 6 "list_and_delete_objects"
|
||||
if ! check_param_count "list_and_delete_objects" "bucket" 1 $#; then
|
||||
log 6 "list_and_delete_objects: '$1'"
|
||||
if ! check_param_count_v2 "bucket" 1 $#; then
|
||||
return 1
|
||||
fi
|
||||
local response
|
||||
@@ -30,6 +30,7 @@ list_and_delete_objects() {
|
||||
return 1
|
||||
fi
|
||||
mapfile -t object_array <<< "$response"
|
||||
log 5 "objects: ${object_array[*]}"
|
||||
for object in "${object_array[@]}"; do
|
||||
if [ "$object" == "" ]; then
|
||||
break
|
||||
|
||||
@@ -107,3 +107,39 @@ delete_objects_verify_success() {
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
check_delete_objects_precondition_error() {
|
||||
if ! check_param_count_v2 "data file, key" 2 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! response=$(get_element_with_matching_inner_value "$1" "$2" "DeleteResult" "Error" "--" "Key" 2>&1); then
|
||||
log 2 "error finding element matching key '$2': $response"
|
||||
return 1
|
||||
fi
|
||||
error_string="$response"
|
||||
if ! error=$(check_xml_element_inside_string "$error_string" "PreconditionFailed" "Code" 2>&1); then
|
||||
log 2 "error checking precondtion: $error"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
check_delete_objects_version_error() {
|
||||
if ! check_param_count_v2 "data file, key, version ID" 3 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! response=$(get_element_with_matching_inner_value "$1" "$2" "DeleteResult" "Error" "--" "Key" 2>&1); then
|
||||
log 2 "error finding element matching key '$2': $response"
|
||||
return 1
|
||||
fi
|
||||
error_string="$response"
|
||||
if ! error=$(check_xml_element_inside_string "$error_string" "NoSuchVersion" "Code" 2>&1); then
|
||||
log 2 "error checking error code: $error"
|
||||
return 1
|
||||
fi
|
||||
if ! error=$(check_xml_element_inside_string "$error_string" "$3" "VersionId" 2>&1); then
|
||||
log 2 "error checking version ID: $error"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -126,17 +126,22 @@ add_and_check_checksum() {
|
||||
fi
|
||||
}
|
||||
|
||||
get_etag_attribute_rest() {
|
||||
if [ $# -ne 3 ]; then
|
||||
log 2 "'get_etag_attribute_rest' requires bucket name, object key, expected etag"
|
||||
check_etag_attribute_rest() {
|
||||
if ! check_param_count_v2 "bucket name, object key, expected etag" 3 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" ATTRIBUTES="ETag" OUTPUT_FILE="$TEST_FILE_FOLDER/attributes.txt" ./tests/rest_scripts/get_object_attributes.sh); then
|
||||
if ! response=$(get_file_name 2>&1); then
|
||||
log 2 "error getting file name: $response"
|
||||
return 1
|
||||
fi
|
||||
file_name="$response"
|
||||
|
||||
if ! result=$(COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" ATTRIBUTES="ETag" OUTPUT_FILE="$TEST_FILE_FOLDER/$file_name" ./tests/rest_scripts/get_object_attributes.sh); then
|
||||
log 2 "error attempting to get object info: $result"
|
||||
return 1
|
||||
fi
|
||||
log 5 "attributes: $(cat "$TEST_FILE_FOLDER/attributes.txt")"
|
||||
if ! check_xml_element "$TEST_FILE_FOLDER/attributes.txt" "$3" "GetObjectAttributesResponse" "ETag"; then
|
||||
log 5 "attributes: $(cat "$TEST_FILE_FOLDER/$file_name")"
|
||||
if ! check_xml_element "$TEST_FILE_FOLDER/$file_name" "$3" "GetObjectAttributesResponse" "ETag"; then
|
||||
log 2 "etag mismatch"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -93,7 +93,7 @@ check_for_empty_element() {
|
||||
log 2 "error getting XML data"
|
||||
return 1
|
||||
fi
|
||||
if grep -q '<[^/][^ >]*>' "$1.xml"; then
|
||||
if grep -q '<[^/ ?>].*>' "$1.xml"; then
|
||||
if xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
@@ -155,6 +155,7 @@ check_xml_element() {
|
||||
log 2 "error getting element text"
|
||||
return 1
|
||||
fi
|
||||
log 5 "expect: '$2', actual: '$xml_val'"
|
||||
if [ "$2" != "$xml_val" ]; then
|
||||
log 2 "XML data mismatch, expected '$2', actual '$xml_val'"
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
ETag = "eTag"
|
||||
Key = "key"
|
||||
LastModifiedTime = "lastModifiedTime"
|
||||
Size = "size"
|
||||
VersionId = "versionId"
|
||||
)
|
||||
|
||||
type Object struct {
|
||||
XMLName xml.Name `xml:"Object"`
|
||||
ETag string `xml:"ETag,omitempty"`
|
||||
Key string `xml:"Key"`
|
||||
LastModifiedTime string `xml:"LastModifiedTime,omitempty"`
|
||||
Size string `xml:"Size,omitempty"`
|
||||
VersionId string `xml:"VersionId,omitempty"`
|
||||
}
|
||||
|
||||
type Delete struct {
|
||||
XMLName xml.Name `xml:"Delete"`
|
||||
XMLNamespace string `xml:"xmlns,attr"`
|
||||
Objects []*Object
|
||||
Quiet bool `xml:"Quiet,omitempty"`
|
||||
}
|
||||
|
||||
func NewDeleteObjectsCommand(command *S3RequestBuilder, objectStrings []string, quietMode bool) (*S3RequestBuilder, error) {
|
||||
command.Config.Method = "POST"
|
||||
command.Config.Query = "delete"
|
||||
deleteCommand := &Delete{
|
||||
XMLNamespace: "https://s3.amazonaws.com/doc/2006-03-01/",
|
||||
}
|
||||
for _, objectString := range objectStrings {
|
||||
var object *Object
|
||||
var err error
|
||||
if object, err = assembleObject(objectString); err != nil {
|
||||
return nil, fmt.Errorf("error assembling object for DeleteObjects command: %w", err)
|
||||
}
|
||||
deleteCommand.Objects = append(deleteCommand.Objects, object)
|
||||
}
|
||||
deleteCommand.Quiet = quietMode
|
||||
xmlData, err := xml.Marshal(deleteCommand)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error marshalling XML: %w", err)
|
||||
}
|
||||
command.Config.Payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + string(xmlData)
|
||||
return command, nil
|
||||
}
|
||||
|
||||
func assembleObject(objectString string) (*Object, error) {
|
||||
object := &Object{}
|
||||
objectStrings := strings.SplitSeq(objectString, ";")
|
||||
for singleObjectString := range objectStrings {
|
||||
keyValuePair := strings.Split(singleObjectString, "=")
|
||||
switch keyValuePair[0] {
|
||||
case ETag:
|
||||
object.ETag = keyValuePair[1]
|
||||
case Key:
|
||||
object.Key = keyValuePair[1]
|
||||
case LastModifiedTime:
|
||||
object.LastModifiedTime = keyValuePair[1]
|
||||
case Size:
|
||||
object.Size = keyValuePair[1]
|
||||
case VersionId:
|
||||
object.VersionId = keyValuePair[1]
|
||||
default:
|
||||
return nil, errors.New("invalid object key for DeleteObjects command: " + keyValuePair[0])
|
||||
}
|
||||
}
|
||||
return object, nil
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
|
||||
const (
|
||||
CreateBucket = "createBucket"
|
||||
DeleteObjects = "deleteObjects"
|
||||
PutBucketCors = "putBucketCORS"
|
||||
PutBucketTagging = "putBucketTagging"
|
||||
PutObject = "putObject"
|
||||
@@ -72,6 +73,8 @@ var locationConstraint *string
|
||||
var locationConstraintSet bool = false
|
||||
|
||||
var corsRules arrayFlags
|
||||
var objectsToDelete arrayFlags
|
||||
var deleteObjectsQuietMode *bool
|
||||
|
||||
type restParams map[string]string
|
||||
|
||||
@@ -175,6 +178,10 @@ func getS3CommandType(baseCommand *command.S3RequestBuilder) (command.S3CommandC
|
||||
if s3Command, err = command.NewCreateBucketCommand(baseCommand, *locationConstraint, locationConstraintSet); err != nil {
|
||||
return nil, fmt.Errorf("error setting up CreateBucket command: %w", err)
|
||||
}
|
||||
case DeleteObjects:
|
||||
if s3Command, err = command.NewDeleteObjectsCommand(baseCommand, objectsToDelete, *deleteObjectsQuietMode); err != nil {
|
||||
return nil, fmt.Errorf("error setting up DeleteObjects command: %w", err)
|
||||
}
|
||||
case PutBucketCors:
|
||||
if s3Command, err = command.NewPutBucketCORSCommand(baseCommand, corsRules); err != nil {
|
||||
return nil, fmt.Errorf("error setting up PutBucketCORS command: %w", err)
|
||||
@@ -273,6 +280,8 @@ func checkFlags() error {
|
||||
writeXMLPayloadToFile = flag.String("writeXMLPayloadToFile", "", "for curl commands, file to write XML payloads to")
|
||||
outputFile = flag.String("outputFile", "", "for curl commands, location to save retrieved file data (to stdout if empty)")
|
||||
headerFile = flag.String("headerFile", "", "for curl commands, location to save header file data (to stdout or outputFile if empty)")
|
||||
flag.Var(&objectsToDelete, "objectsToDelete", "Objects to delete in DeleteObjects command (can add multiple)")
|
||||
deleteObjectsQuietMode = flag.Bool("deleteObjectsQuietMode", false, "Quiet mode for DeleteObjects command")
|
||||
// Parse the flags
|
||||
flag.Parse()
|
||||
|
||||
|
||||
@@ -84,6 +84,8 @@ tags:
|
||||
desc: "DeleteBucketTagging command"
|
||||
DeleteObject:
|
||||
desc: "DeleteObject command"
|
||||
DeleteObjects:
|
||||
desc: "DeleteObjects command"
|
||||
DeleteObjectTagging:
|
||||
desc: "DeleteObjectTagging command"
|
||||
GetBucketAcl:
|
||||
|
||||
Executable
+180
@@ -0,0 +1,180 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Copyright 2026 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.
|
||||
|
||||
load ./bats-support/load
|
||||
load ./bats-assert/load
|
||||
|
||||
source ./tests/drivers/create_bucket/create_bucket_rest.sh
|
||||
source ./tests/drivers/delete_objects/delete_objects_rest.sh
|
||||
source ./tests/setup.sh
|
||||
|
||||
# tags: curl, DeleteObjects, malformed-message
|
||||
@test "REST - DeleteObjects - missing payload" {
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run send_rest_go_command_expect_error "400" "MissingRequestBodyError" "is empty" "-bucketName" "$bucket_name" "-method" "POST" "-query" "delete" "-contentMD5"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects, malformed-message
|
||||
@test "REST - DeleteObjects - no objects added to payload" {
|
||||
if [ "$DIRECT" != "true" ]; then
|
||||
skip "https://github.com/versity/versitygw/issues/2109"
|
||||
fi
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run send_rest_go_command_expect_error "400" "MalformedXML" "was not well-formed" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" "-contentMD5"
|
||||
assert_success
|
||||
|
||||
run get_object_rest "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/$file_name-copy"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects
|
||||
@test "REST - DeleteObjects - nonexistent key" {
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
local incorrect_file_name="${file_name}a"
|
||||
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=$incorrect_file_name" "--" "$incorrect_file_name" "DeleteResult" "Deleted" "Key"
|
||||
assert_success
|
||||
|
||||
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects
|
||||
@test "REST - DeleteObjects - ETag mismatch" {
|
||||
if [ "$DIRECT" != "true" ]; then
|
||||
skip "https://github.com/versity/versitygw/issues/2112"
|
||||
fi
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run send_rest_go_command_callback "200" "check_delete_objects_precondition_error" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=$file_name;eTag=abc" "--" "$file_name"
|
||||
assert_success
|
||||
|
||||
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects
|
||||
@test "REST - DeleteObject - ETag match" {
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run get_etag_rest "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
etag="$output"
|
||||
|
||||
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=$file_name;eTag=$etag" "--" "$file_name" "DeleteResult" "Deleted" "Key"
|
||||
assert_success
|
||||
|
||||
run verify_object_not_found "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects, versioning
|
||||
@test "REST - DeleteObjects - version ID mismatch" {
|
||||
if [ "$DIRECT" != "true" ]; then
|
||||
skip "https://github.com/versity/versitygw/issues/2119"
|
||||
fi
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
incorrect_version="abc"
|
||||
run send_rest_go_command_callback "200" "check_delete_objects_version_error" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=$file_name;versionId=$incorrect_version" "--" "$file_name" "$incorrect_version"
|
||||
assert_success
|
||||
|
||||
run download_and_compare_file "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name" "$TEST_FILE_FOLDER/${file_name}-copy"
|
||||
assert_success
|
||||
}
|
||||
|
||||
# tags: curl, DeleteObjects, versioning
|
||||
@test "REST - DeleteObjects - version ID" {
|
||||
if [ "$RECREATE_BUCKETS" == "false" ]; then
|
||||
skip "cannot change versioning status for static buckets"
|
||||
fi
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_bucket_versioning_rest "$bucket_name" "Enabled"
|
||||
assert_success
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run send_rest_go_command_callback "200" "parse_version_id" "-bucketName" "$bucket_name" "-query" "versions" "--" "true"
|
||||
assert_success
|
||||
version_id="$output"
|
||||
|
||||
run send_rest_go_command_callback "200" "check_xml_element_contains" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=$file_name;versionId=$version_id" "--" "$file_name" "DeleteResult" "Deleted" "Key"
|
||||
assert_success
|
||||
|
||||
run verify_object_not_found "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
}
|
||||
|
||||
@test "REST - DeleteObjects - quiet mode" {
|
||||
if [ "$DIRECT" != "true" ]; then
|
||||
skip "https://github.com/versity/versitygw/issues/2124"
|
||||
fi
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name file_name <<< "$output"
|
||||
|
||||
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
|
||||
run send_rest_go_command_callback "200" "check_for_empty_element" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
|
||||
"-contentMD5" "-objectsToDelete" "key=${file_name}" "-deleteObjectsQuietMode" "--" "DeleteResult"
|
||||
assert_success
|
||||
|
||||
run verify_object_not_found "$bucket_name" "$file_name"
|
||||
assert_success
|
||||
}
|
||||
@@ -41,7 +41,7 @@ source ./tests/drivers/get_object_attributes/get_object_attributes_rest.sh
|
||||
assert_success
|
||||
expected_etag=$output
|
||||
|
||||
run get_etag_attribute_rest "$bucket_name" "$test_file" "$expected_etag"
|
||||
run check_etag_attribute_rest "$bucket_name" "$test_file" "$expected_etag"
|
||||
assert_success
|
||||
}
|
||||
|
||||
|
||||
@@ -24,19 +24,14 @@ source ./tests/drivers/create_bucket/create_bucket_rest.sh
|
||||
source ./tests/drivers/list_buckets/list_buckets_rest.sh
|
||||
source ./tests/util/util_rest.sh
|
||||
|
||||
test_file="test_file"
|
||||
|
||||
# tags: curl, versioning, PutBucketVersioning
|
||||
@test "REST - check, enable, suspend versioning" {
|
||||
if [ "$RECREATE_BUCKETS" == "false" ]; then
|
||||
skip "cannot change versioning status for static buckets"
|
||||
fi
|
||||
run get_bucket_name "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
bucket_name="$output"
|
||||
|
||||
run setup_bucket_v2 "$bucket_name"
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name test_file <<< "$output"
|
||||
|
||||
run check_versioning_status_rest "$bucket_name" ""
|
||||
assert_success
|
||||
@@ -59,12 +54,9 @@ test_file="test_file"
|
||||
if [ "$RECREATE_BUCKETS" == "false" ]; then
|
||||
skip "cannot change versioning status for static buckets"
|
||||
fi
|
||||
run get_bucket_name "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
bucket_name="$output"
|
||||
|
||||
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name test_file <<< "$output"
|
||||
|
||||
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
|
||||
assert_success
|
||||
@@ -90,12 +82,9 @@ test_file="test_file"
|
||||
if [ "$RECREATE_BUCKETS" == "false" ]; then
|
||||
skip "cannot change versioning status for static buckets"
|
||||
fi
|
||||
run get_bucket_name "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
bucket_name="$output"
|
||||
|
||||
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name test_file <<< "$output"
|
||||
|
||||
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
|
||||
assert_success
|
||||
@@ -112,12 +101,9 @@ test_file="test_file"
|
||||
|
||||
# tags: curl, versioning, PutBucketVersioning, PutObject, DeleteObject, GetObject
|
||||
@test "versioning - retrieve after delete" {
|
||||
run get_bucket_name "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
bucket_name="$output"
|
||||
|
||||
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
|
||||
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
|
||||
assert_success
|
||||
read -r bucket_name test_file <<< "$output"
|
||||
|
||||
run put_object "rest" "$TEST_FILE_FOLDER/$test_file" "$bucket_name" "$test_file"
|
||||
assert_success
|
||||
@@ -144,6 +130,10 @@ test_file="test_file"
|
||||
run setup_bucket_object_lock_enabled_v2 "$bucket_name"
|
||||
assert_success
|
||||
|
||||
run get_file_name
|
||||
assert_success
|
||||
test_file="$output"
|
||||
|
||||
run create_test_files "$test_file"
|
||||
assert_success
|
||||
|
||||
@@ -169,6 +159,10 @@ test_file="test_file"
|
||||
run setup_bucket_object_lock_enabled_v2 "$bucket_name"
|
||||
assert_success
|
||||
|
||||
run get_file_name
|
||||
assert_success
|
||||
test_file="$output"
|
||||
|
||||
run create_test_files "$test_file"
|
||||
assert_success
|
||||
|
||||
|
||||
@@ -347,24 +347,29 @@ get_delete_marker_and_verify_405() {
|
||||
if ! check_param_count "get_delete_marker_and_verify_405" "bucket, file name" 2 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! list_object_versions_rest "$1"; then
|
||||
if ! response=$(list_object_versions_rest "$1" 2>&1); then
|
||||
log 2 "error listing REST object versions"
|
||||
return 1
|
||||
fi
|
||||
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
|
||||
versions_file="$response"
|
||||
log 5 "versions: $(cat "$versions_file")"
|
||||
|
||||
if ! version_id=$(xmllint --xpath "//*[local-name()=\"DeleteMarker\"]/*[local-name()=\"VersionId\"]/text()" "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
if ! version_id=$(xmllint --xpath "//*[local-name()=\"DeleteMarker\"]/*[local-name()=\"VersionId\"]/text()" "$versions_file" 2>&1); then
|
||||
log 2 "error getting XML value: $version_id"
|
||||
return 1
|
||||
fi
|
||||
log 5 "xml val: $version_id"
|
||||
|
||||
if ! result=$(OUTPUT_FILE="$TEST_FILE_FOLDER/result.txt" COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" VERSION_ID="$version_id" ./tests/rest_scripts/head_object.sh); then
|
||||
if ! response=$(get_file_name 2>&1); then
|
||||
log 2 "error getting file name: $response"
|
||||
return 1
|
||||
fi
|
||||
if ! result=$(OUTPUT_FILE="$TEST_FILE_FOLDER/$response" COMMAND_LOG="$COMMAND_LOG" BUCKET_NAME="$1" OBJECT_KEY="$2" VERSION_ID="$version_id" ./tests/rest_scripts/head_object.sh); then
|
||||
log 2 "error getting result: $result"
|
||||
return 1
|
||||
fi
|
||||
if [ "$result" != "405" ]; then
|
||||
log 2 "expected '405', was '$result' ($(cat "$TEST_FILE_FOLDER/result.txt"))"
|
||||
log 2 "expected '405', was '$result' ($(cat "$TEST_FILE_FOLDER/$response"))"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
|
||||
@@ -191,12 +191,14 @@ get_and_check_versions_rest() {
|
||||
if ! check_param_count_gt "bucket, key, count, expected islatest, expected id equal to null" 5 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! list_object_versions_rest "$1"; then
|
||||
log 2 "error listing object versions"
|
||||
if ! response=$(list_object_versions_rest "$1" 2>&1); then
|
||||
log 2 "error listing object versions: $response"
|
||||
return 1
|
||||
fi
|
||||
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
|
||||
if ! version_count=$(xmllint --xpath 'count(//*[local-name()="Version"])' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
versions_file="$response"
|
||||
|
||||
log 5 "versions: $(cat "$versions_file")"
|
||||
if ! version_count=$(xmllint --xpath 'count(//*[local-name()="Version"])' "$versions_file" 2>&1); then
|
||||
log 2 "error getting version count: $version_count"
|
||||
return 1
|
||||
fi
|
||||
@@ -213,7 +215,7 @@ get_and_check_versions_rest() {
|
||||
fi
|
||||
match_string="//*[local-name()=\"Version\"][*[local-name()=\"VersionId\" and text()$id_check\"null\"] and *[local-name()=\"IsLatest\" and text()=\"$4\"]]"
|
||||
log 5 "match string: $match_string"
|
||||
if ! xmllint --xpath "$match_string" "$TEST_FILE_FOLDER/object_versions.txt" 2>&1; then
|
||||
if ! xmllint --xpath "$match_string" "$versions_file" 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
shift 2
|
||||
@@ -225,12 +227,14 @@ check_versions_after_file_deletion() {
|
||||
if ! check_param_count "check_versions_after_file_deletion" "bucket, key" 2 $#; then
|
||||
return 1
|
||||
fi
|
||||
if ! list_object_versions_rest "$1"; then
|
||||
log 2 "error listing object versions"
|
||||
if ! response=$(list_object_versions_rest "$1" 2>&1); then
|
||||
log 2 "error listing object versions: $response"
|
||||
return 1
|
||||
fi
|
||||
log 5 "versions: $(cat "$TEST_FILE_FOLDER/object_versions.txt")"
|
||||
if ! version_key=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="Key"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
versions_file="$response"
|
||||
|
||||
log 5 "versions: $(cat "$versions_file")"
|
||||
if ! version_key=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="Key"]/text()' "$versions_file" 2>&1); then
|
||||
log 2 "error getting Version 'Key' value: $version_key"
|
||||
return 1
|
||||
fi
|
||||
@@ -238,7 +242,7 @@ check_versions_after_file_deletion() {
|
||||
log 2 "version key mismatch (expected $2, actual $version_key)"
|
||||
return 1
|
||||
fi
|
||||
if ! version_id=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="VersionId"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
if ! version_id=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="VersionId"]/text()' "$versions_file" 2>&1); then
|
||||
log 2 "error getting Version 'VersionID' value: $version_id"
|
||||
return 1
|
||||
fi
|
||||
@@ -246,7 +250,7 @@ check_versions_after_file_deletion() {
|
||||
log 2 "version ID mismatch (expected 'null', actual '$version_id')"
|
||||
return 1
|
||||
fi
|
||||
if ! marker_key=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="Key"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
if ! marker_key=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="Key"]/text()' "$versions_file" 2>&1); then
|
||||
log 2 "error getting Version 'Key' value: $marker_key"
|
||||
return 1
|
||||
fi
|
||||
@@ -254,7 +258,7 @@ check_versions_after_file_deletion() {
|
||||
log 2 "delete marker key mismatch (expected $2, actual $marker_key)"
|
||||
return 1
|
||||
fi
|
||||
if ! marker_id=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="VersionId"]/text()' "$TEST_FILE_FOLDER/object_versions.txt" 2>&1); then
|
||||
if ! marker_id=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="VersionId"]/text()' "$versions_file" 2>&1); then
|
||||
log 2 "error getting Version 'VersionID' value: $versioning_info"
|
||||
return 1
|
||||
fi
|
||||
@@ -262,4 +266,5 @@ check_versions_after_file_deletion() {
|
||||
log 2 "delete marker ID expected to be non-null"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user