|
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 |
3 | 3 | 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 |
5 | 7 | from fix_plugin_aws.aws_client import AwsClient |
6 | 8 | 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 |
7 | 12 |
|
8 | 13 |
|
9 | 14 | def test_buckets() -> None: |
@@ -62,14 +67,42 @@ def validate_delete_args(aws_service: str, fn: Callable[[Any], None]) -> Any: |
62 | 67 | bucket.delete_resource(client, Graph()) |
63 | 68 |
|
64 | 69 |
|
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