mirror of
https://github.com/versity/versitygw.git
synced 2026-07-23 08:22:22 +00:00
253 lines
8.1 KiB
Bash
253 lines
8.1 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
source ./tests/commands/get_bucket_versioning.sh
|
|
source ./tests/commands/list_object_versions.sh
|
|
source ./tests/drivers/params.sh
|
|
|
|
check_if_versioning_enabled() {
|
|
if ! check_param_count "check_if_versioning_enabled" "bucket" 1 $#; then
|
|
return 2
|
|
fi
|
|
if ! get_bucket_versioning 's3api' "$1"; then
|
|
log 2 "error getting bucket versioning"
|
|
return 2
|
|
fi
|
|
# shellcheck disable=SC2154
|
|
if ! status=$(echo "$versioning" | grep -v "InsecureRequestWarning" | jq -r ".Status" 2>&1); then
|
|
log 2 "error parsing 'Status' value: $status"
|
|
return 2
|
|
fi
|
|
if [[ "$status" == "Enabled" ]]; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
parse_version_data() {
|
|
if ! check_param_count "parse_version_data" "raw data, element name" 2 $#; then
|
|
return 1
|
|
fi
|
|
if ! version_data="$(echo "$1" | jq -c "$2" 2>&1)"; then
|
|
if [[ "$version_data" == *"Cannot iterate over null"* ]]; then
|
|
return 0
|
|
fi
|
|
fi
|
|
log 5 "version data: ${version_data[*]}"
|
|
# shellcheck disable=SC2048
|
|
for version in ${version_data[*]}; do
|
|
if ! key=$(echo "$version" | jq -r '.Key' 2>&1); then
|
|
log 2 "error getting version key: $key (version: $version)"
|
|
return 1
|
|
fi
|
|
version_keys+=("$key")
|
|
if ! version_id=$(echo "$version" | jq -r '.VersionId' 2>&1); then
|
|
log 2 "error getting version id: $version_id (version: $version)"
|
|
return 1
|
|
fi
|
|
version_ids+=("$version_id")
|
|
done
|
|
}
|
|
|
|
check_versioning_status_rest() {
|
|
if ! check_param_count "check_versioning_status_rest" "bucket, expected value" 2 $#; then
|
|
return 1
|
|
fi
|
|
if ! get_bucket_versioning_rest "$1"; then
|
|
log 2 "error getting bucket versioning"
|
|
return 1
|
|
fi
|
|
log 5 "versioning: $(cat "$TEST_FILE_FOLDER/versioning.txt")"
|
|
if ! versioning_info=$(xmllint --xpath '//*[local-name()="VersioningConfiguration"]' "$TEST_FILE_FOLDER/versioning.txt" 2>&1); then
|
|
log 2 "error getting VersioningConfiguration value: $versioning_info"
|
|
return 1
|
|
fi
|
|
versioning_status=""
|
|
if ! has_status=$(echo "$versioning_info" | xmllint --xpath 'boolean(//*[local-name()="Status"]/text())' - 2>&1); then
|
|
log 2 "error getting if versioning status: $has_status"
|
|
return 1
|
|
fi
|
|
if [ "$has_status" == true ]; then
|
|
if ! versioning_status=$(echo "$versioning_info" | xmllint --xpath '//*[local-name()="Status"]/text()' - 2>&1); then
|
|
log 2 "error getting versioning status: $versioning_status"
|
|
return 1
|
|
fi
|
|
fi
|
|
if [ "$versioning_status" != "$2" ]; then
|
|
log 2 "versioning info should be '$2', is $versioning_status"
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
echo_versions() {
|
|
if ! check_param_count_v2 "'Version' or 'DeleteMarker', 'Key' or 'VersionId' or 'IsLatest', file" 3 $#; then
|
|
return 1
|
|
fi
|
|
|
|
local response
|
|
if ! response=$(xmllint --xpath "//*[local-name()=\"$1\"]/*[local-name()=\"$2\"]/text()" "$3" 2>&1); then
|
|
if [[ "$response" == *"XPath set is empty"* ]]; then
|
|
return 0
|
|
fi
|
|
log 2 "error getting Version '$1', '$2' values: $response"
|
|
return 1
|
|
else
|
|
keys="$response"
|
|
fi
|
|
unescaped_keys=$(echo -n "$keys" | xmlstarlet unesc)
|
|
log 5 "keys to append: ${unescaped_keys[*]}"
|
|
echo "${unescaped_keys[*]}"
|
|
return 0
|
|
}
|
|
|
|
parse_versions_rest() {
|
|
if ! check_param_count_v2 "data file" 1 $#; then
|
|
return 1
|
|
fi
|
|
log 5 "versions file: $(cat "$1")"
|
|
base64_pairs=()
|
|
version_keys=()
|
|
version_ids=()
|
|
version_islatests=()
|
|
|
|
local response
|
|
if ! response=$(echo_versions "Version" "Key" "$1" 2>&1); then
|
|
log 2 "error getting Version Key values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_keys+=($response)
|
|
|
|
if ! response=$(echo_versions "Version" "VersionId" "$1" 2>&1); then
|
|
log 2 "error getting Version VersionId values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_ids+=($response)
|
|
|
|
if ! response=$(echo_versions "Version" "IsLatest" "$1" 2>&1); then
|
|
log 2 "error getting Version IsLatest values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_islatests+=($response)
|
|
|
|
if ! response=$(echo_versions "DeleteMarker" "Key" "$1" 2>&1); then
|
|
log 2 "error getting DeleteMarker Key values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_keys+=($response)
|
|
|
|
if ! response=$(echo_versions "DeleteMarker" "VersionId" "$1" 2>&1); then
|
|
log 2 "error getting DeleteMarker VersionId values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_ids+=($response)
|
|
|
|
if ! response=$(echo_versions "DeleteMarker" "IsLatest" "$1" 2>&1); then
|
|
log 2 "error getting DeleteMarker IsLatest values: $response"
|
|
return 1
|
|
fi
|
|
# shellcheck disable=SC2206
|
|
version_islatests+=($response)
|
|
|
|
log 5 "version keys: ${version_keys[*]}"
|
|
log 5 "version IDs: ${version_ids[*]}"
|
|
log 5 "base64 pairs: ${base64_pairs[*]}"
|
|
return 0
|
|
}
|
|
|
|
get_and_check_versions_rest() {
|
|
if ! check_param_count_gt "bucket, key, count, expected islatest/expected id equal to null pairs" 5 $#; then
|
|
return 1
|
|
fi
|
|
local bucket="$1" key="$2" expected_count="$3" expected_pairs=("${@:4}")
|
|
local response versions_data versions_count id_check expected_islatest expected_id_is_null
|
|
|
|
if ! response=$(list_object_versions_rest "$bucket" 2>&1); then
|
|
log 2 "error listing object versions: $response"
|
|
return 1
|
|
fi
|
|
versions_data="$response"
|
|
|
|
log 5 "versions data: $versions_data"
|
|
if ! response=$(xmllint --xpath 'count(//*[local-name()="Version"])' - <<< "$versions_data" 2>&1); then
|
|
log 2 "error getting version count: $response"
|
|
return 1
|
|
fi
|
|
versions_count="$response"
|
|
|
|
log 5 "version count: $versions_count"
|
|
if [ "$versions_count" != "$expected_count" ]; then
|
|
log 2 "version count mismatch (expected '1', actual '$versions_count')"
|
|
return 1
|
|
fi
|
|
for ((i=0; i<"${#expected_pairs[@]}"; i+=2)); do
|
|
expected_islatest="${expected_pairs[$i]}"
|
|
expected_id_is_null="${expected_pairs[$((i+1))]}"
|
|
if [ "$expected_id_is_null" == "true" ]; then
|
|
id_check="="
|
|
else
|
|
id_check="!="
|
|
fi
|
|
match_string="//*[local-name()=\"Version\"][*[local-name()=\"VersionId\" and text()${id_check}\"null\"] and *[local-name()=\"IsLatest\" and text()=\"${expected_islatest}\"]]"
|
|
log 5 "match string: $match_string"
|
|
if ! response=$(xmllint --xpath "$match_string" - <<< "$versions_data" 2>&1); then
|
|
log 2 "error matching: $response"
|
|
return 1
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
check_versions_after_file_deletion() {
|
|
if ! check_param_count "check_versions_after_file_deletion" "bucket, key" 2 $#; then
|
|
return 1
|
|
fi
|
|
local bucket="$1" key="$2"
|
|
local response versions_data version_key version_id marker_key marker_id
|
|
|
|
if ! response=$(list_object_versions_rest "$bucket" 2>&1); then
|
|
log 2 "error listing object versions: $response"
|
|
return 1
|
|
fi
|
|
versions_data="$response"
|
|
|
|
log 5 "versions: $(cat "$versions_data")"
|
|
if ! version_key=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="Key"]/text()' - <<< "$versions_data" 2>&1); then
|
|
log 2 "error getting Version 'Key' value: $version_key"
|
|
return 1
|
|
fi
|
|
if [ "$version_key" != "$key" ]; then
|
|
log 2 "version key mismatch (expected '$key', actual '$version_key')"
|
|
return 1
|
|
fi
|
|
if ! version_id=$(xmllint --xpath '//*[local-name()="Version"]/*[local-name()="VersionId"]/text()' - <<< "$versions_data" 2>&1); then
|
|
log 2 "error getting Version 'VersionID' value: $version_id"
|
|
return 1
|
|
fi
|
|
if [ "$version_id" != "null" ]; then
|
|
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()' - <<< "$versions_data" 2>&1); then
|
|
log 2 "error getting Version 'Key' value: $marker_key"
|
|
return 1
|
|
fi
|
|
if [ "$marker_key" != "$key" ]; then
|
|
log 2 "delete marker key mismatch (expected '$key', actual '$marker_key')"
|
|
return 1
|
|
fi
|
|
if ! marker_id=$(xmllint --xpath '//*[local-name()="DeleteMarker"]/*[local-name()="VersionId"]/text()' - <<< "$versions_data" 2>&1); then
|
|
log 2 "error getting Version 'VersionID' value: $versioning_info"
|
|
return 1
|
|
fi
|
|
if [ "$marker_id" == "null" ]; then
|
|
log 2 "delete marker ID expected to be non-null"
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|