Revision 3a6be177

b/snf-cyclades-app/synnefo/api/tests/servers.py
266 266
        net2 = mfactory.NetworkFactory()
267 267
        net3 = mfactory.NetworkFactory()
268 268
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net1,
269
                                         state="BUILDING")
269
                                         state="BUILD")
270 270
        nic2 = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net2,
271 271
                                                state="ACTIVE")
272 272
        mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net3,
273
                                         state="BUILDING")
273
                                         state="BUILD")
274 274

  
275 275
        response = self.myget('servers/%d' % db_vm.id, user)
276 276
        server = json.loads(response.content)['server']
b/snf-cyclades-app/synnefo/db/migrations/0085_nic_build_state.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
        orm.NetworkInterface.objects.filter(state="BUILDING").update(state="BUILD")
13

  
14
    def backwards(self, orm):
15
        "Write your backwards methods here."
16
        orm.NetworkInterface.objects.filter(state="BUILD").update(state="BUILDING")
17

  
18
    models = {
19
        'db.backend': {
20
            'Meta': {'ordering': "['clustername']", 'object_name': 'Backend'},
21
            'clustername': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
22
            'ctotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
23
            'dfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
24
            'disk_templates': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
25
            'drained': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
26
            'dtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
27
            'hash': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
28
            'hypervisor': ('django.db.models.fields.CharField', [], {'default': "'kvm'", 'max_length': '32'}),
29
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
30
            'index': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'unique': 'True'}),
31
            'mfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
32
            'mtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
33
            'offline': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
34
            'password_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
35
            'pinst_cnt': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
36
            'port': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5080'}),
37
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
38
            'username': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
39
        },
40
        'db.backendnetwork': {
41
            'Meta': {'unique_together': "(('network', 'backend'),)", 'object_name': 'BackendNetwork'},
42
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'networks'", 'on_delete': 'models.PROTECT', 'to': "orm['db.Backend']"}),
43
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
44
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
45
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
46
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
47
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
48
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
49
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
50
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
51
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
52
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'backend_networks'", 'to': "orm['db.Network']"}),
53
            'operstate': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '30'}),
54
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
55
        },
56
        'db.bridgepooltable': {
57
            'Meta': {'object_name': 'BridgePoolTable'},
58
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
59
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
60
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
61
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
62
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
63
            'size': ('django.db.models.fields.IntegerField', [], {})
64
        },
65
        'db.flavor': {
66
            'Meta': {'unique_together': "(('cpu', 'ram', 'disk', 'disk_template'),)", 'object_name': 'Flavor'},
67
            'cpu': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
68
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
69
            'disk': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
70
            'disk_template': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
71
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
72
            'ram': ('django.db.models.fields.IntegerField', [], {'default': '0'})
73
        },
74
        'db.ipaddress': {
75
            'Meta': {'unique_together': "(('network', 'address'),)", 'object_name': 'IPAddress'},
76
            'address': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
77
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
78
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
79
            'floating_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
80
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
81
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'to': "orm['db.Network']"}),
82
            'nic': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.NetworkInterface']"}),
83
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
84
            'subnet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ips'", 'to': "orm['db.Subnet']"}),
85
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
86
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
87
        },
88
        'db.ippooltable': {
89
            'Meta': {'object_name': 'IPPoolTable'},
90
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
91
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
92
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
93
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
94
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
95
            'size': ('django.db.models.fields.IntegerField', [], {}),
96
            'subnet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ip_pools'", 'null': 'True', 'to': "orm['db.Subnet']"})
97
        },
98
        'db.macprefixpooltable': {
99
            'Meta': {'object_name': 'MacPrefixPoolTable'},
100
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
101
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
102
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
103
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
104
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
105
            'size': ('django.db.models.fields.IntegerField', [], {})
106
        },
107
        'db.network': {
108
            'Meta': {'object_name': 'Network'},
109
            'action': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '32', 'null': 'True'}),
110
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
111
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
112
            'drained': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
113
            'external_router': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
114
            'flavor': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
115
            'floating_ip_pool': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
116
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
117
            'link': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
118
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
119
            'machines': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.VirtualMachine']", 'through': "orm['db.NetworkInterface']", 'symmetrical': 'False'}),
120
            'mode': ('django.db.models.fields.CharField', [], {'max_length': '16', 'null': 'True'}),
121
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
122
            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
123
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'network'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
124
            'state': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '32'}),
125
            'tags': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
126
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
127
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'})
128
        },
129
        'db.networkinterface': {
130
            'Meta': {'object_name': 'NetworkInterface'},
131
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
132
            'device_owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
133
            'firewall_profile': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
134
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
135
            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
136
            'mac': ('django.db.models.fields.CharField', [], {'max_length': '32', 'unique': 'True', 'null': 'True'}),
137
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.VirtualMachine']"}),
138
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'null': 'True'}),
139
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.Network']"}),
140
            'security_groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.SecurityGroup']", 'null': 'True', 'symmetrical': 'False'}),
141
            'state': ('django.db.models.fields.CharField', [], {'default': "'ACTIVE'", 'max_length': '32'}),
