From 3d2afbaf6f634cca5deeec12eb704340502720ed Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Sat, 11 Apr 2015 13:39:25 -0400 Subject: [PATCH] connection: Allow setting a custom 'pretty name' (bz 784701) We've had multiple requests over the years for something similar. People might have to connect to multiple IP addresses, or really large hostnames, that become difficult to distinguish in the UI. Add a field in the host details page that allows setting a custom name, and store it in gsettings. --- .../org.virt-manager.virt-manager.gschema.xml | 11 ++ ui/host.ui | 101 ++++++++++-------- virtManager/config.py | 52 ++++++++- virtManager/connection.py | 31 +++++- virtManager/host.py | 21 ++-- virtManager/manager.py | 5 +- 6 files changed, 157 insertions(+), 64 deletions(-) diff --git a/data/org.virt-manager.virt-manager.gschema.xml b/data/org.virt-manager.virt-manager.gschema.xml index 2fede6cb1..411c8126d 100644 --- a/data/org.virt-manager.virt-manager.gschema.xml +++ b/data/org.virt-manager.virt-manager.gschema.xml @@ -27,6 +27,17 @@ + + + + + '' + Custom connection description + Custom connection description, used in the manager window. If empty, the app generates a default on demand. + + + + diff --git a/ui/host.ui b/ui/host.ui index 8f5c762b7..f69c1d43a 100644 --- a/ui/host.ui +++ b/ui/host.ui @@ -130,14 +130,12 @@ False 20 - + True False 3 - 4 - 2 - 6 3 + 6 True @@ -146,10 +144,8 @@ 1 - 1 - 2 - GTK_FILL - + 0 + 2 @@ -160,10 +156,8 @@ 1 - 2 - 3 - GTK_FILL - + 0 + 3 @@ -177,10 +171,7 @@ 1 - 2 - 1 - 2 - + 2 @@ -192,23 +183,20 @@ 1 - 2 - 2 - 3 - + 3 True False - Connection URI: + Libvirt URI: 1 1 - GTK_FILL - + 0 + 1 @@ -222,25 +210,7 @@ 1 - 2 - GTK_FILL - - - - - - True - False - A_utoconnect: - True - config-autoconnect - 1 - - - 3 - 4 - GTK_FILL - + 1 @@ -255,11 +225,48 @@ 1 - 2 - 3 - 4 - GTK_FILL - + 4 + + + + + True + True + 30 + + + + 1 + 0 + + + + + True + False + _Name: + True + overview-name + 1 + 1 + + + 0 + 0 + + + + + True + False + A_utoconnect: + True + config-autoconnect + 1 + + + 0 + 4 diff --git a/virtManager/config.py b/virtManager/config.py index 54cb8a5c1..397cf2349 100644 --- a/virtManager/config.py +++ b/virtManager/config.py @@ -50,15 +50,32 @@ class SettingsWrapper(object): return settingskey, value def make_vm_settings(self, key): + """ + Initialize per-VM relocatable schema if necessary + """ settingskey = self._parse_key(key)[0] - if settingskey in self._settingsmap: return True schema = self._root + ".vm" path = "/" + self._root.replace(".", "/") + key.rsplit("/", 1)[0] + "/" - self._settingsmap[settingskey] = Gio.Settings.new_with_path(schema, - path) + self._settingsmap[settingskey] = Gio.Settings.new_with_path( + schema, path) + return True + + def make_conn_settings(self, key): + """ + Initialize per-conn relocatable schema if necessary + """ + settingskey = self._parse_key(key)[0] + if settingskey in self._settingsmap: + return True + + schema = self._root + ".connection" + path = "/" + self._root.replace(".", "/") + key.rsplit("/", 1)[0] + "/" + print schema, path + self._settingsmap[settingskey] = Gio.Settings.new_with_path( + schema, path) return True def _find_settings(self, key): @@ -212,6 +229,11 @@ class vmmConfig(object): def get_objects(self): return self._objects[:] + + ##################################### + # Wrappers for setting per-VM value # + ##################################### + def _make_pervm_key(self, uuid, key): return "/vms/%s%s" % (uuid.replace("-", ""), key) @@ -232,6 +254,30 @@ class vmmConfig(object): return self.conf.get(key) + ######################################## + # Wrappers for setting per-conn values # + ######################################## + + def _make_perconn_key(self, uri, key): + return "/conns/%s%s" % (uri.replace("/", ""), key) + + def listen_perconn(self, uri, key, *args, **kwargs): + key = self._make_perconn_key(uri, key) + self.conf.make_conn_settings(key) + return self.conf.notify_add(key, *args, **kwargs) + + def set_perconn(self, uri, key, *args, **kwargs): + key = self._make_perconn_key(uri, key) + self.conf.make_conn_settings(key) + ret = self.conf.set(key, *args, **kwargs) + return ret + + def get_perconn(self, uri, key): + key = self._make_perconn_key(uri, key) + self.conf.make_conn_settings(key) + return self.conf.get(key) + + ################### # General helpers # ################### diff --git a/virtManager/connection.py b/virtManager/connection.py index dd7ff9790..f6bf6802e 100644 --- a/virtManager/connection.py +++ b/virtManager/connection.py @@ -191,6 +191,10 @@ class vmmConnection(vmmGObject): self.record = [] self.hostinfo = None + self.add_gsettings_handle( + self._on_config_pretty_name_changed( + self._config_pretty_name_changed_cb)) + self._init_virtconn() @@ -368,6 +372,8 @@ class vmmConnection(vmmGObject): Return a pretty label for use in the manager view, and various connection lists. """ + if self._get_config_pretty_name(): + return self._get_config_pretty_name() if self._backend.fake_name(): return self._backend.fake_name() @@ -811,11 +817,6 @@ class vmmConnection(vmmGObject): # Connection closing/opening methods # ###################################### - def get_autoconnect(self): - return self.config.get_conn_autoconnect(self.get_uri()) - def set_autoconnect(self, val): - self.config.set_conn_autoconnect(self.get_uri(), val) - def _schedule_close(self): self._closing = True self.idle_add(self.close) @@ -1351,3 +1352,23 @@ class vmmConnection(vmmGObject): return self.disk_read_rate() + self.disk_write_rate() def disk_io_max_rate(self): return self._get_record_helper("diskMaxRate") + + + ########################### + # Per-conn config helpers # + ########################### + + def get_autoconnect(self): + return self.config.get_conn_autoconnect(self.get_uri()) + def set_autoconnect(self, val): + self.config.set_conn_autoconnect(self.get_uri(), val) + + def set_config_pretty_name(self, value): + self.config.set_perconn(self.get_uri(), "/pretty-name", value) + def _get_config_pretty_name(self): + return self.config.get_perconn(self.get_uri(), "/pretty-name") + def _on_config_pretty_name_changed(self, *args, **kwargs): + return self.config.listen_perconn(self.get_uri(), "/pretty-name", + *args, **kwargs) + def _config_pretty_name_changed_cb(self): + self.emit("state-changed") diff --git a/virtManager/host.py b/virtManager/host.py index 0864c8626..6253fbcd9 100644 --- a/virtManager/host.py +++ b/virtManager/host.py @@ -60,9 +60,7 @@ class vmmHost(vmmGObjectUI): vmmGObjectUI.__init__(self, "host.ui", "vmm-host") self.conn = conn - self.title = conn.get_pretty_desc() + " " + self.topwin.get_title() - self.topwin.set_title(self.title) - + self._orig_title = self.topwin.get_title() self.ICON_RUNNING = "state_running" self.ICON_SHUTOFF = "state_shutoff" @@ -107,6 +105,7 @@ class vmmHost(vmmGObjectUI): "on_interface_apply_clicked" : (lambda *x: self.interface_apply()), "on_interface_list_changed": self.interface_selected, + "on_overview_name_changed": self._overview_name_changed, "on_config_autoconnect_toggled": self.toggle_autoconnect, "on_qos_inbound_average_changed": (lambda *x: @@ -325,6 +324,12 @@ class vmmHost(vmmGObjectUI): def conn_state_changed(self, ignore1=None): conn_active = self.conn.is_active() + + self.topwin.set_title( + self.conn.get_pretty_desc() + " " + self._orig_title) + if not self.widget("overview-name").has_focus(): + self.widget("overview-name").set_text(self.conn.get_pretty_desc()) + self.widget("menu_file_restore_saved").set_sensitive(conn_active) self.widget("net-add").set_sensitive(conn_active and self.conn.is_network_capable()) @@ -356,13 +361,17 @@ class vmmHost(vmmGObjectUI): if self.addnet: self.addnet.close() + def _overview_name_changed(self, src): + src = self.widget("overview-name") + self.conn.set_config_pretty_name(src.get_text()) + def toggle_autoconnect(self, src): self.conn.set_autoconnect(src.get_active()) - # ------------------------- - # Virtual Network functions - # ------------------------- + ############################# + # Virtual Network functions # + ############################# def delete_network(self, src_ignore): net = self.current_network() diff --git a/virtManager/manager.py b/virtManager/manager.py index 0612ed4f4..7aaaddbf4 100644 --- a/virtManager/manager.py +++ b/virtManager/manager.py @@ -804,10 +804,9 @@ class vmmManager(vmmGObjectUI): it = model.iter_next(it) - def conn_state_changed(self, conn, newname=None): + def conn_state_changed(self, conn): row = self.rows[conn.get_uri()] - if newname: - row[ROW_SORT_KEY] = newname + row[ROW_SORT_KEY] = conn.get_pretty_desc() row[ROW_MARKUP] = self._build_conn_markup(conn, row[ROW_SORT_KEY]) row[ROW_IS_CONN_CONNECTED] = not conn.is_disconnected() row[ROW_COLOR] = self._build_conn_color(conn)