blob: fac349baa2501f67878c8140412572481bff75cb [file] [log] [blame]
Omar Abdelkader60480312017-08-03 14:55:20 -07001from core.models.plcorebase import *
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -04002from models_decl import VSGWCService_decl
3from models_decl import VSGWCTenant_decl
Omar Abdelkader60480312017-08-03 14:55:20 -07004
Omar Abdelkader6b017232017-08-07 19:48:57 -06005from django.db import models
6from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
7from core.models.plcorebase import StrippedCharField
8import os
9from django.db import models, transaction
10from django.forms.models import model_to_dict
11from django.db.models import *
12from operator import itemgetter, attrgetter, methodcaller
13from core.models import Tag
14from core.models.service import LeastLoadedNodeScheduler
15import traceback
16from xos.exceptions import *
17from xos.config import Config
18from django.contrib.contenttypes.models import ContentType
19from django.contrib.contenttypes.fields import GenericForeignKey
20
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040021class VSGWCService(VSGWCService_decl):
Omar Abdelkader60480312017-08-03 14:55:20 -070022 class Meta:
23 proxy = True
24
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040025 def VSGWC_tenant(self, **kwargs):
26 t = VSGWCTenant(kind="vEPC", provider_service=self, connect_method="na", tenant_message="vsgwc tenant in service chain", **kwargs)
Omar Abdelkader21b75412017-08-15 16:59:06 -060027 t.save()
28 return t
29
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040030class VSGWCTenant(VSGWCTenant_decl):
Omar Abdelkader60480312017-08-03 14:55:20 -070031 class Meta:
32 proxy = True
33
34 def __init__(self, *args, **kwargs):
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040035 vsgwcservice = VSGWCService.get_service_objects().all()
36 if vsgwcservice:
Omar Abdelkader60480312017-08-03 14:55:20 -070037 self._meta.get_field(
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040038 "provider_service").default = vsgwcservice[0].id
39 super(VSGWCTenant, self).__init__(*args, **kwargs)
Omar Abdelkader60480312017-08-03 14:55:20 -070040
41 def save(self, *args, **kwargs):
Omar Abdelkader21b75412017-08-15 16:59:06 -060042 if not self.creator:
43 if not getattr(self, "caller", None):
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040044 raise XOSProgrammingError("VSGWCTenant's self.caller was not set")
Omar Abdelkader21b75412017-08-15 16:59:06 -060045 self.creator = self.caller
46 if not self.creator:
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040047 raise XOSProgrammingError("VSGWCTenant's self.creator was not set")
Omar Abdelkader21b75412017-08-15 16:59:06 -060048
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040049 super(VSGWCTenant, self).save(*args, **kwargs)
Omar Abdelkader60480312017-08-03 14:55:20 -070050 # This call needs to happen so that an instance is created for this
51 # tenant is created in the slice. One instance is created per tenant.
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040052 model_policy_vsgwctenant(self.pk)
Omar Abdelkader60480312017-08-03 14:55:20 -070053
54 def delete(self, *args, **kwargs):
55 # Delete the instance that was created for this tenant
56 self.cleanup_container()
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040057 super(VSGWCTenant, self).delete(*args, **kwargs)
Omar Abdelkader60480312017-08-03 14:55:20 -070058
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040059def model_policy_vsgwctenant(pk):
Omar Abdelkader60480312017-08-03 14:55:20 -070060 # This section of code is atomic to prevent race conditions
61 with transaction.atomic():
62 # We find all of the tenants that are waiting to update
Yunpeng Zhang9d7204c2017-08-17 19:07:43 -040063 tenant = VSGWCTenant.objects.select_for_update().filter(pk=pk)
Omar Abdelkader60480312017-08-03 14:55:20 -070064 if not tenant:
65 return
66 # Since this code is atomic it is safe to always use the first tenant
67 tenant = tenant[0]
68 tenant.manage_container()
69