Re: [RFC]Re: [libvirt] [RFC][PATCH] virt-managercallsmigrationAPI

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxxx>

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

Attachment: migrate_submenu.patch
Description: Binary data

_______________________________________________
et-mgmt-tools mailing list
et-mgmt-tools@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/et-mgmt-tools

[Index of Archives]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux