[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