blob: 55d36c8fcd57159925a572f2d0676d4d535a7ce9 [file] [log] [blame]
Matteo Scandolo41ed0992017-08-08 13:05:27 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
JianHaoadbe03c2017-10-06 00:52:44 +080015from models_decl import VSGWCService_decl
16from models_decl import VSGWCVendor_decl
17from models_decl import VSGWCTenant_decl
Matteo Scandolo41ed0992017-08-08 13:05:27 -070018
JianHaoadbe03c2017-10-06 00:52:44 +080019from django.db import models
20from core.models import Service, XOSBase, Slice, Instance, ServiceInstance, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, Port, AddressPool
21import os
JianHaoce45e042017-01-16 11:06:29 +000022from django.db import models, transaction
JianHaoadbe03c2017-10-06 00:52:44 +080023from django.forms.models import model_to_dict
24from django.db.models import *
25from operator import itemgetter, attrgetter, methodcaller
26from core.models import Tag
27from core.models.service import LeastLoadedNodeScheduler
28import traceback
29from xos.exceptions import *
JianHaoce45e042017-01-16 11:06:29 +000030
JianHaoadbe03c2017-10-06 00:52:44 +080031class VSGWCService(VSGWCService_decl):
32 class Meta:
JianHaoce45e042017-01-16 11:06:29 +000033 proxy = True
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070034
JianHaoadbe03c2017-10-06 00:52:44 +080035 def create_tenant(self, **kwargs):
36 t = VSGWCTenant(kind="vEPC", provider_service=self, connect_method="na", **kwargs)
37 t.save()
38 return t
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070039
JianHaoadbe03c2017-10-06 00:52:44 +080040class VSGWCVendor(VSGWCVendor_decl):
41 class Meta:
42 proxy = True
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070043
JianHaoadbe03c2017-10-06 00:52:44 +080044class VSGWCTenant(VSGWCTenant_decl):
45 class Meta:
46 proxy = True
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070047
JianHaoadbe03c2017-10-06 00:52:44 +080048 def __init__(self, *args, **kwargs):
49 vsgwcservice = VSGWCService.get_service_objects().all()
50 if vsgwcservice:
51 self._meta.get_field(
52 "provider_service").default = vsgwcservice[0].id
53 super(VSGWCTenant, self).__init__(*args, **kwargs)
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070054
JianHaoadbe03c2017-10-06 00:52:44 +080055 @property
56 def image(self):
57 if not self.vsgwc_vendor:
58 return super(VSGWCTenant, self).image
59 return self.vsgwc_vendor.image
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070060
JianHaoadbe03c2017-10-06 00:52:44 +080061 def save_instance(self, instance):
62 if self.vsgwc_vendor:
63 instance.flavor = self.vsgwc_vendor.flavor
64 super(VSGWCTenant, self).save_instance(instance)
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070065
JianHaoadbe03c2017-10-06 00:52:44 +080066 def save(self, *args, **kwargs):
67 if not self.creator:
68 if not getattr(self, "caller", None):
69 raise XOSProgrammingError("VSGWCTenant's self.caller was not set")
70 self.creator = self.caller
71 if not self.creator:
72 raise XOSProgrammingError("VSGWCTenant's self.creator was not set")
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070073
JianHaoadbe03c2017-10-06 00:52:44 +080074 super(VSGWCTenant, self).save(*args, **kwargs)
75 # This call needs to happen so that an instance is created for this
76 # tenant is created in the slice. One instance is created per tenant.
77 model_policy_vsgwctenant(self.pk)
Saleil Bhat42e8c5e2017-02-01 15:59:54 -080078
JianHaoadbe03c2017-10-06 00:52:44 +080079 def delete(self, *args, **kwargs):
80 # Delete the instance that was created for this tenant
81 self.cleanup_container()
82 super(VSGWCTenant, self).delete(*args, **kwargs)
83
84def model_policy_vsgwctenant(pk):
85 # This section of code is atomic to prevent race conditions
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070086 with transaction.atomic():
JianHaoadbe03c2017-10-06 00:52:44 +080087 # We find all of the tenants that are waiting to update
88 tenant = VSGWCTenant.objects.select_for_update().filter(pk=pk)
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070089 if not tenant:
90 return
JianHaoadbe03c2017-10-06 00:52:44 +080091 # Since this code is atomic it is safe to always use the first tenant
Murat Parlakisik66fde4d2016-09-22 13:28:13 -070092 tenant = tenant[0]
JianHaoce45e042017-01-16 11:06:29 +000093 tenant.manage_container()
JianHaoadbe03c2017-10-06 00:52:44 +080094