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 +sleep 3; -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 +# 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; -docker stop s3test-instance || echo "already stopped" -killall -9 weed +# 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 + +echo -e "\n[info] stopping [${CONTAINER_NAME}] container..."; +docker stop $CONTAINER_NAME || echo "[info] already stopped"; + +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