aboutsummaryrefslogtreecommitdiffstats
path: root/src/dashboard/admin_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/dashboard/admin_utils.py')
-rw-r--r--src/dashboard/admin_utils.py20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/dashboard/admin_utils.py b/src/dashboard/admin_utils.py
index ad276d9..186a64f 100644
--- a/src/dashboard/admin_utils.py
+++ b/src/dashboard/admin_utils.py
@@ -32,7 +32,10 @@ import pydoc
from django.contrib.auth.models import User
-from account.models import Lab
+from account.models import (
+ Lab,
+ PublicNetwork
+)
from resource_inventory.resource_manager import ResourceManager
from resource_inventory.pdf_templater import PDFTemplater
@@ -306,6 +309,21 @@ def force_release_booking(booking_id: int):
task.save()
+def free_leaked_public_vlans(safety_buffer_days=2):
+ for lab in Lab.objects.all():
+ current_booking_set = Booking.objects.filter(end__gte=timezone.now() + timedelta(days=safety_buffer_days))
+
+ marked_nets = set()
+
+ for booking in current_booking_set:
+ for network in get_network_metadata(booking.id):
+ marked_nets.add(network["vlan_id"])
+
+ for net in PublicNetwork.objects.filter(lab=lab).filter(in_use=True):
+ if net.vlan not in marked_nets:
+ lab.vlan_manager.release_public_vlan(net.vlan)
+
+
def get_network_metadata(booking_id: int):
"""
Takes a booking id and prints all (known) networks that are owned by it.