Revision 9ba6bb95 snf-cyclades-app/synnefo/logic/servers.py

b/snf-cyclades-app/synnefo/logic/servers.py
14 14
from synnefo.logic.backend_allocator import BackendAllocator
15 15
from synnefo.logic.rapi import GanetiApiError
16 16
from synnefo.db.models import (NetworkInterface, VirtualMachine,
17
                               VirtualMachineMetadata)
18
from synnefo.db.pools import EmptyPool
17
                               VirtualMachineMetadata, FloatingIP)
19 18

  
20 19
from vncauthproxy.client import request_forwarding as request_vnc_forwarding
21 20

  
......
378 377
        'password': password}
379 378

  
380 379
    return console
380

  
381

  
382
@server_command("CONNECTING")
383
def add_floating_ip(vm, address):
384
    user_id = vm.userid
385
    # Get lock in VM, to guarantee that floating IP will only by assigned once
386
    try:
387
        floating_ip = FloatingIP.objects.select_for_update()\
388
                                        .get(userid=user_id, ipv4=address,
389
                                             deleted=False)
390
    except FloatingIP.DoesNotExist:
391
        raise faults.ItemNotFound("Floating IP '%s' does not exist" % address)
392

  
393
    if floating_ip.in_use():
394
        raise faults.Conflict("Floating IP '%s' already in use" %
395
                              floating_ip.id)
396

  
397
    floating_ip.machine = vm
398
    floating_ip.save()
399

  
400
    log.info("Connecting VM %s to floating IP %s", vm, floating_ip)
401
    return backend.connect_to_network(vm, floating_ip.network, address)
402

  
403

  
404
@server_command("DISCONNECTING")
405
def remove_floating_ip(vm, address):
406
    user_id = vm.userid
407
    try:
408
        floating_ip = FloatingIP.objects.select_for_update()\
409
                                        .get(userid=user_id, ipv4=address,
410
                                             deleted=False, machine=vm)
411
    except FloatingIP.DoesNotExist:
412
        raise faults.ItemNotFound("Floating IP '%s' does not exist" % address)
413

  
414
    try:
415
        nic = NetworkInterface.objects.get(machine=vm, ipv4=address)
416
    except NetworkInterface.DoesNotExist:
417
        raise faults.ItemNotFound("Floating IP '%s' is not attached to"
418
                                  "VM '%s'" % (floating_ip, vm))
419

  
420
    log.info("Removing NIC %s from VM %s. Floating IP '%s'", str(nic.index),
421
             vm, floating_ip)
422

  
423
    return backend.disconnect_from_network(vm, nic)

Also available in: Unified diff