Skip to content

Commit 14cc285

Browse files
authored
DRIVERS-3117 periodically remove old Azure resources (#625)
1 parent ba75f25 commit 14cc285

File tree

3 files changed

+192
-0
lines changed

3 files changed

+192
-0
lines changed

.evergreen/config.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,18 @@ tasks:
660660
file: ".evergreen/compile.sh"
661661
buildtool: "cmake"
662662
- func: "upload build"
663+
664+
- name: delete_old_azure_resources
665+
commands:
666+
- command: ec2.assume_role
667+
params:
668+
role_arn: ${aws_test_secrets_role}
669+
- command: subprocess.exec
670+
params:
671+
binary: bash
672+
args:
673+
- ${DRIVERS_TOOLS}/.evergreen/csfle/azurekms/delete_old_azure_resources.sh
674+
663675
# }}}
664676

665677

@@ -1567,6 +1579,14 @@ buildvariants:
15671579
tasks:
15681580
- serverless_task_group
15691581

1582+
- name: delete_old_azure_resources
1583+
display_name: "Delete old Azure resources"
1584+
run_on: rhel80-small
1585+
cron: '@daily'
1586+
patchable: false
1587+
tasks:
1588+
- name: delete_old_azure_resources
1589+
15701590
# Platform notes
15711591
# i386 builds of OpenSSL or Cyrus SASL are not available
15721592
# Ubuntu14.04 only supports 2.6+ with SSL
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
"""
2+
Delete old Azure Virtual Machines and related orphaned resources.
3+
4+
Run with the shell script: delete_old_azure_resources.sh
5+
"""
6+
7+
import argparse
8+
import datetime
9+
import os
10+
11+
from azure.identity import DefaultAzureCredential
12+
from azure.mgmt.compute import ComputeManagementClient
13+
from azure.mgmt.network import NetworkManagementClient
14+
15+
16+
def main():
17+
# Parse args:
18+
parser = argparse.ArgumentParser()
19+
parser.add_argument("--dry-run", action="store_true")
20+
args = parser.parse_args()
21+
22+
# Create clients:
23+
sub_id = os.getenv("AZURE_SUBSCRIPTION_ID")
24+
resource_group_name = os.getenv("AZURE_RESOURCE_GROUP")
25+
cmclient = ComputeManagementClient(
26+
credential=DefaultAzureCredential(), subscription_id=sub_id
27+
)
28+
nmclient = NetworkManagementClient(
29+
credential=DefaultAzureCredential(), subscription_id=sub_id
30+
)
31+
32+
# Delete old Virtual Machines:
33+
vm_names = []
34+
for vm in cmclient.virtual_machines.list(resource_group_name):
35+
try:
36+
now = datetime.datetime.now(tz=datetime.timezone.utc)
37+
delta = now - vm.time_created
38+
if delta < datetime.timedelta(hours=2):
39+
print(
40+
f"{vm.name} is less than 2 hours old. Age is: {delta} ... skipping"
41+
)
42+
continue
43+
vm_names.append(vm.name)
44+
except Exception as e:
45+
print(f"Exception occurred: {e}")
46+
print(f"Detected old Virtual Machines: {vm_names}")
47+
if args.dry_run:
48+
print("Dry run detected. Not deleting.")
49+
else:
50+
for vm_name in vm_names:
51+
try:
52+
print(f"Deleting Virtual Machine '{vm_name}' ...")
53+
cmclient.virtual_machines.begin_delete(
54+
resource_group_name, vm_name
55+
).result()
56+
print(f"Deleting Virtual Machine '{vm_name}' ... done")
57+
except Exception as e:
58+
print(f"Exception occurred: {e}")
59+
60+
# Get list of all Virtual Machine names to detect orphaned resources:
61+
all_vm_names = [] # Example: `vmname-RUBY-10561`
62+
for vm in cmclient.virtual_machines.list(resource_group_name):
63+
all_vm_names.append(vm.name)
64+
65+
# Delete orphaned NSGs:
66+
orphan_nsg_names = []
67+
for nsg in nmclient.network_security_groups.list(resource_group_name):
68+
is_orphan = True
69+
for vm_name in all_vm_names:
70+
if vm_name + "-NSG" == nsg.name:
71+
is_orphan = False
72+
break
73+
if is_orphan:
74+
orphan_nsg_names.append(nsg.name)
75+
print(f"Detected orphaned NSGs: {orphan_nsg_names}")
76+
if args.dry_run:
77+
print("Dry run detected. Not deleting.")
78+
else:
79+
for nsg_name in orphan_nsg_names:
80+
try:
81+
print(f"Deleting orphaned NSG '{nsg_name}' ...")
82+
nmclient.network_security_groups.begin_delete(
83+
resource_group_name, nsg_name
84+
).result()
85+
print(f"Deleting orphaned NSG '{nsg_name}' ... done")
86+
except Exception as e:
87+
print(f"Exception occurred: {e}")
88+
89+
# Delete orphaned IPs:
90+
orphan_ip_names = []
91+
for ip in nmclient.public_ip_addresses.list(resource_group_name):
92+
is_orphan = True
93+
for vm_name in all_vm_names:
94+
if vm_name + "-PUBLIC-IP" == ip.name:
95+
is_orphan = False
96+
break
97+
if is_orphan:
98+
orphan_ip_names.append(ip.name)
99+
print(f"Detected orphaned IPs: {orphan_ip_names}")
100+
if args.dry_run:
101+
print("Dry run detected. Not deleting.")
102+
else:
103+
for ip_name in orphan_ip_names:
104+
try:
105+
print(f"Deleting orphaned IP '{ip_name}' ...")
106+
nmclient.public_ip_addresses.begin_delete(
107+
resource_group_name, ip_name
108+
).result()
109+
print(f"Deleting orphaned IP '{ip_name}' ... done")
110+
except Exception as e:
111+
print(f"Exception occurred: {e}")
112+
113+
114+
if __name__ == "__main__":
115+
main()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env bash
2+
3+
# Delete old Azure Virtual Machines and related orphaned resources.
4+
5+
set -o errexit
6+
set -o nounset
7+
8+
# Get absolute path to drivers-evergreen-tools:
9+
{
10+
SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
11+
. "$SCRIPT_DIR/../../handle-paths.sh"
12+
}
13+
14+
# Create virtualenv with Azure dependencies installed:
15+
{
16+
. "$DRIVERS_TOOLS/.evergreen/venv-utils.sh"
17+
if [[ -d azure_deletion_venv ]]; then
18+
venvactivate azure_deletion_venv
19+
else
20+
. "$DRIVERS_TOOLS/.evergreen/find-python3.sh"
21+
PYTHON=$(ensure_python3)
22+
echo "Creating virtual environment 'azure_deletion_venv'..."
23+
venvcreate "${PYTHON:?}" azure_deletion_venv
24+
python -m pip install azure-identity
25+
python -m pip install azure-mgmt-compute
26+
python -m pip install azure-mgmt-network
27+
echo "Creating virtual environment 'azure_deletion_venv'... done."
28+
fi
29+
}
30+
31+
# Delete resources for Azure KMS testing (DRIVERS-2411):
32+
{
33+
"$DRIVERS_TOOLS/.evergreen/secrets_handling/setup-secrets.sh" drivers/azurekms
34+
# shellcheck source=/dev/null
35+
source secrets-export.sh
36+
export AZURE_SUBSCRIPTION_ID="$AZUREKMS_SUBSCRIPTION"
37+
export AZURE_RESOURCE_GROUP="$AZUREKMS_RESOURCEGROUP"
38+
export AZURE_CLIENT_SECRET="$AZUREKMS_SECRET"
39+
export AZURE_CLIENT_ID="$AZUREKMS_CLIENTID"
40+
export AZURE_TENANT_ID="$AZUREKMS_TENANTID"
41+
python "$DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete_old_azure_resources.py"
42+
rm secrets-export.sh
43+
}
44+
45+
# Delete resources for Azure OIDC testing (DRIVERS-2415):
46+
{
47+
"$DRIVERS_TOOLS/.evergreen/secrets_handling/setup-secrets.sh" drivers/azureoidc
48+
# shellcheck source=/dev/null
49+
source secrets-export.sh
50+
export AZURE_SUBSCRIPTION_ID="$AZUREOIDC_SUBSCRIPTION"
51+
export AZURE_RESOURCE_GROUP="$AZUREOIDC_RESOURCEGROUP"
52+
export AZURE_CLIENT_SECRET="$AZUREOIDC_SECRET"
53+
export AZURE_CLIENT_ID="$AZUREOIDC_CLIENTID"
54+
export AZURE_TENANT_ID="$AZUREOIDC_TENANTID"
55+
python "$DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete_old_azure_resources.py"
56+
rm secrets-export.sh
57+
}

0 commit comments

Comments
 (0)