def vm_changed(self, vm): row = self.get_row(vm) if row is None: return # pragma: no cover try: if vm == self.current_vm(): self.update_current_selection() name = vm.get_name_or_title() status = vm.run_status() row[ROW_SORT_KEY] = name row[ROW_STATUS_ICON] = vm.run_status_icon_name() row[ROW_IS_VM_RUNNING] = vm.is_active() row[ROW_MARKUP] = self._build_vm_markup(name, status) desc = vm.get_description() row[ROW_HINT] = xmlutil.xml_escape(desc) except Exception as e: # pragma: no cover if vm.conn.support.is_libvirt_error_no_domain(e): return raise self.vm_row_updated(vm)
def _build_row(self, conn, vm): if conn: name = conn.get_pretty_desc() markup = self._build_conn_markup(conn, name) status = ("<span size='smaller'>%s</span>" % conn.get_state_text()) status_icon = None hint = self._build_conn_hint(conn) color = self._build_conn_color(conn) os_icon = None else: name = vm.get_name_or_title() status = vm.run_status() markup = self._build_vm_markup(name, status) status_icon = vm.run_status_icon_name() hint = vm.get_description() color = None os_icon = _get_inspection_icon_pixbuf(vm, 16, 16) row = [] row.insert(ROW_HANDLE, conn or vm) row.insert(ROW_SORT_KEY, name) row.insert(ROW_MARKUP, markup) row.insert(ROW_STATUS_ICON, status_icon) row.insert(ROW_HINT, xmlutil.xml_escape(hint)) row.insert(ROW_IS_CONN, bool(conn)) row.insert(ROW_IS_CONN_CONNECTED, bool(conn) and not conn.is_disconnected()) row.insert(ROW_IS_VM, bool(vm)) row.insert(ROW_IS_VM_RUNNING, bool(vm) and vm.is_active()) row.insert(ROW_COLOR, color) row.insert(ROW_INSPECTION_OS_ICON, os_icon) return row
def _build_conn_menuitem(self, conn): menu_item = Gtk.MenuItem.new_with_label(conn.get_pretty_desc()) if conn.is_active(): label = menu_item.get_child() markup = "<b>%s</b>" % xmlutil.xml_escape(conn.get_pretty_desc()) label.set_markup(markup) menu = Gtk.Menu() vms = conn.list_vms() vms.sort(key=lambda v: v.get_name_or_title()) for vm in vms: menu.add(self._build_vm_menuitem(vm)) if not vms: vmitem = Gtk.MenuItem.new_with_label(_("No virtual machines")) vmitem.set_sensitive(False) menu.add(vmitem) menu.add(Gtk.SeparatorMenuItem()) if conn.is_active(): citem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_DISCONNECT, None) citem.connect("activate", _conn_disconnect_cb, conn.get_uri()) else: citem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CONNECT, None) citem.connect("activate", _conn_connect_cb, conn.get_uri()) menu.add(citem) menu_item.set_submenu(menu) return menu_item
def _reset_state(self): title_str = ("<span size='large' color='white'>%s '%s'</span>" % (_("Migrate"), xmlutil.xml_escape(self.vm.get_name()))) self.widget("header-label").set_markup(title_str) self.widget("migrate-advanced-expander").set_expanded(False) self.widget("migrate-cancel").grab_focus() self.widget("config-box").set_visible(True) hostname = self.conn.libvirt_gethostname() srctext = "%s (%s)" % (hostname, self.conn.get_pretty_desc()) self.widget("migrate-label-name").set_text(self.vm.get_name_or_title()) self.widget("migrate-label-src").set_text(srctext) self.widget("migrate-label-src").set_tooltip_text(self.conn.get_uri()) self.widget("migrate-set-address").set_active(True) self.widget("migrate-set-address").emit("toggled") self.widget("migrate-set-port").set_active(True) self.widget("migrate-mode").set_active(0) self.widget("migrate-unsafe").set_active(False) self.widget("migrate-temporary").set_active(False) if self.conn.is_xen(): # Default xen port is 8002 self.widget("migrate-port").set_value(8002) else: # QEMU migrate port range is 49152+64 self.widget("migrate-port").set_value(49152) self._populate_destconn()
def get_markup(self, vm): lines = [] line = "" path = self.get_orig_disk_path() if path: line += path else: line += _("No storage.") lines.append(line) line = "" if self.is_share_requested(): line += _("Share disk with %s") % vm.get_name() if self.is_clone_requested(): line += _("Clone this disk") sizelabel = self.get_size_label() if sizelabel: line += " (%s)" % sizelabel if line: lines.append(line) label = "\n".join(lines) markup = "<small>%s</small>" % xmlutil.xml_escape(label) return markup
def _init_state(self): os_list = self.widget("os-list") # (os object, label) os_list_model = Gtk.ListStore(object, str) all_os = virtinst.OSDB.list_os(sortkey="label") # Always put the generic entries at the end of the list all_os = list(sorted(all_os, key=_always_show)) for os in all_os: os_list_model.append([os, "%s (%s)" % (os.label, os.name)]) model_filter = Gtk.TreeModelFilter(child_model=os_list_model) model_filter.set_visible_func(self._filter_os_cb) os_list.set_model(model_filter) nameCol = Gtk.TreeViewColumn(_("Name")) nameCol.set_spacing(6) text = Gtk.CellRendererText() nameCol.pack_start(text, True) nameCol.add_attribute(text, 'text', 1) os_list.append_column(nameCol) markup = "<small>%s</small>" % xmlutil.xml_escape( self.widget("eol-warn").get_text()) self.widget("eol-warn").set_markup(markup)
def _reset_state(self): # Set VM name or disk.target in title' if self.disk: text = self.disk.target else: text = self.vm.get_name() title_str = ("<span size='large' color='white'>%s '%s'</span>" % (_("Delete"), xmlutil.xml_escape(text))) self.widget("header-label").set_markup(title_str) self.topwin.resize(1, 1) self.widget("delete-cancel").grab_focus() # Show warning message if VM is running vm_active = self.vm.is_active() and not self.disk uiutil.set_grid_row_visible( self.widget("delete-warn-running-vm-box"), vm_active) # Enable storage removal by default self.widget("delete-remove-storage").set_active(True) self.widget("delete-remove-storage").toggled() if self.disk: diskdatas = [_DiskData.from_disk(self.disk)] else: diskdatas = _build_diskdata_for_vm(self.vm) _populate_storage_list(self.widget("delete-storage-list"), self.vm, self.vm.conn, diskdatas)
def _set_snapshot_state(self, snap=None): self.widget("snapshot-notebook").set_current_page(0) xmlobj = snap and snap.get_xmlobj() or None name = snap and xmlobj.name or "" desc = snap and xmlobj.description or "" state = snap and snap.run_status() or "" icon = snap and snap.run_status_icon_name() or None is_external = snap and snap.is_external() or False is_current = snap and snap.is_current() or False timestamp = "" if snap: timestamp = str( datetime.datetime.fromtimestamp(xmlobj.creationTime)) title = "" if name: title = (_("<b>Snapshot '%(name)s':</b>") % { "name": xmlutil.xml_escape(name) }) uiutil.set_grid_row_visible(self.widget("snapshot-is-current"), is_current) self.widget("snapshot-title").set_markup(title) self.widget("snapshot-timestamp").set_text(timestamp) self.widget("snapshot-description").get_buffer().set_text(desc) self.widget("snapshot-status-text").set_text(state) if icon: self.widget("snapshot-status-icon").set_from_icon_name( icon, Gtk.IconSize.BUTTON) uiutil.set_grid_row_visible(self.widget("snapshot-mode"), is_external) if is_external: is_mem = xmlobj.memory_type == "external" is_disk = [d.snapshot == "external" for d in xmlobj.disks] if is_mem and is_disk: mode = _("External disk and memory") elif is_mem: mode = _("External memory only") else: mode = _("External disk only") self.widget("snapshot-mode").set_text(mode) sn = self._read_screenshot_file(name) self.widget("snapshot-screenshot").set_visible(bool(sn)) self.widget("snapshot-screenshot-label").set_visible(not bool(sn)) if sn: self.widget("snapshot-screenshot").set_from_pixbuf(sn) self.widget("snapshot-add").set_sensitive(True) self.widget("snapshot-delete").set_sensitive(bool(snap)) self.widget("snapshot-start").set_sensitive(bool(snap)) self.widget("snapshot-apply").set_sensitive(False) self._unapplied_changes = False
def _build_conn_markup(self, conn, name): name = xmlutil.xml_escape(name) text = name if conn.is_disconnected(): text = _("%(connection)s - Not Connected") % {"connection": name} elif conn.is_connecting(): text = _("%(connection)s - Connecting...") % {"connection": name} markup = "<span size='smaller'>%s</span>" % text return markup
def _build_conn_markup(self, conn, name): name = xmlutil.xml_escape(name) text = name if conn.is_disconnected(): text += " - " + _("Not Connected") elif conn.is_connecting(): text += " - " + _("Connecting...") markup = "<span size='smaller'>%s</span>" % text return markup
def _set_conn_state(self, menu_item, conn): label = menu_item.get_child() if conn.is_active(): label = menu_item.get_child() markup = "<b>%s</b>" % xmlutil.xml_escape(conn.get_pretty_desc()) label.set_markup(markup) else: label.set_text(conn.get_pretty_desc()) connect_item = self._find_lookupkey(menu_item.get_submenu(), 1) disconnect_item = self._find_lookupkey(menu_item.get_submenu(), 2) connect_item.set_visible(conn.is_active()) disconnect_item.set_visible(not conn.is_active())
def reset_state(self): # Set VM name in title' title_str = ("<span size='large' color='white'>%s '%s'</span>" % (_("Delete"), xmlutil.xml_escape(self.vm.get_name()))) self.widget("header-label").set_markup(title_str) self.topwin.resize(1, 1) self.widget("delete-cancel").grab_focus() # Show warning message if VM is running vm_active = self.vm.is_active() uiutil.set_grid_row_visible(self.widget("delete-warn-running-vm-box"), vm_active) # Enable storage removal by default self.widget("delete-remove-storage").set_active(True) self.widget("delete-remove-storage").toggled() populate_storage_list(self.widget("delete-storage-list"), self.vm, self.vm.conn)
def _reset_state(self): # Set VM name or disk.target in title' text = self._get_dialog_text() title_str = ("<span size='large'>%s</span>" % xmlutil.xml_escape(text)) self.widget("header-label").set_markup(title_str) self.topwin.resize(1, 1) self.widget("delete-cancel").grab_focus() # Show warning message if VM is running vm_active = self._vm_active_status() uiutil.set_grid_row_visible(self.widget("delete-warn-running-vm-box"), vm_active) # Enable storage removal by default remove_storage_default = self._get_remove_storage_default() self.widget("delete-remove-storage").set_active(remove_storage_default) self.widget("delete-remove-storage").toggled() diskdatas = self._get_disk_datas() _populate_storage_list(self.widget("delete-storage-list"), self.vm, self.vm.conn, diskdatas)
def _sync_ui(self): fstype = uiutil.get_list_selection(self.widget("fs-type-combo")) fsdriver = uiutil.get_list_selection(self.widget("fs-driver-combo")) is_qemu = self.conn.is_qemu() or self.conn.is_test() show_ram_source = fstype == DeviceFilesystem.TYPE_RAM uiutil.set_grid_row_visible(self.widget("fs-ram-source-box"), show_ram_source) uiutil.set_grid_row_visible(self.widget("fs-source-box"), not show_ram_source) show_format = bool(fsdriver == DeviceFilesystem.DRIVER_NBD) uiutil.set_grid_row_visible(self.widget("fs-format-combo"), show_format) show_driver_combo = is_qemu or fstype == DeviceFilesystem.TYPE_FILE if fstype == DeviceFilesystem.TYPE_TEMPLATE: source_text = _("Te_mplate:") else: source_text = _("_Source path:") self.widget("fs-source-title").set_text(source_text) self.widget("fs-source-title").set_use_underline(True) uiutil.set_grid_row_visible(self.widget("fs-type-combo"), not is_qemu) uiutil.set_grid_row_visible(self.widget("fs-driver-combo"), show_driver_combo) need_shared_mem = fsdriver == "virtiofs" have_shared_mem, _shared_mem_err = self.vm.has_shared_mem() show_shared_mem_warn = need_shared_mem and not have_shared_mem uiutil.set_grid_row_visible(self.widget("fs-driver-warn-box"), show_shared_mem_warn) if show_shared_mem_warn: label = _( "You may need to 'Enable shared memory' on the 'Memory' screen." ) self.widget("fs-driver-warn").set_markup("<small>%s</small>" % xmlutil.xml_escape(label))
def _build_vm_markup(self, name, status): domtext = ("<span size='smaller' weight='bold'>%s</span>" % xmlutil.xml_escape(name)) statetext = "<span size='smaller'>%s</span>" % status return domtext + "\n" + statetext