142
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
143
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'})
144
        },
145
        'db.quotaholderserial': {
146
            'Meta': {'ordering': "['serial']", 'object_name': 'QuotaHolderSerial'},
147
            'accept': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
148
            'pending': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
149
            'resolved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
150
            'serial': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True', 'db_index': 'True'})
151
        },
152
        'db.securitygroup': {
153
            'Meta': {'object_name': 'SecurityGroup'},
154
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
155
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
156
        },
157
        'db.subnet': {
158
            'Meta': {'object_name': 'Subnet'},
159
            'cidr': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
160
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
161
            'dhcp': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
162
            'dns_nameservers': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
163
            'gateway': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
164
            'host_routes': ('synnefo.db.fields.SeparatedValuesField', [], {'null': 'True'}),
165
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
166
            'ipversion': ('django.db.models.fields.IntegerField', [], {'default': '4'}),
167
            'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'null': 'True'}),
168
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subnets'", 'to': "orm['db.Network']"})
169
        },
170
        'db.virtualmachine': {
171
            'Meta': {'object_name': 'VirtualMachine'},
172
            'action': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '30', 'null': 'True'}),
173
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machines'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': "orm['db.Backend']"}),
174
            'backend_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
175
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
176
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
177
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
178
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
179
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
180
            'buildpercentage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
181
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
182
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
183
            'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Flavor']", 'on_delete': 'models.PROTECT'}),
184
            'hostid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
185
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
186
            'imageid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
187
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
188
            'operstate': ('django.db.models.fields.CharField', [], {'default': "'BUILD'", 'max_length': '30'}),
189
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machine'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['db.QuotaHolderSerial']"}),
190
            'suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
191
            'task': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
192
            'task_job_id': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
193
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
194
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'})
195
        },
196
        'db.virtualmachinediagnostic': {
197
            'Meta': {'ordering': "['-created']", 'object_name': 'VirtualMachineDiagnostic'},
198
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
199
            'details': ('django.db.models.fields.TextField', [], {'null': 'True'}),
200
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
201
            'level': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
202
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'diagnostics'", 'to': "orm['db.VirtualMachine']"}),
203
            'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
204
            'source': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
205
            'source_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'})
206
        },
207
        'db.virtualmachinemetadata': {
208
            'Meta': {'unique_together': "(('meta_key', 'vm'),)", 'object_name': 'VirtualMachineMetadata'},
209
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
210
            'meta_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
211
            'meta_value': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
212
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'metadata'", 'to': "orm['db.VirtualMachine']"})
213
        }
214
    }
215

  
216
    complete_apps = ['db']
217
    symmetrical = True
b/snf-cyclades-app/synnefo/db/models.py
765 765

  
766 766
    STATES = (
767 767
        ("ACTIVE", "Active"),
768
        ("BUILDING", "Building"),
768
        ("BUILD", "Building"),
769 769
        ("ERROR", "Error"),
770
        ("DOWN", "Down"),
770 771
    )
771 772

  
772 773
    NETWORK_IFACE_NAME_LENGTH = 128
b/snf-cyclades-app/synnefo/logic/backend.py
247 247
            # state for more than 5 minutes, then we remove the NIC.
248 248
            # TODO: This is dangerous as the job may be stack in the queue, and
249 249
            # releasing the IP may lead to duplicate IP use.
250
            if db_nic.state != "BUILDING" or\
251
                (db_nic.state == "BUILDING" and
250
            if db_nic.state != "BUILD" or\
251
                (db_nic.state == "BUILD" and
252 252
                 etime > db_nic.created + BUILDING_NIC_TIMEOUT):
253 253
                remove_nic_ips(db_nic)
254 254
                db_nic.delete()
b/snf-cyclades-app/synnefo/logic/ports.py
82 82
                                           machine=machine,
83 83
                                           userid=user_id,
84 84
                                           device_owner=device_owner,
85
                                           state="BUILDING")
85
                                           state="BUILD")
86 86
    #add the security groups if any
87 87
    if security_groups:
88 88
        port.security_groups.add(*security_groups)
b/snf-cyclades-app/synnefo/logic/reconciliation.py
287 287
    def reconcile_unsynced_nics(self, server_id, db_server, gnt_server):
288 288
        building_time = (self.event_time -
289 289
                         backend_mod.BUILDING_NIC_TIMEOUT)
290
        db_nics = db_server.nics.exclude(state="BUILDING",
290
        db_nics = db_server.nics.exclude(state="BUILD",
291 291
                                         created__lte=building_time) \
292 292
                                .order_by("id")
293 293
        gnt_nics = gnt_server["nics"]
b/snf-cyclades-app/synnefo/logic/servers.py
308 308
    #device_owner = "router" if vm.router else "vm"
309 309
    device_owner = "vm"
310 310
    nic = NetworkInterface.objects.create(machine=vm, network=network,
311
                                          state="BUILDING",
311
                                          state="BUILD",
312 312
                                          device_owner=device_owner)
313 313
    if ipaddress is not None:
314 314
        ipaddress.nic = nic

Also available in: Unified diff