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)
|