Add uuid field to sliver
[plstackapi.git] / planetstack / core / models / sliver.py
index 0f37bc9..d2f794f 100644 (file)
@@ -1,19 +1,87 @@
 import os
 from django.db import models
 import os
 from django.db import models
+from django.db.models import Q
 from django.core import exceptions
 from django.core import exceptions
-from core.models import PlCoreBase
+from core.models import PlCoreBase,PlCoreBaseManager,PlCoreBaseDeletionManager
 from core.models import Image
 from core.models import Slice
 from core.models import Node
 from core.models import Site
 from core.models import Deployment
 from core.models import Image
 from core.models import Slice
 from core.models import Node
 from core.models import Site
 from core.models import Deployment
+from core.models import Controller
 from core.models import User
 from core.models import Tag
 from core.models import User
 from core.models import Tag
+from core.models import Flavor
 from django.contrib.contenttypes import generic
 from django.contrib.contenttypes import generic
+from planetstack.config import Config
+from monitor import driver as monitor
+
+config = Config()
+
+def get_default_flavor(controller = None):
+    # Find a default flavor that can be used for a sliver. This is particularly
+    # useful in evolution. It's also intended this helper function can be used
+    # for admin.py when users
+
+    if controller:
+        flavors = controller.flavors.all()
+    else:
+        flavors = Flavor.objects.all()
+
+    if not flavors:
+        return None
+
+    for flavor in flavors:
+        if flavor.default:
+            return flavor
+
+    return flavors[0]
+
+class SliverDeletionManager(PlCoreBaseDeletionManager):
+    def get_queryset(self):
+        parent=super(SliverDeletionManager, 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(node__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 SliverManager(PlCoreBaseManager):
+    def get_queryset(self):
+        parent=super(SliverManager, 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(node__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()
 
 # Create your models here.
 class Sliver(PlCoreBase):
 
 # Create your models here.
 class Sliver(PlCoreBase):
-    instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id")    
+    objects = SliverManager()
+    deleted_objects = SliverDeletionManager()
+    instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id")
+    instance_uuid = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance uuid")
     name = models.CharField(max_length=200, help_text="Sliver name")
     instance_name = models.CharField(blank=True, null=True, max_length=200, help_text="OpenStack generated name")
     ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True)
     name = models.CharField(max_length=200, help_text="Sliver name")
     instance_name = models.CharField(blank=True, null=True, max_length=200, help_text="OpenStack generated name")
     ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True)
@@ -21,9 +89,10 @@ class Sliver(PlCoreBase):
     #key = models.ForeignKey(Key, related_name='slivers')
     creator = models.ForeignKey(User, related_name='slivers', blank=True, null=True)
     slice = models.ForeignKey(Slice, related_name='slivers')
     #key = models.ForeignKey(Key, related_name='slivers')
     creator = models.ForeignKey(User, related_name='slivers', blank=True, null=True)
     slice = models.ForeignKey(Slice, related_name='slivers')
+    deployment = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deployment')
     node = models.ForeignKey(Node, related_name='slivers')
     node = models.ForeignKey(Node, related_name='slivers')
-    deploymentNetwork = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deploymentNetwork')
     numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0)
     numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0)
+    flavor = models.ForeignKey(Flavor, help_text="Flavor of this instance", default=get_default_flavor)
     tags = generic.GenericRelation(Tag)
     userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation")
 
     tags = generic.GenericRelation(Tag)
     userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation")
 
@@ -38,20 +107,34 @@ class Sliver(PlCoreBase):
             return u'unsaved-sliver'
 
     def save(self, *args, **kwds):
             return u'unsaved-sliver'
 
     def save(self, *args, **kwds):
-        if not self.name:
-            self.name = self.slice.name
+        self.name = self.slice.name
         if not self.creator and hasattr(self, 'caller'):
             self.creator = self.caller
         if not self.creator and hasattr(self, 'caller'):
             self.creator = self.caller
-        self.deploymentNetwork = self.node.deployment
 
 
-        if not self.deploymentNetwork.test_acl(slice=self.slice):
-            raise exceptions.ValidationError("Deployment %s's ACL does not allow any of this slice %s's users" % (self.deploymentNetwork.name, self.slice.name))
+# XXX smbaker - disabled for now, was causing fault in tenant view create slice
+#        if not self.controllerNetwork.test_acl(slice=self.slice):
+#            raise exceptions.ValidationError("Deployment %s's ACL does not allow any of this slice %s's users" % (self.controllerNetwork.name, self.slice.name))
 
         super(Sliver, self).save(*args, **kwds)
 
     def can_update(self, user):
         return self.slice.can_update(user)
 
 
         super(Sliver, self).save(*args, **kwds)
 
     def can_update(self, user):
         return self.slice.can_update(user)
 
+    def all_ips(self):
+        ips={}
+        for ns in self.networksliver_set.all():
+           ips[ns.network.name] = ns.ip
+        return ips
+
+    def all_ips_string(self):
+        result = []
+        ips = self.all_ips()
+        for key in sorted(ips.keys()):
+            #result.append("%s = %s" % (key, ips[key]))
+            result.append(ips[key])
+        return ", ".join(result)
+    all_ips_string.short_description = "addresses"
+
     @staticmethod
     def select_by_user(user):
         if user.is_admin:
     @staticmethod
     def select_by_user(user):
         if user.is_admin:
@@ -60,3 +143,15 @@ class Sliver(PlCoreBase):
             slices = Slice.select_by_user(user)
             qs = Sliver.objects.filter(slice__in=slices)
         return qs
             slices = Slice.select_by_user(user)
             qs = Sliver.objects.filter(slice__in=slices)
         return qs
+
+    def get_cpu_stats(self):
+        filter = 'instance_id=%s'%self.sliver_id
+        return monitor.get_meter('cpu',filter,None)
+
+    def get_bw_stats(self):
+        filter = 'instance_id=%s'%self.sliver_id
+        return monitor.get_meter('network.outgoing.bytes',filter,None)
+
+    def get_node_stats(self):
+        # Note sure what should go back here
+        return 1