Revision 482c6454 snf-cyclades-app/synnefo/api/servers.py

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