Skip to content

Commit

Permalink
Import swift3 into swift repo as s3api middleware
Browse files Browse the repository at this point in the history
This attempts to import openstack/swift3 package into swift upstream
repository, namespace. This is almost simple porting except following items.

1. Rename swift3 namespace to swift.common.middleware.s3api
1.1 Rename also some conflicted class names (e.g. Request/Response)

2. Port unittests to test/unit/s3api dir to be able to run on the gate.

3. Port functests to test/functional/s3api and setup in-process testing

4. Port docs to doc dir, then address the namespace change.

5. Use get_logger() instead of global logger instance

6. Avoid global conf instance

Ex. fix various minor issue on those steps (e.g. packages, dependencies,
  deprecated things)

The details and patch references in the work on feature/s3api are listed
at https://trello.com/b/ZloaZ23t/s3api (completed board)

Note that, because this is just a porting, no new feature is developed since
the last swift3 release, and in the future work, Swift upstream may continue
to work on remaining items for further improvements and the best compatibility
of Amazon S3. Please read the new docs for your deployment and keep track to
know what would be changed in the future releases.

Change-Id: Ib803ea89cfee9a53c429606149159dd136c036fd
Co-Authored-By: Thiago da Silva <[email protected]>
Co-Authored-By: Tim Burke <[email protected]>
  • Loading branch information
3 people committed Apr 27, 2018
1 parent 260bd26 commit 636b922
Show file tree
Hide file tree
Showing 116 changed files with 19,747 additions and 6 deletions.
14 changes: 14 additions & 0 deletions .zuul.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,18 @@
vars:
tox_envlist: func-domain-remap-staticweb

- job:
name: swift-tox-func-s3api
parent: swift-tox-base
description: |
Run functional tests for swift under cPython version 2.7.
Uses tox with the ``func-s3api`` environment.
It sets TMPDIR to an XFS mount point created via
tools/test-setup.sh.
vars:
tox_envlist: func-s3api

- job:
name: swift-probetests-centos-7
parent: unittests
Expand All @@ -128,6 +140,7 @@
- swift-tox-func-encryption
- swift-tox-func-domain-remap-staticweb
- swift-tox-func-ec
- swift-tox-func-s3api
- swift-probetests-centos-7
gate:
jobs:
Expand All @@ -137,6 +150,7 @@
- swift-tox-func-encryption
- swift-tox-func-domain-remap-staticweb
- swift-tox-func-ec
- swift-tox-func-s3api
experimental:
jobs:
- swift-tox-py27-centos-7
Expand Down
7 changes: 7 additions & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Brian Ober ([email protected])
Brian Reitz ([email protected])
Bryan Keller ([email protected])
Béla Vancsics ([email protected])
Виль Суркин ([email protected])
Caleb Tennis ([email protected])
Cao Xuan Hoang ([email protected])
Carlos Cavanna ([email protected])
Expand Down Expand Up @@ -111,6 +112,7 @@ Dan Prince ([email protected])
dangming ([email protected])
Daniele Valeriani ([email protected])
Darrell Bishop ([email protected])
Darryl Tam ([email protected])
David Goetz ([email protected])
David Hadas ([email protected])
David Liu ([email protected])
Expand Down Expand Up @@ -253,6 +255,7 @@ Martin Geisler ([email protected])
Martin Kletzander ([email protected])
Maru Newby ([email protected])
Mathias Bjoerkqvist ([email protected])
Masaki Tsukuda ([email protected])
Matt Kassawara ([email protected])
Matt Riedemann ([email protected])
Matthew Oliver ([email protected])
Expand All @@ -274,6 +277,8 @@ Nakagawa Masaaki ([email protected])
Nakul Dahiwade ([email protected])
Nam Nguyen Hoai ([email protected])
Nandini Tata ([email protected])
Naoto Nishizono ([email protected])
Nassim Babaci ([email protected])
Nathan Kinder ([email protected])
Nelson Almeida ([email protected])
Newptone ([email protected])
Expand Down Expand Up @@ -365,11 +370,13 @@ Victor Lowther ([email protected])
Victor Rodionov ([email protected])
Victor Stinner ([email protected])
Viktor Varga ([email protected])
Vil Surkin ([email protected])
Vincent Untz ([email protected])
Vladimir Vechkanov ([email protected])
Vu Cong Tuan ([email protected])
vxlinux ([email protected])
wanghongtaozz ([email protected])
Wyllys Ingersoll ([email protected])
Wu Wenxiang ([email protected])
xhancar ([email protected])
XieYingYun ([email protected])
Expand Down
4 changes: 4 additions & 0 deletions bindep.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ liberasurecode-dev [platform:dpkg]
liberasurecode-devel [platform:rpm !platform:centos]
libffi-dev [platform:dpkg]
libffi-devel [platform:rpm]
libxml2-dev [platform:dpkg]
libxml2-devel [platform:rpm]
libxslt-devel [platform:rpm]
libxslt1-dev [platform:dpkg]
memcached
python-dev [platform:dpkg]
python-devel [platform:rpm]
Expand Down
209 changes: 209 additions & 0 deletions doc/s3api/conf/ceph-known-failures-keystone.yaml

