Filter out slivers not associated with a deployment
[plstackapi.git] / planetstack / core / models / sliver.py
1 import os
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
16
17 config = Config()
18
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
23
24     if deployment:
25         flavors = deployment.flavors.all()
26     else:
27         flavors = Flavor.objects.all()
28
29     if not flavors:
30         return None
31
32     for flavor in flavors:
33         if flavor.default:
34             return flavor
35
36     return flavors[0]
37
38 class SliverDeletionManager(PlCoreBaseDeletionManager):
39     def get_queryset(self):
40         parent=super(SliverDeletionManager, self)
41         try:
42             backend_type = config.observer_backend_type
43         except AttributeError:
44             backend_type = None
45
46         parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
47         if (backend_type):
48             return parent_queryset.filter(Q(node__deployment__backend_type=backend_type))
49         else:
50             return parent_queryset
51
52     # deprecated in django 1.7 in favor of get_queryset().
53     def get_query_set(self):
54         return self.get_queryset()
55
56
57 class SliverManager(PlCoreBaseManager):
58     def get_queryset(self):
59         parent=super(SliverManager, self)
60
61         try:
62             backend_type = config.observer_backend_type
63         except AttributeError:
64             backend_type = None
65
66         parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
67
68         if backend_type:
69             return parent_queryset.filter(Q(node__deployment__backend_type=backend_type))
70         else:
71             return parent_queryset
72
73     # deprecated in django 1.7 in favor of get_queryset().
74     def get_query_set(self):
75         return self.get_queryset()
76
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")
95
96     def __unicode__(self):
97         if self.instance_name:
98             return u'%s' % (self.instance_name)
99         elif self.id:
100             return u'uninstantiated-%s' % str(self.id)
101         elif self.slice:
102             return u'unsaved-sliver on %s' % self.slice.name
103         else:
104             return u'unsaved-sliver'
105
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
111
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))
115
116         super(Sliver, self).save(*args, **kwds)
117
118     def can_update(self, user):
119         return self.slice.can_update(user)
120
121     def all_ips(self):
122         ips={}
123         for ns in self.networksliver_set.all():
124            ips[ns.network.name] = ns.ip
125         return ips
126
127     def all_ips_string(self):
128         result = []
129         ips = self.all_ips()
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"
135
136     @staticmethod
137     def select_by_user(user):
138         if user.is_admin:
139             qs = Sliver.objects.all()
140         else:
141             slices = Slice.select_by_user(user)
142             qs = Sliver.objects.filter(slice__in=slices)
143         return qs