Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
[plstackapi.git] / planetstack / core / models / site.py
index 1301ebf..cc2ad03 100644 (file)
@@ -1,10 +1,94 @@
 import os
 from django.db import models
 import os
 from django.db import models
-from core.models import PlCoreBase
+from django.db.models import Q
+from core.models import PlCoreBase,PlCoreBaseManager,PlCoreBaseDeletionManager
 from core.models import Tag
 from django.contrib.contenttypes import generic
 from geoposition.fields import GeopositionField
 from core.acl import AccessControlList
 from core.models import Tag
 from django.contrib.contenttypes import generic
 from geoposition.fields import GeopositionField
 from core.acl import AccessControlList
+from planetstack.config import Config
+
+config = Config()
+
+class ControllerLinkDeletionManager(PlCoreBaseDeletionManager):
+    def get_queryset(self):
+        parent=super(ControllerLinkDeletionManager, self)
+        try:
+            backend_type = config.observer_backend_type
+        except AttributeError:
+            backend_type = None
+
+        parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
+        if (backend_type):
+            return parent_queryset.filter(Q(controller__backend_type=backend_type))
+        else:
+            return parent_queryset
+
+    # deprecated in django 1.7 in favor of get_queryset().
+    def get_query_set(self):
+        return self.get_queryset()
+
+
+class ControllerDeletionManager(PlCoreBaseDeletionManager):
+    def get_queryset(self):
+        parent=super(ControllerDeletionManager, self)
+
+        try:
+            backend_type = config.observer_backend_type
+        except AttributeError:
+            backend_type = None
+
+        parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
+
+        if backend_type:
+            return parent_queryset.filter(Q(backend_type=backend_type))
+        else:
+            return parent_queryset
+
+    # deprecated in django 1.7 in favor of get_queryset().
+    def get_query_set(self):
+        return self.get_queryset()
+
+class ControllerLinkManager(PlCoreBaseManager):
+    def get_queryset(self):
+        parent=super(ControllerLinkManager, self)
+
+        try:
+            backend_type = config.observer_backend_type
+        except AttributeError:
+            backend_type = None
+
+        parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
+
+        if backend_type:
+            return parent_queryset.filter(Q(controller__backend_type=backend_type))
+        else:
+            return parent_queryset
+
+    # deprecated in django 1.7 in favor of get_queryset().
+    def get_query_set(self):
+        return self.get_queryset()
+
+
+class ControllerManager(PlCoreBaseManager):
+    def get_queryset(self):
+        parent=super(ControllerManager, self)
+
+        try:
+            backend_type = config.observer_backend_type
+        except AttributeError:
+            backend_type = None
+
+        parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
+
+        if backend_type:
+            return parent_queryset.filter(Q(backend_type=backend_type))
+        else:
+            return parent_queryset
+
+    # deprecated in django 1.7 in favor of get_queryset().
+    def get_query_set(self):
+        return self.get_queryset()
 
 class Site(PlCoreBase):
     """
 
 class Site(PlCoreBase):
     """
@@ -21,7 +105,7 @@ class Site(PlCoreBase):
     abbreviated_name = models.CharField(max_length=80)
 
     #deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
     abbreviated_name = models.CharField(max_length=80)
 
     #deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
-    deployments = models.ManyToManyField('Deployment', through='SiteDeployments', blank=True)
+    deployments = models.ManyToManyField('Deployment', through='SiteDeployment', blank=True, help_text="Select which sites are allowed to host nodes in this deployment", related_name='sites')
     tags = generic.GenericRelation(Tag)
 
     def __unicode__(self):  return u'%s' % (self.name)
     tags = generic.GenericRelation(Tag)
 
     def __unicode__(self):  return u'%s' % (self.name)
@@ -57,9 +141,9 @@ class SiteRole(PlCoreBase):
 
 class SitePrivilege(PlCoreBase):
 
 
 class SitePrivilege(PlCoreBase):
 
