Loading ccnode/hypervisor/__init__.py +64 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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') Loading Loading @@ -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: Loading Loading
ccnode/hypervisor/__init__.py +64 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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') Loading Loading @@ -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: Loading