Skip to content

Commit 9514d5d

Browse files
committed
APM-3095 Paginate on force unlock
1 parent 8231a7c commit 9514d5d

1 file changed

Lines changed: 38 additions & 9 deletions

File tree

scripts/terraform_force_unlock.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,40 +27,69 @@
2727

2828
@click.command()
2929
@click.option("--min-age-hr", type=int, default=4)
30-
@click.option("--key-prefix", type=str, default="nhsd-apm-management-ptl-terraform/env:/api-deployment:ptl:")
30+
@click.option(
31+
"--key-prefix",
32+
type=str,
33+
default="nhsd-apm-management-ptl-terraform/env:/api-deployment:ptl:",
34+
)
3135
@click.option("--table-name", type=str, default="terraform-state-lock")
3236
@click.option("--profile", type=str, default="apm_ptl")
3337
def main(min_age_hr, key_prefix, table_name, profile):
34-
3538
accepted_envs = ["apm_ptl", "apm_prod"]
3639

3740
if profile not in accepted_envs:
3841
raise ValueError("Profile must be apm_ptl or apm_prod")
3942

40-
terraform_lock_table = boto3.Session(profile_name=profile).resource("dynamodb").Table(table_name)
43+
terraform_lock_table = (
44+
boto3.Session(profile_name=profile).resource("dynamodb").Table(table_name)
45+
)
4146

4247
filter_expr = "begins_with(#n0, :v0) AND attribute_exists(#n1)"
4348

4449
ExpressionAttributeNames = {"#n0": "LockID", "#n1": "Info"}
4550
ExpressionAttributeValues = {
4651
":v0": key_prefix,
4752
}
48-
items = terraform_lock_table.scan(FilterExpression=filter_expr, ExpressionAttributeNames=ExpressionAttributeNames, ExpressionAttributeValues=ExpressionAttributeValues)
49-
print(f"Found {len(items['Items'])} locks which start with key prefix '{key_prefix}'")
53+
items = terraform_lock_table.scan(
54+
FilterExpression=filter_expr,
55+
ExpressionAttributeNames=ExpressionAttributeNames,
56+
ExpressionAttributeValues=ExpressionAttributeValues,
57+
)
58+
59+
total_items = items["Items"]
60+
61+
while "LastEvaluatedKey" in items:
62+
items = terraform_lock_table.scan(
63+
FilterExpression=filter_expr,
64+
ExpressionAttributeNames=ExpressionAttributeNames,
65+
ExpressionAttributeValues=ExpressionAttributeValues,
66+
ExclusiveStartKey=items["LastEvaluatedKey"],
67+
)
68+
total_items.extend(items["Items"])
69+
70+
print(
71+
f"Found {len(items['Items'])} locks which start with key prefix '{key_prefix}'"
72+
)
5073

5174
removed_count = 0
52-
for lock_item in items["Items"]:
75+
for lock_item in total_items:
5376
lock_item_info = json.loads(lock_item["Info"])
5477
lock_id = lock_item["LockID"]
5578
created_at = dateutil.parser.parse(lock_item_info["Created"])
5679

57-
if datetime.datetime.now(datetime.timezone.utc) - created_at > datetime.timedelta(hours=min_age_hr):
58-
print(f"{lock_id} {created_at=} is more than {min_age_hr} hours old, deleting lock...")
80+
if datetime.datetime.now(
81+
datetime.timezone.utc
82+
) - created_at > datetime.timedelta(hours=min_age_hr):
83+
print(
84+
f"{lock_id} {created_at=} is more than {min_age_hr} hours old, deleting lock..."
85+
)
5986
terraform_lock_table.delete_item(Key={"LockID": lock_id})
6087
removed_count += 1
6188

6289
else:
63-
print(f"{lock_id} {created_at=} is not more than {min_age_hr} hours old, leaving it alone!")
90+
print(
91+
f"{lock_id} {created_at=} is not more than {min_age_hr} hours old, leaving it alone!"
92+
)
6493

6594
print(f"Removed {removed_count} locks")
6695

0 commit comments

Comments
 (0)