Skip to content
Snippets Groups Projects
Commit 84cd62db authored by Anael Beutot's avatar Anael Beutot
Browse files

Add handler for live migration.

parent be0ca650
No related branches found
No related tags found
No related merge requests found
......@@ -106,6 +106,7 @@ class Handler(HostHandler):
self.main.reset_handler('vm_start', self.vm_start)
self.main.reset_handler('vm_suspend', self.vm_suspend)
self.main.reset_handler('vm_resume', self.vm_resume)
self.main.reset_handler('vm_migrate_tunneled', self.vm_migrate_tunneled)
self.main.reset_handler('vol_create', self.vol_create)
self.main.reset_handler('vol_delete', self.vol_delete)
self.main.reset_handler('vol_import', self.vol_import)
......@@ -156,6 +157,7 @@ class Handler(HostHandler):
self.main.remove_handler('vm_start')
self.main.remove_handler('vm_suspend')
self.main.remove_handler('vm_resume')
self.main.remove_handler('vm_migrate_tunneled')
self.main.remove_handler('vol_create')
self.main.remove_handler('vol_delete')
self.main.remove_handler('vol_import')
......@@ -267,6 +269,68 @@ class Handler(HostHandler):
logger.error(msg)
raise UndefinedDomain(msg)
def vm_migrate_tunneled(self, name, tun_res, migtun_res, unsafe=False):
"""Live migrate VM through TCP tunnel.
:param name: VM name to migrate
:param tun_res: result of tunnel_setup handler
:param migtun_res: result of tunnel setup handler
:param unsafe: for Libvirt >= 0.9.11, see
http://libvirt.org/html/libvirt-libvirt.html#virDomainMigrateFlags
"""
logger.debug('VM live migrate %s', name)
try:
remote_virt_port = tun_res['port']
except KeyError:
logger.error('Invalid formatted argument tun_res for live'
' migration')
raise
try:
remote_hv_port = migtun_res['port']
except KeyError:
logger.error('Invalid formatted argument migtun_res for live'
' migration')
raise
try:
vm = self.hypervisor.domains[name]
except KeyError:
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
try:
if unsafe:
# VIR_MIGRATE_UNSAFE is not defined for libvirt < 0.9.11
append_flags = getattr(libvirt, 'VIR_MIGRATE_UNSAFE', 0)
else:
append_flags = 0
vm.lv_dom.migrate(
dest_virt_con,
libvirt.VIR_MIGRATE_LIVE | libvirt.VIR_MIGRATE_PEER2PEER |
libvirt.VIR_MIGRATE_TUNNELLED |
libvirt.VIR_MIGRATE_PERSIST_DEST |
libvirt.VIR_MIGRATE_UNDEFINE_SOURCE |
append_flags,
None,
'qemu+tcp://127.0.0.1:%d/system' % remote_hv_port,
0,
)
except libvirt.libvirtError:
# FIXME maybe we should catch some weird crap libvirt bad exception
logger.exception('Libvirt error while live migrating vm %s', name)
raise
finally:
dest_virt_con.close()
logger.debug('Sucessfuly live migrated vm %s', name)
def vol_create(self, pool, name, size):
logger.debug('Volume create %s, pool %s, size %s', name, pool, size)
try:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment