diff options
author | Sawyer Bergeron <sbergeron@iol.unh.edu> | 2019-03-19 17:22:40 -0400 |
---|---|---|
committer | Parker Berberian <pberberian@iol.unh.edu> | 2019-03-22 13:26:14 -0400 |
commit | aefe6dd882386bba4320313c505d8b43a77f8e33 (patch) | |
tree | 4843dbc7fb97b882b00144c66fc7cfefa2f246dc | |
parent | f2130761e1b0eb83965cb5f502aa0ef5ff6b7b1e (diff) |
Add ability to clean up hosts and vlans
Change-Id: Idfe8c7245ba76e1a8aadd501401991e215761afc
Signed-off-by: Sawyer Bergeron <sbergeron@iol.unh.edu>
Signed-off-by: Parker Berberian <pberberian@iol.unh.edu>
-rw-r--r-- | dashboard/src/dashboard/actions.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/dashboard/src/dashboard/actions.py b/dashboard/src/dashboard/actions.py new file mode 100644 index 0000000..44b1fdd --- /dev/null +++ b/dashboard/src/dashboard/actions.py @@ -0,0 +1,47 @@ +############################################################################## +# Copyright (c) 2019 Parker Berberian, Sawyer Bergeron, and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +from resource_inventory.models import Host, Vlan +from account.models import Lab +from booking.models import Booking +from datetime import timedelta +from django.utils import timezone + + +def free_leaked_hosts(free_old_bookings=False, old_booking_age=timedelta(days=1)): + bundles = [booking.resource for booking in Booking.objects.filter(end__gt=timezone.now())] + active_hosts = set() + for bundle in bundles: + active_hosts.update([host for host in bundle.hosts.all()]) + + marked_hosts = set(Host.objects.filter(booked=True)) + + for host in (marked_hosts - active_hosts): + host.booked = False + host.save() + + +def free_leaked_public_vlans(): + booked_host_interfaces = [] + + for lab in Lab.objects.all(): + + for host in Host.objects.filter(booked=True).filter(lab=lab): + for interface in host.interfaces.all(): + booked_host_interfaces.append(interface) + + in_use_vlans = Vlan.objects.filter(public=True).distinct('vlan_id').filter(interface__in=booked_host_interfaces) + + manager = lab.vlan_manager + + for vlan in Vlan.objects.all(): + if vlan not in in_use_vlans: + if vlan.public: + manager.release_public_vlan(vlan.vlan_id) + manager.release_vlans(vlan) |