blob: 4b59dea1b210fd60b69d3a2771c14a9dd98132e2 [file] [log] [blame]
Tony Mack5cbec5d2013-04-02 07:55:11 -04001import os
Tony Mack7130ac32013-03-22 21:58:00 -04002from django.db import models
Tony Mack7823b892013-03-29 20:35:26 -04003from plstackapi.openstack.driver import OpenStackDriver
Tony Mack7130ac32013-03-22 21:58:00 -04004
Tony Mack5cbec5d2013-04-02 07:55:11 -04005os.environ.setdefault("DJANGO_SETTINGS_MODULE", "plstackapi.planetstack.settings")
Tony Mack7130ac32013-03-22 21:58:00 -04006# Create your models here.
7
8class 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
16class Site(PlCoreBase):
Tony Mackd7cb7712013-03-26 13:21:36 -040017 tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
Tony Mack7130ac32013-03-22 21:58:00 -040018 name = models.CharField(max_length=200, unique=True, help_text="Name for this Site")
19 site_url = models.URLField(help_text="Site's Home URL Page")
20 enabled = models.BooleanField(default=True, help_text="Status for this Site")
21 longitude = models.FloatField(null=True, blank=True)
22 latitude = models.FloatField(null=True, blank=True)
23 login_base = models.CharField(max_length=50, help_text="Prefix for Slices associated with this Site")
24 is_public = models.BooleanField(default=True, help_text="Indicates the visibility of this site to other members")
25 abbreviated_name = models.CharField(max_length=80)
26
27 def __unicode__(self): return u'%s' % (self.name)
28
Tony Mackd7cb7712013-03-26 13:21:36 -040029 def save(self, *args, **kwargs):
Tony Mack7823b892013-03-29 20:35:26 -040030 driver = OpenStackDriver()
Tony Mackd7cb7712013-03-26 13:21:36 -040031 if not self.id:
Tony Mack7823b892013-03-29 20:35:26 -040032 tenant = driver.create_tenant(name=self.login_base,
33 description=self.name,
34 enabled=self.enabled)
Tony Mackd7cb7712013-03-26 13:21:36 -040035 self.tenant_id = tenants.id
36 else:
37 # update record
Tony Mack7823b892013-03-29 20:35:26 -040038 self.driver.update_tenant(self.tenant_id, name=self.login_base,
39 description=self.name, enabled=self.enabled)
Tony Mackd7cb7712013-03-26 13:21:36 -040040 super(Site, self).save(*args, **kwargs)
41
Tony Macke1c8c382013-03-26 13:37:59 -040042 def delete(self, *args, **kwds):
43 # delete keystone tenant
Tony Mack7823b892013-03-29 20:35:26 -040044 driver = OpenStackDriver()
45 driver.delete_tenant(self.tenant_id)
Tony Macke1c8c382013-03-26 13:37:59 -040046 super(Site, self).delete(*args, **kwargs)
47
Tony Mack7130ac32013-03-22 21:58:00 -040048class Slice(PlCoreBase):
Tony Mackd7cb7712013-03-26 13:21:36 -040049 tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
Tony Mack7130ac32013-03-22 21:58:00 -040050 name = models.CharField(help_text="The Name of the Slice", max_length=80)
51 SLICE_CHOICES = (('plc', 'PLC'), ('delegated', 'Delegated'), ('controller','Controller'), ('none','None'))
52 instantiation = models.CharField(help_text="The instantiation type of the slice", max_length=80, choices=SLICE_CHOICES)
53 omf_friendly = models.BooleanField()
54 description=models.TextField(blank=True,help_text="High level description of the slice and expected activities", max_length=1024)
55 slice_url = models.URLField(blank=True)
56 site = models.ForeignKey(Site, related_name='slices', help_text="The Site this Node belongs too")
57
58 def __unicode__(self): return u'%s' % (self.name)
59
Tony Mackd7cb7712013-03-26 13:21:36 -040060 def save(self, *args, **kwds):
Tony Macke1c8c382013-03-26 13:37:59 -040061 # sync keystone tenant
Tony Mack7823b892013-03-29 20:35:26 -040062 driver = OpenStackDriver()
63
Tony Mackd7cb7712013-03-26 13:21:36 -040064 tenant_fields = {'name': self.name,
65 'enabled': self.enabled,
66 'description': self.description}
67 if not self.id:
Tony Mack7823b892013-03-29 20:35:26 -040068 tenant = driver.create_tenant(name=self.name,
69 description=self.description,
70 enabled=self.enabled)
Tony Mackd7cb7712013-03-26 13:21:36 -040071 self.tenant_id = tenants.id
72 else:
73 # update record
Tony Mack7823b892013-03-29 20:35:26 -040074 self.driver.update_tenant(self.tenant_id, name=self.name,
75 description=self.description, enabled=self.enabled)
76 super(Slice, self).save(*args, **kwargs)
Tony Mackd7cb7712013-03-26 13:21:36 -040077
Tony Macke1c8c382013-03-26 13:37:59 -040078 def delete(self, *args, **kwds):
79 # delete keystone tenant
Tony Mack7823b892013-03-29 20:35:26 -040080 driver = OpenStackDriver()
81 driver.delete_tenant(self.tenant_id)
Tony Macke1c8c382013-03-26 13:37:59 -040082 super(Slice, self).delete(*args, **kwargs)
83
Tony Mack7130ac32013-03-22 21:58:00 -040084class DeploymentNetwork(PlCoreBase):
85 name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment Network")
86
87 def __unicode__(self): return u'%s' % (self.name)
88
89class SiteDeploymentNetwork(PlCoreBase):
90 class Meta:
91 unique_together = ['site', 'deploymentNetwork']
92
93 site = models.ForeignKey(Site, related_name='deploymentNetworks')
94 deploymentNetwork = models.ForeignKey(DeploymentNetwork, related_name='sites')
95 name = models.CharField(default="Blah", max_length=100)
96
97
98 def __unicode__(self): return u'%s::%s' % (self.site, self.deploymentNetwork)
99
100
101class Sliver(PlCoreBase):
Tony Mackebb24872013-04-02 08:20:59 -0400102 tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id")
103 instance_id = models.CharField(max_length=200, help_text="Nova instance id")
Tony Mackd9ae9da2013-04-02 08:58:22 -0400104 name = models.CharField(max_length=200, help_text="Sliver name")
105 flavor = models.CharField(max_length=200, help_text="OS Flavor")
106 image = models.CharField(max_length=200, help_text="Image Name")
Tony Mackebb24872013-04-02 08:20:59 -0400107 slice = models.ForeignKey(Slice, related_name='slices')
Tony Mack7130ac32013-03-22 21:58:00 -0400108 siteDeploymentNetwork = models.ForeignKey(SiteDeploymentNetwork)
Tony Mack4ec65352013-04-02 08:09:29 -0400109 #node = models.ForeignKey(Node, related_name='node')
Tony Mack7130ac32013-03-22 21:58:00 -0400110
111 def __unicode__(self): return u'%s::%s' % (self.slice, self.siteDeploymentNetwork)
112
Tony Mack7823b892013-03-29 20:35:26 -0400113 def save(self, *args, **kwds):
114 driver = OpenStackDriver()
115 instance = driver.spawn_instances(name=self.name,
116 keyname=self.name,
117 hostnames=self.node.name,
118 flavor=self.flavor,
119 image=self.image)
120 self.instance_id = instance.id
121 super(Sliver, self).save(*args, **kwds)
122
123 def delete(self, *args, **kwds):
124 driver = OpenStackDriver()
125 driver.destroy_instance(name=self.name, id=self.instance_id)
126 super(Sliver, self).delete(*args, **kwds)
127
128
Tony Mack7130ac32013-03-22 21:58:00 -0400129class Node(PlCoreBase):
130 name = models.CharField(max_length=200, unique=True, help_text="Name of the Node")
131 siteDeploymentNetwork = models.ForeignKey(SiteDeploymentNetwork, help_text="The Site and Deployment Network this Node belongs too.")
132
133 def __unicode__(self): return u'%s' % (self.name)
134
Tony Mackd7cb7712013-03-26 13:21:36 -0400135class Network(PlCoreBase):
Tony Mackebb24872013-04-02 08:20:59 -0400136 slice = models.ForeignKey(Slice, related_name='slices')
Tony Mackd7cb7712013-03-26 13:21:36 -0400137 name = models.CharField(max_length=200, unique=True)
138 quantum_id = models.CharField(max_length=200, unique=True)
139
140 def __unicode__(self): return u'%s' % (self.name)
141
142 def save(self, *args, **kwargs):
143 os_shell = OpenStackShell()
144 network_fields = {'name': self.name}
145
146 if not self.id:
147 # check if quantum network record exists
148 networks = os_shell.quantum.list_networks(name=self.name)
149 if not networks:
150 network = os_shell.quantum.create_network(name=self.name,
151 admin_state_up=False)
152 else:
153 network = networks[0]
154 self.quantum_id = network.id
155 super(Network, self).save(*args, **kwargs)
156
Tony Macke1c8c382013-03-26 13:37:59 -0400157 def delete(self, *args, **kwargs):
158 # delete quantum network
159 os_shell = OpenStackShell()
160 os_shell.quantum.delete_network(self.quantum_id)
161
162 super(Network, self).delete(*args, **kwargs)
163
Tony Mackd7cb7712013-03-26 13:21:36 -0400164class SubNet(PlCoreBase):
165 network = models.ForeignKey(Network, related_name='network')
166 name = models.CharField(max_length=200, unique=True)
167 quantum_id = models.CharField(max_length=200, unique=True)
168 cidr = models.CharField(max_length=20)
169 ip_version = models.IntegerField()
170 start = models.IPAddressField()
171 end = models.IPAddressField()
172
173 def __unicode__(self): return u'%s' % (self.name)
174
175 def save(self, *args, **kwargs):
176 os_shell = OpenStackShell()
177 subnet_fields = {'network_id': self.network.quantum_id,
178 'name' : self.name,
179 'ip_version': self.ip_version,
180 'cidr': self.cidr,
Tony Mack560788f2013-03-28 20:46:58 -0400181 'allocation_pools': {'start': self.start,
182 'end': self.end}
Tony Mackd7cb7712013-03-26 13:21:36 -0400183 }
184 if not self.id:
185 subnets = os_shell.quantum.list_subnets(name=self.name)
186 if not subnets:
187 subnet = os_shell.quantum.create_subnet(**subnet_fields)
188 else:
189 subnet = subnets[0]
190 self.quantum_id = subnet.id
191 super(SubNet, self).save(*args, **kwargs)
Tony Macke1c8c382013-03-26 13:37:59 -0400192
193
194 def delete(self, *args, **kwargs):
195 # delete quantum network
196 os_shell = OpenStackShell()
197 os_shell.quantum.delete_subnet(self.quantum_id)
198
199 super(SubNet, self).delete(*args, **kwargs)
Tony Mackd7cb7712013-03-26 13:21:36 -0400200
201
202