1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
from resource_inventory.models import (
ResourceTemplate,
Image,
Server,
ResourceBundle,
)
from django.contrib.auth.models import User
from account.models import Lab
from resource_inventory.resource_manager import ResourceManager
from resource_inventory.pdf_templater import PDFTemplater
from booking.quick_deployer import update_template
from datetime import timedelta
from django.utils import timezone
from booking.models import Booking
from notifier.manager import NotificationHandler
from api.models import JobFactory
"""
creates a quick booking using the given host
"""
def book_host(owner_username, host_labid, lab_username, hostname, image_id, template_name, length_days=21, collaborator_usernames=[], purpose="internal", project="LaaS"):
lab = Lab.objects.get(lab_user__username=lab_username)
host = Server.objects.filter(lab=lab).get(labid=host_labid)
if host.booked:
print("Can't book host, already marked as booked")
return
else:
host.booked = True
host.save()
template = ResourceTemplate.objects.filter(public=True).get(name=template_name)
image = Image.objects.get(id=image_id)
owner = User.objects.get(username=owner_username)
new_template = update_template(template, image, hostname, owner)
rmanager = ResourceManager.getInstance()
vlan_map = rmanager.get_vlans(new_template)
# only a single host so can reuse var for iter here
resource_bundle = ResourceBundle.objects.create(template=new_template)
res_configs = new_template.getConfigs()
for config in res_configs:
try:
host.bundle = resource_bundle
host.config = config
rmanager.configureNetworking(resource_bundle, host, vlan_map)
host.save()
except Exception:
host.booked = False
host.save()
print("Failed to book host due to error configuring it")
return
new_template.save()
booking = Booking.objects.create(
purpose=purpose,
project=project,
lab=lab,
owner=owner,
start=timezone.now(),
end=timezone.now() + timedelta(days=int(length_days)),
resource=resource_bundle,
opnfv_config=None
)
booking.pdf = PDFTemplater.makePDF(booking)
booking.save()
for collaborator_username in collaborator_usernames:
try:
user = User.objects.get(username=collaborator_username)
booking.collaborators.add(user)
except Exception:
print("couldn't add user with username ", collaborator_username)
booking.save()
JobFactory.makeCompleteJob(booking)
NotificationHandler.notify_new_booking(booking)
def mark_working(host_labid, lab_username, working=True):
lab = Lab.objects.get(lab_user__username=lab_username)
server = Server.objects.filter(lab=lab).get(labid=host_labid)
print("changing server working status from ", server.working, "to", working)
server.working = working
server.save()
def mark_booked(host_labid, lab_username, booked=True):
lab = Lab.objects.get(lab_user__username=lab_username)
server = Server.objects.filter(lab=lab).get(labid=host_labid)
print("changing server booked status from ", server.booked, "to", booked)
server.booked = booked
server.save()
|