Skip to content

Commit 3fff8b5

Browse files
authored
[aws][fix]: Update S3 bucket tests for updated implementation (#2281)
1 parent 5b8dc07 commit 3fff8b5

4 files changed

+67
-22
lines changed

plugins/aws/fix_plugin_aws/resource/ssm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ class AwsSSMResourceCompliance(AwsResource, PhantomBaseResource):
360360
"ssm",
361361
"list-resource-compliance-summaries",
362362
"ResourceComplianceSummaryItems",
363-
{"Filters": [{"Key": "Status", "Values": ["COMPLIANT"], "Type": "EQUAL"}]},
363+
{"Filters": [{"Key": "Status", "Values": ["NON_COMPLIANT"], "Type": "EQUAL"}]},
364364
)
365365
mapping: ClassVar[Dict[str, Bender]] = {
366366
"id": S("Id"),
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,36 @@
33
{
44
"Id": "bucketsizebytes_aws_s3_bucketname_bucket_1_storagetype_standardstorage_average",
55
"Label": "BucketSizeBytes",
6-
"Timestamps": [ "2024-04-30T12:50:00+00:00" ],
7-
"Values": [ 1 ],
6+
"Timestamps": [
7+
"2024-04-30T12:50:00+00:00"
8+
],
9+
"Values": [
10+
1
11+
],
812
"StatusCode": "Complete"
913
},
1014
{
1115
"Id": "bucketsizebytes_aws_s3_bucketname_bucket_1_storagetype_intelligenttieringstorage_average",
1216
"Label": "BucketSizeBytes",
13-
"Timestamps": [ "2024-04-30T12:50:00+00:00" ],
14-
"Values": [ 2 ],
17+
"Timestamps": [
18+
"2024-04-30T12:50:00+00:00"
19+
],
20+
"Values": [
21+
2
22+
],
1523
"StatusCode": "Complete"
1624
},
1725
{
1826
"Id": "bucketsizebytes_aws_s3_bucketname_bucket_1_storagetype_standardiastorage_average",
1927
"Label": "BucketSizeBytes",
20-
"Timestamps": [ "2024-04-30T12:50:00+00:00" ],
21-
"Values": [ 3 ],
28+
"Timestamps": [
29+
"2024-04-30T12:50:00+00:00"
30+
],
31+
"Values": [
32+
3
33+
],
2234
"StatusCode": "Complete"
2335
}
2436
],
2537
"Messages": []
26-
}
38+
}

plugins/aws/test/resources/s3_test.py

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
from fixlib.graph import Graph
2-
from test.resources import round_trip_for
1+
from concurrent.futures import ThreadPoolExecutor
2+
from datetime import datetime, timedelta
33
from types import SimpleNamespace
4-
from typing import cast, Any, Callable
4+
from typing import cast, Any, Callable, List
5+
from fix_plugin_aws.resource.base import AwsRegion, GraphBuilder
6+
from fix_plugin_aws.resource.cloudwatch import update_resource_metrics, AwsCloudwatchMetricData, AwsCloudwatchQuery
57
from fix_plugin_aws.aws_client import AwsClient
68
from fix_plugin_aws.resource.s3 import AwsS3Bucket, AwsS3AccountSettings
9+
from fixlib.threading import ExecutorQueue
10+
from fixlib.graph import Graph
11+
from test.resources import round_trip_for
712

813

914
def test_buckets() -> None:
@@ -62,14 +67,42 @@ def validate_delete_args(aws_service: str, fn: Callable[[Any], None]) -> Any:
6267
bucket.delete_resource(client, Graph())
6368

6469

65-
# TODO: fix 'RuntimeError: cannot schedule new futures after shutdown'
66-
# def test_s3_usage_metrics(account_collector: AwsAccountCollector) -> None:
67-
# bucket, builder = round_trip_for(AwsS3Bucket)
68-
# builder.all_regions.update({"us-east-1": AwsRegion(id="us-east-1", name="us-east-1")})
69-
# account_collector.collect_usage_metrics(builder)
70-
# bucket.complete_graph(builder, {})
71-
# assert bucket._resource_usage["standard_storage_bucket_size_bytes"]["avg"] == 1.0
72-
# assert bucket._resource_usage["intelligent_tiering_storage_bucket_size_bytes"]["avg"] == 2.0
73-
# assert bucket._resource_usage["standard_ia_storage_bucket_size_bytes"]["avg"] == 3.0
74-
# # This values is computed internally using the other values. If the number does not match, the logic is broken!
75-
# assert bucket._resource_usage["bucket_size_bytes"]["avg"] == 6.0
70+
def test_s3_usage_metrics() -> None:
71+
bucket, builder = round_trip_for(AwsS3Bucket, "bucket_lifecycle_policy")
72+
builder.all_regions.update({"us-east-1": AwsRegion(id="us-east-1", name="us-east-1")})
73+
queries = bucket.collect_usage_metrics(builder)
74+
lookup_map = {}
75+
lookup_map[bucket.id] = bucket
76+
77+
# simulates the `collect_usage_metrics` method found in `AwsAccountCollector`.
78+
def collect_and_set_metrics(start_at: datetime, region: AwsRegion, queries: List[AwsCloudwatchQuery]) -> None:
79+
with ThreadPoolExecutor(max_workers=1) as executor:
80+
queue = ExecutorQueue(executor, tasks_per_key=lambda _: 1, name="test")
81+
g_builder = GraphBuilder(
82+
builder.graph,
83+
builder.cloud,
84+
builder.account,
85+
region,
86+
{region.id: region},
87+
builder.client,
88+
queue,
89+
builder.core_feedback,
90+
last_run_started_at=builder.last_run_started_at,
91+
)
92+
result = AwsCloudwatchMetricData.query_for_multiple(
93+
g_builder, start_at, start_at + timedelta(hours=2), queries
94+
)
95+
update_resource_metrics(lookup_map, result)
96+
# compute bucket_size_bytes
97+
for after_collect in builder.after_collect_actions:
98+
after_collect()
99+
100+
start = datetime(2020, 5, 30, 15, 45, 30)
101+
102+
collect_and_set_metrics(start, AwsRegion(id="us-east-1", name="us-east-1"), queries)
103+
104+
assert bucket._resource_usage["standard_storage_bucket_size_bytes"]["avg"] == 1.0
105+
assert bucket._resource_usage["intelligent_tiering_storage_bucket_size_bytes"]["avg"] == 2.0
106+
assert bucket._resource_usage["standard_ia_storage_bucket_size_bytes"]["avg"] == 3.0
107+
# This values is computed internally using the other values. If the number does not match, the logic is broken!
108+
assert bucket._resource_usage["bucket_size_bytes"]["avg"] == 6.0

0 commit comments

Comments
 (0)