Merge "Fix DELETE Bucket to also delete segments bucket"
This commit is contained in:
commit
80f4386904
@ -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))
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user