Exemple #1
0
    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
Exemple #3
0
    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
Exemple #4
0
    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()
Exemple #5
0
    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
Exemple #6
0
    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)
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #11
0
    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())
Exemple #12
0
    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)
Exemple #13
0
    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)
Exemple #14
0
    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))
Exemple #15
0
 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