blob: ca470d26278c0b23feb3cd6cf10fcfabbe890d60 [file] [log] [blame]
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -05001from core.models.plcorebase import *
2from models_decl import VPGWCService_decl
Omar Abdelkader8e0f0302017-09-06 19:30:40 -05003from models_decl import VPGWCVendor_decl
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -05004from models_decl import VPGWCTenant_decl
5
Omar Abdelkader37e8ddd2017-08-07 19:47:09 -06006from django.db import models
7from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool, SlicePrivilege, SitePrivilege
8from core.models.plcorebase import StrippedCharField
9import os
10from django.db import models, transaction
11from django.forms.models import model_to_dict
12from django.db.models import *
13from operator import itemgetter, attrgetter, methodcaller
14from core.models import Tag
15from core.models.service import LeastLoadedNodeScheduler
16import traceback
17from xos.exceptions import *
18from sets import Set
19from xos.config import Config
Omar Abdelkader37e8ddd2017-08-07 19:47:09 -060020
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -050021class VPGWCService(VPGWCService_decl):
22 class Meta:
23 proxy = True
24
Omar Abdelkader6a4842a2017-08-15 16:40:48 -060025 def create_tenant(self, **kwargs):
26 t = VPGWCTenant(kind="vEPC", provider_service=self, connect_method="na", **kwargs)
27 t.save()
28 return t
29
Omar Abdelkader8e0f0302017-09-06 19:30:40 -050030class VPGWCVendor(VPGWCVendor_decl):
31 class Meta:
32 proxy = True
33
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -050034class VPGWCTenant(VPGWCTenant_decl):
35 class Meta:
36 proxy = True
37
38 def __init__(self, *args, **kwargs):
39 vpgwcservice = VPGWCService.get_service_objects().all()
40 # When the tenant is created the default service in the form is set
41 # to be the first created HelloWorldServiceComplete
42 if vpgwcservice:
43 self._meta.get_field(
44 "provider_service").default = vpgwcservice[0].id
45 super(VPGWCTenant, self).__init__(*args, **kwargs)
46
Omar Abdelkader8e0f0302017-09-06 19:30:40 -050047 @property
48 def image(self):
49 if not self.vpgwc_vendor:
50 return super(VPGWCTenant, self).image
51 return self.vpgwc_vendor.image
52
53 def save_instance(self, instance):
54 if self.vpgwc_vendor:
55 instance.flavor = self.vpgwc_vendor.flavor
56 super(VPGWCTenant, self).save_instance(instance)
57
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -050058 def save(self, *args, **kwargs):
Omar Abdelkader6a4842a2017-08-15 16:40:48 -060059 if not self.creator:
60 if not getattr(self, "caller", None):
61 raise XOSProgrammingError("VPGWCTenant's self.caller was not set")
62 self.creator = self.caller
63 if not self.creator:
64 raise XOSProgrammingError("VPGWCTenant's self.creator was not set")
65
Omar Abdelkaderd76c89d2017-08-02 19:39:44 -050066 # Update the instance that was created for this tenant
67 super(VPGWCTenant, self).save(*args, **kwargs)
68 model_policy_vpgwctenant(self.pk)
69
70 def delete(self, *args, **kwargs):
71 # Delete the instance that was created for this tenant
72 self.cleanup_container()
73 super(VPGWCTenant, self).delete(*args, **kwargs)
74
75def model_policy_vpgwctenant(pk):
76 # This section of code is atomic to prevent race conditions
77 with transaction.atomic():
78 # We find all of the tenants that are waiting to update
79 tenant = VPGWCTenant.objects.select_for_update().filter(pk=pk)
80 if not tenant:
81 return
82 # Since this code is atomic it is safe to always use the first tenant
83 tenant = tenant[0]
84 tenant.manage_container()