Revision 482c6454
b/snf-cyclades-app/synnefo/api/servers.py | ||
---|---|---|
305 | 305 |
else: |
306 | 306 |
transaction.commit() |
307 | 307 |
|
308 |
# Fix flavor for archipelago |
|
309 |
password = util.random_password() |
|
310 |
disk_template, provider = util.get_flavor_provider(flavor) |
|
311 |
if provider: |
|
312 |
flavor.disk_template = disk_template |
|
313 |
flavor.disk_provider = provider |
|
314 |
flavor.disk_origin = None |
|
315 |
if provider == 'vlmc': |
|
316 |
flavor.disk_origin = image['checksum'] |
|
317 |
image['backend_id'] = 'null' |
|
318 |
else: |
|
319 |
flavor.disk_provider = None |
|
320 |
|
|
308 | 321 |
try: |
309 | 322 |
# Issue commission |
310 | 323 |
serial = quotas.issue_vm_commission(user_id, flavor) |
... | ... | |
325 | 338 |
action="CREATE", |
326 | 339 |
serial=serial) |
327 | 340 |
|
328 |
password = util.random_password() |
|
329 |
|
|
330 |
disk_template, provider = util.get_flavor_provider(flavor) |
|
331 |
if provider: |
|
332 |
flavor.disk_template = disk_template |
|
333 |
flavor.disk_provider = provider |
|
334 |
flavor.disk_origin = None |
|
335 |
if provider == 'vlmc': |
|
336 |
flavor.disk_origin = image['checksum'] |
|
337 |
image['backend_id'] = 'null' |
|
338 |
else: |
|
339 |
flavor.disk_provider = None |
|
341 |
log.info("Created entry in DB for VM '%s'", vm) |
|
340 | 342 |
|
341 | 343 |
# dispatch server created signal |
342 | 344 |
server_created.send(sender=vm, created_vm_params={ |
... | ... | |
347 | 349 |
'img_properties': json.dumps(image['metadata']), |
348 | 350 |
}) |
349 | 351 |
|
350 |
try: |
|
351 |
jobID = create_instance(vm, nic, flavor, image) |
|
352 |
except GanetiApiError: |
|
353 |
vm.delete() |
|
354 |
raise |
|
355 |
|
|
356 |
log.info("User %s created VM %s, NIC %s, Backend %s, JobID %s", |
|
357 |
user_id, vm, nic, backend, str(jobID)) |
|
358 |
|
|
359 |
vm.backendjobid = jobID |
|
360 |
vm.save() |
|
361 |
|
|
352 |
# Also we must create the VM metadata in the same transaction. |
|
362 | 353 |
for key, val in metadata.items(): |
363 | 354 |
VirtualMachineMetadata.objects.create( |
364 | 355 |
meta_key=key, |
365 | 356 |
meta_value=val, |
366 | 357 |
vm=vm) |
367 |
|
|
368 |
server = vm_to_dict(vm, detail=True) |
|
369 |
server['status'] = 'BUILD' |
|
370 |
server['adminPass'] = password |
|
371 |
|
|
372 |
respsone = render_server(request, server, status=202) |
|
373 | 358 |
except: |
374 | 359 |
transaction.rollback() |
375 | 360 |
raise |
376 | 361 |
else: |
377 | 362 |
transaction.commit() |
378 | 363 |
|
364 |
try: |
|
365 |
jobID = create_instance(vm, nic, flavor, image) |
|
366 |
# At this point the job is enqueued in the Ganeti backend |
|
367 |
vm.backendjobid = jobID |
|
368 |
vm.save() |
|
369 |
transaction.commit() |
|
370 |
log.info("User %s created VM %s, NIC %s, Backend %s, JobID %s", |
|
371 |
user_id, vm, nic, backend, str(jobID)) |
|
372 |
except GanetiApiError as e: |
|
373 |
log.exception("Can not communicate to backend %s: %s. Deleting VM %s", |
|
374 |
backend, e, vm) |
|
375 |
vm.delete() |
|
376 |
transaction.commit() |
|
377 |
raise |
|
378 |
except: |
|
379 |
transaction.rollback() |
|
380 |
raise |
|
381 |
|
|
382 |
server = vm_to_dict(vm, detail=True) |
|
383 |
server['status'] = 'BUILD' |
|
384 |
server['adminPass'] = password |
|
385 |
|
|
386 |
respsone = render_server(request, server, status=202) |
|
387 |
|
|
379 | 388 |
return respsone |
380 | 389 |
|
381 | 390 |
|
Also available in: Unified diff