Skip to content

Commit

Permalink
Add support for deleting resources from multiple regions in AWS
Browse files Browse the repository at this point in the history
  • Loading branch information
shubhamsg199 committed Jul 21, 2022
1 parent 26d7ddb commit 7b8ee13
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 62 deletions.
5 changes: 2 additions & 3 deletions cloudwash/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@


@contextmanager
def compute_client(compute_resource):
def compute_client(compute_resource, **kwargs):
"""The context manager for compute resource client to initiate and disconnect
:param str compute_resource: The compute resource name
"""
if compute_resource == "azure":
Expand All @@ -33,7 +32,7 @@ def compute_client(compute_resource):
client = wrapanapi.EC2System(
username=settings.providers.ec2.username,
password=settings.providers.ec2.password,
region=settings.providers.ec2.region,
region=kwargs['ec2_region'],
)
else:
raise ValueError(
Expand Down
126 changes: 68 additions & 58 deletions cloudwash/providers/ec2.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,67 +10,77 @@
def cleanup(**kwargs):

is_dry_run = kwargs["dry_run"]

with compute_client("ec2") as ec2_client:
# Dry Data Collection Defs
def dry_vms():
all_vms = ec2_client.list_vms()
for vm in all_vms:
if vm.name in settings.providers.ec2.except_vm_list:
dry_data["VMS"]["skip"].append(vm.name)
continue
elif total_running_time(vm).minutes >= settings.sla_minutes:
if vm.name in settings.providers.ec2.except_vm_stop_list:
dry_data["VMS"]["stop"].append(vm.name)
data = ['VMS', 'DISCS', 'PIPS', 'RESOURCES']
regions = settings.providers.ec2.regions
with compute_client("ec2", ec2_region="us-west-2") as client:
if "all" in regions:
regions = client.list_regions()
for region in regions:
dry_data['VMS']['stop'] = []
dry_data['VMS']['skip'] = []
for items in data:
dry_data[items]['delete'] = []
with compute_client("ec2", ec2_region=region) as ec2_client:
# Dry Data Collection Defs
def dry_vms():
all_vms = ec2_client.list_vms()
for vm in all_vms:
if vm.name in settings.providers.ec2.except_vm_list:
dry_data["VMS"]["skip"].append(vm.name)
continue
elif vm.name.startswith(settings.delete_vm):
dry_data["VMS"]["delete"].append(vm.name)
return dry_data["VMS"]
elif total_running_time(vm).minutes >= settings.sla_minutes:
if vm.name in settings.providers.ec2.except_vm_stop_list:
dry_data["VMS"]["stop"].append(vm.name)
continue
elif vm.name.startswith(settings.delete_vm):
dry_data["VMS"]["delete"].append(vm.name)
return dry_data["VMS"]

def dry_nics():
rnics = ec2_client.get_all_unused_network_interfaces()
[dry_data["NICS"]["delete"].append(dnic["NetworkInterfaceId"]) for dnic in rnics]
return dry_data["NICS"]["delete"]
def dry_nics():
rnics = ec2_client.get_all_unused_network_interfaces()
[dry_data["NICS"]["delete"].append(dnic["NetworkInterfaceId"]) for dnic in rnics]
return dry_data["NICS"]["delete"]

def dry_discs():
rdiscs = ec2_client.get_all_unattached_volumes()
[dry_data["DISCS"]["delete"].append(ddisc["VolumeId"]) for ddisc in rdiscs]
return dry_data["DISCS"]["delete"]
def dry_discs():
rdiscs = ec2_client.get_all_unattached_volumes()
[dry_data["DISCS"]["delete"].append(ddisc["VolumeId"]) for ddisc in rdiscs]
return dry_data["DISCS"]["delete"]

def dry_pips():
rpips = ec2_client.get_all_disassociated_addresses()
[dry_data["PIPS"]["delete"].append(dpip["AllocationId"]) for dpip in rpips]
return dry_data["PIPS"]["delete"]
def dry_pips():
rpips = ec2_client.get_all_disassociated_addresses()
[dry_data["PIPS"]["delete"].append(dpip["AllocationId"]) for dpip in rpips]
return dry_data["PIPS"]["delete"]

# Remove / Stop VMs
def remove_vms(avms):
# Remove VMs
[ec2_client.get_vm(vm_name).delete() for vm_name in avms["delete"]]
# Stop VMs
[ec2_client.get_vm(vm_name).stop() for vm_name in avms["stop"]]
# Remove / Stop VMs
def remove_vms(avms):
# Remove VMs
[ec2_client.get_vm(vm_name).delete() for vm_name in avms["delete"]]
# Stop VMs
[ec2_client.get_vm(vm_name).stop() for vm_name in avms["stop"]]

# Actual Cleaning and dry execution
if kwargs["vms"] or kwargs["_all"]:
avms = dry_vms()
if not is_dry_run:
remove_vms(avms=avms)
logger.info(f"Stopped VMs: \n{avms['stop']}")
logger.info(f"Removed VMs: \n{avms['delete']}")
logger.info(f"Skipped VMs: \n{avms['skip']}")
if kwargs["nics"] or kwargs["_all"]:
rnics = dry_nics()
if not is_dry_run:
ec2_client.remove_all_unused_nics()
logger.info(f"Removed NICs: \n{rnics}")
if kwargs["discs"] or kwargs["_all"]:
rdiscs = dry_discs()
if not is_dry_run:
ec2_client.remove_all_unused_volumes()
logger.info(f"Removed Discs: \n{rdiscs}")
if kwargs["pips"] or kwargs["_all"]:
rpips = dry_pips()
if not is_dry_run:
ec2_client.remove_all_unused_ips()
logger.info(f"Removed PIPs: \n{rpips}")
if is_dry_run:
echo_dry(dry_data)
# Actual Cleaning and dry execution
logger.info(f"\nResources from the region: {region}")
if kwargs["vms"] or kwargs["_all"]:
avms = dry_vms()
if not is_dry_run:
remove_vms(avms=avms)
logger.info(f"Stopped VMs: \n{avms['stop']}")
logger.info(f"Removed VMs: \n{avms['delete']}")
logger.info(f"Skipped VMs: \n{avms['skip']}")
if kwargs["nics"] or kwargs["_all"]:
rnics = dry_nics()
if not is_dry_run:
ec2_client.remove_all_unused_nics()
logger.info(f"Removed NICs: \n{rnics}")
if kwargs["discs"] or kwargs["_all"]:
rdiscs = dry_discs()
if not is_dry_run:
ec2_client.remove_all_unused_volumes()
logger.info(f"Removed Discs: \n{rdiscs}")
if kwargs["pips"] or kwargs["_all"]:
rpips = dry_pips()
if not is_dry_run:
ec2_client.remove_all_unused_ips()
logger.info(f"Removed PIPs: \n{rpips}")
if is_dry_run:
echo_dry(dry_data)
3 changes: 2 additions & 1 deletion settings.yaml.template
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ PROVIDERS:
EC2:
USERNAME:
PASSWORD:
REGION:
# Multiple regions can be added like ["ap-south-1", "us-west-2", "us-west-1"] or ["all"] for all regions
REGIONS: []
# VMs that would be skipped from cleanup
EXCEPT_VM_LIST: []
# VMs that would be stopped from running states
Expand Down

0 comments on commit 7b8ee13

Please sign in to comment.