Revision bdd0f1a6

b/snf-cyclades-app/synnefo/db/migrations/0079_auto__add_ipaddress__add_unique_ipaddress_network_address__add_securit.py
1
# -*- coding: utf-8 -*-
2
import datetime
3
from south.db import db
4
from south.v2 import SchemaMigration
5
from django.db import models
6

  
7

  
8
class Migration(SchemaMigration):
9

  
10
    def forwards(self, orm):
11
        # Removing unique constraint on 'NetworkInterface', fields ['network', 'ipv4']
12
        db.delete_unique('db_networkinterface', ['network_id', 'ipv4'])
13

  
14
        # Adding model 'IPAddress'
15
        db.create_table('db_ipaddress', (
16
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
17
            ('subnet', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ips', to=orm['db.Subnet'])),
18
            ('network', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ips', to=orm['db.Network'])),
19
            ('nic', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ips', null=True, on_delete=models.SET_NULL, to=orm['db.NetworkInterface'])),
20
            ('userid', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
21
            ('address', self.gf('django.db.models.fields.CharField')(max_length=64)),
22
            ('floating_ip', self.gf('django.db.models.fields.BooleanField')(default=False)),
23
            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
24
            ('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
25
            ('deleted', self.gf('django.db.models.fields.BooleanField')(default=False)),
26
            ('serial', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ips', null=True, on_delete=models.SET_NULL, to=orm['db.QuotaHolderSerial'])),
27
        ))
28
        db.send_create_signal('db', ['IPAddress'])
29

  
30
        # Adding unique constraint on 'IPAddress', fields ['network', 'address']
31
        db.create_unique('db_ipaddress', ['network_id', 'address'])
32

  
33
        # Adding model 'SecurityGroup'
34
        db.create_table('db_securitygroup', (
35
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
36
            ('name', self.gf('django.db.models.fields.CharField')(max_length=128)),
37
        ))
38
        db.send_create_signal('db', ['SecurityGroup'])
39

  
40
        # Adding field 'NetworkInterface.name'
41
        db.add_column('db_networkinterface', 'name',
42
                      self.gf('django.db.models.fields.CharField')(max_length=128, null=True),
43
                      keep_default=False)
44

  
45
        # Adding field 'NetworkInterface.userid'
46
        db.add_column('db_networkinterface', 'userid',
47
                      self.gf('django.db.models.fields.CharField')(max_length=128, null=True, db_index=True),
48
                      keep_default=False)
49

  
50
        # Adding field 'NetworkInterface.device_owner'
51
        db.add_column('db_networkinterface', 'device_owner',
52
                      self.gf('django.db.models.fields.CharField')(max_length=128, null=True),
53
                      keep_default=False)
54

  
55
        # Adding M2M table for field security_groups on 'NetworkInterface'
56
        db.create_table('db_networkinterface_security_groups', (
57
            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
58
            ('networkinterface', models.ForeignKey(orm['db.networkinterface'], null=False)),
59
            ('securitygroup', models.ForeignKey(orm['db.securitygroup'], null=False))
60
        ))
61
        db.create_unique('db_networkinterface_security_groups', ['networkinterface_id', 'securitygroup_id'])
62

  
63

  
64
    def backwards(self, orm):
65
        # Removing unique constraint on 'IPAddress', fields ['network', 'address']
66
        db.delete_unique('db_ipaddress', ['network_id', 'address'])
67

  
68
        # Deleting model 'IPAddress'
69
        db.delete_table('db_ipaddress')
70

  
71
        # Deleting model 'SecurityGroup'
72
        db.delete_table('db_securitygroup')
73

  
74
        # Deleting field 'NetworkInterface.name'
75
        db.delete_column('db_networkinterface', 'name')
76

  
77
        # Deleting field 'NetworkInterface.userid'
78
        db.delete_column('db_networkinterface', 'userid')
79

  
80
        # Deleting field 'NetworkInterface.device_owner'
81
        db.delete_column('db_networkinterface', 'device_owner')
82

  
83
        # Removing M2M table for field security_groups on 'NetworkInterface'
84
        db.delete_table('db_networkinterface_security_groups')
85

  
86
        # Adding unique constraint on 'NetworkInterface', fields ['network', 'ipv4']
87
        db.create_unique('db_networkinterface', ['network_id', 'ipv4'])
88

  
89

  
90
    models = {
91
        'db.backend': {
92
            'Meta': {'ordering': "['clustername']", 'object_name': 'Backend'},
93
            'clustername': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
94
            'ctotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
95
            'dfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
96
            'disk_templates': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
97
            'drained': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
98
            'dtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
99
            'hash': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
100
            'hypervisor': ('django.db.models.fields.CharField', [], {'default': "'kvm'", 'max_length': '32'}),
101
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
102
            'index': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'unique': 'True'}),
103
            'mfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
104
            'mtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
105
            'offline': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
106
            'password_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
107
            'pinst_cnt': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
108
            'port': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5080'}),
109
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
110
            'username': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
111
        },
112
        'db.backendnetwork': {
113
            'Meta': {'unique_together': "(('network', 'backend'),)", 'object_name': 'BackendNetwork'},
114
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'networks'", 'on_delete': 'models.PROTECT', 'to': "orm['db.Backend']"}),
115
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
116
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
117
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
118
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
119
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
120
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
121
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
122
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
123
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
124
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'backend_networks'", 'to': "orm['db.Network']"}),
125
            'operstate': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '30'}),
126
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
127
        },
128
        'db.bridgepooltable': {
129
            'Meta': {'object_name': 'BridgePoolTable'},
130
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
131
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
132
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
133
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
134
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
135
            'size': ('django.db.models.fields.IntegerField', [], {})
136
        },
137
        'db.flavor': {
138
            'Meta': {'unique_together': "(('cpu', 'ram', 'disk', 'disk_template'),)", 'object_name': 'Flavor'},
139
            'cpu': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
140
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
141
            'disk': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
142
            'disk_template': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
143
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
144
            'ram': ('django.db.models.fields.IntegerField', [], {'default': '0'})
145
        },
146
        'db.floatingip': {
147
            'Meta': {'object_name': 'FloatingIP'},
148
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
149
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
150
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151
            'ipv4': ('django.db.models.fields.IPAddressField', [], {'unique': 'True', 'max_length': '15', 'db_index': 'True'}),
152
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'floating_ips'", 'null': 'True', 'to': "orm['db.VirtualMachine']"}),
153
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'floating_ips'", 'to': "orm['db.Network']"}),
154
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'floating_ips'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
155
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
156
        },
157
        'db.ipaddress': {
158
            'Meta': {'unique_together': "(('network', 'address'),)", 'object_name': 'IPAddress'},
159
            'address': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
160
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
161
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
162
            'floating_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
163
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
164
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'to': "orm['db.Network']"}),
165
            'nic': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.NetworkInterface']"}),
166
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
167
            'subnet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'to': "orm['db.Subnet']"}),
168
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
169
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
170
        },
171
        'db.ippooltable': {
172
            'Meta': {'object_name': 'IPPoolTable'},
173
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
174
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
175
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
176
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
177
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
178
            'size': ('django.db.models.fields.IntegerField', [], {}),
179
            'subnet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ip_pools'", 'null': 'True', 'to': "orm['db.Subnet']"})
180
        },
181
        'db.macprefixpooltable': {
182
            'Meta': {'object_name': 'MacPrefixPoolTable'},
183
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
184
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
185
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
186
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
187
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
188
            'size': ('django.db.models.fields.IntegerField', [], {})
189
        },
190
        'db.network': {
191
            'Meta': {'object_name': 'Network'},
192
            'action': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '32', 'null': 'True'}),
