From a1c6f1fbd68b64a4546ea00d1adf33ada95f024b Mon Sep 17 00:00:00 2001 From: vados Date: Thu, 9 Nov 2023 14:03:47 +0900 Subject: [PATCH] chore(tests): update S3 compat tests While present, the S3 compatibility tests were broken (at the very least when running on Linux) due to a few issues: - `ubuntu:latest` moving ahead of Python 3.6 - Docker networking not working as expected (host.docker.internal) This commit fixes the s3 compatibility tests, ensuring they run properly on linux, and updates the repository to contain some results. Signed-off-by: vados --- test/s3/compatibility/.gitignore | 6 + test/s3/compatibility/Dockerfile | 16 +- test/s3/compatibility/Makefile | 9 + test/s3/compatibility/README.md | 240 +++++++++++++++++++++- test/s3/compatibility/results.summary.txt | 186 +++++++++++++++++ test/s3/compatibility/run.sh | 86 +++++++- test/s3/compatibility/s3tests.conf | 8 + 7 files changed, 533 insertions(+), 18 deletions(-) create mode 100644 test/s3/compatibility/Makefile create mode 100644 test/s3/compatibility/results.summary.txt diff --git a/test/s3/compatibility/.gitignore b/test/s3/compatibility/.gitignore index dc3cc5207..f719dbc98 100644 --- a/test/s3/compatibility/.gitignore +++ b/test/s3/compatibility/.gitignore @@ -1,2 +1,8 @@ +# Test run scratch data /s3-tests /tmp + +# Test run outputs +weed.log +compat.raw.txt +compat.summary.txt \ No newline at end of file diff --git a/test/s3/compatibility/Dockerfile b/test/s3/compatibility/Dockerfile index b2a1040cb..a3a76b742 100644 --- a/test/s3/compatibility/Dockerfile +++ b/test/s3/compatibility/Dockerfile @@ -1,11 +1,21 @@ # the tests only support python 3.6, not newer -FROM ubuntu:latest +#FROM ubuntu:latest +FROM python:3.6.15-slim-buster -RUN apt-get update && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y git-core sudo tzdata +# Installed required system deps +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y git-core sudo tzdata + +# Install python deps +RUN pip install virtualenv + +# Clone Ceph S3 tests RUN git clone https://github.com/ceph/s3-tests.git + WORKDIR s3-tests -# we pin a certain commit +# Pin to a certain commit on ceph/s3-tests +# https://github.com/ceph/s3-tests/commit/9a6a1e9f197fc9fb031b809d1e057635c2ff8d4e RUN git checkout 9a6a1e9f197fc9fb031b809d1e057635c2ff8d4e RUN ./bootstrap diff --git a/test/s3/compatibility/Makefile b/test/s3/compatibility/Makefile new file mode 100644 index 000000000..b6171b10f --- /dev/null +++ b/test/s3/compatibility/Makefile @@ -0,0 +1,9 @@ +.PHONY: all build-image test + +all: build-image test + +build-image: + ./prepare.sh + +test: + ./run.sh diff --git a/test/s3/compatibility/README.md b/test/s3/compatibility/README.md index de1b6e9ec..5f57cdc9c 100644 --- a/test/s3/compatibility/README.md +++ b/test/s3/compatibility/README.md @@ -1,13 +1,245 @@ # Running S3 Compatibility tests against SeaweedFS -This is using [the tests from CephFS](https://github.com/ceph/s3-tests). +This is using [the tests from CephFS][s3-tests]. + +[s3-tests]: https://github.com/ceph/s3-tests ## Prerequisites -- have Docker installed +- have [Docker][docker] installed - this has been executed on Mac. On Linux, the hostname in `s3tests.conf` needs to be adjusted. +[docker]: https://docs.docker.com + ## Running tests -- `./prepare.sh` to build the docker image -- `./run.sh` to execute all tests +To build the docker image that is used for the tests: + +```console +./prepare.sh +``` + +To execute all tests: + +```console +./run.sh +``` +To see debug output including all commands run by the script: + +```console +DEBUG=y ./run.sh +``` + +> [!WARNING] +> +> If your output does *not* look like the content in [`results.summary.txt`](./results.summary.txt) +> and it is full of HTTP level exceptions, there is likely an error contacting the `weed` server from +> the container that is runnin the S3 compatibility tests. +> +> There are at least a couple ways to solve this: +> +> - Modify your `docker` setup to ensure `host.docker.internal` is connected to your host running `weed` +> - Use `--net=host` and modify `host` in `s3tests.conf` to `localhost` +> +> The `--net=host` solution is potentially *unsafe*, as the container running [s3-tests][s3-tests] could +> visit unexpected websites or use the host-passthrough internet access maliciously. +> +> If you are OK with the risk of allowing `--net=host`: +> +> - Set `host = localhost` in `s3tests.conf` +> - Set `DOCKER_NET_HOST=y` when running `run.sh` + +## Most recent results + +See [`results.summary.txt`](./results.summary.txt) for the latest results of compatibility testing (with the caveat that `s3-tests` is pinned to [`ceph/s3-tests` @ 9a6a1e9f197fc9fb031b809d1e057635c2ff8d4e](https://github.com/ceph/s3-tests/commit/9a6a1e9f197fc9fb031b809d1e057635c2ff8d4e)). + +The file is reproduced below for ease of access: + +``` +/s3-tests/virtualenv/lib/python3.6/site-packages/boto3/compat.py:88: PythonDeprecationWarning: Boto3 will no longer support Python 3.6 starting May 30, 2022. To continue receiving service updates, bug fixes, and security updates please upgrade to Python 3.7 or later. More information can be found here: https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/ + warnings.warn(warning, PythonDeprecationWarning) +s3tests_boto3.functional.test_s3.test_bucket_list_return_data ... ERROR +s3tests_boto3.functional.test_s3.test_object_write_to_nonexist_bucket ... FAIL +s3tests_boto3.functional.test_s3.test_object_read_not_exist ... ok +s3tests_boto3.functional.test_s3.test_object_requestid_matches_header_on_error ... FAIL +s3tests_boto3.functional.test_s3.test_multi_object_delete ... ok +s3tests_boto3.functional.test_s3.test_multi_objectv2_delete ... ok +s3tests_boto3.functional.test_s3.test_multi_object_delete_key_limit ... ok +s3tests_boto3.functional.test_s3.test_multi_objectv2_delete_key_limit ... ok +s3tests_boto3.functional.test_s3.test_object_head_zero_bytes ... ok +s3tests_boto3.functional.test_s3.test_object_write_check_etag ... ok +s3tests_boto3.functional.test_s3.test_object_write_cache_control ... ok +s3tests_boto3.functional.test_s3.test_object_write_expires ... ok +s3tests_boto3.functional.test_s3.test_object_write_read_update_read_delete ... ok +s3tests_boto3.functional.test_s3.test_object_metadata_replaced_on_put ... ok +s3tests_boto3.functional.test_s3.test_object_write_file ... ok +s3tests_boto3.functional.test_s3.test_post_object_anonymous_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_no_content_type ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_request_bad_access_key ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_success_code ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_invalid_success_code ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_upload_larger_than_chunk ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_key_from_filename ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_ignored_header ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_case_insensitive_condition_fields ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_escaped_field_values ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_success_redirect_action ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_signature ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_access_key ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_date_format ... ok +s3tests_boto3.functional.test_s3.test_post_object_no_key_specified ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_signature ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_policy_condition ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_user_specified_header ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_request_missing_policy_specified_field ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_condition_is_case_sensitive ... ok +s3tests_boto3.functional.test_s3.test_post_object_expires_is_case_sensitive ... ok +s3tests_boto3.functional.test_s3.test_post_object_expired_policy ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_request_field_value ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_missing_expires_condition ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_conditions_list ... ok +s3tests_boto3.functional.test_s3.test_post_object_upload_size_limit_exceeded ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_content_length_argument ... ok +s3tests_boto3.functional.test_s3.test_post_object_invalid_content_length_argument ... ok +s3tests_boto3.functional.test_s3.test_post_object_upload_size_below_minimum ... ok +s3tests_boto3.functional.test_s3.test_post_object_empty_conditions ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmatch_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifnonematch_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifnonematch_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmodifiedsince_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmodifiedsince_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifunmodifiedsince_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifunmodifiedsince_failed ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_overwrite_existed_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_nonexisted_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_nonexisted_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_overwrite_existed_failed ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_delete_key_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_object_gone ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated ... ok +s3tests_boto3.functional.test_s3.test_object_raw_response_headers ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_bucket_acl ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_object_acl ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_object_gone ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_not_expired ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_range_zero ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_max_range ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_positive_range ... FAIL +s3tests_boto3.functional.test_s3.test_object_anon_put ... FAIL +s3tests_boto3.functional.test_s3.test_object_anon_put_write_access ... ok +s3tests_boto3.functional.test_s3.test_object_put_authenticated ... ok +s3tests_boto3.functional.test_s3.test_object_raw_put_authenticated_expired ... FAIL +s3tests_boto3.functional.test_s3.test_object_acl_canned_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_write ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_writeacp ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_read ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_readacp ... ERROR +s3tests_boto3.functional.test_s3.test_object_header_acl_grants ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_private ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_private ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_publicread ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_publicread ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_publicreadwrite ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_publicreadwrite ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_private ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_publicread ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_private ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_publicread ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_bucket_create_special_key_names ... ok +s3tests_boto3.functional.test_s3.test_object_copy_zero_size ... ok +s3tests_boto3.functional.test_s3.test_object_copy_same_bucket ... ok +s3tests_boto3.functional.test_s3.test_object_copy_verify_contenttype ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_to_itself ... ok +s3tests_boto3.functional.test_s3.test_object_copy_to_itself_with_metadata ... ok +s3tests_boto3.functional.test_s3.test_object_copy_diff_bucket ... ok +s3tests_boto3.functional.test_s3.test_object_copy_not_owned_bucket ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_not_owned_object_bucket ... ERROR +s3tests_boto3.functional.test_s3.test_object_copy_canned_acl ... ok +s3tests_boto3.functional.test_s3.test_object_copy_retaining_metadata ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_replacing_metadata ... ok +s3tests_boto3.functional.test_s3.test_object_copy_bucket_not_found ... ok +s3tests_boto3.functional.test_s3.test_object_copy_key_not_found ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_empty ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_small ... ERROR +s3tests_boto3.functional.test_s3.test_multipart_copy_small ... ok +s3tests_boto3.functional.test_s3.test_multipart_copy_invalid_range ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_copy_improper_range ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_copy_without_range ... ok +s3tests_boto3.functional.test_s3.test_multipart_copy_special_names ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload ... ERROR +s3tests_boto3.functional.test_s3.test_multipart_upload_resend_part ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_size_too_small ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_upload_contents ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_overwrite_existing_object ... ok +s3tests_boto3.functional.test_s3.test_abort_multipart_upload ... ok +s3tests_boto3.functional.test_s3.test_abort_multipart_upload_not_found ... ok +s3tests_boto3.functional.test_s3.test_list_multipart_upload ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_missing_part ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_incorrect_etag ... ok +s3tests_boto3.functional.test_s3.test_100_continue ... FAIL +s3tests_boto3.functional.test_s3.test_atomic_read_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_read_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_read_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_conditional_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_conditional_write_1mb ... FAIL +s3tests_boto3.functional.test_s3.test_atomic_write_bucket_gone ... ok +s3tests_boto3.functional.test_s3.test_atomic_multipart_upload_write ... ok +s3tests_boto3.functional.test_s3.test_multipart_resend_first_finishes_last ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_big_request_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_skip_leading_bytes_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_return_trailing_bytes_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_invalid_range ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_empty_object ... ok +s3tests_boto3.functional.test_s3.test_get_obj_tagging ... ok +s3tests_boto3.functional.test_s3.test_get_obj_head_tagging ... ok +s3tests_boto3.functional.test_s3.test_put_max_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_tags ... ok +s3tests_boto3.functional.test_s3.test_put_max_kvsize_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_key_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_val_tags ... ok +s3tests_boto3.functional.test_s3.test_put_modify_tags ... ok +s3tests_boto3.functional.test_s3.test_put_delete_tags ... ok +s3tests_boto3.functional.test_s3.test_post_object_tags_anonymous_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_tags_authenticated_request ... FAIL +s3tests_boto3.functional.test_s3.test_put_obj_with_tags ... ok +s3tests_boto3.functional.test_s3.test_object_lock_multi_delete_object_with_retention ... ERROR +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_governance_with_bypass ... ok +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_governance_without_bypass ... FAIL +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_compliance ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_copy_object_ifmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifnonematch_good ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifnonematch_failed ... ok +s3tests_boto3.functional.test_s3.test_object_read_unreadable ... FAIL +ERROR + +====================================================================== +ERROR: s3tests_boto3.functional.test_s3.test_bucket_list_return_data +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/s3-tests/virtualenv/lib/python3.6/site-packages/nose/case.py", line 198, in runTest + self.test(*self.arg) + File "/s3-tests/s3tests_boto3/functional/test_s3.py", line 1669, in test_bucket_list_return_data + 'DisplayName': acl_response['Owner']['DisplayName'], +KeyError: 'Owner' +-------------------- >> begin captured logging << -------------------- +``` diff --git a/test/s3/compatibility/results.summary.txt b/test/s3/compatibility/results.summary.txt new file mode 100644 index 000000000..371b9e81a --- /dev/null +++ b/test/s3/compatibility/results.summary.txt @@ -0,0 +1,186 @@ +/s3-tests/virtualenv/lib/python3.6/site-packages/boto3/compat.py:88: PythonDeprecationWarning: Boto3 will no longer support Python 3.6 starting May 30, 2022. To continue receiving service updates, bug fixes, and security updates please upgrade to Python 3.7 or later. More information can be found here: https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/ + warnings.warn(warning, PythonDeprecationWarning) +s3tests_boto3.functional.test_s3.test_bucket_list_return_data ... ERROR +s3tests_boto3.functional.test_s3.test_object_write_to_nonexist_bucket ... FAIL +s3tests_boto3.functional.test_s3.test_object_read_not_exist ... ok +s3tests_boto3.functional.test_s3.test_object_requestid_matches_header_on_error ... FAIL +s3tests_boto3.functional.test_s3.test_multi_object_delete ... ok +s3tests_boto3.functional.test_s3.test_multi_objectv2_delete ... ok +s3tests_boto3.functional.test_s3.test_multi_object_delete_key_limit ... ok +s3tests_boto3.functional.test_s3.test_multi_objectv2_delete_key_limit ... ok +s3tests_boto3.functional.test_s3.test_object_head_zero_bytes ... ok +s3tests_boto3.functional.test_s3.test_object_write_check_etag ... ok +s3tests_boto3.functional.test_s3.test_object_write_cache_control ... ok +s3tests_boto3.functional.test_s3.test_object_write_expires ... ok +s3tests_boto3.functional.test_s3.test_object_write_read_update_read_delete ... ok +s3tests_boto3.functional.test_s3.test_object_metadata_replaced_on_put ... ok +s3tests_boto3.functional.test_s3.test_object_write_file ... ok +s3tests_boto3.functional.test_s3.test_post_object_anonymous_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_no_content_type ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_authenticated_request_bad_access_key ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_success_code ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_invalid_success_code ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_upload_larger_than_chunk ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_set_key_from_filename ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_ignored_header ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_case_insensitive_condition_fields ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_escaped_field_values ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_success_redirect_action ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_signature ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_access_key ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_date_format ... ok +s3tests_boto3.functional.test_s3.test_post_object_no_key_specified ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_signature ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_policy_condition ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_user_specified_header ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_request_missing_policy_specified_field ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_condition_is_case_sensitive ... ok +s3tests_boto3.functional.test_s3.test_post_object_expires_is_case_sensitive ... ok +s3tests_boto3.functional.test_s3.test_post_object_expired_policy ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_invalid_request_field_value ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_missing_expires_condition ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_conditions_list ... ok +s3tests_boto3.functional.test_s3.test_post_object_upload_size_limit_exceeded ... ok +s3tests_boto3.functional.test_s3.test_post_object_missing_content_length_argument ... ok +s3tests_boto3.functional.test_s3.test_post_object_invalid_content_length_argument ... ok +s3tests_boto3.functional.test_s3.test_post_object_upload_size_below_minimum ... ok +s3tests_boto3.functional.test_s3.test_post_object_empty_conditions ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmatch_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifnonematch_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifnonematch_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmodifiedsince_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifmodifiedsince_failed ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifunmodifiedsince_good ... ok +s3tests_boto3.functional.test_s3.test_get_object_ifunmodifiedsince_failed ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_overwrite_existed_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifmatch_nonexisted_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_nonexisted_good ... ok +s3tests_boto3.functional.test_s3.test_put_object_ifnonmatch_overwrite_existed_failed ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_delete_key_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_object_gone ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated ... ok +s3tests_boto3.functional.test_s3.test_object_raw_response_headers ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_bucket_acl ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_object_acl ... ok +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_bucket_gone ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_authenticated_object_gone ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_not_expired ... ok +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_range_zero ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_max_range ... FAIL +s3tests_boto3.functional.test_s3.test_object_raw_get_x_amz_expires_out_positive_range ... FAIL +s3tests_boto3.functional.test_s3.test_object_anon_put ... FAIL +s3tests_boto3.functional.test_s3.test_object_anon_put_write_access ... ok +s3tests_boto3.functional.test_s3.test_object_put_authenticated ... ok +s3tests_boto3.functional.test_s3.test_object_raw_put_authenticated_expired ... FAIL +s3tests_boto3.functional.test_s3.test_object_acl_canned_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_write ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_writeacp ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_read ... ERROR +s3tests_boto3.functional.test_s3.test_object_acl_readacp ... ERROR +s3tests_boto3.functional.test_s3.test_object_header_acl_grants ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_private ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_private ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_publicread ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_publicread ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_object_publicreadwrite ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_private_objectv2_publicreadwrite ... FAIL +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_private ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_publicread ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicread_object_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_private ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_publicread ... ERROR +s3tests_boto3.functional.test_s3.test_access_bucket_publicreadwrite_object_publicreadwrite ... ERROR +s3tests_boto3.functional.test_s3.test_bucket_create_special_key_names ... ok +s3tests_boto3.functional.test_s3.test_object_copy_zero_size ... ok +s3tests_boto3.functional.test_s3.test_object_copy_same_bucket ... ok +s3tests_boto3.functional.test_s3.test_object_copy_verify_contenttype ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_to_itself ... ok +s3tests_boto3.functional.test_s3.test_object_copy_to_itself_with_metadata ... ok +s3tests_boto3.functional.test_s3.test_object_copy_diff_bucket ... ok +s3tests_boto3.functional.test_s3.test_object_copy_not_owned_bucket ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_not_owned_object_bucket ... ERROR +s3tests_boto3.functional.test_s3.test_object_copy_canned_acl ... ok +s3tests_boto3.functional.test_s3.test_object_copy_retaining_metadata ... FAIL +s3tests_boto3.functional.test_s3.test_object_copy_replacing_metadata ... ok +s3tests_boto3.functional.test_s3.test_object_copy_bucket_not_found ... ok +s3tests_boto3.functional.test_s3.test_object_copy_key_not_found ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_empty ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_small ... ERROR +s3tests_boto3.functional.test_s3.test_multipart_copy_small ... ok +s3tests_boto3.functional.test_s3.test_multipart_copy_invalid_range ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_copy_improper_range ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_copy_without_range ... ok +s3tests_boto3.functional.test_s3.test_multipart_copy_special_names ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload ... ERROR +s3tests_boto3.functional.test_s3.test_multipart_upload_resend_part ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_size_too_small ... FAIL +s3tests_boto3.functional.test_s3.test_multipart_upload_contents ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_overwrite_existing_object ... ok +s3tests_boto3.functional.test_s3.test_abort_multipart_upload ... ok +s3tests_boto3.functional.test_s3.test_abort_multipart_upload_not_found ... ok +s3tests_boto3.functional.test_s3.test_list_multipart_upload ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_missing_part ... ok +s3tests_boto3.functional.test_s3.test_multipart_upload_incorrect_etag ... ok +s3tests_boto3.functional.test_s3.test_100_continue ... FAIL +s3tests_boto3.functional.test_s3.test_atomic_read_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_read_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_read_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_write_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_4mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_write_8mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_conditional_write_1mb ... ok +s3tests_boto3.functional.test_s3.test_atomic_dual_conditional_write_1mb ... FAIL +s3tests_boto3.functional.test_s3.test_atomic_write_bucket_gone ... ok +s3tests_boto3.functional.test_s3.test_atomic_multipart_upload_write ... ok +s3tests_boto3.functional.test_s3.test_multipart_resend_first_finishes_last ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_big_request_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_skip_leading_bytes_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_return_trailing_bytes_response_code ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_invalid_range ... ok +s3tests_boto3.functional.test_s3.test_ranged_request_empty_object ... ok +s3tests_boto3.functional.test_s3.test_get_obj_tagging ... ok +s3tests_boto3.functional.test_s3.test_get_obj_head_tagging ... ok +s3tests_boto3.functional.test_s3.test_put_max_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_tags ... ok +s3tests_boto3.functional.test_s3.test_put_max_kvsize_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_key_tags ... ok +s3tests_boto3.functional.test_s3.test_put_excess_val_tags ... ok +s3tests_boto3.functional.test_s3.test_put_modify_tags ... ok +s3tests_boto3.functional.test_s3.test_put_delete_tags ... ok +s3tests_boto3.functional.test_s3.test_post_object_tags_anonymous_request ... FAIL +s3tests_boto3.functional.test_s3.test_post_object_tags_authenticated_request ... FAIL +s3tests_boto3.functional.test_s3.test_put_obj_with_tags ... ok +s3tests_boto3.functional.test_s3.test_object_lock_multi_delete_object_with_retention ... ERROR +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_governance_with_bypass ... ok +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_governance_without_bypass ... FAIL +s3tests_boto3.functional.test_s3.test_object_lock_changing_mode_from_compliance ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifmatch_good ... ok +s3tests_boto3.functional.test_s3.test_copy_object_ifmatch_failed ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifnonematch_good ... FAIL +s3tests_boto3.functional.test_s3.test_copy_object_ifnonematch_failed ... ok +s3tests_boto3.functional.test_s3.test_object_read_unreadable ... FAIL +ERROR + +====================================================================== +ERROR: s3tests_boto3.functional.test_s3.test_bucket_list_return_data +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/s3-tests/virtualenv/lib/python3.6/site-packages/nose/case.py", line 198, in runTest + self.test(*self.arg) + File "/s3-tests/s3tests_boto3/functional/test_s3.py", line 1669, in test_bucket_list_return_data + 'DisplayName': acl_response['Owner']['DisplayName'], +KeyError: 'Owner' +-------------------- >> begin captured logging << -------------------- diff --git a/test/s3/compatibility/run.sh b/test/s3/compatibility/run.sh index 990599df5..adfee1366 100755 --- a/test/s3/compatibility/run.sh +++ b/test/s3/compatibility/run.sh @@ -1,24 +1,88 @@ #!/usr/bin/env bash -set -ex +CONTAINER_NAME=${CONTAINER_NAME:-s3test-instance} +CONF_FILE=${CONF_FILE:-s3tests.conf} +WEED_BIN=${WEED_BIN:-../../../weed/weed} +TEST_RAW_OUTPUT_FILE=${TEST_RAW_OUTPUT_FILE:-compat.raw.txt} +TEST_PROCESSED_OUTPUT_FILE=${TEST_PROCESSED_OUTPUT_FILE:-compat.summary.txt} +# Set up debugging for this bash script if DEBUG is set +if [ -n "${DEBUG}" ]; then + echo -e "DEBUG set [${DEBUG}], enabling debugging output..."; + set -ex +fi + +# Reset from possible previous test run killall -9 weed || echo "already stopped" rm -Rf tmp mkdir tmp -docker stop s3test-instance || echo "already stopped" +docker stop $CONTAINER_NAME || echo "already stopped" +# Ensure ulimit is set to reasonable value ulimit -n 10000 -../../../weed/weed server -filer -s3 -volume.max 0 -master.volumeSizeLimitMB 5 -dir "$(pwd)/tmp" 1>&2>weed.log & +# Start weed w/ filer + s3 in the background +$WEED_BIN server \ + -filer \ + -s3 \ + -volume.max 0 \ + -master.volumeSizeLimitMB 5 \ + -dir "$(pwd)/tmp" \ + 1>&2>weed.log & + +# Wait for master to start up +echo -e "\n[info] waiting for master @ 9333..."; until curl --output /dev/null --silent --head --fail http://127.0.0.1:9333; do - printf '.' - sleep 5 + printf '.'; + sleep 5; +done +sleep 3; + +# Wait for s3 to start up +echo -e "\n[info] waiting for S3 @ 8333..."; +until curl --output /dev/null --silent --fail http://127.0.0.1:8333; do + printf '.'; + sleep 5; done -sleep 3 +sleep 3; + +# Determine whether docker net +DOCKER_NET_HOST_ARGS="" +if [ -n "${DOCKER_NET_HOST}" ]; then + DOCKER_NET_HOST_ARGS="--net=host" + echo -e "\n[info] setting docker to het nost" +fi + +echo -e "\n[warn] You may have to run with UNFILTERED=y to disable output filtering, if you get the broken pipe error"; +echo -e "\n[info] running tests with unfiltered output..."; +docker run \ + --name $CONTAINER_NAME \ + --rm \ + ${DOCKER_NET_HOST_ARGS} \ + -e S3TEST_CONF=$CONF_FILE \ + -v "$(pwd)"/$CONF_FILE:/s3-tests/s3tests.conf \ + -it \ + s3tests \ + ./virtualenv/bin/nosetests \ + s3tests_boto3/functional/test_s3.py \ + -v \ + -a 'resource=object,!bucket-policy,!versioning,!encryption' \ + | tee ${TEST_RAW_OUTPUT_FILE} + +# If the summary logs are present, process them +if [ -f "${TEST_RAW_OUTPUT_FILE}" ]; then + cat ${TEST_RAW_OUTPUT_FILE} | sed -n -e '/botocore.hooks/!p;//q' | tee ${TEST_PROCESSED_OUTPUT_FILE} + echo -e "\n[info] ✅ Successfully wrote processed output @ [${TEST_PROCESSED_OUTPUT_FILE}]"; + if [ -z "${TEST_KEEP_RAW_OUTPUT}" ]; then + echo -e "\n[info] removing test raw output file @ [${TEST_RAW_OUTPUT_FILE}] (to disable this, set TEST_KEEP_RAW_OUTPUT=y)..."; + rm -rf ${TEST_RAW_OUTPUT_FILE}; + fi +else + echo -e "\n[warn] failed to find raw output @ [${TEST_RAW_OUTPUT_FILE}]"; +fi -rm -Rf logs-full.txt logs-summary.txt -# docker run --name s3test-instance --rm -e S3TEST_CONF=s3tests.conf -v `pwd`/s3tests.conf:/s3-tests/s3tests.conf -it s3tests ./virtualenv/bin/nosetests s3tests_boto3/functional/test_s3.py:test_get_obj_tagging -v -a 'resource=object,!bucket-policy,!versioning,!encryption' -docker run --name s3test-instance --rm -e S3TEST_CONF=s3tests.conf -v "$(pwd)"/s3tests.conf:/s3-tests/s3tests.conf -it s3tests ./virtualenv/bin/nosetests s3tests_boto3/functional/test_s3.py -v -a 'resource=object,!bucket-policy,!versioning,!encryption' | sed -n -e '/botocore.hooks/!p;//q' | tee logs-summary.txt +echo -e "\n[info] stopping [${CONTAINER_NAME}] container..."; +docker stop $CONTAINER_NAME || echo "[info] already stopped"; -docker stop s3test-instance || echo "already stopped" -killall -9 weed +echo -e "\n[info] stopping seaweedfs processes (all, via kill -9)..."; +killall -9 weed; diff --git a/test/s3/compatibility/s3tests.conf b/test/s3/compatibility/s3tests.conf index 5adb61791..191168b32 100644 --- a/test/s3/compatibility/s3tests.conf +++ b/test/s3/compatibility/s3tests.conf @@ -4,6 +4,14 @@ # host set for rgw in vstart.sh host = host.docker.internal +## NOTE: if running docker --net=host (e.x. `DOCKER_NET_HOST=y ./run.sh`) +## then use 'localhost', so the container can more easily access your *local* weed instance +## +## This is *unsafe* -- it is possible that this script will do malicious +## things with host-level access. only run this if you trust the programmatic content of +## ceph/s3-tests (https://github.com/ceph/s3-tests) which will be using this file +#host = localhost + # port set for rgw in vstart.sh port = 8333