-    user = models.ForeignKey('User', related_name='site_privileges')
-    site = models.ForeignKey('Site', related_name='site_privileges')
-    role = models.ForeignKey('SiteRole')
+    user = models.ForeignKey('User', related_name='siteprivileges')
+    site = models.ForeignKey('Site', related_name='siteprivileges')
+    role = models.ForeignKey('SiteRole',related_name='siteprivileges')
 
     def __unicode__(self):  return u'%s %s %s' % (self.site, self.user, self.role)
 
 
     def __unicode__(self):  return u'%s %s %s' % (self.site, self.user, self.role)
 
@@ -82,7 +166,15 @@ class SitePrivilege(PlCoreBase):
         return qs
 
 class Deployment(PlCoreBase):
         return qs
 
 class Deployment(PlCoreBase):
+    #objects = Controllermanager()
+    #deleted_objects = DeploymentDeletionManager()
     name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
     name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
+    #admin_user = models.CharField(max_length=200, null=True, blank=True, help_text="Username of an admin user at this deployment")
+    #admin_password = models.CharField(max_length=200, null=True, blank=True, help_text="Password of theadmin user at this deployment")\r
+    #admin_tenant = models.CharField(max_length=200, null=True, blank=True, help_text="Name of the tenant the admin user belongs to")\r
+    #auth_url = models.CharField(max_length=200, null=True, blank=True, help_text="Auth url for the deployment")
+    #backend_type = models.CharField(max_length=200, null=True, blank=True, help_text="Type of deployment, e.g. EC2, OpenStack, or OpenStack version")
+    #availability_zone = models.CharField(max_length=200, null=True, blank=True, help_text="OpenStack availability zone")
 
     # smbaker: the default of 'allow all' is intended for evolutions of existing
     #    deployments. When new deployments are created via the GUI, they are
 
     # smbaker: the default of 'allow all' is intended for evolutions of existing
     #    deployments. When new deployments are created via the GUI, they are
@@ -101,7 +193,7 @@ class Deployment(PlCoreBase):
 
         if slice:
             potential_users.append(slice.creator)
 
         if slice:
             potential_users.append(slice.creator)
-            for priv in slice.slice_privileges.all():
+            for priv in slice.sliceprivileges.all():
                 if priv.user not in potential_users:
                     potential_users.append(priv.user)
 
                 if priv.user not in potential_users:
                     potential_users.append(priv.user)
 
@@ -112,32 +204,33 @@ class Deployment(PlCoreBase):
 
         return False
 
 
         return False
 
-    def select_by_acl(self, user):
-        acl = self.get_acl()
-        result = []
+    @staticmethod
+    def select_by_acl(user):
+        ids = []
         for deployment in Deployment.objects.all():
         for deployment in Deployment.objects.all():
-            if acl.test(user):
-                result.append(deployment)
-        return result
+            acl = deployment.get_acl()
+            if acl.test(user) == "allow":
+                ids.append(deployment.id)
 
 
-    def __unicode__(self):  return u'%s' % (self.name)
+        return Deployment.objects.filter(id__in=ids)
 
 
-    @staticmethod
-    def select_by_user(user):
-        return Deployment.objects.all()
+    def __unicode__(self):  return u'%s' % (self.name)
 
 class DeploymentRole(PlCoreBase):
 
 class DeploymentRole(PlCoreBase):
-
+    #objects = DeploymentLinkManager()
+    #deleted_objects = DeploymentLinkDeletionManager()
     ROLE_CHOICES = (('admin','Admin'),)
     role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
 
     def __unicode__(self):  return u'%s' % (self.role)
 
 class DeploymentPrivilege(PlCoreBase):
     ROLE_CHOICES = (('admin','Admin'),)
     role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
 
     def __unicode__(self):  return u'%s' % (self.role)
 
 class DeploymentPrivilege(PlCoreBase):
