Skip to content
Snippets Groups Projects
Commit ab6f9bf6 authored by Radoslav Bodó's avatar Radoslav Bodó
Browse files

rwm: fix storage_delete, use paging when deleting storage

parent b90aceeb
No related branches found
No related tags found
No related merge requests found
Pipeline #7756 passed
......@@ -273,10 +273,36 @@ class StorageManager:
def storage_delete(self, bucket_name):
"""storage delete"""
bucket = self.s3.Bucket(bucket_name)
bucket.objects.all().delete()
bucket.object_versions.all().delete()
bucket.delete()
# delete all objects
paginator = self.s3.meta.client.get_paginator('list_objects')
objects = []
for page in paginator.paginate(Bucket=bucket_name):
for item in page.get("Contents", []):
objects.append((bucket_name, item["Key"]))
for item in objects:
self.s3.Object(*item).delete()
paginator = self.s3.meta.client.get_paginator('list_object_versions')
# delete all object versions
objects = []
for page in paginator.paginate(Bucket=bucket_name):
for item in page.get("Versions", []):
objects.append((bucket_name, item["Key"], item["VersionId"]))
for item in objects:
self.s3.ObjectVersion(*item).delete()
# delete all delete markers
objects = []
for page in paginator.paginate(Bucket=bucket_name):
for item in page.get("DeleteMarkers", []):
objects.append((bucket_name, item["Key"], item["VersionId"]))
for item in objects:
self.s3.ObjectVersion(*item).delete()
# delete bucket
self.s3.Bucket(bucket_name).delete()
return 0
@staticmethod
......
......@@ -232,3 +232,20 @@ def test_storage_save_state_error_handling(tmpworkdir: str): # pylint: disable=
mock = Mock(side_effect=TypeError("dummy"))
with patch.object(rwm.StorageManager, "_bucket_state", mock):
assert rwm.StorageManager("http://localhost", "", "").storage_save_state("dummy") == 1
@pytest.mark.skipif('PYTEST_SLOW' not in os.environ, reason='slow on devnode, runs in CI')
def test_storage_delete(tmpworkdir: str, radosuser_admin: rwm.StorageManager): # pylint: disable=unused-argument
"""test storage delete"""
bucket_name = "testbuckx"
bucket = radosuser_admin.storage_create(bucket_name, "dummy")
bucket.upload_fileobj(BytesIO(b"dummydata0"), "dummykey")
for idx in range(803):
bucket.Object("dummykey").delete()
bucket.upload_fileobj(BytesIO(f"dummydata{idx}".encode()), "dummykey")
assert radosuser_admin.storage_delete(bucket.name) == 0
assert not radosuser_admin.bucket_exist(bucket.name)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment