Fix issues around S3 deletion. Closes #606.

This commit is contained in:
Steve Pulec 2016-05-08 17:14:29 -04:00
parent 5415091d14
commit bd7327fca2
3 changed files with 14 additions and 11 deletions

View File

@ -477,7 +477,12 @@ class S3Backend(BaseBackend):
def delete_key(self, bucket_name, key_name):
key_name = clean_key_name(key_name)
bucket = self.get_bucket(bucket_name)
return bucket.keys.pop(key_name)
try:
bucket.keys.pop(key_name)
return True
except KeyError:
return False
def copy_key(self, src_bucket_name, src_key_name, dest_bucket_name,
dest_key_name, storage=None, acl=None, src_version_id=None):

View File

@ -305,11 +305,11 @@ class ResponseObject(_TemplateEnvironmentMixin):
error_names = []
for k in keys:
try:
key_name = k.firstChild.nodeValue
self.backend.delete_key(bucket_name, key_name)
key_name = k.firstChild.nodeValue
success = self.backend.delete_key(bucket_name, key_name)
if success:
deleted_names.append(key_name)
except KeyError:
else:
error_names.append(key_name)
return 200, headers, template.render(deleted=deleted_names, delete_errors=error_names)
@ -520,12 +520,9 @@ class ResponseObject(_TemplateEnvironmentMixin):
upload_id = query['uploadId'][0]
self.backend.cancel_multipart(bucket_name, upload_id)
return 204, headers, ""
try:
removed_key = self.backend.delete_key(bucket_name, key_name)
except KeyError:
return 404, headers, ""
self.backend.delete_key(bucket_name, key_name)
template = self.response_template(S3_DELETE_OBJECT_SUCCESS)
return 204, headers, template.render(bucket=removed_key)
return 204, headers, template.render()
def _complete_multipart_body(self, body):
ps = minidom.parseString(body).getElementsByTagName('Part')

View File

@ -501,7 +501,8 @@ def test_delete_missing_key():
conn = boto.connect_s3('the_key', 'the_secret')
bucket = conn.create_bucket('foobar')
bucket.delete_key.when.called_with('foobar').should.throw(S3ResponseError)
deleted_key = bucket.delete_key("foobar")
deleted_key.key.should.equal("foobar")
@mock_s3