193
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
194
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
195
            'drained': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
196
            'external_router': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
197
            'flavor': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
198
            'floating_ip_pool': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
199
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
200
            'link': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
201
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
202
            'machines': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.VirtualMachine']", 'through': "orm['db.NetworkInterface']", 'symmetrical': 'False'}),
203
            'mode': ('django.db.models.fields.CharField', [], {'max_length': '16', 'null': 'True'}),
204
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
205
            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
206
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'network'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
207
            'state': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '32'}),
208
            'tags': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
209
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
210
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'})
211
        },
212
        'db.networkinterface': {
213
            'Meta': {'object_name': 'NetworkInterface'},
214
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
215
            'device_owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
216
            'dirty': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
217
            'firewall_profile': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
218
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
219
            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
220
            'ipv4': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True'}),
221
            'ipv6': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
222
            'mac': ('django.db.models.fields.CharField', [], {'max_length': '32', 'unique': 'True', 'null': 'True'}),
223
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.VirtualMachine']"}),
224
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
225
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.Network']"}),
226
            'security_groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.SecurityGroup']", 'null': 'True', 'symmetrical': 'False'}),
227
            'state': ('django.db.models.fields.CharField', [], {'default': "'ACTIVE'", 'max_length': '32'}),
228
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
229
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'})
230
        },
