Fix Delete Multiple Objects process when multipart object is deleted

When delete a object created by Complete Multipart Upload in Delete
Multiple Objects operation, delete both manifest file and segments by
adding "multipart-manifest=delete" to query string.

Change-Id: I3759e6f43d8c531d7a7d961c2069af1e411d04ef
This commit is contained in:
Naoto Nishizono 2015-02-12 16:49:27 +09:00 committed by Sivasathurappan Radhakrishnan
parent 2f6ad2f6aa
commit 822dd7f395
4 changed files with 26 additions and 3 deletions

View File

@ -242,6 +242,11 @@ class MultiObjectDeleteAclHandler(BaseAclHandler):
"""
MultiObjectDeleteAclHandler: Handler for MultiObjectDeleteController
"""
def HEAD(self, app):
# Only bucket write acl is required
if not self.obj:
return self._handle_acl(app, 'HEAD')
def DELETE(self, app):
# Only bucket write acl is required
pass

View File

@ -99,7 +99,8 @@ class MultiObjectDeleteController(Controller):
req.object_name = key
try:
req.get_response(self.app, method='DELETE')
query = req.gen_multipart_manifest_delete_query(self.app)
req.get_response(self.app, method='DELETE', query=query)
except NoSuchKey:
pass
except ErrorResponse as e:

View File

@ -17,6 +17,7 @@ import unittest
from datetime import datetime
from hashlib import md5
from six.moves import urllib
from swift.common import swob
from swift.common.swob import Request
@ -30,6 +31,10 @@ class TestSwift3MultiDelete(Swift3TestCase):
def setUp(self):
super(TestSwift3MultiDelete, self).setUp()
self.swift.register('HEAD', '/v1/AUTH_test/bucket/Key1',
swob.HTTPOk, {}, None)
self.swift.register('HEAD', '/v1/AUTH_test/bucket/Key2',
swob.HTTPNotFound, {}, None)
@s3acl
def test_object_multi_DELETE_to_object(self):
@ -51,13 +56,19 @@ class TestSwift3MultiDelete(Swift3TestCase):
@s3acl
def test_object_multi_DELETE(self):
self.swift.register('HEAD', '/v1/AUTH_test/bucket/Key3',
swob.HTTPOk,
{'x-static-large-object': 'True'},
None)
self.swift.register('DELETE', '/v1/AUTH_test/bucket/Key1',
swob.HTTPNoContent, {}, None)
self.swift.register('DELETE', '/v1/AUTH_test/bucket/Key2',
swob.HTTPNotFound, {}, None)
self.swift.register('DELETE', '/v1/AUTH_test/bucket/Key3',
swob.HTTPOk, {}, None)
elem = Element('Delete')
for key in ['Key1', 'Key2']:
for key in ['Key1', 'Key2', 'Key3']:
obj = SubElement(elem, 'Object')
SubElement(obj, 'Key').text = key
body = tostring(elem, use_s3ns=False)
@ -75,7 +86,12 @@ class TestSwift3MultiDelete(Swift3TestCase):
self.assertEquals(status.split()[0], '200')
elem = fromstring(body)
self.assertEquals(len(elem.findall('Deleted')), 2)
self.assertEquals(len(elem.findall('Deleted')), 3)
_, path, _ = self.swift.calls_with_headers[-1]
path, query_string = path.split('?', 1)
self.assertEquals(path, '/v1/AUTH_test/bucket/Key3')
query = dict(urllib.parse.parse_qsl(query_string))
self.assertEquals(query['multipart-manifest'], 'delete')
@s3acl
def test_object_multi_DELETE_quiet(self):

View File

@ -7,3 +7,4 @@ mock
pylint
python-openstackclient<=1.9.0
boto
six>=1.9.0