Revision d8989b47

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

  
7
class Migration(DataMigration):
8

  
9
    def forwards(self, orm):
10
        "Write your forwards methods here."
11
        # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..."
12
        for network in orm.Network.objects.all():
13
            if network.subnet:
14
                subnet = orm.Subnet.objects.create(network=network,
15
                                                   ipversion=4,
16
                                                   cidr=network.subnet,
17
                                                   gateway=network.gateway,
18
                                                   dhcp=network.dhcp,
19
                                                   deleted=network.deleted)
20
                ip_pool = network.pool
21
                ip_pool.subnet = subnet
22
                ip_pool.save()
23

  
24
            if network.subnet6:
25
                orm.Subnet.objects.create(network=network,
26
                                          ipversion=6,
27
                                          cidr=network.subnet6,
28
                                          gateway=network.gateway6,
29
                                          dhcp=network.dhcp,
30
                                          deleted=network.deleted)
31

  
32
    def backwards(self, orm):
33
        warning_msg_printed = False
34
        for subnet in orm.Subnet.objects.filter(ipversion=4):
35
            network = subnet.network
36
            network.dhcp = subnet.dhcp
37
            network.subnet = subnet.cidr
38
            network.gateway = subnet.gateway
39
            # Create an empty pool
40
            network.pool = orm.IPPoolTable.objects.create(available_map="",
41
                                                          reserved_map="",
42
                                                          size=0)
43
            network.save()
44
            try:
45
                ip_pool = network.get_pool()
46
                for nic in network.nics.filter(ipv4__isnull=False):
47
                    ip_pool.reserve(nic.ipv4)
48
                ip_pool.save()
49
            except:
50
                if not warning_msg_printed:
51
                    msg = ("WARNING: Cannot perform backwards migration for IP pools!"
52
                           " IP pools for all networks are not consistent."
53
                           " Make sure to run 'snf-manage reconcile-pools'.")
54
                    print msg
55
                    warning_msg_printed = True
56

  
57
            subnet.ip_pools.all().delete()
58

  
59
        for subnet in orm.Subnet.objects.filter(ipversion=6):
60
            network = subnet.network
61
            network.dhcp = subnet.dhcp
62
            network.subnet6 = subnet.cidr
63
            network.gateway6 = subnet.gateway
64
            network.save()
65

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

  
260
    complete_apps = ['db']
261
    symmetrical = True

Also available in: Unified diff