Skip to content

Commit 25d1213

Browse files
authored
[aws][feat] Add lifecycle policy to the S3 resource (#2220)
1 parent 207397f commit 25d1213

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

plugins/aws/fix_plugin_aws/resource/ecr.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,11 @@ def fetch_lifecycle_policy(repository: AwsEcrRepository) -> None:
7575
if policy := builder.client.get(
7676
service_name,
7777
"get-lifecycle-policy",
78+
"lifecyclePolicyText",
7879
repositoryName=repository.name,
7980
expected_errors=["LifecyclePolicyNotFoundException"],
8081
):
81-
repository.lifecycle_policy = sort_json(json.loads(policy["lifecyclePolicyText"]), sort_list=True)
82+
repository.lifecycle_policy = sort_json(json.loads(policy), sort_list=True) # type: ignore
8283

8384
def collect(visibility: str, spec: AwsApiSpec) -> None:
8485
try:

plugins/aws/fix_plugin_aws/resource/s3.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class AwsS3Bucket(AwsResource, BaseBucket):
182182
bucket_acl: Optional[AwsS3BucketAcl] = field(default=None)
183183
bucket_logging: Optional[AwsS3Logging] = field(default=None)
184184
bucket_location: Optional[str] = field(default=None)
185+
bucket_lifecycle_policy: Optional[Json] = field(default=None, metadata={"description": "The bucket lifecycle policy."}) # fmt: skip
185186

186187
@classmethod
187188
def called_collect_apis(cls) -> List[AwsApiSpec]:
@@ -231,6 +232,19 @@ def add_bucket_policy(bck: AwsS3Bucket) -> None:
231232
):
232233
bck.bucket_policy = sort_json(json_loads(raw_policy), sort_list=True) # type: ignore
233234

235+
def fetch_lifecycle_policy(bck: AwsS3Bucket) -> None:
236+
with builder.suppress(f"{service_name}.get-bucket-lifecycle-configuration"):
237+
for policy in builder.client.list(
238+
service_name,
239+
"get-bucket-lifecycle-configuration",
240+
"Rules",
241+
Bucket=bck.name,
242+
expected_errors=["NoSuchLifecycleConfiguration"],
243+
):
244+
if not bck.bucket_lifecycle_policy:
245+
bck.bucket_lifecycle_policy = {}
246+
bck.bucket_lifecycle_policy[policy["ID"]] = policy
247+
234248
def add_bucket_versioning(bck: AwsS3Bucket) -> None:
235249
with builder.suppress(f"{service_name}.get-bucket-versioning"):
236250
if raw_versioning := builder.client.get(
@@ -310,6 +324,7 @@ def add_bucket_location(bck: AwsS3Bucket) -> None:
310324
builder.submit_work(service_name, add_public_access, bucket)
311325
builder.submit_work(service_name, add_acls, bucket)
312326
builder.submit_work(service_name, add_bucket_logging, bucket)
327+
builder.submit_work(service_name, fetch_lifecycle_policy, bucket)
313328

314329
def _set_tags(self, client: AwsClient, tags: Dict[str, str]) -> bool:
315330
tag_set = [{"Key": k, "Value": v} for k, v in tags.items()]

plugins/aws/test/resources/s3_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
def test_buckets() -> None:
10-
first, builder = round_trip_for(AwsS3Bucket)
10+
first, builder = round_trip_for(AwsS3Bucket, "bucket_lifecycle_policy")
1111
assert len(builder.resources_of(AwsS3Bucket)) == 4
1212
assert len(first.bucket_encryption_rules or []) == 1
1313
assert first.arn == "arn:aws:s3:::bucket-1"
@@ -25,7 +25,7 @@ def test_s3_account_settings() -> None:
2525

2626

2727
def test_tagging() -> None:
28-
bucket, _ = round_trip_for(AwsS3Bucket)
28+
bucket, _ = round_trip_for(AwsS3Bucket, "bucket_lifecycle_policy")
2929

3030
def validate_update_args(**kwargs: Any) -> Any:
3131
if kwargs["action"] == "get-bucket-tagging":
@@ -53,7 +53,7 @@ def validate_delete_args(**kwargs: Any) -> Any:
5353

5454

5555
def test_deletion() -> None:
56-
bucket, _ = round_trip_for(AwsS3Bucket)
56+
bucket, _ = round_trip_for(AwsS3Bucket, "bucket_lifecycle_policy")
5757

5858
def validate_delete_args(aws_service: str, fn: Callable[[Any], None]) -> Any:
5959
assert aws_service == "s3"

0 commit comments

Comments
 (0)