S.Sakamoto wrote:
> 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.
>
Okay, this looks good, I've committed this:
http://hg.et.redhat.com/virt/applications/virt-manager--devel?cs=f47cf079e311
Though I had a few more small issues with the code. I
worked up a patch (attached) that fixes them.
There was a bug when trying to migrate from the manager
view: the migrate connection list won't update correctly
if clicking around between different VM's on different
connections. The fix was just to populate the migrate
menu on demand, rather than when a new VM was selected.
The other change was to actually list unusable connections
in the migrate list, but have them as inactive list entries:
http://fedorapeople.org/~crobinso/virt-manager/virt-manager-migrate.png
The disabled list entries also have tooltips which explain
why they are disabled. I think this will be more clear to
users if there are invalid connections.
Do you think this is an okay change?
Thanks,
Cole
details.py | 22 +--------------------
engine.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++------------
manager.py | 28 +++------------------------
3 files changed, 57 insertions(+), 56 deletions(-)
diff -r 10a90110ebf3 src/virtManager/details.py
--- a/src/virtManager/details.py Thu Oct 30 15:56:47 2008 -0400
+++ b/src/virtManager/details.py Thu Oct 30 16:37:20 2008 -0400
@@ -132,13 +132,8 @@
menu = gtk.Menu()
self.window.get_widget("control-shutdown").set_menu(menu)
-
+
self.migrate_menu_items = {}
-
- self.migrate_menu_items["(None)"] = gtk.ImageMenuItem(_("(None)"))
- self.migrate_menu_items["(None)"].show()
- self.migrate_menu_items["(None)"].set_sensitive(False)
- self.window.get_widget("details-menu-migrate_menu").add(self.migrate_menu_items["(None)"])
rebootimg = gtk.Image()
rebootimg.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() + "/icon_shutdown.png", 18, 18))
@@ -681,20 +676,7 @@
def set_migrate_menu(self):
menu = self.window.get_widget("details-menu-migrate_menu")
- # clear migrate-submenu
- for submenu_item in menu.get_children():
- submenu_item_name = submenu_item.get_image().get_stock()[0]
- menu.remove(self.migrate_menu_items[submenu_item_name])
-
- available_migrate_hostnames = self.engine.get_available_migrate_hostnames()
- if len(available_migrate_hostnames) == 0:
- menu.add(self.migrate_menu_items["(None)"])
- else:
- for hostname in available_migrate_hostnames.values():
- self.migrate_menu_items[hostname] = gtk.ImageMenuItem(hostname)
- self.migrate_menu_items[hostname].show()
- self.migrate_menu_items[hostname].connect("activate", self.control_vm_migrate)
- menu.add(self.migrate_menu_items[hostname])
+ self.engine.populate_migrate_menu(menu, self.control_vm_migrate)
def set_pause_widget_states(self, state):
try:
diff -r 10a90110ebf3 src/virtManager/engine.py
--- a/src/virtManager/engine.py Thu Oct 30 15:56:47 2008 -0400
+++ b/src/virtManager/engine.py Thu Oct 30 16:37:20 2008 -0400
@@ -569,26 +569,65 @@
migrate_progress.set_title(" ")
return migrate_progress
+ def populate_migrate_menu(self, menu, migrate_func):
+ conns = self.get_available_migrate_hostnames()
+
+ # Clear menu
+ for item in menu:
+ menu.remove(item)
+
+ for key, val_list in conns.items():
+ can_migrate, label, tooltip = val_list
+ mitem = gtk.ImageMenuItem(label)
+ mitem.set_sensitive(can_migrate)
+ mitem.connect("activate", migrate_func)
+ if tooltip:
+ mitem.set_tooltip_text(tooltip)
+ mitem.show()
+
+ menu.add(mitem)
+
+ if len(menu) == 0:
+ mitem = gtk.ImageMenuItem(_("No connections available."))
+ mitem.show()
+ menu.add(mitem)
+
def get_available_migrate_hostnames(self):
hostname = self.windowManager.current_connection().get_hostname()
driver = self.windowManager.current_connection().get_driver()
+ uri = self.windowManager.current_connection().get_uri()
available_migrate_hostnames = {}
+ # Returns list of lists of the form
+ # [ Can we migrate to this connection?,
+ # String to use as list entry,
+ # Tooltip reason ]
+
# 1. connected(ACTIVE, INACTIVE) host
- for key in self.connections.keys():
- if self.connections[key].has_key("connection") is True \
- and (self.get_connection(key).get_state() == vmmConnection.STATE_ACTIVE or self.get_connection(key).get_state() == vmmConnection.STATE_INACTIVE):
- available_migrate_hostnames[key] = self.get_connection(key).get_hostname()
+ for key, value in self.connections.items():
+ if not value.has_key("connection"):
+ continue
+ conn = value["connection"]
- # 2. remove source host
- for key in available_migrate_hostnames.keys():
- if available_migrate_hostnames[key] == hostname:
- del available_migrate_hostnames[key]
+ can_migrate = False
+ desc = "%s (%s)" % (conn.get_hostname(), conn.get_driver())
+ reason = ""
- # 3. remove a different host of hypervisor
- for key in available_migrate_hostnames.keys():
- if self.get_connection(key).get_driver() != driver:
- del available_migrate_hostnames[key]
+ if conn.get_driver() != driver:
+ reason = _("Connection hypervisors do not match.")
+ elif conn.get_state() == vmmConnection.STATE_DISCONNECTED:
+ reason = _("Connection is disconnected.")
+ elif key == uri:
+ reason = _("Cannot migrate to same connection.")
+
+ # Explicitly don't include this in the list
+ continue;
+ elif conn.get_state() == vmmConnection.STATE_ACTIVE:
+ # Assumably we can migrate to this connection
+ can_migrate = True
+
+
+ available_migrate_hostnames[key] = [can_migrate, desc, reason]
return available_migrate_hostnames
diff -r 10a90110ebf3 src/virtManager/manager.py
--- a/src/virtManager/manager.py Thu Oct 30 15:56:47 2008 -0400
+++ b/src/virtManager/manager.py Thu Oct 30 16:37:20 2008 -0400
@@ -159,7 +159,6 @@
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"])
@@ -211,12 +210,9 @@
self.vmmenu_items["migrate"] = gtk.ImageMenuItem("_Migrate")
self.vmmenu_items["migrate"].set_submenu(self.vmmenumigrate)
self.vmmenu_items["migrate"].show()
+ self.vmmenu_items["migrate"].connect("activate",
+ self.set_migrate_submenu)
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();
@@ -746,7 +742,6 @@
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)
@@ -755,7 +750,6 @@
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()
@@ -764,7 +758,6 @@
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:
@@ -1088,21 +1081,8 @@
if vm is not None:
self.emit("action-migrate-domain", vm.get_connection().get_uri(), vm.get_uuid(), host_uri)
- def set_migrate_submenu(self):
- # clear migrate-submenu
- for submenu_item in self.vmmenumigrate.get_children():
- submenu_item_name = submenu_item.get_image().get_stock()[0]
- self.vmmenumigrate.remove(self.vmmenumigrate_items[submenu_item_name])
-
- available_migrate_hostnames = self.engine.get_available_migrate_hostnames()
- if len(available_migrate_hostnames) == 0:
- self.vmmenumigrate.add(self.vmmenumigrate_items["(None)"])
- else:
- for hostname in available_migrate_hostnames.values():
- self.vmmenumigrate_items[hostname] = gtk.ImageMenuItem(hostname)
- self.vmmenumigrate_items[hostname].show()
- self.vmmenumigrate_items[hostname].connect("activate", self.migrate)
- self.vmmenumigrate.add(self.vmmenumigrate_items[hostname])
+ def set_migrate_submenu(self, src):
+ self.engine.populate_migrate_menu(self.vmmenumigrate, self.migrate)
def _add_connection(self, engine, conn):
conn.connect("vm-added", self.vm_added)
_______________________________________________
et-mgmt-tools mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/et-mgmt-tools