diff --git a/swift3/acl_handlers.py b/swift3/acl_handlers.py index 32f804a7..12ea08bd 100644 --- a/swift3/acl_handlers.py +++ b/swift3/acl_handlers.py @@ -157,6 +157,17 @@ class BucketAclHandler(BaseAclHandler): """ BucketAclHandler: Handler for BucketController """ + def DELETE(self, app): + if self.container.endswith(MULTIUPLOAD_SUFFIX): + # anyways, delete multiupload container doesn't need acls + pass + else: + return self._handle_acl(app, 'DELETE') + + def GET(self, app): + if self.method != 'DELETE': + return self._handle_acl(app, 'GET') + def PUT(self, app): req_acl = ACL.from_headers(self.req.headers, Owner(self.user_id, self.user_id)) diff --git a/swift3/controllers/bucket.py b/swift3/controllers/bucket.py index b5a93b37..24d119a1 100644 --- a/swift3/controllers/bucket.py +++ b/swift3/controllers/bucket.py @@ -22,9 +22,10 @@ from swift3.controllers.base import Controller from swift3.etree import Element, SubElement, tostring, fromstring, \ XMLSyntaxError, DocumentInvalid from swift3.response import HTTPOk, S3NotImplemented, InvalidArgument, \ - MalformedXML, InvalidLocationConstraint + MalformedXML, InvalidLocationConstraint, NoSuchBucket, \ + BucketNotEmpty, InternalError, ServiceUnavailable, NoSuchKey from swift3.cfg import CONF -from swift3.utils import LOGGER +from swift3.utils import LOGGER, MULTIUPLOAD_SUFFIX MAX_PUT_BUCKET_BODY_SIZE = 10240 @@ -33,6 +34,38 @@ class BucketController(Controller): """ Handles bucket request. """ + def _delete_segments_bucket(self, req): + """ + Before delete bucket, delete segments bucket if existing. + """ + container = req.container_name + MULTIUPLOAD_SUFFIX + marker = '' + seg = '' + try: + while True: + # delete all segments + resp = req.get_response(self.app, 'GET', container, + query={'format': 'json', + 'marker': marker}) + segments = json.loads(resp.body) + for seg in segments: + try: + req.get_response(self.app, 'DELETE', container, + seg['name']) + except NoSuchKey: + pass + except InternalError: + raise ServiceUnavailable() + if segments: + marker = seg['name'] + else: + break + req.get_response(self.app, 'DELETE', container) + except NoSuchBucket: + return + except (BucketNotEmpty, InternalError): + raise ServiceUnavailable() + def HEAD(self, req): """ Handle HEAD Bucket (Get Metadata) request @@ -154,7 +187,10 @@ class BucketController(Controller): """ Handle DELETE Bucket request """ - return req.get_response(self.app) + resp = req.get_response(self.app) + if CONF.allow_multipart_uploads: + self._delete_segments_bucket(req) + return resp def POST(self, req): """ diff --git a/swift3/test/unit/test_bucket.py b/swift3/test/unit/test_bucket.py index 483718f3..e9605b5f 100644 --- a/swift3/test/unit/test_bucket.py +++ b/swift3/test/unit/test_bucket.py @@ -46,6 +46,23 @@ class TestSwift3Bucket(Swift3TestCase): for p in self.prefixes: object_list_subdir.append({"subdir": p}) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments', + swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments/rose', + swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments/viola', + swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments/lily', + swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments/with' + ' space', swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('DELETE', '/v1/AUTH_test/bucket+segments/with%20' + 'space', swob.HTTPNoContent, {}, json.dumps([])) + self.swift.register('GET', '/v1/AUTH_test/bucket+segments?format=json' + '&marker=with%2520space', swob.HTTPOk, {}, + json.dumps([])) + self.swift.register('GET', '/v1/AUTH_test/bucket+segments?format=json' + '&marker=', swob.HTTPOk, {}, object_list) self.swift.register('HEAD', '/v1/AUTH_test/junk', swob.HTTPNoContent, {}, None) self.swift.register('HEAD', '/v1/AUTH_test/nojunk', swob.HTTPNotFound, diff --git a/swift3/test/unit/test_s3_acl.py b/swift3/test/unit/test_s3_acl.py index b33e2d82..125b8607 100644 --- a/swift3/test/unit/test_s3_acl.py +++ b/swift3/test/unit/test_s3_acl.py @@ -126,6 +126,8 @@ def generate_s3acl_environ(account, swift, owner): # for bucket swift.register('HEAD', '/v1/AUTH_test/bucket', swob.HTTPNoContent, container_headers, None) + swift.register('HEAD', '/v1/AUTH_test/bucket+segments', swob.HTTPNoContent, + container_headers, None) swift.register('PUT', '/v1/AUTH_test/bucket', swob.HTTPCreated, {}, None) swift.register('GET', '/v1/AUTH_test/bucket', swob.HTTPNoContent,