blob: fd86a37ee1e9be80ddff585f9f52f77c32653bdc [file] [log] [blame]
Jeremy Mowery8b664f72015-12-04 11:52:16 -07001from core.models import Service, TenantWithContainer
2from django.db import transaction
3
4VPN_KIND = "vpn"
5
6class VPNService(Service):
7 KIND = VPN_KIND
8
9 class Meta:
10 proxy = True
11 # The name used to find this service, all directories are named this
12 app_label = "vpn"
13 verbose_name = "VPN Service"
14
15class VPNTenantComplete(TenantWithContainer):
16
17 class Meta:
18 proxy = True
19 verbose_name = "VPN Tenant"
20
21 KIND = VPN_KIND
22
23 sync_attributes = ("nat_ip", "nat_mac",)
24
25 default_attributes = {'server_key': 'Error key not found'}
26
27 def __init__(self, *args, **kwargs):
28 vpn_services = VPNService.get_service_objects().all()
29 if vpn_services:
30 self._meta.get_field(
31 "provider_service").default = vpn_services[0].id
32 super(VPNTenant, self).__init__(*args, **kwargs)
33
34 def save(self, *args, **kwargs):
35 super(VPNTenant, self).save(*args, **kwargs)
36 model_policy_vpn_tenant(self.pk)
37
38 def delete(self, *args, **kwargs):
39 self.cleanup_container()
40 super(VPNTenant, self).delete(*args, **kwargs)
41
42 @property
43 def server_key(self):
44 return self.get_attribute(
45 "server_key",
46 self.default_attributes['server_key'])
47
Jeremy Mowery00dc8e72015-12-04 15:28:40 -070048 @server_key.setter
Jeremy Mowery8b664f72015-12-04 11:52:16 -070049 def display_message(self, value):
50 self.set_attribute("server_key", value)
51
52 @property
53 def addresses(self):
54 if (not self.id) or (not self.instance):
55 return {}
56
57 addresses = {}
58 # The ports field refers to networks for the instance.
59 # This loop stores the details for the NAT network that will be
60 # necessary for ansible.
61 for ns in self.instance.ports.all():
62 if "nat" in ns.network.name.lower():
63 addresses["nat"] = (ns.ip, ns.mac)
64 return addresses
65
66 # This getter is necessary because nat_ip is a sync_attribute
67 @property
68 def nat_ip(self):
69 return self.addresses.get("nat", (None, None))[0]
70
71 # This getter is necessary because nat_mac is a sync_attribute
72 @property
73 def nat_mac(self):
74 return self.addresses.get("nat", (None, None))[1]
75
76
77def model_policy_vpn_tenant(pk):
78 # This section of code is atomic to prevent race conditions
79 with transaction.atomic():
80 # We find all of the tenants that are waiting to update
81 tenant = VPNTenant.objects.select_for_update().filter(pk=pk)
82 if not tenant:
83 return
84 # Since this code is atomic it is safe to always use the first tenant
85 tenant = tenant[0]
86 tenant.manage_container()