2 from django.db import models
3 from django.db.models import Q
4 from django.core import exceptions
5 from core.models import PlCoreBase,PlCoreBaseManager,PlCoreBaseDeletionManager
6 from core.models import Image
7 from core.models import Slice
8 from core.models import Node
9 from core.models import Site
10 from core.models import Deployment
11 from core.models import Controller
12 from core.models import User
13 from core.models import Tag
14 from core.models import Flavor
15 from django.contrib.contenttypes import generic
16 from planetstack.config import Config
17 from monitor import driver as monitor
21 def get_default_flavor(controller = None):
22 # Find a default flavor that can be used for a sliver. This is particularly
23 # useful in evolution. It's also intended this helper function can be used
24 # for admin.py when users
27 flavors = controller.flavors.all()
29 flavors = Flavor.objects.all()
34 for flavor in flavors:
40 class SliverDeletionManager(PlCoreBaseDeletionManager):
41 def get_queryset(self):
42 parent=super(SliverDeletionManager, self)
44 backend_type = config.observer_backend_type
45 except AttributeError:
48 parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
50 return parent_queryset.filter(Q(node__controller__backend_type=backend_type))
52 return parent_queryset
54 # deprecated in django 1.7 in favor of get_queryset().
55 def get_query_set(self):
56 return self.get_queryset()
59 class SliverManager(PlCoreBaseManager):
60 def get_queryset(self):
61 parent=super(SliverManager, self)
64 backend_type = config.observer_backend_type
65 except AttributeError:
68 parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
71 return parent_queryset.filter(Q(node__controller__backend_type=backend_type))
73 return parent_queryset
75 # deprecated in django 1.7 in favor of get_queryset().
76 def get_query_set(self):
77 return self.get_queryset()
79 # Create your models here.
80 class Sliver(PlCoreBase):
81 objects = SliverManager()
82 deleted_objects = SliverDeletionManager()
83 instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id")
84 name = models.CharField(max_length=200, help_text="Sliver name")
85 instance_name = models.CharField(blank=True, null=True, max_length=200, help_text="OpenStack generated name")
86 ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True)
87 image = models.ForeignKey(Image, related_name='slivers')
88 #key = models.ForeignKey(Key, related_name='slivers')
89 creator = models.ForeignKey(User, related_name='slivers', blank=True, null=True)
90 slice = models.ForeignKey(Slice, related_name='slivers')
91 node = models.ForeignKey(Node, related_name='slivers')
92 controllerNetwork = models.ForeignKey(Controller, verbose_name='controller', related_name='sliver_controllerNetwork')
93 numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0)
94 flavor = models.ForeignKey(Flavor, help_text="Flavor of this instance", default=get_default_flavor)
95 tags = generic.GenericRelation(Tag)
96 userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation")
98 def __unicode__(self):
99 if self.instance_name:
100 return u'%s' % (self.instance_name)
102 return u'uninstantiated-%s' % str(self.id)
104 return u'unsaved-sliver on %s' % self.slice.name
106 return u'unsaved-sliver'
108 def save(self, *args, **kwds):
109 self.name = self.slice.slicename
110 if not self.creator and hasattr(self, 'caller'):
111 self.creator = self.caller
112 self.controllerNetwork = self.node.controller
114 # XXX smbaker - disabled for now, was causing fault in tenant view create slice
115 # if not self.controllerNetwork.test_acl(slice=self.slice):
116 # raise exceptions.ValidationError("Deployment %s's ACL does not allow any of this slice %s's users" % (self.controllerNetwork.name, self.slice.name))
118 super(Sliver, self).save(*args, **kwds)
120 def can_update(self, user):
121 return self.slice.can_update(user)
125 for ns in self.networksliver_set.all():
126 ips[ns.network.name] = ns.ip
129 def all_ips_string(self):
132 for key in sorted(ips.keys()):
133 #result.append("%s = %s" % (key, ips[key]))
134 result.append(ips[key])
135 return ", ".join(result)
136 all_ips_string.short_description = "addresses"
139 def select_by_user(user):
141 qs = Sliver.objects.all()
143 slices = Slice.select_by_user(user)
144 qs = Sliver.objects.filter(slice__in=slices)
147 def get_cpu_stats(self):
148 filter = 'instance_id=%s'%self.sliver_id
149 return monitor.get_meter('cpu',filter,None)
151 def get_bw_stats(self):
152 filter = 'instance_id=%s'%self.sliver_id
153 return monitor.get_meter('network.outgoing.bytes',filter,None)
155 def get_node_stats(self):
156 # Note sure what should go back here