Large diffs are not rendered by default.

187 changes: 187 additions & 0 deletions doc/s3api/conf/ceph-known-failures-tempauth.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
ceph_s3:
<nose.suite.ContextSuite context=s3tests.functional>:teardown: {status: KNOWN}
<nose.suite.ContextSuite context=test_routing_generator>:setup: {status: KNOWN}
s3tests.functional.test_headers.test_bucket_create_bad_authorization_invalid_aws2: {status: KNOWN}
s3tests.functional.test_headers.test_bucket_create_bad_authorization_none: {status: KNOWN}
s3tests.functional.test_headers.test_object_create_bad_authorization_invalid_aws2: {status: KNOWN}
s3tests.functional.test_headers.test_object_create_bad_authorization_none: {status: KNOWN}
s3tests.functional.test_s3.test_100_continue: {status: KNOWN}
s3tests.functional.test_s3.test_atomic_conditional_write_1mb: {status: KNOWN}
s3tests.functional.test_s3.test_atomic_dual_conditional_write_1mb: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_acl_grant_email: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_acl_grant_email_notexist: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_acl_grant_nonexist_user: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_acl_no_grants: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_create_exists: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_header_acl_grants: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_list_objects_anonymous: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_list_objects_anonymous_fail: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_recreate_not_overriding: {status: KNOWN}
s3tests.functional.test_s3.test_cors_origin_response: {status: KNOWN}
s3tests.functional.test_s3.test_cors_origin_wildcard: {status: KNOWN}
s3tests.functional.test_s3.test_list_buckets_anonymous: {status: KNOWN}
s3tests.functional.test_s3.test_list_buckets_invalid_auth: {status: KNOWN}
s3tests.functional.test_s3.test_logging_toggle: {status: KNOWN}
s3tests.functional.test_s3.test_multipart_resend_first_finishes_last: {status: KNOWN}
s3tests.functional.test_s3.test_object_copy_canned_acl: {status: KNOWN}
s3tests.functional.test_s3.test_object_copy_replacing_metadata: {status: KNOWN}
s3tests.functional.test_s3.test_object_header_acl_grants: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_get: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_get_bucket_acl: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_get_bucket_gone: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_get_object_acl: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_get_object_gone: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_put: {status: KNOWN}
s3tests.functional.test_s3.test_object_raw_put_write_access: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_anonymous_request: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_authenticated_request: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_authenticated_request_bad_access_key: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_case_insensitive_condition_fields: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_condition_is_case_sensitive: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_escaped_field_values: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_expired_policy: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_expires_is_case_sensitive: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_ignored_header: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_invalid_access_key: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_invalid_content_length_argument: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_invalid_date_format: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_invalid_request_field_value: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_invalid_signature: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_missing_conditions_list: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_missing_content_length_argument: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_missing_expires_condition: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_missing_policy_condition: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_missing_signature: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_no_key_specified: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_request_missing_policy_specified_field: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_set_invalid_success_code: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_set_key_from_filename: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_set_success_code: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_success_redirect_action: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_upload_larger_than_chunk: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_upload_size_below_minimum: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_upload_size_limit_exceeded: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_user_specified_header: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifmatch_failed: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifmatch_good: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifmatch_nonexisted_failed: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifmatch_overwrite_existed_good: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifnonmatch_failed: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifnonmatch_good: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifnonmatch_nonexisted_good: {status: KNOWN}
s3tests.functional.test_s3.test_put_object_ifnonmatch_overwrite_existed_failed: {status: KNOWN}
s3tests.functional.test_s3.test_set_cors: {status: KNOWN}
s3tests.functional.test_s3.test_versioned_concurrent_object_create_and_remove: {status: KNOWN}
s3tests.functional.test_s3.test_versioned_concurrent_object_create_concurrent_remove: {status: KNOWN}
s3tests.functional.test_s3.test_versioned_object_acl: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_bucket_create_suspend: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_copy_obj_version: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_multi_object_delete: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_multi_object_delete_with_marker: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_multi_object_delete_with_marker_create: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_create_overwrite_multipart: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_create_read_remove: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_create_read_remove_head: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_create_versions_remove_all: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_create_versions_remove_special_names: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_list_marker: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_plain_null_version_overwrite: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_plain_null_version_overwrite_suspended: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_plain_null_version_removal: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_suspend_versions: {status: KNOWN}
s3tests.functional.test_s3.test_versioning_obj_suspend_versions_simple: {status: KNOWN}
s3tests.functional.test_s3_website.check_can_test_website: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_bucket_private_redirectall_base: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_bucket_private_redirectall_path: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_bucket_private_redirectall_path_upgrade: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_nonexistant_bucket_rgw: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_nonexistant_bucket_s3: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_empty: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_empty_blockederrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_empty_gooderrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_empty_missingerrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_private_index: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_private_index_blockederrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_private_index_gooderrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_private_index_missingerrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_private_bucket_list_public_index: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_empty: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_empty_blockederrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_empty_gooderrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_empty_missingerrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_private_index: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_private_index_blockederrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_private_index_gooderrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_private_index_missingerrordoc: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_public_bucket_list_public_index: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_xredirect_nonwebsite: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_xredirect_private_abs: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_xredirect_private_relative: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_xredirect_public_abs: {status: KNOWN}
s3tests.functional.test_s3_website.test_website_xredirect_public_relative: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_configure_recreate: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_list_return_data_versioning: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_policy: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_policy_acl: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_policy_another_bucket: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_policy_different_tenant: {status: KNOWN}
s3tests.functional.test_s3.test_bucket_policy_set_condition_operator_end_with_IfExists: {status: KNOWN}
s3tests.functional.test_s3.test_delete_tags_obj_public: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_invalid_md5: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_method_head: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_multipart_bad_download: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_multipart_invalid_chunks_1: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_multipart_invalid_chunks_2: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_no_key: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_no_md5: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_other_key: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_post_object_authenticated_request: {status: KNOWN}
s3tests.functional.test_s3.test_encryption_sse_c_present: {status: KNOWN}
s3tests.functional.test_s3.test_get_obj_head_tagging: {status: KNOWN}
s3tests.functional.test_s3.test_get_obj_tagging: {status: KNOWN}
s3tests.functional.test_s3.test_get_tags_acl_public: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_deletemarker_expiration: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_expiration: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_expiration_date: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_get: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_get_no_id: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_id_too_long: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_multipart_expiration: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_noncur_expiration: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_rules_conflicted: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_same_id: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_date: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_deletemarker: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_empty_filter: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_filter: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_multipart: {status: KNOWN}
s3tests.functional.test_s3.test_lifecycle_set_noncurrent: {status: KNOWN}
s3tests.functional.test_s3.test_multipart_copy_invalid_range: {status: KNOWN}
s3tests.functional.test_s3.test_multipart_copy_versioned: {status: KNOWN}
s3tests.functional.test_s3.test_object_copy_versioned_bucket: {status: KNOWN}
s3tests.functional.test_s3.test_object_copy_versioning_multipart_upload: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_empty_conditions: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_tags_anonymous_request: {status: KNOWN}
s3tests.functional.test_s3.test_post_object_tags_authenticated_request: {status: KNOWN}
s3tests.functional.test_s3.test_put_delete_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_excess_key_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_excess_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_excess_val_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_max_kvsize_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_max_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_modify_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_obj_with_tags: {status: KNOWN}
s3tests.functional.test_s3.test_put_tags_acl_public: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_method_head: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_multipart_invalid_chunks_1: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_multipart_invalid_chunks_2: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_multipart_upload: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_post_object_authenticated_request: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_present: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_read_declare: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_transfer_13b: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_transfer_1MB: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_transfer_1b: {status: KNOWN}
s3tests.functional.test_s3.test_sse_kms_transfer_1kb: {status: KNOWN}
s3tests.functional.test_s3.test_versioned_object_acl_no_version_specified: {status: KNOWN}
18 changes: 18 additions & 0 deletions doc/s3api/conf/ceph-s3.conf.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[DEFAULT]
host = localhost
port = 8080
is_secure = no

