Skip to content

Commit e4c3f11

Browse files
committed
Also delete delete markers when deleting buckets
1 parent 96104c5 commit e4c3f11

4 files changed

Lines changed: 70 additions & 16 deletions

File tree

destroy-cumulus/destroy_cumulus.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -549,21 +549,33 @@ def delete(self, get_client):
549549
version_paginator = client.get_paginator("list_object_versions")
550550

551551
for response in version_paginator.paginate(Bucket=self.name):
552-
if "Versions" not in response:
553-
continue
552+
if "Versions" in response:
553+
client.delete_objects(
554+
Bucket=self.name,
555+
Delete=dict(
556+
Objects=[
557+
{
558+
"Key": entry["Key"],
559+
"VersionId": entry["VersionId"],
560+
}
561+
for entry in response["Versions"]
562+
],
563+
),
564+
)
554565

555-
client.delete_objects(
556-
Bucket=self.name,
557-
Delete=dict(
558-
Objects=[
559-
{
560-
"Key": entry["Key"],
561-
"VersionId": entry["VersionId"],
562-
}
563-
for entry in response["Versions"]
564-
],
565-
),
566-
)
566+
if "DeleteMarkers" in response:
567+
client.delete_objects(
568+
Bucket=self.name,
569+
Delete=dict(
570+
Objects=[
571+
{
572+
"Key": entry["Key"],
573+
"VersionId": entry["VersionId"],
574+
}
575+
for entry in response["DeleteMarkers"]
576+
],
577+
),
578+
)
567579

568580
for response in object_paginator.paginate(Bucket=self.name):
569581
if "Contents" not in response:

destroy-cumulus/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
66
name = "destroy-cumulus"
7-
version = "0.3.0"
7+
version = "0.3.1"
88
description = ""
99
authors = ["Rohan Weeden <reweeden@alaska.edu>"]
1010
readme = "README.md"

destroy-cumulus/tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ def aws_credentials():
2424
def get_client():
2525
with mock_aws():
2626
yield boto3.client
27+
28+
29+
@pytest.fixture
30+
def s3_resource():
31+
with mock_aws():
32+
yield boto3.resource("s3")

destroy-cumulus/tests/test_delete.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
1+
import contextlib
2+
13
import pytest
2-
from destroy_cumulus import Arn, CloudWatchEventRule
4+
from destroy_cumulus import Arn, Bucket, CloudWatchEventRule
35

46

57
@pytest.fixture
68
def client_events(get_client):
79
yield get_client("events")
810

911

12+
@pytest.fixture
13+
def client_s3(get_client):
14+
yield get_client("s3")
15+
16+
17+
@pytest.fixture
18+
def test_bucket(s3_resource):
19+
bucket_name = "test-bucket"
20+
21+
bucket = s3_resource.Bucket(bucket_name)
22+
bucket.create()
23+
bucket.Versioning().enable()
24+
25+
foo = bucket.Object("foo.txt")
26+
bar = bucket.Object("bar.txt")
27+
foo.put(Body=b"foo")
28+
bar.put(Body=b"bar")
29+
# create a new version of foo.txt
30+
foo.put(Body=b"foo 2")
31+
# Create a delete marker for bar.txt
32+
bar.delete()
33+
34+
yield bucket
35+
36+
with contextlib.suppress(s3_resource.meta.client.exceptions.NoSuchBucket):
37+
bucket.object_versions.delete()
38+
bucket.delete()
39+
40+
41+
def test_delete_bucket(get_client, test_bucket):
42+
bucket = Bucket.from_arn(Arn(f"arn:aws:s3:::{test_bucket.name}"))
43+
bucket.delete(get_client)
44+
45+
1046
def test_delete_rule_targets(get_client, client_events):
1147
rule_arn = client_events.put_rule(
1248
Name="test-rule",

0 commit comments

Comments
 (0)