[et-mgmt-tools] [PATCH][RFC](take2)Add "Migrate" to VirtualMachine-menu in the individual VM view
S.Sakamoto
fj0588di at aa.jp.fujitsu.com
Fri Oct 24 08:29:29 UTC 2008
Hi, Cole
I cleared all the problems about your comment.
I show the following the summary of this patch
and a problem about doing "Migrate" from individual VM view.
[Summary]
1. Move the logic that get available host from manager.py to engnine.py.
2. Don't show a host of the different hypervisor in available host list.
3. Change the message from "is migrated from" to "will be migrated from".
4. Add "Migrate" to VirtualMachine-menu in the individual VM view.
VirtualMachine
|
+- Run
Pause
Shutdown
Save
---------------
Migrate ----> host1.example.com
--------------- host2.example.com
Take Screenshot host3.example.com
[Problem]
After I do "Migrate" from the individual VM view,
the view shows a information of the VM on not destination host.
But, I think that the view should show a information of the VM
on destination host.
How about this problem?
Thanks,
Shigeki Sakamoto.
> Hi, Cole
>
> Thank you for your comment.
>
> I fix the following three points about Migrate patch.
>
> 1. Move the logic that get available host from manager.py to engnine.py.
>
> 2. Don't show a host of the different hypervisor in available host list.
>
> 3. Change the message from "is migrated from" to "will be migrated from".
>
> This patch only can migrate from sub-menu.
> I understand that it is necessary to add migrate to the 'Virtual Machine' menu
> in the individual VM view.
> But, Just now, I can't focus on that. So, anybody's patch are welcome.
>
>
> Signed-off-by: Shigeki Sakamoto <fj0588di at aa.jp.fujitsu.com>
>
> Thanks,
> Shigeki Sakamoto.
>
>
> >
> > Hi, patch generally looks good. One issue though: how does
> > this handle connections using different hypervisors? Say a local
> > xen and a remote qemu. Obviously we shouldn't be able to
> > migrate between the two but I think this code would allow it.
> >
> > Maybe have the connection list look something like:
> >
> > migrate -> hostname1 (qemu)
> > -> hostname2 (xen)
> >
> > If the hypervisors don't match the entry would be disabled.
> >
> > Also, having the migrate option only available as a right
> > click menu item doesn't seem too transparent. Maybe also
> > list it as an option under the 'Virtual Machine' menu
> > in the individual VM view. If you go this route, you'll want
> > to offload most of the logic to engine.py like is done for
> > shutdown, pause, etc.
> >
> > > diff -r 270e1697b81a src/virtManager/domain.py
> > > --- a/src/virtManager/domain.py Mon Oct 06 13:21:06 2008 -0400
> > > +++ b/src/virtManager/domain.py Wed Oct 08 16:38:05 2008 +0900
> > > @@ -972,4 +972,10 @@ class vmmDomain(gobject.GObject):
> > > # Invalidate cached xml
> > > self.xml = None
> > >
> > > + def migrate(self, dictcon):
> > > + flags = 0
> > > + if self.lastStatus == libvirt.VIR_DOMAIN_RUNNING:
> > > + flags = libvirt.VIR_MIGRATE_LIVE
> > > + self.vm.migrate(self.connection.vmm, flags, None,
> > > dictcon.get_short_hostname(), 0)
> > > +
> > > gobject.type_register(vmmDomain)
> > > diff -r 270e1697b81a src/virtManager/engine.py
> > > --- a/src/virtManager/engine.py Mon Oct 06 13:21:06 2008 -0400
> > > +++ b/src/virtManager/engine.py Wed Oct 08 16:38:05 2008 +0900
> > > @@ -202,6 +202,8 @@ class vmmEngine(gobject.GObject):
> > > self.shutdown_domain(src, uri, uuid)
> > > def _do_reboot_domain(self, src, uri, uuid):
> > > self.reboot_domain(src, uri, uuid)
> > > + def _do_migrate_domain(self, src, uri, uuid, desturi):
> > > + self.migrate_domain(uri, uuid, desturi)
> > > def _do_exit_app(self, src):
> > > self.exit_app()
> > >
> > > @@ -296,6 +298,7 @@ class vmmEngine(gobject.GObject):
> > > self.windowManager.connect("action-shutdown-domain",
> > > self._do_shutdown_domain)
> > > self.windowManager.connect("action-reboot-domain",
> > > self._do_reboot_domain)
> > > self.windowManager.connect("action-destroy-domain",
> > > self._do_destroy_domain)
> > > + self.windowManager.connect("action-migrate-domain",
> > > self._do_migrate_domain)
> > > self.windowManager.connect("action-show-console",
> > > self._do_show_console)
> > > self.windowManager.connect("action-show-details",
> > > self._do_show_details)
> > > self.windowManager.connect("action-show-preferences",
> > > self._do_show_preferences)
> > > @@ -528,6 +531,39 @@ class vmmEngine(gobject.GObject):
> > > else:
> > > logging.warning("Reboot requested, but machine is already
> > > shutting down / shutoff")
> > >
> > > + def migrate_domain(self, uri, uuid, desturi):
> > > + conn = self.get_connection(uri, False)
> > > + vm = conn.get_vm(uuid)
> > > + destconn = self.get_connection(desturi, False)
> > > + migrate_progress = None
> > > + try:
> > > + # show progress dialog
> > > + migrate_progress =
> > > self.get_migrate_progress(vm.get_name(), conn.get_short_hostname(),
> > > destconn.get_short_hostname())
> > > + migrate_progress.show()
> > > + while gtk.events_pending():
> > > + gtk.main_iteration()
> > > + # call virDomainMigrate
> > > + vm.migrate(destconn)
> > > + # close progress dialog
> > > + migrate_progress.destroy()
> > > + except Exception, e:
> > > + migrate_progress.destroy()
> > > + self.err.show_err(_("Error migrating domain: %s") % str(e),
> > > + "".join(traceback.format_exc()))
> > > +
> > > + self.windowManager.conn_refresh_resources(conn)
> > > + self.windowManager.conn_refresh_resources(destconn)
> > > +
> > > + def get_migrate_progress(self, vmname, hostname, desthostname):
> > > + migrate_progress = None
> > > + migrate_progress = gtk.MessageDialog(None, \
> > > +
> > > gtk.DIALOG_DESTROY_WITH_PARENT, \
> > > + gtk.MESSAGE_INFO, \
> > > + gtk.BUTTONS_NONE, \
> > > + _("%s is migrating from
> > > %s to %s." % \
> > > + (vmname, hostname,
> > > desthostname)))
> > > + migrate_progress.set_title(" ")
> > > + return migrate_progress
> > >
> > >
> > > gobject.type_register(vmmEngine)
> > > diff -r 270e1697b81a src/virtManager/manager.py
> > > --- a/src/virtManager/manager.py Mon Oct 06 13:21:06 2008 -0400
> > > +++ b/src/virtManager/manager.py Wed Oct 08 16:38:05 2008 +0900
> > > @@ -101,6 +101,8 @@ class vmmManager(gobject.GObject):
> > > gobject.TYPE_NONE, [str]),
> > > "action-show-help": (gobject.SIGNAL_RUN_FIRST,
> > > gobject.TYPE_NONE, [str]),
> > > + "action-migrate-domain": (gobject.SIGNAL_RUN_FIRST,
> > > + gobject.TYPE_NONE, (str,str,str)),
> > > "action-exit-app": (gobject.SIGNAL_RUN_FIRST,
> > > gobject.TYPE_NONE, []),}
> > >
> > > @@ -154,6 +156,8 @@ class vmmManager(gobject.GObject):
> > > self.vmmenushutdown = gtk.Menu()
> > > self.vmmenu_items = {}
> > > self.vmmenushutdown_items = {}
> > > + self.vmmenumigrate = gtk.Menu()
> > > + self.vmmenumigrate_items = {}
> > >
> > > self.vmmenu_items["run"] = gtk.ImageMenuItem("_Run")
> > > self.vmmenu_items["run"].set_image(self.vmmenu_icons["run"])
> > > @@ -198,9 +202,23 @@ class vmmManager(gobject.GObject):
> > >
> > > self.vmmenushutdown_items["forcepoweroff"].connect("activate",
> > > self.destroy_vm)
> > >
> > > self.vmmenushutdown.add(self.vmmenushutdown_items["forcepoweroff"])
> > >
> > > - self.vmmenu_items["hsep"] = gtk.SeparatorMenuItem()
> > > - self.vmmenu_items["hsep"].show();
> > > - self.vmmenu.add(self.vmmenu_items["hsep"])
> > > + self.vmmenu_items["hsep1"] = gtk.SeparatorMenuItem()
> > > + self.vmmenu_items["hsep1"].show();
> > > + self.vmmenu.add(self.vmmenu_items["hsep1"])
> > > +
> > > + self.vmmenu_items["migrate"] = gtk.ImageMenuItem("_Migrate")
> > > + self.vmmenu_items["migrate"].set_submenu(self.vmmenumigrate)
> > > + self.vmmenu_items["migrate"].show()
> > > + self.vmmenu.add(self.vmmenu_items["migrate"])
> > > +
> > > + self.vmmenumigrate_items["(None)"] =
> > > gtk.ImageMenuItem(_("(None)"))
> > > + self.vmmenumigrate_items["(None)"].show()
> > > + self.vmmenumigrate_items["(None)"].set_sensitive(False)
> > > + self.vmmenumigrate.add(self.vmmenumigrate_items["(None)"])
> > > +
> > > + self.vmmenu_items["hsep2"] = gtk.SeparatorMenuItem()
> > > + self.vmmenu_items["hsep2"].show();
> > > + self.vmmenu.add(self.vmmenu_items["hsep2"])
> > >
> > > self.vmmenu_items["open"] = gtk.ImageMenuItem(gtk.STOCK_OPEN)
> > > self.vmmenu_items["open"].connect("activate",
> > > self.open_vm_console)
> > > @@ -698,6 +716,7 @@ class vmmManager(gobject.GObject):
> > > self.vmmenu_items["resume"].hide()
> > > self.vmmenu_items["resume"].set_sensitive(False)
> > > self.vmmenu_items["shutdown"].set_sensitive(False)
> > > + self.vmmenu_items["migrate"].set_sensitive(False)
> > > else:
> > > if vm.status() == libvirt.VIR_DOMAIN_SHUTOFF:
> > > self.vmmenu_items["run"].set_sensitive(True)
> > > @@ -706,6 +725,8 @@ class vmmManager(gobject.GObject):
> > > self.vmmenu_items["resume"].hide()
> > > self.vmmenu_items["resume"].set_sensitive(False)
> > >
> > > self.vmmenu_items["shutdown"].set_sensitive(False)
> > > + self.vmmenu_items["migrate"].set_sensitive(True)
> > > + self.set_migrate_submenu()
> > > elif vm.status() == libvirt.VIR_DOMAIN_RUNNING:
> > > self.vmmenu_items["run"].set_sensitive(False)
> > > self.vmmenu_items["pause"].set_sensitive(True)
> > > @@ -713,6 +734,8 @@ class vmmManager(gobject.GObject):
> > > self.vmmenu_items["resume"].hide()
> > > self.vmmenu_items["resume"].set_sensitive(False)
> > > self.vmmenu_items["shutdown"].set_sensitive(True)
> > > + self.vmmenu_items["migrate"].set_sensitive(True)
> > > + self.set_migrate_submenu()
> > > elif vm.status() == libvirt.VIR_DOMAIN_PAUSED:
> > > self.vmmenu_items["run"].set_sensitive(False)
> > > self.vmmenu_items["pause"].hide()
> > > @@ -720,6 +743,8 @@ class vmmManager(gobject.GObject):
> > > self.vmmenu_items["resume"].show()
> > > self.vmmenu_items["resume"].set_sensitive(True)
> > > self.vmmenu_items["shutdown"].set_sensitive(True)
> > > + self.vmmenu_items["migrate"].set_sensitive(True)
> > > + self.set_migrate_submenu()
> > > self.vmmenu.popup(None, None, None, 0, event.time)
> > > return False
> > > else:
> > > @@ -1007,6 +1032,53 @@ class vmmManager(gobject.GObject):
> > > if vm is not None:
> > > self.emit("action-resume-domain",
> > > vm.get_connection().get_uri(), vm.get_uuid())
> > >
> > > + def migrate(self, ignore):
> > > + vm = self.current_vm()
> > > + # get selected submenu(destination hostname)
> > > + hostname =
> > > self.vmmenumigrate.get_active().get_image().get_stock()[0]
> > > + for key in self.engine.connections.keys():
> > > + if self.engine.get_connection(key).get_hostname() ==
> > > hostname:
> > > + host_uri = key
> > > + break
> > > + if vm is not None:
> > > + result = self.err.yes_no(_("%s is migrated from %s to %s,
> > > are you sure?") % \
> >
> > Change "is migrated from" to "will be migrated from"
> >
> > The rest looks fine.
> >
> > Thanks,
> > Cole
>
> _______________________________________________
> et-mgmt-tools mailing list
> et-mgmt-tools at redhat.com
> https://www.redhat.com/mailman/listinfo/et-mgmt-tools
>
More information about the et-mgmt-tools
mailing list