[s3 main]
user_id = %ADMIN_ACCESS_KEY%
display_name = %ADMIN_ACCESS_KEY%
email = %ADMIN_ACCESS_KEY%
access_key = %ADMIN_ACCESS_KEY%
secret_key = %ADMIN_SECRET_KEY%

[s3 alt]
user_id = %TESTER_ACCESS_KEY%
display_name = %TESTER_ACCESS_KEY%
email = %TESTER_ACCESS_KEY%
access_key = %TESTER_ACCESS_KEY%
secret_key = %TESTER_SECRET_KEY%
17 changes: 17 additions & 0 deletions doc/s3api/conf/object-server.conf.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[DEFAULT]
user = %USER%
bind_port = 6000
swift_dir = %TEST_DIR%/etc
devices = %TEST_DIR%
mount_check = false
workers = 1
log_level = DEBUG

[pipeline:main]
pipeline = object-server

[app:object-server]
use = egg:swift#object
allowed_headers = Cache-Control, Content-Disposition, Content-Encoding,
Content-Language, Expires, X-Delete-At, X-Object-Manifest, X-Robots-Tag,
X-Static-Large-Object
7 changes: 7 additions & 0 deletions doc/s3api/rnc/access_control_policy.rnc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
include "common.rnc"

start =
element AccessControlPolicy {
element Owner { CanonicalUser } &
element AccessControlList { AccessControlList }
}
10 changes: 10 additions & 0 deletions doc/s3api/rnc/bucket_logging_status.rnc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
include "common.rnc"

start =
element BucketLoggingStatus {
element LoggingEnabled {
element TargetBucket { xsd:string } &
element TargetPrefix { xsd:string } &
element TargetGrants { AccessControlList }?
}?
}
Loading

0 comments on commit 636b922

Please sign in to comment.