update slice model
[plstackapi.git] / plstackapi / core / models.py
1 import os
2 import datetime
3 from django.db import models
4 from plstackapi.openstack.driver import OpenStackDriver
5
6 # Create your models here.
7
8 class PlCoreBase(models.Model):
9
10     created = models.DateTimeField(auto_now_add=True)
11     updated = models.DateTimeField(auto_now=True)
12
13     class Meta:
14         abstract = True
15
16     def save(self):
17         if not self.id:
18             self.created = datetime.date.today()
19         self.updated = datetime.datetime.today()
20         super(PlCoreBase, self).save()
21
22 class Role(PlCoreBase):
23
24     ROLE_CHOICES = (('admin', 'Admin'), ('pi', 'Principle Investigator'), ('user','User'))
25     role_id = models.CharField(max_length=256, unique=True)
26     role_type = models.CharField(max_length=80, unique=True, choices=ROLE_CHOICES)
27
28     def __unicode__(self):  return u'%s' % (self.role_type)
29
30     def save(self):
31         if not self.id:
32             self.created = datetime.date.today()
33         self.updated = datetime.datetime.today()
34         super(Role, self).save()
35
36 class Site(PlCoreBase):
37     tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
38     name = models.CharField(max_length=200, help_text="Name for this Site")
39     site_url = models.URLField(null=True, blank=True, max_length=512, help_text="Site's Home URL Page")
40     enabled = models.BooleanField(default=True, help_text="Status for this Site")
41     longitude = models.FloatField(null=True, blank=True)
42     latitude = models.FloatField(null=True, blank=True)
43     login_base = models.CharField(max_length=50, unique=True, help_text="Prefix for Slices associated with this Site")
44     is_public = models.BooleanField(default=True, help_text="Indicates the visibility of this site to other members")
45     abbreviated_name = models.CharField(max_length=80)
46
47     def __unicode__(self):  return u'%s' % (self.name)
48
49
50 class User(PlCoreBase):
51     user_id = models.CharField(max_length=256, unique=True)
52     firstname = models.CharField(help_text="person's given name", max_length=200)
53     lastname = models.CharField(help_text="person's surname", max_length=200)
54     email = models.EmailField(help_text="e-mail address")
55     phone = models.CharField(null=True, blank=True, help_text="phone number contact", max_length=100)
56     user_url = models.URLField(null=True, blank=True)
57     is_admin = models.BooleanField(default=False)
58     enabled = models.BooleanField(default=True, help_text="Status for this User")
59     site = models.ForeignKey(Site, related_name='users', verbose_name="Site this user will be homed too")
60
61     def __unicode__(self):  return u'%s' % (self.email)
62
63 class SitePrivilege(PlCoreBase):
64
65     user = models.ForeignKey('User', related_name='site_privileges')
66     site = models.ForeignKey('Site', related_name='site_privileges')
67     role = models.ForeignKey('Role')
68
69     def __unicode__(self):  return u'%s %s %s' % (self.site, self.user, self.role)
70
71     def save(self, *args, **kwds):
72         driver  = OpenStackDriver()
73         driver.add_user_role(user_id=user.user_id, 
74                              tenant_id=site.tenant_id, 
75                              role_name=role.name)
76         super(SitePrivilege, self).save(*args, **kwds)
77
78     def delete(self, *args, **kwds):
79         driver = OpenStackDriver()
80         driver.delete_user_role(user_id=user.user_id,
81                                 tenant_id=site.tenant_id,
82                                 role_name=role.name)
83         super(SitePrivilege, self).delete(*args, **kwds)
84          
85
86 class DeploymentNetwork(PlCoreBase):
87     name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment Network")
88
89     def __unicode__(self):  return u'%s' % (self.name)
90
91 class SiteDeploymentNetwork(PlCoreBase):
92     class Meta:
93         unique_together = ['site', 'deploymentNetwork']
94
95     site = models.ForeignKey(Site, related_name='deployment_networks')
96     deploymentNetwork = models.ForeignKey(DeploymentNetwork, related_name='sites')
97     name = models.CharField(default="Blah", max_length=100)
98
99
100     def __unicode__(self):  return u'%s::%s' % (self.site, self.deploymentNetwork)
101
102
103 class Slice(PlCoreBase):
104     tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
105     name = models.CharField(help_text="The Name of the Slice", max_length=80)
106     enabled = models.BooleanField(default=True, help_text="Status for this Slice")
107     SLICE_CHOICES = (('plc', 'PLC'), ('delegated', 'Delegated'), ('controller','Controller'), ('none','None'))
108     instantiation = models.CharField(help_text="The instantiation type of the slice", max_length=80, choices=SLICE_CHOICES)
109     omf_friendly = models.BooleanField(default=False)
110     description=models.TextField(blank=True,help_text="High level description of the slice and expected activities", max_length=1024)
111     slice_url = models.URLField(blank=True, max_length=512)
112     site = models.ForeignKey(Site, related_name='slices', help_text="The Site this Node belongs too")
113     network_id = models.CharField(max_length=256, help_text="Quantum network")
114     router_id = models.CharField(max_length=256, help_text="Quantum router id")
115
116     def __unicode__(self):  return u'%s' % (self.name)
117
118
119 class SliceMembership(PlCoreBase):
120     user = models.ForeignKey('User', related_name='slice_memberships')
121     slice = models.ForeignKey('Slice', related_name='slice_memberships')
122     role = models.ForeignKey('Role')
123
124     def __unicode__(self):  return u'%s %s %s' % (self.slice, self.user, self.role)
125
126     def save(self, *args, **kwds):
127         driver  = OpenStackDriver()
128         driver.add_user_role(user_id=user.user_id,
129                              tenant_id=slice.tenant_id,
130                              role_name=role.name)
131         super(SliceMembership, self).save(*args, **kwds)
132
133     def delete(self, *args, **kwds):
134         driver = OpenStackDriver()
135         driver.delete_user_role(user_id=user.user_id,
136                                 tenant_id=slice.tenant_id,
137                                 role_name=role.name)
138         super(SliceMembership, self).delete(*args, **kwds)
139
140 class SubNet(PlCoreBase):
141     subnet_id = models.CharField(max_length=256, unique=True)
142     cidr = models.CharField(max_length=20)
143     ip_version = models.IntegerField()
144     start = models.IPAddressField()
145     end = models.IPAddressField()
146     slice = models.ForeignKey(Slice, related_name='subnets')
147
148     def __unicode__(self):  return u'%s' % (self.name)
149
150     def save(self, *args, **kwargs):
151         driver  = OpenStackDriver()
152         if not self.id:
153             subnet = driver.create_subnet(network_name=self.slice.name,
154                                           cidr_ip = self.cidr,
155                                           ip_version=self.ip_version,
156                                           start = self.start,
157                                           end = self.end)
158
159             self.subnet_id = subnet.id
160
161         # add subnet as interface to slice router
162         driver.add_router_interface(self.slice.router_id, subnet.id)
163
164         super(SubNet, self).save(*args, **kwargs)
165
166
167     def delete(self, *args, **kwargs):
168         # delete quantum network
169         driver  = OpenStackDriver()
170         driver.delete_subnet(self.subnet_id)
171         driver.delete_router_interface(self.slice.router_id, self.subnet.id)
172         super(SubNet, self).delete(*args, **kwargs)
173
174 class Node(PlCoreBase):
175     name = models.CharField(max_length=200, unique=True, help_text="Name of the Node")
176     siteDeploymentNetwork = models.ForeignKey(SiteDeploymentNetwork, help_text="The Site and Deployment Network this Node belongs too.")
177
178     def __unicode__(self):  return u'%s' % (self.name)
179
180 class Image(PlCoreBase):
181     image_id = models.CharField(max_length=256, unique=True)
182     name = models.CharField(max_length=256, unique=True)
183     disk_format = models.CharField(max_length=256)
184     container_format = models.CharField(max_length=256)
185
186     def __unicode__(self):  return u'%s' % (self.name)
187
188
189 class Flavor(PlCoreBase):
190     flavor_id = models.IntegerField(unique=True)
191     name = models.CharField(max_length=256, unique=True)
192     memory_mb = models.IntegerField()
193     disk_gb = models.IntegerField()
194     vcpus = models.IntegerField()
195
196     def __unicode__(self):  return u'%s' % (self.name)
197
198 class Key(PlCoreBase):
199     name = models.CharField(max_length=256, unique=True)
200     key = models.CharField(max_length=512)
201     type = models.CharField(max_length=256)
202     blacklisted = models.BooleanField(default=False)
203     user = models.ForeignKey(User, related_name='keys')
204
205     def __unicode__(self):  return u'%s' % (self.name)
206
207 class Sliver(PlCoreBase):
208     instance_id = models.CharField(max_length=200, help_text="Nova instance id")    
209     name = models.CharField(max_length=200, help_text="Sliver name")
210     flavor = models.ForeignKey(Flavor)
211     image = models.ForeignKey(Image) 
212     key = models.ForeignKey(Key)        
213     slice = models.ForeignKey(Slice, related_name='slivers')
214     siteDeploymentNetwork = models.ForeignKey(SiteDeploymentNetwork)
215     node = models.ForeignKey(Node)
216
217     def __unicode__(self):  return u'%s::%s' % (self.slice, self.siteDeploymentNetwork)
218
219     def save(self, *args, **kwds):
220         driver  = OpenStackDriver()
221         instance = driver.spawn_instances(name=self.name,
222                                           keyname=self.name,
223                                           hostnames=self.node.name,
224                                           flavor=self.flavor.name,
225                                           image=self.image.name)
226         self.instance_id = instance.id
227         super(Sliver, self).save(*args, **kwds)
228
229     def delete(self, *args, **kwds):
230         driver  = OpenStackDriver()
231         driver.destroy_instance(name=self.name, id=self.instance_id)
232         super(Sliver, self).delete(*args, **kwds)
233