231
        'db.quotaholderserial': {
232
            'Meta': {'ordering': "['serial']", 'object_name': 'QuotaHolderSerial'},
233
            'accept': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
234
            'pending': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
235
            'resolved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
236
            'serial': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True', 'db_index': 'True'})
237
        },
238
        'db.securitygroup': {
239
            'Meta': {'object_name': 'SecurityGroup'},
240
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
241
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
242
        },
243
        'db.subnet': {
244
            'Meta': {'object_name': 'Subnet'},
245
            'cidr': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
246
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
247
            'dhcp': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
248
            'dns_nameservers': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
249
            'gateway': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
250
            'host_routes': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
251
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
252
            'ipversion': ('django.db.models.fields.IntegerField', [], {'default': '4'}),
253
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
254
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subnets'", 'to': "orm['db.Network']"})
255
        },
256
        'db.virtualmachine': {
257
            'Meta': {'object_name': 'VirtualMachine'},
258
            'action': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '30', 'null': 'True'}),
259
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machines'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['db.Backend']"}),
260
            'backend_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
261
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
262
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
263
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
264
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
265
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
266
            'buildpercentage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
267
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
268
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
269
            'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Flavor']", 'on_delete': 'models.PROTECT'}),
270
            'hostid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
271
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
272
            'imageid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
273
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
274
            'operstate': ('django.db.models.fields.CharField', [], {'default': "'BUILD'", 'max_length': '30'}),
275
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machine'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
276
            'suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
277
            'task': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
278
            'task_job_id': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
279
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
280
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'})
281
        },
282
        'db.virtualmachinediagnostic': {
283
            'Meta': {'ordering': "['-created']", 'object_name': 'VirtualMachineDiagnostic'},
284
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
285
            'details': ('django.db.models.fields.TextField', [], {'null': 'True'}),
286
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
287
            'level': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
288
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'diagnostics'", 'to': "orm['db.VirtualMachine']"}),
289
            'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
290
            'source': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
291
            'source_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'})
292
        },
293
        'db.virtualmachinemetadata': {
294
            'Meta': {'unique_together': "(('meta_key', 'vm'),)", 'object_name': 'VirtualMachineMetadata'},
295
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
296
            'meta_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
297
            'meta_value': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
298
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'metadata'", 'to': "orm['db.VirtualMachine']"})
299
        }
300
    }
301

  
302
    complete_apps = ['db']
b/snf-cyclades-app/synnefo/db/models.py
669 669
        return '<%s@%s>' % (self.network, self.backend)
670 670

  
671 671

  
672
class IPAddress(models.Model):
673
    subnet = models.ForeignKey("Subnet", related_name="ips", null=False,
674
                               on_delete=models.CASCADE)
675
    network = models.ForeignKey(Network, related_name="ips", null=False,
676
                                on_delete=models.CASCADE)
677
    nic = models.ForeignKey("NetworkInterface", related_name="ips", null=True,
678
                            on_delete=models.SET_NULL)
