diff --git a/cloudcontrol/node/hypervisor/__init__.py b/cloudcontrol/node/hypervisor/__init__.py index 14fcc8b8f28bcfc8ba6754f82181d8d4eaf60d9e..8ef92c7e5aa4e38fdfecf09903e4cae956f970f0 100644 --- a/cloudcontrol/node/hypervisor/__init__.py +++ b/cloudcontrol/node/hypervisor/__init__.py @@ -339,14 +339,6 @@ class Handler(HostHandler): logger.exception('Cannot find domain %s on hypervisor for live' ' migration', name) raise - try: - dest_virt_con = libvirt.open( - 'qemu+tcp://127.0.0.1:%d/system' % remote_virt_port) - except libvirt.libvirtError: - logger.exception('Cannot connect to remote libvirt for live' - ' migrating vm %s', name) - raise - # we open a new connection to libvirt and fork because sometimes libvirt # python binding, while doing a operation, @@ -356,14 +348,6 @@ class Handler(HostHandler): # libvirt connection for the migration and fork, the migration operation # in itself is handled by the child while other threads can be scheduled - # create a new libvirt connection dedicated to migration - try: - new_con = libvirt.open('qemu:///system') - domain = new_con.lookupByUUIDString(vm.uuid) - except libvirt.libvirtError: - logger.exception('Cannot connect to libvirt') - raise - try: pid = os.fork() except OSError: @@ -373,6 +357,29 @@ class Handler(HostHandler): if pid == 0: # child # FIXME we should close all unused fds + # create a new libvirt connection dedicated to migration + try: + new_con = libvirt.open('qemu:///system') + domain = new_con.lookupByUUIDString(vm.uuid) + except libvirt.libvirtError: + sys.stderr.write('Cannot connect to libvirt\n') + os._exit(4) + except: + # error + # TODO print traceback + os._exit(2) + try: + dest_virt_con = libvirt.open( + 'qemu+tcp://127.0.0.1:%d/system' % remote_virt_port) + except libvirt.libvirtError: + sys.stderr.write('Cannot connect to remote libvirt for live' + ' migrating vm %s', name) + os._exit(5) + except: + # error + # TODO print traceback + os._exit(2) + try: if unsafe: # VIR_MIGRATE_UNSAFE is not defined for libvirt < 0.9.11 @@ -398,6 +405,7 @@ class Handler(HostHandler): else: os._exit(0) finally: + new_con.close() dest_virt_con.close() else: # watch for migration status every second @@ -437,7 +445,13 @@ class Handler(HostHandler): logger.error('Migration timeout for vm %s', name) raise VMMigrationError('Timeout') else: - if status != 0: + if status == 4: + raise VMMigrationError('Cannot open new connection to' + ' libvirt') + elif status == 5: + raise VMMigrationError('Cannot open connection to' + ' remote libvirt') + elif status != 0: # error logger.error('Libvirt error while live migrating vm %s', name)