1 ##############################################################################
2 # Copyright (c) 2016 Max Breitenfeldt and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
11 from django.contrib.auth.models import User
12 from django.db import models
17 class LabStatus(object):
23 def upload_to(object, filename):
24 return object.user.username + '/' + filename
27 class UserProfile(models.Model):
28 user = models.OneToOneField(User, on_delete=models.CASCADE)
29 timezone = models.CharField(max_length=100, blank=False, default='UTC')
30 ssh_public_key = models.FileField(upload_to=upload_to, null=True, blank=True)
31 pgp_public_key = models.FileField(upload_to=upload_to, null=True, blank=True)
32 email_addr = models.CharField(max_length=300, blank=False, default='email@mail.com')
33 company = models.CharField(max_length=200, blank=False)
35 oauth_token = models.CharField(max_length=1024, blank=False)
36 oauth_secret = models.CharField(max_length=1024, blank=False)
38 jira_url = models.CharField(max_length=100, default='')
39 full_name = models.CharField(max_length=100, default='')
40 booking_privledge = models.BooleanField(default=False)
43 db_table = 'user_profile'
46 return self.user.username
49 class VlanManager(models.Model):
50 # list of length 4096 containing either 0 (not available) or 1 (available)
51 vlans = models.TextField()
52 block_size = models.IntegerField()
53 allow_overlapping = models.BooleanField()
54 # list of length 4096 containing either 0 (not rexerved) or 1 (reserved)
55 reserved_vlans = models.TextField()
57 def get_vlan(self, count=1):
59 vlans = json.loads(self.vlans)
60 for i in range(count):
61 new_vlan = vlans.index(1) # will throw if none available
63 allocated.append(new_vlan)
68 def get_public_vlan(self):
69 return PublicNetwork.objects.filter(lab=self.lab_set.first(), in_use=False).first()
71 def reserve_public_vlan(self, vlan):
72 net = PublicNetwork.objects.get(lab=self.lab_set.first(), vlan=vlan, in_use=False)
76 def release_public_vlan(self, vlan):
77 net = PublicNetwork.objects.get(lab=self.lab_set.first(), vlan=vlan, in_use=True)
81 def public_vlan_is_available(self, vlan):
82 net = PublicNetwork.objects.get(lab=self.lab_set.first(), vlan=vlan)
85 def is_available(self, vlans):
87 'vlans' is either a single vlan id integer or a list of integers
88 will return true (available) or false
90 if self.allow_overlapping:
93 reserved = json.loads(self.reserved_vlans)
94 vlan_master_list = json.loads(self.vlans)
101 if not vlan_master_list[vlan] or reserved[vlan]:
105 def release_vlans(self, vlans):
107 'vlans' is either a single vlan id integer or a list of integers
108 will make the vlans available
109 doesnt return a value
111 my_vlans = json.loads(self.vlans)
120 self.vlans = json.dumps(my_vlans)
123 def reserve_vlans(self, vlans):
124 my_vlans = json.loads(self.vlans)
134 if my_vlans[vlan] is 0:
135 raise ValueError("vlan " + str(vlan) + " is not available")
138 self.vlans = json.dumps(my_vlans)
142 class Lab(models.Model):
143 lab_user = models.OneToOneField(User, on_delete=models.CASCADE)
144 name = models.CharField(max_length=200, primary_key=True, unique=True, null=False, blank=False)
145 contact_email = models.EmailField(max_length=200, null=True, blank=True)
146 contact_phone = models.CharField(max_length=20, null=True, blank=True)
147 status = models.IntegerField(default=LabStatus.UP)
148 vlan_manager = models.ForeignKey(VlanManager, on_delete=models.CASCADE, null=True)
149 location = models.TextField(default="unknown")
150 api_token = models.CharField(max_length=50)
151 description = models.CharField(max_length=240)
154 def make_api_token():
155 alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
158 key += random.choice(alphabet)
165 class PublicNetwork(models.Model):
166 vlan = models.IntegerField()
167 lab = models.ForeignKey(Lab, on_delete=models.CASCADE)
168 in_use = models.BooleanField(default=False)
169 cidr = models.CharField(max_length=50, default="0.0.0.0/0")
170 gateway = models.CharField(max_length=50, default="0.0.0.0")