from core.models.plcorebase import *
from models_decl import VSMService_decl
from models_decl import VSMTenant_decl

class VSMService(VSMService_decl):
   class Meta:
        proxy = True 

class VSMTenant(VSMTenant_decl):
   class Meta:
        proxy = True 

   def __init__(self, *args, **kwargs):
       vsmservice = VSMService.get_service_objects().all()
       if vsmservice:
           self._meta.get_field(
                   "provider_service").default = vsmservice[0].id
       super(VSMTenant, self).__init__(*args, **kwargs)

   def save(self, *args, **kwargs):
       super(VSMTenant, self).save(*args, **kwargs)
       # This call needs to happen so that an instance is created for this
       # tenant is created in the slice. One instance is created per tenant.
       model_policy_vsmtenant(self.pk)

   def delete(self, *args, **kwargs):
       # Delete the instance that was created for this tenant
       self.cleanup_container()
       super(VSMTenant, self).delete(*args, **kwargs)

def model_policy_vsmtenant(pk):
    # This section of code is atomic to prevent race conditions
    with transaction.atomic():
        # We find all of the tenants that are waiting to update
        tenant = VSMTenant.objects.select_for_update().filter(pk=pk)
        if not tenant:
            return
        # Since this code is atomic it is safe to always use the first tenant
        tenant = tenant[0]
        tenant.manage_container()