Hello community, here is the log from the commit of package virt-manager for openSUSE:Factory checked in at 2020-09-29 19:02:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/virt-manager (Old) and /work/SRC/openSUSE:Factory/.virt-manager.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "virt-manager" Tue Sep 29 19:02:38 2020 rev:210 rq:838334 version:3.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/virt-manager/virt-manager.changes 2020-09-17 14:56:05.416211031 +0200 +++ /work/SRC/openSUSE:Factory/.virt-manager.new.4249/virt-manager.changes 2020-09-29 19:02:53.489852795 +0200 @@ -1,0 +2,10 @@ +Mon Sep 28 08:17:59 MDT 2020 - [email protected] + +- Upstream bug fixes (bsc#1027942) + ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch + a010c49b-cli-Fix-os-variant-help-introspection.patch + 79ebcbcb-viewers-Fix-spice-audio.patch + e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch + 9c13d2f8-Remove-use-of-problematic-terminology.patch + +------------------------------------------------------------------- @@ -4 +14 @@ -- Update to virt-manager 3.0.0 (fate#326786) +- jsc#SLE-16582, Upgrade virt-manager >= 3.x New: ---- 79ebcbcb-viewers-Fix-spice-audio.patch 9c13d2f8-Remove-use-of-problematic-terminology.patch a010c49b-cli-Fix-os-variant-help-introspection.patch ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ virt-manager.spec ++++++ --- /var/tmp/diff_new_pack.qv2EuE/_old 2020-09-29 19:02:54.529854058 +0200 +++ /var/tmp/diff_new_pack.qv2EuE/_new 2020-09-29 19:02:54.537854067 +0200 @@ -32,6 +32,11 @@ Source2: virt-install.desktop Source3: virt-manager-supportconfig # Upstream Patches +Patch1: ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch +Patch2: a010c49b-cli-Fix-os-variant-help-introspection.patch +Patch3: 79ebcbcb-viewers-Fix-spice-audio.patch +Patch4: e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch +Patch5: 9c13d2f8-Remove-use-of-problematic-terminology.patch # SUSE Only Patch70: virtman-desktop.patch Patch71: virtman-kvm.patch @@ -154,6 +159,11 @@ %prep %setup -q # Upstream Patches +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 # SUSE Only %patch70 -p1 %patch71 -p1 ++++++ 79ebcbcb-viewers-Fix-spice-audio.patch ++++++ Subject: viewers: Fix spice audio From: Cole Robinson [email protected] Mon Sep 21 11:35:51 2020 -0400 Date: Mon Sep 21 11:35:51 2020 -0400: Git: 79ebcbcb71d77548443b7943d65bacb216c93769 Commit 1689ebb25 removed what I thought was an unused audio handle in the spice viewer code, but apparently it does something. Strangely some VMs work fine (linux, windows 7), but my windows 10 VMs need this to actually get audio. No clue what that's all about https://bugzilla.redhat.com/show_bug.cgi?id=1881080 Signed-off-by: Cole Robinson <[email protected]> diff --git a/virtManager/details/viewers.py b/virtManager/details/viewers.py index 46ff1431..da9f906d 100644 --- a/virtManager/details/viewers.py +++ b/virtManager/details/viewers.py @@ -476,6 +476,7 @@ class SpiceViewer(Viewer): Viewer.__init__(self, *args, **kwargs) self._spice_session = None self._display = None + self._audio = None self._main_channel = None self._display_channel = None self._usbdev_manager = None @@ -618,6 +619,14 @@ class SpiceViewer(Viewer): self._init_widget() self.emit("connected") + elif (type(channel) in [SpiceClientGLib.PlaybackChannel, + SpiceClientGLib.RecordChannel] and + not self._audio): + # It's unclear why we need this audio handle, but it + # does matter: + # https://bugzilla.redhat.com/show_bug.cgi?id=1881080 + self._audio = SpiceClientGLib.Audio.get(self._spice_session, None) + def _agent_connected_cb(self, src, val): self.emit("agent-connected") # pragma: no cover @@ -631,6 +640,7 @@ class SpiceViewer(Viewer): _SIGS.disconnect_obj_signals(self._spice_session) self._spice_session.disconnect() self._spice_session = None + self._audio = None if self._display: self._display.destroy() self._display = None ++++++ 9c13d2f8-Remove-use-of-problematic-terminology.patch ++++++ Subject: Remove use of problematic terminology From: Cole Robinson [email protected] Wed Sep 23 14:33:17 2020 -0400 Date: Wed Sep 23 14:33:17 2020 -0400: Git: 9c13d2f8788414f1ab5b0300ce82b5d9ce277880 Following kernel recommendation here: https://lkml.org/lkml/2020/7/4/229 Signed-off-by: Cole Robinson <[email protected]> Index: virt-manager-3.0.0/man/virt-install.rst =================================================================== --- virt-manager-3.0.0.orig/man/virt-install.rst +++ virt-manager-3.0.0/man/virt-install.rst @@ -1247,7 +1247,7 @@ Connect the guest to the host network. E Tell virt-install not to add any default network interface. If ``--network`` is omitted a single NIC will be created in the guest. If -there is a bridge device in the host with a physical interface enslaved, +there is a bridge device in the host with a physical interface attached, that will be used for connectivity. Failing that, the virtual network called ``default`` will be used. This option can be specified multiple times to setup more than one NIC. Index: virt-manager-3.0.0/tests/uitests/test_addhardware.py =================================================================== --- virt-manager-3.0.0.orig/tests/uitests/test_addhardware.py +++ virt-manager-3.0.0/tests/uitests/test_addhardware.py @@ -310,7 +310,7 @@ class AddHardware(lib.testcase.UITestCas self.app.open(break_setfacl=True) details = self.app.open_details_window("test-clone-simple") - # Say 'Yes' and it should fail, then blacklist the paths + # Say 'Yes' and it should fail, then denylist the paths addhw = self._open_addhw_window(details) tab = self._select_hw(addhw, "Storage", "storage-tab") tab.find_fuzzy("Select or create", "radio").click() Index: virt-manager-3.0.0/tests/uitests/test_connection.py =================================================================== --- virt-manager-3.0.0.orig/tests/uitests/test_connection.py +++ virt-manager-3.0.0/tests/uitests/test_connection.py @@ -15,7 +15,7 @@ class UITestConnection(lib.testcase.UITe def testConnectionBlacklist(self): self.app.open( - extra_opts=["--test-options=object-blacklist=test-many-devices"]) + extra_opts=["--test-options=object-denylist=test-many-devices"]) manager = self.app.topwin def _delete_vm(vmname): Index: virt-manager-3.0.0/virtManager/connection.py =================================================================== --- virt-manager-3.0.0.orig/virtManager/connection.py +++ virt-manager-3.0.0/virtManager/connection.py @@ -38,46 +38,46 @@ class _ObjectList(vmmGObject): vmmGObject.__init__(self) self._objects = [] - self._blacklist = {} + self._denylist = {} self._lock = threading.Lock() def _cleanup(self): self._objects = [] - def _blacklist_key(self, obj): + def _denylist_key(self, obj): return str(obj.__class__) + obj.get_name() - def add_blacklist(self, obj): + def add_denylist(self, obj): """ - Add an object to the blacklist. Basically a list of objects we + Add an object to the denylist. Basically a list of objects we choose not to poll, because they threw an error at init time - :param obj: vmmLibvirtObject to blacklist + :param obj: vmmLibvirtObject to denylist :returns: number of added object to list """ - key = self._blacklist_key(obj) - count = self._blacklist.get(key, 0) - self._blacklist[key] = count + 1 - return self._blacklist[key] + key = self._denylist_key(obj) + count = self._denylist.get(key, 0) + self._denylist[key] = count + 1 + return self._denylist[key] - def remove_blacklist(self, obj): + def remove_denylist(self, obj): """ - :param obj: vmmLibvirtObject to remove from blacklist - :returns: True if object was blacklisted or False otherwise. + :param obj: vmmLibvirtObject to remove from denylist + :returns: True if object was denylisted or False otherwise. """ - key = self._blacklist_key(obj) - return bool(self._blacklist.pop(key, 0)) + key = self._denylist_key(obj) + return bool(self._denylist.pop(key, 0)) - def in_blacklist(self, obj): + def in_denylist(self, obj): """ - If an object is in list only once don't consider it blacklisted, + If an object is in list only once don't consider it denylisted, give it one more chance. :param obj: vmmLibvirtObject to check - :returns: True if object is blacklisted + :returns: True if object is denylisted """ - key = self._blacklist_key(obj) - return self._blacklist.get(key, 0) >= _ObjectList.BLACKLIST_COUNT + key = self._denylist_key(obj) + return self._denylist.get(key, 0) >= _ObjectList.BLACKLIST_COUNT def remove(self, obj): """ @@ -90,7 +90,7 @@ class _ObjectList(vmmGObject): # Identity check is sufficient here, since we should never be # asked to remove an object that wasn't at one point in the list. if obj not in self._objects: - return self.remove_blacklist(obj) + return self.remove_denylist(obj) self._objects.remove(obj) return True @@ -1060,11 +1060,11 @@ class vmmConnection(vmmGObject): if initialize_failed: log.debug("Blacklisting %s=%s", class_name, obj.get_name()) - count = self._objects.add_blacklist(obj) - log.debug("Object added in blacklist, count=%d", count) + count = self._objects.add_denylist(obj) + log.debug("Object added in denylist, count=%d", count) return - self._objects.remove_blacklist(obj) + self._objects.remove_denylist(obj) if not self._objects.add(obj): log.debug("New %s=%s requested, but it's already tracked.", class_name, obj.get_name()) @@ -1134,7 +1134,7 @@ class vmmConnection(vmmGObject): gone_objects.extend(gone) preexisting_objects.extend([o for o in master if o not in new]) - new = [n for n in new if not self._objects.in_blacklist(n)] + new = [n for n in new if not self._objects.in_denylist(n)] return new new_vms = _process_objects("vms") Index: virt-manager-3.0.0/virtManager/lib/testmock.py =================================================================== --- virt-manager-3.0.0.orig/virtManager/lib/testmock.py +++ virt-manager-3.0.0/virtManager/lib/testmock.py @@ -157,7 +157,7 @@ class CLITestOptionsClass: Spice doesn't return values here when we are just testing against seabios in uitests, this fakes it to hit more code paths * fake-systray: Enable the fake systray window - * object-blacklist=NAME: Make object initialize for that name + * object-denylist=NAME: Make object initialize for that name fail to test some connection code paths * conn-crash: Test connection abruptly closing like when libvirtd is restarted. @@ -205,7 +205,7 @@ class CLITestOptionsClass: self.fake_vnc_username = _get("fake-vnc-username") self.fake_console_resolution = _get("fake-console-resolution") self.fake_systray = _get("fake-systray") - self.object_blacklist = _get_value("object-blacklist") + self.object_denylist = _get_value("object-denylist") self.conn_crash = _get("conn-crash") self.fake_agent_event = _get_value("fake-agent-event") self.fake_nodedev_event = _get_value("fake-nodedev-event") Index: virt-manager-3.0.0/virtManager/object/domain.py =================================================================== --- virt-manager-3.0.0.orig/virtManager/object/domain.py +++ virt-manager-3.0.0/virtManager/object/domain.py @@ -393,7 +393,7 @@ class vmmDomain(vmmLibvirtObject): self.get_uuid() == "00000000-0000-0000-0000-000000000000"): # We don't want virt-manager to track Domain-0 since it # doesn't work with our UI. Raising an error will ensures it - # is blacklisted. + # is denylisted. raise RuntimeError( # pragma: no cover "Can't track Domain-0 as a vmmDomain") Index: virt-manager-3.0.0/virtManager/object/libvirtobject.py =================================================================== --- virt-manager-3.0.0.orig/virtManager/object/libvirtobject.py +++ virt-manager-3.0.0/virtManager/object/libvirtobject.py @@ -171,7 +171,7 @@ class vmmLibvirtObject(vmmGObject): initialize_failed = False try: - if self.config.CLITestOptions.object_blacklist == self._name: + if self.config.CLITestOptions.object_denylist == self._name: raise RuntimeError("fake initialization error") self._init_libvirt_state() Index: virt-manager-3.0.0/virtinst/devices/graphics.py =================================================================== --- virt-manager-3.0.0.orig/virtinst/devices/graphics.py +++ virt-manager-3.0.0/virtinst/devices/graphics.py @@ -151,7 +151,7 @@ class DeviceGraphics(Device): def _spice_supported(self): if not self.conn.is_qemu() and not self.conn.is_test(): return False - # Spice has issues on some host arches, like ppc, so whitelist it + # Spice has issues on some host arches, like ppc, so allow it if self.conn.caps.host.cpu.arch not in ["i686", "x86_64"]: return False return True Index: virt-manager-3.0.0/virtinst/devices/interface.py =================================================================== --- virt-manager-3.0.0.orig/virtinst/devices/interface.py +++ virt-manager-3.0.0/virtinst/devices/interface.py @@ -72,7 +72,7 @@ def _host_default_bridge(): return dev # pragma: no cover # Old style, peth0 == phys dev, eth0 == netloop, xenbr0 == bridge, - # vif0.0 == netloop enslaved, eth0 == default route + # vif0.0 == netloop attached, eth0 == default route try: defn = int(dev[-1]) except Exception: # pragma: no cover ++++++ a010c49b-cli-Fix-os-variant-help-introspection.patch ++++++ Subject: cli: Fix --os-variant=help introspection From: Cole Robinson [email protected] Sun Sep 20 16:00:33 2020 -0400 Date: Sun Sep 20 16:00:46 2020 -0400: Git: a010c49b8b3c0ecca5ec99d962b2b98f25694a37 Signed-off-by: Cole Robinson <[email protected]> Index: virt-manager-3.0.0/virtinst/cli.py =================================================================== --- virt-manager-3.0.0.orig/virtinst/cli.py +++ virt-manager-3.0.0/virtinst/cli.py @@ -1830,7 +1830,7 @@ class OSVariantData(object): class ParserOSVariant(VirtCLIParser): - cli_arg_name = "os-variant" + cli_arg_name = "os_variant" supports_clearxml = False @classmethod ++++++ ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch ++++++ Subject: addstorage: Return to using qcow2 sparse by default From: Cole Robinson [email protected] Sat Sep 19 18:06:45 2020 -0400 Date: Sun Sep 20 10:11:36 2020 -0400: Git: ba08f84b3408744e9aa9763d100e8aa217c1f5ff https://bugzilla.redhat.com/show_bug.cgi?id=1759454 See 15a6a7e2105440df528f75c4df4d2471df28bd1e The idea behind virt-manager's sparse vs nonsparse default, is that if the user selected 'raw' for as the default image format, assume they want to maximize performance, so fully allocate the disk. qcow2 didn't support anything except sparse, so the sparse=True vs sparse=False made no difference. So we always set sparse=False Then qcow2 grows non-sparse support, and virt-manager is suddenly defaulting to it, which is not the intention. Default to sparse when requested format isn't raw Signed-off-by: Cole Robinson <[email protected]> Index: virt-manager-3.0.0/tests/uitests/test_addhardware.py =================================================================== --- virt-manager-3.0.0.orig/tests/uitests/test_addhardware.py +++ virt-manager-3.0.0/tests/uitests/test_addhardware.py @@ -152,11 +152,8 @@ class AddHardware(lib.testcase.UITestCas tab.combo_select("Cache mode:", "none") tab.combo_select("Discard mode:", "ignore") tab.combo_select("Detect zeroes:", "unmap") - # Size too big - tab.find("GiB", "spin button").set_text("2000") - self._finish(addhw, check=None) - self.app.click_alert_button("not enough free space", "Close") - tab.find("GiB", "spin button").set_text("1.5") + # High number but we are non-sparse by default so it won't complain + tab.find("GiB", "spin button").set_text("200000") self._finish(addhw, check=details) # USB disk with removable setting Index: virt-manager-3.0.0/tests/uitests/test_createvm.py =================================================================== --- virt-manager-3.0.0.orig/tests/uitests/test_createvm.py +++ virt-manager-3.0.0/tests/uitests/test_createvm.py @@ -201,12 +201,11 @@ class NewVM(lib.testcase.UITestCase): self.forward(newvm) self.forward(newvm) - # Trigger size validation failure + # qcow2 default shouldn't trigger size error sizetext = newvm.find(None, "spin button", "GiB") sizetext.set_text("10000000") - self.forward(newvm, check=False) - self.app.click_alert_button("Storage parameter error", "OK") - sizetext.set_text("1") + _forward(newvm) + _back(newvm) # Use the storage browser to select a local file storagetext = newvm.find("storage-entry") Index: virt-manager-3.0.0/virtManager/device/addstorage.py =================================================================== --- virt-manager-3.0.0.orig/virtManager/device/addstorage.py +++ virt-manager-3.0.0/virtManager/device/addstorage.py @@ -251,14 +251,18 @@ class vmmAddStorage(vmmGObjectUI): if disk.wants_storage_creation(): pool = disk.get_parent_pool() size = uiutil.spin_get_helper(self.widget("storage-size")) - sparse = False + fmt = self.conn.get_default_storage_format() + + # If the user changed the default disk format to raw, assume + # they want to maximize performance, so fully allocate the + # disk image. Otherwise use sparse + sparse = fmt != 'raw' vol_install = virtinst.DeviceDisk.build_vol_install( disk.conn, os.path.basename(disk.path), pool, size, sparse) disk.set_vol_install(vol_install) - fmt = self.conn.get_default_storage_format() if disk.get_vol_install().supports_format(): log.debug("Using default prefs format=%s for path=%s", fmt, disk.path) ++++++ e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch ++++++ Subject: details: Change Close accelerator to ctrl+shift+w From: Cole Robinson [email protected] Mon Sep 21 14:33:25 2020 -0400 Date: Mon Sep 21 14:33:25 2020 -0400: Git: e5a51f637411b4b2efc789fdef99eb4860ac3b9f Close accelerator changes ctrl+w -> ctrl+shift+w Quit accelerator changes ctrl+q -> ctrl+shift+q After aafb874c8, if the mouse pointer isn't inside the console window, it has keyboard focus but ctrl+w will be sent to the vmwindow and not the VM. ctrl+w is a common shortcut for deleting a word so this is pretty disruptive if you are typing inside the VM Use gnome-terminal-esque accelerators starting with ctrl+shift to reduce the chance of collision. https://bugzilla.redhat.com/show_bug.cgi?id=1880295 Signed-off-by: Cole Robinson <[email protected]> Index: virt-manager-3.0.0/tests/uitests/test_livetests.py =================================================================== --- virt-manager-3.0.0.orig/tests/uitests/test_livetests.py +++ virt-manager-3.0.0/tests/uitests/test_livetests.py @@ -146,7 +146,7 @@ class Console(lib.testcase.UITestCase): # Check that modifiers don't work win.click() self.app.sleep(1) - win.keyCombo("<ctrl>w") + win.keyCombo("<ctrl><shift>w") lib.utils.check(lambda: win.showing) dom.destroy() win.find("Guest is not running.") @@ -315,13 +315,13 @@ class Console(lib.testcase.UITestCase): # Ensure ctrl+w doesn't close the window, modifiers are disabled term.click() - win.keyCombo("<ctrl>w") + win.keyCombo("<ctrl><shift>w") lib.utils.check(lambda: win.showing) - # Shut it down, ensure <ctrl>w works again + # Shut it down, ensure accelerator works again self._destroy(win) win.click_title() self.app.sleep(1) - win.keyCombo("<ctrl>w") + win.keyCombo("<ctrl><shift>w") lib.utils.check(lambda: not win.showing) Index: virt-manager-3.0.0/ui/vmwindow.ui =================================================================== --- virt-manager-3.0.0.orig/ui/vmwindow.ui +++ virt-manager-3.0.0/ui/vmwindow.ui @@ -3,6 +3,16 @@ <interface> <requires lib="gtk+" version="3.22"/> <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-close</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-quit</property> + </object> <object class="GtkWindow" id="vmm-vmwindow"> <property name="can_focus">False</property> <property name="title" translatable="yes">Virtual Machine</property> @@ -48,24 +58,28 @@ </child> <child> <object class="GtkImageMenuItem" id="close4"> - <property name="label">gtk-close</property> + <property name="label">_Close</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_underline">True</property> - <property name="use_stock">True</property> + <property name="image">image1</property> + <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> <signal name="activate" handler="on_details_menu_close_activate" swapped="no"/> + <accelerator key="w" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/> </object> </child> <child> <object class="GtkImageMenuItem" id="quit3"> - <property name="label">gtk-quit</property> + <property name="label">_Quit</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_underline">True</property> - <property name="use_stock">True</property> + <property name="image">image2</property> + <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> <signal name="activate" handler="on_details_menu_quit_activate" swapped="no"/> + <accelerator key="q" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/> </object> </child> </object>