679
    userid = models.CharField("UUID of the owner", max_length=128, null=False,
680
                              db_index=True)
681
    address = models.CharField("IP Address", max_length=64, null=False)
682
    floating_ip = models.BooleanField("Floating IP", null=False, default=False)
683
    created = models.DateTimeField(auto_now_add=True)
684
    updated = models.DateTimeField(auto_now=True)
685
    deleted = models.BooleanField(default=False, null=False)
686

  
687
    serial = models.ForeignKey(QuotaHolderSerial,
688
                               related_name="ips", null=True,
689
                               on_delete=models.SET_NULL)
690

  
691
    def __unicode__(self):
692
        ip_type = "floating" if self.floating_ip else "static"
693
        return u"<IPAddress: %s, Network: %s, Subnet: %s, Type: %s>"\
694
               % (self.address, self.network_id, self.subnet_id, ip_type)
695

  
696
    def in_use(self):
697
        if self.machine is None:
698
            return False
699
        else:
700
            return (not self.machine.deleted)
701

  
702
    class Meta:
703
        unique_together = ("network", "address")
704

  
705

  
672 706
class NetworkInterface(models.Model):
673 707
    FIREWALL_PROFILES = (
674 708
        ('ENABLED', 'Enabled'),
......
682 716
        ("ERROR", "Error"),
683 717
    )
684 718

  
685
    IP_TYPES = (
686
        ("FIXED", "Fixed IP Address"),
687
        ("FLOATING", "Floating IP Address"),
688
    )
689

  
719
    name = models.CharField('NIC name', max_length=128, null=True)
720
    userid = models.CharField("UUID of the owner", max_length=128,
721
                              null=True, db_index=True)
690 722
    machine = models.ForeignKey(VirtualMachine, related_name='nics',
691 723
                                on_delete=models.CASCADE)
692 724
    network = models.ForeignKey(Network, related_name='nics',
......
699 731
    ipv6 = models.CharField(max_length=100, null=True)
700 732
    firewall_profile = models.CharField(choices=FIREWALL_PROFILES,
701 733
                                        max_length=30, null=True)
734
    security_groups = models.ManyToManyField("SecurityGroup", null=True)
702 735
    state = models.CharField(max_length=32, null=False, default="ACTIVE",
703 736
                             choices=STATES)
704
    ip_type = models.CharField(max_length=32, null=False, default="FIXED",
705
                               choices=IP_TYPES)
737
    device_owner = models.CharField('Device owner', max_length=128, null=True)
738

  
739
    def __unicode__(self):
740
        return "<%s:vm:%s network:%s>" % (self.id, self.machine_id,
741
                                          self.network_id)
706 742

  
707 743
    @property
708 744
    def backend_uuid(self):
709 745
        """Return the backend id by prepending backend-prefix."""
710 746
        return "%snic-%s" % (settings.BACKEND_PREFIX_ID, str(self.id))
711 747

  
712
    def __unicode__(self):
713
        return "<%s:vm:%s network:%s ipv4:%s ipv6:%s>" % \
714
            (self.id, self.machine_id, self.network_id, self.ipv4,
715
             self.ipv6)
716

  
717
    class Meta:
718
        # Assert than an IPv4 address from the same network will not be
719
        # assigned to more than one NICs
720
        unique_together = ("network", "ipv4")
721 748

  
722
    def delete(self):
723
        """Custom method for deleting NetworkInterfaces.
724

  
725
        In case the NIC is of 'FLOATING' type, this method clears the 'machine'
726
        flag of the FloatingIP object, before deleting the NIC.
727

  
728
        """
729
        if self.ip_type == "FLOATING":
730
            FloatingIP.objects.filter(machine=self.machine_id,
731
                                      network=self.network_id,
732
                                      ipv4=self.ipv4).update(machine=None)
733
        super(NetworkInterface, self).delete()
749
class SecurityGroup(models.Model):
750
    name = models.CharField('group name', max_length=128)
734 751

  
735 752

  
736 753
class FloatingIP(models.Model):

Also available in: Unified diff