+    #objects = DeploymentLinkManager()
+    #deleted_objects = DeploymentLinkDeletionManager()
 
 
-    user = models.ForeignKey('User', related_name='deployment_privileges')
-    deployment = models.ForeignKey('Deployment', related_name='deployment_privileges')
-    role = models.ForeignKey('DeploymentRole')
+    user = models.ForeignKey('User', related_name='deploymentprivileges')
+    deployment = models.ForeignKey('Deployment', related_name='deploymentprivileges')
+    role = models.ForeignKey('DeploymentRole',related_name='deploymentprivileges')
 
     def __unicode__(self):  return u'%s %s %s' % (self.deployment, self.user, self.role)
 
 
     def __unicode__(self):  return u'%s %s %s' % (self.deployment, self.user, self.role)
 
@@ -159,18 +252,52 @@ class DeploymentPrivilege(PlCoreBase):
         else:
             dpriv_ids = [dp.id for dp in DeploymentPrivilege.objects.filter(user=user)]
             qs = DeploymentPrivilege.objects.filter(id__in=dpriv_ids)
         else:
             dpriv_ids = [dp.id for dp in DeploymentPrivilege.objects.filter(user=user)]
             qs = DeploymentPrivilege.objects.filter(id__in=dpriv_ids)
-        return qs 
+        return qs
 
 
-class SiteDeployments(PlCoreBase):
-    site = models.ForeignKey(Site)
-    deployment = models.ForeignKey(Deployment)
-    tenant_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone tenant id")    
+class ControllerRole(PlCoreBase):
+    #objects = ControllerLinkManager()
+    #deleted_objects = ControllerLinkDeletionManager()
 
 
-    @staticmethod
-    def select_by_user(user):
-        return SiteDeployments.objects.all()
+    ROLE_CHOICES = (('admin','Admin'),)
+    role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
 
 
-    #class Meta:
-    #    db_table = 'core_site_deployments'
-    #    #auto_created = Site
+    def __unicode__(self):  return u'%s' % (self.role)
+
+class Controller(PlCoreBase):
+
+    objects = ControllerManager()
+    deleted_objects = ControllerDeletionManager()
+
+    name = models.CharField(max_length=200, unique=True, help_text="Name of the Controller")
+    backend_type = models.CharField(max_length=200, help_text="Type of compute controller, e.g. EC2, OpenStack, or OpenStack version")
+    version = models.CharField(max_length=200, help_text="Controller version")
+    auth_url = models.CharField(max_length=200, null=True, blank=True, help_text="Auth url for the compute controller")
+    admin_user = models.CharField(max_length=200, null=True, blank=True, help_text="Username of an admin user at this controller")
+    admin_password = models.CharField(max_length=200, null=True, blank=True, help_text="Password of theadmin user at this controller")
+    admin_tenant = models.CharField(max_length=200, null=True, blank=True, help_text="Name of the tenant the admin user belongs to")
+
+    def __unicode__(self):  return u'%s %s %s' % (self.name, self.backend_type, self.version)
+
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        return False
 
 
+class SiteDeployment(PlCoreBase):
+    objects = ControllerLinkManager()
+    deleted_objects = ControllerLinkDeletionManager()
+
+    site = models.ForeignKey(Site,related_name='sitedeployments')
+    deployment = models.ForeignKey(Deployment,related_name='sitedeployments')
+    controller = models.ForeignKey(Controller, null=True, blank=True, related_name='sitedeployments')
+    availability_zone = models.CharField(max_length=200, null=True, blank=True, help_text="OpenStack availability zone")
+
+    def __unicode__(self):  return u'%s %s' % (self.deployment, self.site)
+    
+class ControllerSite(PlCoreBase):
+     
+    site = models.ForeignKey(Site,related_name='controllersite')
+    controller = models.ForeignKey(Controller, null=True, blank=True, related_name='controllersite')
+    tenant_id = models.CharField(null=True, blank=True, max_length=200, db_index=True, help_text="Keystone tenant id")