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 User
12 from core.models import Tag
13 from core.models import Flavor
14 from django.contrib.contenttypes import generic
15 from planetstack.config import Config
19 def get_default_flavor(deployment = None):
20 # Find a default flavor that can be used for a sliver. This is particularly
21 # useful in evolution. It's also intended this helper function can be used
22 # for admin.py when users
25 flavors = deployment.flavors.all()
27 flavors = Flavor.objects.all()
32 for flavor in flavors:
38 class SliverDeletionManager(PlCoreBaseDeletionManager):
39 def get_queryset(self):
40 parent=super(SliverDeletionManager, self)
42 backend_type = config.observer_backend_type
43 except AttributeError:
46 parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
48 return parent_queryset.filter(Q(node__deployment__backend_type=backend_type))
50 return parent_queryset
52 # deprecated in django 1.7 in favor of get_queryset().
53 def get_query_set(self):
54 return self.get_queryset()
57 class SliverManager(PlCoreBaseManager):
58 def get_queryset(self):
59 parent=super(SliverManager, self)
62 backend_type = config.observer_backend_type
63 except AttributeError:
66 parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
69 return parent_queryset.filter(Q(node__deployment__backend_type=backend_type))
71 return parent_queryset
73 # deprecated in django 1.7 in favor of get_queryset().
74 def get_query_set(self):
75 return self.get_queryset()
77 # Create your models here.
78 class Sliver(PlCoreBase):
79 objects = SliverManager()
80 deleted_objects = SliverDeletionManager()
81 instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id")
82 name = models.CharField(max_length=200, help_text="Sliver name")
83 instance_name = models.CharField(blank=True, null=True, max_length=200, help_text="OpenStack generated name")
84 ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True)
85 image = models.ForeignKey(Image, related_name='slivers')
86 #key = models.ForeignKey(Key, related_name='slivers')
87 creator = models.ForeignKey(User, related_name='slivers', blank=True, null=True)
88 slice = models.ForeignKey(Slice, related_name='slivers')
89 node = models.ForeignKey(Node, related_name='slivers')
90 deploymentNetwork = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deploymentNetwork')
91 numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0)
92 flavor = models.ForeignKey(Flavor, help_text="Flavor of this instance", default=get_default_flavor)
93 tags = generic.GenericRelation(Tag)
94 userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation")
96 def __unicode__(self):
97 if self.instance_name:
98 return u'%s' % (self.instance_name)
100 return u'uninstantiated-%s' % str(self.id)
102 return u'unsaved-sliver on %s' % self.slice.name
104 return u'unsaved-sliver'
106 def save(self, *args, **kwds):
107 self.name = self.slice.slicename
108 if not self.creator and hasattr(self, 'caller'):
109 self.creator = self.caller
110 self.deploymentNetwork = self.node.deployment
112 # XXX smbaker - disabled for now, was causing fault in tenant view create slice
113 # if not self.deploymentNetwork.test_acl(slice=self.slice):
114 # raise exceptions.ValidationError("Deployment %s's ACL does not allow any of this slice %s's users" % (self.deploymentNetwork.name, self.slice.name))
116 super(Sliver, self).save(*args, **kwds)
118 def can_update(self, user):
119 return self.slice.can_update(user)
123 for ns in self.networksliver_set.all():
124 ips[ns.network.name] = ns.ip
127 def all_ips_string(self):
130 for key in sorted(ips.keys()):
131 #result.append("%s = %s" % (key, ips[key]))
132 result.append(ips[key])
133 return ", ".join(result)
134 all_ips_string.short_description = "addresses"
137 def select_by_user(user):
139 qs = Sliver.objects.all()
141 slices = Slice.select_by_user(user)
142 qs = Sliver.objects.filter(slice__in=slices)