88logger = logging .getLogger (__name__ )
99
1010
11- def delete_deprecated_images (ec2 : EC2Client , dry_run : bool ) -> None :
11+ def delete_deprecated_images (
12+ ec2 : EC2Client , dry_run : bool , grace_period_days : int = 0
13+ ) -> None :
1214 """
1315 Delete an image by its name.
1416
@@ -29,7 +31,9 @@ def delete_deprecated_images(ec2: EC2Client, dry_run: bool) -> None:
2931 # ISO8601 string and compare the strings. This works because
3032 # ISO8601 strings are lexicographically comparable.
3133 current_time = datetime .datetime .isoformat (
32- datetime .datetime .now (), timespec = "milliseconds"
34+ datetime .datetime .now ()
35+ - datetime .timedelta (days = grace_period_days ),
36+ timespec = "milliseconds" ,
3337 )
3438 if (
3539 image ["Name" ].startswith ("nixos/23.11" )
@@ -67,6 +71,13 @@ def main() -> None:
6771 action = "store_true" ,
6872 help = "Do not actually delete anything, just log what would be deleted" ,
6973 )
74+ parser .add_argument (
75+ "--grace-period" ,
76+ type = int ,
77+ default = 0 ,
78+ metavar = "DAYS" ,
79+ help = "Number of days after deprecation before an image is deleted (default: 0)" ,
80+ )
7081 logging .basicConfig (level = logging .INFO )
7182 ec2 : EC2Client = boto3 .client ("ec2" )
7283
@@ -76,7 +87,7 @@ def main() -> None:
7687 assert "RegionName" in region
7788 ec2r = boto3 .client ("ec2" , region_name = region ["RegionName" ])
7889 logging .info (f"Checking region { region ['RegionName' ]} " )
79- delete_deprecated_images (ec2r , args .dry_run )
90+ delete_deprecated_images (ec2r , args .dry_run , args . grace_period )
8091
8192
8293if __name__ == "__main__" :
0 commit comments