Merge "Fix DELETE Bucket to also delete segments bucket"

This commit is contained in:
Jenkins 2016-02-02 04:03:12 +00:00 committed by Gerrit Code Review
commit 80f4386904
4 changed files with 69 additions and 3 deletions

View File

@ -157,6 +157,17 @@ class BucketAclHandler(BaseAclHandler):
""" """
BucketAclHandler: Handler for BucketController 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): def PUT(self, app):
req_acl = ACL.from_headers(self.req.headers, req_acl = ACL.from_headers(self.req.headers,
Owner(self.user_id, self.user_id)) Owner(self.user_id, self.user_id))

View File

@ -22,9 +22,10 @@ from swift3.controllers.base import Controller
from swift3.etree import Element, SubElement, tostring, fromstring, \ from swift3.etree import Element, SubElement, tostring, fromstring, \
XMLSyntaxError, DocumentInvalid XMLSyntaxError, DocumentInvalid
from swift3.response import HTTPOk, S3NotImplemented, InvalidArgument, \ from swift3.response import HTTPOk, S3NotImplemented, InvalidArgument, \
MalformedXML, InvalidLocationConstraint MalformedXML, InvalidLocationConstraint, NoSuchBucket, \
BucketNotEmpty, InternalError, ServiceUnavailable, NoSuchKey
from swift3.cfg import CONF from swift3.cfg import CONF
from swift3.utils import LOGGER from swift3.utils import LOGGER, MULTIUPLOAD_SUFFIX
MAX_PUT_BUCKET_BODY_SIZE = 10240 MAX_PUT_BUCKET_BODY_SIZE = 10240
@ -33,6 +34,38 @@ class BucketController(Controller):
""" """
Handles bucket request. 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): def HEAD(self, req):
""" """
Handle HEAD Bucket (Get Metadata) request Handle HEAD Bucket (Get Metadata) request
@ -154,7 +187,10 @@ class BucketController(Controller):
""" """
Handle DELETE Bucket request 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): def POST(self, req):
""" """

View File

@ -46,6 +46,23 @@ class TestSwift3Bucket(Swift3TestCase):
for p in self.prefixes: for p in self.prefixes:
object_list_subdir.append({"subdir": p}) 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, self.swift.register('HEAD', '/v1/AUTH_test/junk', swob.HTTPNoContent,
{}, None) {}, None)
self.swift.register('HEAD', '/v1/AUTH_test/nojunk', swob.HTTPNotFound, self.swift.register('HEAD', '/v1/AUTH_test/nojunk', swob.HTTPNotFound,

View File

@ -126,6 +126,8 @@ def generate_s3acl_environ(account, swift, owner):
# for bucket # for bucket
swift.register('HEAD', '/v1/AUTH_test/bucket', swob.HTTPNoContent, swift.register('HEAD', '/v1/AUTH_test/bucket', swob.HTTPNoContent,
container_headers, None) container_headers, None)
swift.register('HEAD', '/v1/AUTH_test/bucket+segments', swob.HTTPNoContent,
container_headers, None)
swift.register('PUT', '/v1/AUTH_test/bucket', swift.register('PUT', '/v1/AUTH_test/bucket',
swob.HTTPCreated, {}, None) swob.HTTPCreated, {}, None)
swift.register('GET', '/v1/AUTH_test/bucket', swob.HTTPNoContent, swift.register('GET', '/v1/AUTH_test/bucket', swob.HTTPNoContent,