New Upstream Snapshot - virt-manager

Ready changes

Summary

Merged new upstream version: 4.1.0+git20230119.1.a63b40a (was: 4.1.0).

Resulting package

Built on 2023-02-08T18:08 (took 8m24s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots virt-managerapt install -t fresh-snapshots virtinst

Lintian Result

Diff

diff --git a/PKG-INFO b/PKG-INFO
index 2982ae6..0afc228 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,13 +1,8 @@
 Metadata-Version: 2.1
 Name: virt-manager
 Version: 4.1.0
-Summary: UNKNOWN
 Home-page: http://virt-manager.org
 Author: Cole Robinson
 Author-email: virt-tools-list@redhat.com
 License: GPLv2+
-Platform: UNKNOWN
 License-File: COPYING
-
-UNKNOWN
-
diff --git a/debian/changelog b/debian/changelog
index bbf79ac..7b78eae 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+virt-manager (1:4.1.0+git20230119.1.a63b40a-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 08 Feb 2023 18:02:43 -0000
+
 virt-manager (1:4.1.0-2) unstable; urgency=medium
 
   [ Stefano Rivera ]
diff --git a/setup.py b/setup.py
index b45d315..4bf29f2 100755
--- a/setup.py
+++ b/setup.py
@@ -29,7 +29,7 @@ import setuptools.command.install_egg_info
 #
 # Newer setuptools will transparently support 'import distutils' though.
 # That can be overridden with SETUPTOOLS_USE_DISTUTILS env variable
-import distutils.command.build  # pylint: disable=wrong-import-order
+import distutils.command.build  # pylint: disable=wrong-import-order,deprecated-module
 
 
 SYSPREFIX = sysconfig.get_config_var("prefix")
diff --git a/tests/data/capabilities/kvm-x86_64-domcaps-latest.xml b/tests/data/capabilities/kvm-x86_64-domcaps-latest.xml
index ee586e1..ebcc9ec 100644
--- a/tests/data/capabilities/kvm-x86_64-domcaps-latest.xml
+++ b/tests/data/capabilities/kvm-x86_64-domcaps-latest.xml
@@ -1,7 +1,7 @@
 <domainCapabilities>
   <path>/usr/bin/qemu-system-x86_64</path>
   <domain>kvm</domain>
-  <machine>pc-q35-6.1</machine>
+  <machine>pc-q35-7.0</machine>
   <arch>x86_64</arch>
   <vcpu max='288'/>
   <iothreads supported='yes'/>
@@ -12,6 +12,8 @@
     <loader supported='yes'>
       <value>/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd</value>
       <value>/usr/share/edk2/ovmf/OVMF_CODE.fd</value>
+      <value>/usr/share/edk2/ovmf/OVMF.amdsev.fd</value>
+      <value>/usr/share/edk2/ovmf/OVMF.inteltdx.fd</value>
       <enum name='type'>
         <value>rom</value>
         <value>pflash</value>
@@ -40,91 +42,91 @@
       </enum>
     </mode>
     <mode name='host-model' supported='yes'>
-      <model fallback='forbid'>Cooperlake</model>
+      <model fallback='forbid'>Skylake-Client-IBRS</model>
       <vendor>Intel</vendor>
       <feature policy='require' name='ss'/>
       <feature policy='require' name='vmx'/>
       <feature policy='require' name='pdcm'/>
       <feature policy='require' name='hypervisor'/>
       <feature policy='require' name='tsc_adjust'/>
-      <feature policy='require' name='mpx'/>
+      <feature policy='require' name='clflushopt'/>
       <feature policy='require' name='umip'/>
+      <feature policy='require' name='pku'/>
       <feature policy='require' name='md-clear'/>
+      <feature policy='require' name='stibp'/>
+      <feature policy='require' name='arch-capabilities'/>
+      <feature policy='require' name='ssbd'/>
       <feature policy='require' name='xsaves'/>
+      <feature policy='require' name='pdpe1gb'/>
       <feature policy='require' name='invtsc'/>
       <feature policy='require' name='ibpb'/>
       <feature policy='require' name='ibrs'/>
       <feature policy='require' name='amd-stibp'/>
       <feature policy='require' name='amd-ssbd'/>
+      <feature policy='require' name='rdctl-no'/>
+      <feature policy='require' name='ibrs-all'/>
+      <feature policy='require' name='skip-l1dfl-vmentry'/>
+      <feature policy='require' name='mds-no'/>
+      <feature policy='require' name='pschange-mc-no'/>
       <feature policy='disable' name='hle'/>
       <feature policy='disable' name='rtm'/>
-      <feature policy='disable' name='avx512f'/>
-      <feature policy='disable' name='avx512dq'/>
-      <feature policy='disable' name='clwb'/>
-      <feature policy='disable' name='avx512cd'/>
-      <feature policy='disable' name='avx512bw'/>
-      <feature policy='disable' name='avx512vl'/>
-      <feature policy='disable' name='avx512vnni'/>
-      <feature policy='disable' name='avx-vnni'/>
-      <feature policy='disable' name='avx512-bf16'/>
-      <feature policy='disable' name='taa-no'/>
     </mode>
     <mode name='custom' supported='yes'>
-      <model usable='yes'>qemu64</model>
-      <model usable='yes'>qemu32</model>
-      <model usable='no'>phenom</model>
-      <model usable='yes'>pentium3</model>
-      <model usable='yes'>pentium2</model>
-      <model usable='yes'>pentium</model>
-      <model usable='yes'>n270</model>
-      <model usable='yes'>kvm64</model>
-      <model usable='yes'>kvm32</model>
-      <model usable='yes'>coreduo</model>
-      <model usable='yes'>core2duo</model>
-      <model usable='no'>athlon</model>
-      <model usable='yes'>Westmere-IBRS</model>
-      <model usable='yes'>Westmere</model>
-      <model usable='no'>Snowridge</model>
-      <model usable='no'>Skylake-Server-noTSX-IBRS</model>
-      <model usable='no'>Skylake-Server-IBRS</model>
-      <model usable='no'>Skylake-Server</model>
-      <model usable='yes'>Skylake-Client-noTSX-IBRS</model>
-      <model usable='no'>Skylake-Client-IBRS</model>
-      <model usable='no'>Skylake-Client</model>
-      <model usable='yes'>SandyBridge-IBRS</model>
-      <model usable='yes'>SandyBridge</model>
-      <model usable='yes'>Penryn</model>
-      <model usable='no'>Opteron_G5</model>
-      <model usable='no'>Opteron_G4</model>
-      <model usable='no'>Opteron_G3</model>
-      <model usable='yes'>Opteron_G2</model>
-      <model usable='yes'>Opteron_G1</model>
-      <model usable='yes'>Nehalem-IBRS</model>
-      <model usable='yes'>Nehalem</model>
-      <model usable='yes'>IvyBridge-IBRS</model>
-      <model usable='yes'>IvyBridge</model>
-      <model usable='no'>Icelake-Server-noTSX</model>
-      <model usable='no'>Icelake-Server</model>
-      <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
-      <model usable='no' deprecated='yes'>Icelake-Client</model>
-      <model usable='yes'>Haswell-noTSX-IBRS</model>
-      <model usable='yes'>Haswell-noTSX</model>
-      <model usable='no'>Haswell-IBRS</model>
-      <model usable='no'>Haswell</model>
-      <model usable='no'>EPYC-Rome</model>
-      <model usable='no'>EPYC-Milan</model>
-      <model usable='no'>EPYC-IBPB</model>
-      <model usable='no'>EPYC</model>
-      <model usable='no'>Dhyana</model>
-      <model usable='no'>Cooperlake</model>
-      <model usable='yes'>Conroe</model>
-      <model usable='no'>Cascadelake-Server-noTSX</model>
-      <model usable='no'>Cascadelake-Server</model>
-      <model usable='yes'>Broadwell-noTSX-IBRS</model>
-      <model usable='yes'>Broadwell-noTSX</model>
-      <model usable='no'>Broadwell-IBRS</model>
-      <model usable='no'>Broadwell</model>
-      <model usable='yes'>486</model>
+      <model usable='yes' vendor='unknown'>qemu64</model>
+      <model usable='yes' vendor='unknown'>qemu32</model>
+      <model usable='no' vendor='AMD'>phenom</model>
+      <model usable='yes' vendor='unknown'>pentium3</model>
+      <model usable='yes' vendor='unknown'>pentium2</model>
+      <model usable='yes' vendor='unknown'>pentium</model>
+      <model usable='yes' vendor='Intel'>n270</model>
+      <model usable='yes' vendor='unknown'>kvm64</model>
+      <model usable='yes' vendor='unknown'>kvm32</model>
+      <model usable='yes' vendor='Intel'>coreduo</model>
+      <model usable='yes' vendor='Intel'>core2duo</model>
+      <model usable='no' vendor='AMD'>athlon</model>
+      <model usable='yes' vendor='Intel'>Westmere-IBRS</model>
+      <model usable='yes' vendor='Intel'>Westmere</model>
+      <model usable='no' vendor='Intel'>Snowridge</model>
+      <model usable='no' vendor='Intel'>Skylake-Server-noTSX-IBRS</model>
+      <model usable='no' vendor='Intel'>Skylake-Server-IBRS</model>
+      <model usable='no' vendor='Intel'>Skylake-Server</model>
+      <model usable='yes' vendor='Intel'>Skylake-Client-noTSX-IBRS</model>
+      <model usable='no' vendor='Intel'>Skylake-Client-IBRS</model>
+      <model usable='no' vendor='Intel'>Skylake-Client</model>
+      <model usable='yes' vendor='Intel'>SandyBridge-IBRS</model>
+      <model usable='yes' vendor='Intel'>SandyBridge</model>
+      <model usable='yes' vendor='Intel'>Penryn</model>
+      <model usable='no' vendor='AMD'>Opteron_G5</model>
+      <model usable='no' vendor='AMD'>Opteron_G4</model>
+      <model usable='no' vendor='AMD'>Opteron_G3</model>
+      <model usable='yes' vendor='AMD'>Opteron_G2</model>
+      <model usable='yes' vendor='AMD'>Opteron_G1</model>
+      <model usable='yes' vendor='Intel'>Nehalem-IBRS</model>
+      <model usable='yes' vendor='Intel'>Nehalem</model>
+      <model usable='yes' vendor='Intel'>IvyBridge-IBRS</model>
+      <model usable='yes' vendor='Intel'>IvyBridge</model>
+      <model usable='no' vendor='Intel'>Icelake-Server-noTSX</model>
+      <model usable='no' vendor='Intel'>Icelake-Server</model>
+      <model usable='no' deprecated='yes' vendor='Intel'>Icelake-Client-noTSX</model>
+      <model usable='no' deprecated='yes' vendor='Intel'>Icelake-Client</model>
+      <model usable='yes' vendor='Intel'>Haswell-noTSX-IBRS</model>
+      <model usable='yes' vendor='Intel'>Haswell-noTSX</model>
+      <model usable='no' vendor='Intel'>Haswell-IBRS</model>
+      <model usable='no' vendor='Intel'>Haswell</model>
+      <model usable='no' vendor='AMD'>EPYC-Rome</model>
+      <model usable='no' vendor='AMD'>EPYC-Milan</model>
+      <model usable='no' vendor='AMD'>EPYC-IBPB</model>
+      <model usable='no' vendor='AMD'>EPYC</model>
+      <model usable='no' vendor='Hygon'>Dhyana</model>
+      <model usable='no' vendor='Intel'>Cooperlake</model>
+      <model usable='yes' vendor='Intel'>Conroe</model>
+      <model usable='no' vendor='Intel'>Cascadelake-Server-noTSX</model>
+      <model usable='no' vendor='Intel'>Cascadelake-Server</model>
+      <model usable='yes' vendor='Intel'>Broadwell-noTSX-IBRS</model>
+      <model usable='yes' vendor='Intel'>Broadwell-noTSX</model>
+      <model usable='no' vendor='Intel'>Broadwell-IBRS</model>
+      <model usable='no' vendor='Intel'>Broadwell</model>
+      <model usable='yes' vendor='unknown'>486</model>
     </mode>
   </cpu>
   <memoryBacking supported='yes'>
@@ -161,6 +163,7 @@
         <value>vnc</value>
         <value>spice</value>
         <value>egl-headless</value>
+        <value>dbus</value>
       </enum>
     </graphics>
     <video supported='yes'>
@@ -191,10 +194,7 @@
         <value>scsi</value>
       </enum>
       <enum name='capsType'/>
-      <enum name='pciBackend'>
-        <value>default</value>
-        <value>vfio</value>
-      </enum>
+      <enum name='pciBackend'/>
     </hostdev>
     <rng supported='yes'>
       <enum name='model'>
@@ -224,7 +224,23 @@
         <value>passthrough</value>
         <value>emulator</value>
       </enum>
+      <enum name='backendVersion'>
+        <value>1.2</value>
+        <value>2.0</value>
+      </enum>
     </tpm>
+    <redirdev supported='yes'>
+      <enum name='bus'>
+        <value>usb</value>
+      </enum>
+    </redirdev>
+    <channel supported='yes'>
+      <enum name='type'>
+        <value>pty</value>
+        <value>unix</value>
+        <value>spicevmc</value>
+      </enum>
+    </channel>
   </devices>
   <features>
     <gic supported='no'/>
@@ -233,6 +249,7 @@
     <backingStoreInput supported='yes'/>
     <backup supported='yes'/>
     <sev supported='no'/>
+    <sgx supported='no'/>
   </features>
 </domainCapabilities>
 
diff --git a/tests/data/cli/compare/virt-clone-auto-unmanaged.xml b/tests/data/cli/compare/virt-clone-auto-unmanaged.xml
index 21a9a63..f2043be 100644
--- a/tests/data/cli/compare/virt-clone-auto-unmanaged.xml
+++ b/tests/data/cli/compare/virt-clone-auto-unmanaged.xml
@@ -1,6 +1,11 @@
 <domain type="test">
   <name>origtest-clone</name>
   <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <sysinfo type="smbios">
+    <system>
+      <entry name="uuid">00000000-1111-2222-3333-444444444444</entry>
+    </system>
+  </sysinfo>
   <memory>8388608</memory>
   <currentMemory>2097152</currentMemory>
   <vcpu>2</vcpu>
diff --git a/tests/data/cli/compare/virt-clone-unmanaged-preserve.xml b/tests/data/cli/compare/virt-clone-unmanaged-preserve.xml
index 3bdbbbe..c003ed3 100644
--- a/tests/data/cli/compare/virt-clone-unmanaged-preserve.xml
+++ b/tests/data/cli/compare/virt-clone-unmanaged-preserve.xml
@@ -1,6 +1,11 @@
 <domain type="test">
   <name>clonetest</name>
   <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <sysinfo type="smbios">
+    <system>
+      <entry name="uuid">00000000-1111-2222-3333-444444444444</entry>
+    </system>
+  </sysinfo>
   <memory>8388608</memory>
   <currentMemory>2097152</currentMemory>
   <vcpu>2</vcpu>
diff --git a/tests/data/cli/compare/virt-install-many-devices.xml b/tests/data/cli/compare/virt-install-many-devices.xml
index a73343a..e4a7da8 100644
--- a/tests/data/cli/compare/virt-install-many-devices.xml
+++ b/tests/data/cli/compare/virt-install-many-devices.xml
@@ -194,6 +194,7 @@
         <bandwidth initiator="0" target="2" cache="1" type="access" value="409600" unit="KiB"/>
       </interconnects>
     </numa>
+    <maxphysaddr mode="emulate" bits="46"/>
   </cpu>
   <clock offset="utc">
     <timer name="pit" tickpolicy="catchup" present="yes"/>
@@ -423,6 +424,15 @@
       </source>
       <target dev="vdu" bus="virtio"/>
     </disk>
+    <disk type="file" device="disk">
+      <driver name="qemu" type="qcow2" discard="unmap">
+        <metadata_cache>
+          <max_size unit="KiB">2048</max_size>
+        </metadata_cache>
+      </driver>
+      <source file="/tmp/disk1.qcow2"/>
+      <target dev="vdv" bus="virtio"/>
+    </disk>
     <controller type="usb" index="0" model="ich9-ehci1">
       <address type="pci" domain="0" bus="0" slot="4" function="7"/>
     </controller>
diff --git a/tests/data/cli/compare/virt-install-singleton-config-2.xml b/tests/data/cli/compare/virt-install-singleton-config-2.xml
index d567d18..27c69c1 100644
--- a/tests/data/cli/compare/virt-install-singleton-config-2.xml
+++ b/tests/data/cli/compare/virt-install-singleton-config-2.xml
@@ -11,7 +11,7 @@
   <vcpu cpuset="1,3-5">2</vcpu>
   <os>
     <type arch="x86_64" machine="q35">hvm</type>
-    <loader readonly="yes" secure="no" type="rom">/tmp/foo</loader>
+    <loader readonly="yes" secure="no" type="rom" stateless="yes">/tmp/foo</loader>
     <smbios mode="emulate"/>
     <boot dev="network"/>
     <boot dev="hd"/>
@@ -112,7 +112,7 @@
   <vcpu cpuset="1,3-5">2</vcpu>
   <os>
     <type arch="x86_64" machine="q35">hvm</type>
-    <loader readonly="yes" secure="no" type="rom">/tmp/foo</loader>
+    <loader readonly="yes" secure="no" type="rom" stateless="yes">/tmp/foo</loader>
     <boot dev="hd"/>
     <smbios mode="emulate"/>
   </os>
diff --git a/tests/data/cli/compare/virt-install-testdriver-edgecases.xml b/tests/data/cli/compare/virt-install-testdriver-edgecases.xml
index f129d08..3cc385c 100644
--- a/tests/data/cli/compare/virt-install-testdriver-edgecases.xml
+++ b/tests/data/cli/compare/virt-install-testdriver-edgecases.xml
@@ -17,7 +17,9 @@
     <pae/>
     <vmport state="off"/>
   </features>
-  <cpu mode="host-passthrough" migratable="on"/>
+  <cpu mode="host-passthrough" migratable="on">
+    <maxphysaddr mode="passthrough"/>
+  </cpu>
   <clock offset="utc"/>
   <pm>
     <suspend-to-mem enabled="no"/>
diff --git a/tests/data/cli/compare/virt-install-win11.xml b/tests/data/cli/compare/virt-install-win11.xml
new file mode 100644
index 0000000..4270c74
--- /dev/null
+++ b/tests/data/cli/compare/virt-install-win11.xml
@@ -0,0 +1,180 @@
+<domain type="kvm">
+  <name>win11</name>
+  <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <metadata>
+    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
+      <libosinfo:os id="http://microsoft.com/win/11"/>
+    </libosinfo:libosinfo>
+  </metadata>
+  <memory>65536</memory>
+  <currentMemory>65536</currentMemory>
+  <vcpu>4</vcpu>
+  <os firmware="efi">
+    <type arch="x86_64" machine="q35">hvm</type>
+    <boot dev="cdrom"/>
+    <boot dev="hd"/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <hyperv>
+      <relaxed state="on"/>
+      <vapic state="on"/>
+      <spinlocks state="on" retries="8191"/>
+    </hyperv>
+    <vmport state="off"/>
+  </features>
+  <cpu mode="host-passthrough"/>
+  <clock offset="localtime">
+    <timer name="rtc" tickpolicy="catchup"/>
+    <timer name="pit" tickpolicy="delay"/>
+    <timer name="hpet" present="no"/>
+    <timer name="hypervclock" present="yes"/>
+  </clock>
+  <pm>
+    <suspend-to-mem enabled="no"/>
+    <suspend-to-disk enabled="no"/>
+  </pm>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <disk type="file" device="disk">
+      <driver name="qemu" type="qcow2" discard="unmap"/>
+      <source file="/var/lib/libvirt/images/win11.qcow2"/>
+      <target dev="sda" bus="sata"/>
+    </disk>
+    <disk type="file" device="cdrom">
+      <driver name="qemu" type="qcow2"/>
+      <source file="/pool-dir/testvol1.img"/>
+      <target dev="sdb" bus="sata"/>
+      <readonly/>
+    </disk>
+    <controller type="usb" model="qemu-xhci" ports="15"/>
+    <controller type="pci" model="pcie-root"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <interface type="bridge">
+      <source bridge="testsuitebr0"/>
+      <mac address="00:11:22:33:44:55"/>
+      <model type="e1000e"/>
+    </interface>
+    <console type="pty"/>
+    <channel type="spicevmc">
+      <target type="virtio" name="com.redhat.spice.0"/>
+    </channel>
+    <input type="tablet" bus="usb"/>
+    <tpm model="tpm-crb">
+      <backend type="emulator"/>
+    </tpm>
+    <graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
+      <image compression="off"/>
+    </graphics>
+    <sound model="ich9"/>
+    <video>
+      <model type="qxl"/>
+    </video>
+    <redirdev bus="usb" type="spicevmc"/>
+    <redirdev bus="usb" type="spicevmc"/>
+  </devices>
+  <on_reboot>destroy</on_reboot>
+</domain>
+<domain type="kvm">
+  <name>win11</name>
+  <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <metadata>
+    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
+      <libosinfo:os id="http://microsoft.com/win/11"/>
+    </libosinfo:libosinfo>
+  </metadata>
+  <memory>65536</memory>
+  <currentMemory>65536</currentMemory>
+  <vcpu>4</vcpu>
+  <os firmware="efi">
+    <type arch="x86_64" machine="q35">hvm</type>
+    <boot dev="hd"/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <hyperv>
+      <relaxed state="on"/>
+      <vapic state="on"/>
+      <spinlocks state="on" retries="8191"/>
+    </hyperv>
+    <vmport state="off"/>
+  </features>
+  <cpu mode="host-passthrough"/>
+  <clock offset="localtime">
+    <timer name="rtc" tickpolicy="catchup"/>
+    <timer name="pit" tickpolicy="delay"/>
+    <timer name="hpet" present="no"/>
+    <timer name="hypervclock" present="yes"/>
+  </clock>
+  <pm>
+    <suspend-to-mem enabled="no"/>
+    <suspend-to-disk enabled="no"/>
+  </pm>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <disk type="file" device="disk">
+      <driver name="qemu" type="qcow2" discard="unmap"/>
+      <source file="/var/lib/libvirt/images/win11.qcow2"/>
+      <target dev="sda" bus="sata"/>
+    </disk>
+    <disk type="file" device="cdrom">
+      <driver name="qemu" type="qcow2"/>
+      <source file="/pool-dir/testvol1.img"/>
+      <target dev="sdb" bus="sata"/>
+      <readonly/>
+    </disk>
+    <controller type="usb" model="qemu-xhci" ports="15"/>
+    <controller type="pci" model="pcie-root"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <controller type="pci" model="pcie-root-port"/>
+    <interface type="bridge">
+      <source bridge="testsuitebr0"/>
+      <mac address="00:11:22:33:44:55"/>
+      <model type="e1000e"/>
+    </interface>
+    <console type="pty"/>
+    <channel type="spicevmc">
+      <target type="virtio" name="com.redhat.spice.0"/>
+    </channel>
+    <input type="tablet" bus="usb"/>
+    <tpm model="tpm-crb">
+      <backend type="emulator"/>
+    </tpm>
+    <graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
+      <image compression="off"/>
+    </graphics>
+    <sound model="ich9"/>
+    <video>
+      <model type="qxl"/>
+    </video>
+    <redirdev bus="usb" type="spicevmc"/>
+    <redirdev bus="usb" type="spicevmc"/>
+  </devices>
+</domain>
diff --git a/tests/data/cli/compare/virt-xml-build-disk-domain.xml b/tests/data/cli/compare/virt-xml-build-disk-domain.xml
index 1a08b20..6d9f716 100644
--- a/tests/data/cli/compare/virt-xml-build-disk-domain.xml
+++ b/tests/data/cli/compare/virt-xml-build-disk-domain.xml
@@ -1,5 +1,5 @@
 <disk type="file" device="disk">
   <driver name="qemu" type="qcow2"/>
   <source file="/pool-dir/testvol1.img"/>
-  <target dev="vdag" bus="virtio"/>
+  <target dev="vdaf" bus="virtio"/>
 </disk>
diff --git a/tests/data/cli/compare/virt-xml-build-pool-logical-disk.xml b/tests/data/cli/compare/virt-xml-build-pool-logical-disk.xml
index 055a8f0..49c9bd4 100644
--- a/tests/data/cli/compare/virt-xml-build-pool-logical-disk.xml
+++ b/tests/data/cli/compare/virt-xml-build-pool-logical-disk.xml
@@ -1,5 +1,5 @@
 <disk type="volume" device="disk">
   <driver name="qemu" type="raw"/>
   <source volume="sdfg1" pool="pool-disk"/>
-  <target dev="vdag" bus="virtio"/>
+  <target dev="vdaf" bus="virtio"/>
 </disk>
diff --git a/tests/data/cli/virtclone/clone-disk.xml b/tests/data/cli/virtclone/clone-disk.xml
index da1eb0a..2f6e916 100644
--- a/tests/data/cli/virtclone/clone-disk.xml
+++ b/tests/data/cli/virtclone/clone-disk.xml
@@ -1,6 +1,11 @@
 <domain type='test' id='1'>
   <name>origtest</name>
   <uuid>db69fa1f-eef0-e567-3c20-3ef16f10376b</uuid>
+  <sysinfo type='smbios'>
+    <system>
+      <entry name='uuid'>db69fa1f-eef0-e567-3c20-3ef16f10376b</entry>
+    </system>
+  </sysinfo>
   <memory>8388608</memory>
   <currentMemory>2097152</currentMemory>
   <vcpu>2</vcpu>
diff --git a/tests/data/meter/meter-zero.txt b/tests/data/meter/meter-zero.txt
new file mode 100644
index 0000000..fc81f21
--- /dev/null
+++ b/tests/data/meter/meter-zero.txt
@@ -0,0 +1,4 @@
+
+Meter text test            100% [================]    0 B/s |    0 B  --:-- ETA 
+
+Meter text test                                             |         00:02     
diff --git a/tests/data/meter/meter1.txt b/tests/data/meter/meter1.txt
index a3f7c7d..7e154c9 100644
--- a/tests/data/meter/meter1.txt
+++ b/tests/data/meter/meter1.txt
@@ -9,4 +9,4 @@ Meter text test            20% [===              ]  413 B/s | 2.0 kB  00:19 ETA
 
 Meter text test            40% [======-          ]  731 B/s | 3.9 kB  00:08 ETA 
 
-Meter text test                                             | 3.9 kB  00:04 ... 
+Meter text test                                             | 4.4 kB  00:04 ... 
diff --git a/tests/data/meter/meter2.txt b/tests/data/meter/meter2.txt
index 93e93dc..7ccc316 100644
--- a/tests/data/meter/meter2.txt
+++ b/tests/data/meter/meter2.txt
@@ -9,4 +9,4 @@ Meter text test                               20% [=======
 
 Meter text test                               40% [==============                     ]  731 B/s | 3.9 kB  00:00:08 ETA 
 
-Meter text test                                                                                  | 3.9 kB  00:00:04 ... 
+Meter text test                                                                                  | 4.4 kB  00:00:04 ... 
diff --git a/tests/data/meter/meter3.txt b/tests/data/meter/meter3.txt
index 474e40f..6f66608 100644
--- a/tests/data/meter/meter3.txt
+++ b/tests/data/meter/meter3.txt
@@ -4,4 +4,4 @@ Meter text test                                      67 B/s |  200 B  00:02
 Meter text test                                     413 B/s | 2.0 kB  00:03     
 Meter text test                                     731 B/s | 3.9 kB  00:04     
 
-Meter text test                                             | 3.9 kB  00:04     
+Meter text test                                             | 4.4 kB  00:04     
diff --git a/tests/data/meter/meter5.txt b/tests/data/meter/meter5.txt
index 1d232a5..7142a97 100644
--- a/tests/data/meter/meter5.txt
+++ b/tests/data/meter/meter5.txt
@@ -9,4 +9,4 @@ Meter text test           1000% [================]  413 B/s | 2.0 kB  --:-- ETA
 
 Meter text test           2000% [================]  731 B/s | 3.9 kB  --:-- ETA 
 
-Meter text test                                             | 3.9 kB  00:04 !!! 
+Meter text test                                             | 4.4 kB  00:04 !!! 
diff --git a/tests/data/meter/meter6.txt b/tests/data/meter/meter6.txt
index 07d99bf..dd5d3d4 100644
--- a/tests/data/meter/meter6.txt
+++ b/tests/data/meter/meter6.txt
@@ -9,4 +9,4 @@ Meter text test            100% [================]  413 B/s | 2.0 kB  --:-- ETA
 
 Meter text test            100% [================]  731 B/s | 3.9 kB  --:-- ETA 
 
-Meter text test                                             | 3.9 kB  00:04     
+Meter text test                                             | 4.4 kB  00:04     
diff --git a/tests/data/testdriver/testdriver.xml b/tests/data/testdriver/testdriver.xml
index b213863..4e0a41e 100644
--- a/tests/data/testdriver/testdriver.xml
+++ b/tests/data/testdriver/testdriver.xml
@@ -294,26 +294,19 @@ Foo bar baz &amp; yeah boii &lt; &gt; yeahfoo
       </source>
       <target dev='vdac' bus='virtio'/>
     </disk>
-    <disk type='network' device='disk'>
-      <driver name='qemu' type='raw'/>
-      <source protocol='sheepdog' name='image,with,commas'>
-        <host name='example.org' port='6000'/>
-      </source>
-      <target dev='vdad' bus='virtio'/>
-    </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
       <source protocol='gluster' name='test-volume/test-gluster2.raw'>
         <host name='192.168.1.100'/>
       </source>
-      <target dev='vdae' bus='virtio'/>
+      <target dev='vdad' bus='virtio'/>
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
       <source protocol='nbd'>
         <host transport='unix' socket='relative.sock'/>
       </source>
-      <target dev='vdaf' bus='virtio'/>
+      <target dev='vdae' bus='virtio'/>
     </disk>
 
     <!-- bus usb -->
@@ -599,6 +592,13 @@ Foo bar baz &amp; yeah boii &lt; &gt; yeahfoo
       <source file='/root/container.vmdk'/>
       <target dir='/home'/>
     </filesystem>
+    <filesystem type='mount'>
+      <driver type='virtiofs' queue='1024'/>
+      <source socket='/tmp/sock'/>
+      <target dir='tag'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </filesystem>
+
 
     <!-- tpm devices -->
     <tpm model='tpm-tis'>
@@ -1598,9 +1598,9 @@ ba</description>
 <pool type='dir'>
   <name>pool-dir</name>
   <uuid>35bb2ad9-388a-cdfe-461a-b8907f6e53fe</uuid>
-  <capacity>107374182400</capacity>
+  <capacity unit='TiB'>32</capacity>
   <allocation>0</allocation>
-  <available>107374182400</available>
+  <available unit='TiB'>32</available>
   <source>
   </source>
   <target>
@@ -2164,35 +2164,6 @@ ba</description>
 </pool>
 
 
-<pool type='sheepdog'>
-  <name>pool-sheepdog</name>
-  <uuid>581381f8-a13f-4f7c-89b5-9c9b71c64834</uuid>
-  <capacity unit='bytes'>107374182400</capacity>
-  <allocation unit='bytes'>53687091200</allocation>
-  <available unit='bytes'>53687091200</available>
-  <source>
-    <host name='localhost' port='7000'/>
-    <name>mysheeppool</name>
-  </source>
-
-  <volume type='network'>
-    <name>vol_sheepdog</name>
-    <key>sheep/vol_sheepdog</key>
-    <capacity unit='bytes'>1024</capacity>
-    <allocation unit='bytes'>0</allocation>
-    <target>
-      <path>sheepdog:vol_sheepdog</path>
-      <format type='unknown'/>
-      <permissions>
-        <mode>0600</mode>
-        <owner>-1</owner>
-        <group>-1</group>
-      </permissions>
-    </target>
-  </volume>
-</pool>
-
-
 <pool type='gluster'>
   <name>pool-gluster</name>
   <uuid>7b83ef6d-28da-44f1-841f-2011320f13b0</uuid>
diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py
index d102e51..70c9de6 100644
--- a/tests/test_capabilities.py
+++ b/tests/test_capabilities.py
@@ -92,6 +92,8 @@ def testDomainCapabilitiesx86():
 
     assert caps.supports_filesystem_virtiofs()
     assert caps.supports_memorybacking_memfd()
+    assert caps.supports_redirdev_usb()
+    assert caps.supports_channel_spicevmc()
 
     xml = open(DATADIR + "/kvm-x86_64-domcaps-amd-sev.xml").read()
     caps = DomainCapabilities(utils.URIs.open_testdriver_cached(), xml)
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 774db09..3424963 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -123,6 +123,12 @@ def no_osinfo_linux2020_virtio():
         return "osinfo is too old: missing linux2020 with virtio-gpu"
 
 
+def no_osinfo_win11():
+    win11 = OSDB.lookup_os("win11")
+    if not win11:
+        return "osinfo is too old: no win11 entry"
+
+
 ######################
 # Test class helpers #
 ######################
@@ -511,7 +517,8 @@ numa.interconnects.latency0.initiator=0,numa.interconnects.latency0.target=0,num
 numa.interconnects.latency1.initiator=0,numa.interconnects.latency1.target=2,numa.interconnects.latency1.cache=1,numa.interconnects.latency1.type=access,numa.interconnects.latency1.value=10,numa.interconnects.latency1.unit=ns,\
 numa.interconnects.bandwidth0.initiator=0,numa.interconnects.bandwidth0.target=0,numa.interconnects.bandwidth0.type=access,numa.interconnects.bandwidth0.value=204800,\
 numa.interconnects.bandwidth1.initiator=0,numa.interconnects.bandwidth1.target=2,numa.interconnects.bandwidth1.cache=1,numa.interconnects.bandwidth1.type=access,numa.interconnects.bandwidth1.value=409600,numa.interconnects.bandwidth1.unit=KiB,\
-cache.mode=emulate,cache.level=3
+cache.mode=emulate,cache.level=3,\
+maxphysaddr.mode=emulate,maxphysaddr.bits=46
 
 
 --numatune 1,2,3,5-7,^6,mode=strict,\
@@ -605,6 +612,7 @@ source.reservations.managed=no,source.reservations.source.type=unix,source.reser
 --disk path=/fooroot.img,size=.0001,transient=on
 --disk source.dir=/
 --disk type=nvme,source.type=pci,source.managed=no,source.namespace=2,source.address.domain=0x0001,source.address.bus=0x02,source.address.slot=0x00,source.address.function=0x0
+--disk /tmp/disk1.qcow2,size=16,driver.type=qcow2,driver.metadata_cache.max_size=2048,driver.metadata_cache.max_size.unit=KiB
 
 
 --network user,mac=12:34:56:78:11:22,portgroup=foo,link_state=down,rom_bar=on,rom_file=/tmp/foo
@@ -830,7 +838,7 @@ c.add_compare("--pxe "
 "--cpuset 1,3-5 "  # setting compat --cpuset when --vcpus is not present
 # --boot loader settings here, or they will conflict with firmware=efi
 # in other test cases
-"--boot loader_ro=yes,loader.type=rom,loader=/tmp/foo,loader_secure=no "
+"--boot loader_ro=yes,loader.type=rom,loader=/tmp/foo,loader_secure=no,loader.stateless=yes"
 
 # 'default' handling for solo devices
 """
@@ -879,7 +887,7 @@ c.add_compare("--pxe "
 
 # Hitting test driver specific output
 c.add_compare("--connect " + utils.URIs.test_suite + " "
-"--cpu host-passthrough,migratable=on "  # migratable=on is only accepted with host-passthrough
+"--cpu host-passthrough,migratable=on,maxphysaddr.mode=passthrough "  # migratable=on is only accepted with host-passthrough
 "--seclabel label=foobar.label,a1,z2,b3,relabel=yes,type=dynamic "  # fills in default model=testModel
 "--tpm default "  # --tpm default when domcaps missing
 "",
@@ -966,6 +974,7 @@ c.add_valid("--os-variant generic --pxe --ram 16", grep="Requested memory 16 MiB
 c.add_valid("--os-variant winxp --ram 32 --cdrom %(EXISTIMG1)s", grep="32 MiB is less than the recommended 64 MiB")  # Windows. Catch memory warning
 c.add_valid("--osinfo generic --pxe --autostart")  # --autostart flag
 c.add_valid("--cdrom %(EXISTIMG2)s --os-variant win2k3 --print-step 2")  # HVM windows install, print 3rd stage XML
+c.add_valid("--memory 512 --osinfo generic --boot cdrom")  # --boot XXX should imply --install no_install
 c.add_compare("--location location=%(TREEDIR)s --initrd-inject virt-install --extra-args ks=file:/virt-install", "initrd-inject")  # initrd-inject
 c.add_compare("--cdrom http://example.com/path/to/some.iso --os-variant detect=yes,require=no", "cdrom-url")
 c.add_compare("--pxe --print-step all --os-variant none", "simple-pxe")  # Diskless PXE install
@@ -1016,7 +1025,9 @@ c = vinst.add_category("misc-install", "--nographics --noautoconsole")
 c.add_compare("--connect %s --os-variant generic" % (utils.URIs.test_suite), "noargs-fail", use_default_args=False)  # No arguments
 c.add_compare("--connect %s --os-variant fedora26" % (utils.URIs.test_suite), "osvariant-noargs-fail", use_default_args=False)  # No arguments
 c.add_compare("--connect %s --os-variant fedora26 --pxe --print-xml" % (utils.URIs.test_suite), "osvariant-defaults-pxe", use_default_args=False)  # No arguments
+c.add_compare("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init root-password-generate=yes,disable=no --sysinfo system.serial=foobar", "cloud-init-options1", env={"VIRTINST_TEST_SUITE_PRINT_CLOUDINIT": "1"})  # --cloud-init root-password-generate, with --sysinfo override
 c.add_compare("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init", "cloud-init-default", env={"VIRTINST_TEST_SUITE_CLOUDINIT": "1"})  # default --cloud-init behavior is root-password-generate=yes,disable=yes
+c.add_valid("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init", env={"VIRTINST_TEST_SUITE_CLOUDINIT": "1"})  # default --cloud-init, but without implied --print-xml, to hit some specific code paths
 c.add_compare("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init root-password-generate=yes,disable=no --sysinfo system.serial=foobar", "cloud-init-options1", env={"VIRTINST_TEST_SUITE_PRINT_CLOUDINIT": "1"})  # --cloud-init root-password-generate, with --sysinfo override
 c.add_compare("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init root-password-file=%(ADMIN-PASSWORD-FILE)s,root-ssh-key=%(XMLDIR)s/cloudinit/ssh-key.txt,clouduser-ssh-key=%(XMLDIR)s/cloudinit/ssh-key2.txt --boot smbios.mode=none", "cloud-init-options2", env={"VIRTINST_TEST_SUITE_PRINT_CLOUDINIT": "1"})  # --cloud-init root-password-file with smbios.mode override
 c.add_compare("--disk %(EXISTIMG1)s --os-variant fedora28 --cloud-init ssh-key=%(XMLDIR)s/cloudinit/ssh-key.txt", "cloud-init-options3", env={"VIRTINST_TEST_SUITE_PRINT_CLOUDINIT": "1"})  # --cloud-init ssh-key
@@ -1086,6 +1097,7 @@ c.add_compare("--cdrom %(EXISTIMG2)s --file %(EXISTIMG1)s --os-variant win2k3 --
 c.add_compare("--os-variant name=ubuntusaucy --nodisks --boot cdrom --virt-type qemu --cpu Penryn --input tablet --boot uefi --graphics vnc", "qemu-plain")  # plain qemu
 c.add_compare("--os-variant fedora20 --nodisks --boot network --graphics default --arch i686 --rng none", "qemu-32-on-64", prerun_check=has_old_osinfo)  # 32 on 64
 c.add_compare("--osinfo linux2020 --pxe", "linux2020", prerun_check=no_osinfo_linux2020_virtio)
+c.add_compare("--check disk_size=off --osinfo win11 --cdrom %(EXISTIMG1)s", "win11", prerun_check=no_osinfo_win11)
 c.add_compare("--osinfo generic --disk none --location %(ISO-NO-OS)s,kernel=frib.img,initrd=/frob.img", "location-manual-kernel", prerun_check=missing_xorriso)  # --location with an unknown ISO but manually specified kernel paths
 c.add_compare("--disk %(EXISTIMG1)s --location %(ISOTREE)s --nonetworks", "location-iso", prerun_check=missing_xorriso)  # Using --location iso mounting
 c.add_compare("--disk %(EXISTIMG1)s --cdrom %(ISOLABEL)s", "cdrom-centos-label")  # Using --cdrom with centos CD label, should use virtio etc.
@@ -1104,13 +1116,14 @@ c.add_compare("--connect " + utils.URIs.kvm_x86_remote + " --import --disk %(EXI
 c.add_compare("--connect %(URI-KVM-X86)s --os-variant fedora26 --graphics spice --controller usb,model=none", "graphics-usb-disable")
 c.add_compare("--osinfo generic --boot uefi --disk size=1", "boot-uefi")
 c.add_compare("--osinfo generic --boot uefi --disk size=1 --tpm none --connect " + utils.URIs.kvm_x86_oldfirmware, "boot-uefi-oldcaps")
-c.add_compare("--osinfo linux2020 --boot uefi --launchSecurity sev --connect " + utils.URIs.kvm_amd_sev, "amd-sev")
+c.add_compare("--osinfo linux2020 --boot uefi --launchSecurity sev --connect " + utils.URIs.kvm_amd_sev, "amd-sev", prerun_check=no_osinfo_linux2020_virtio)
 
 c.add_invalid("--disk none --location nfs:example.com/fake --nonetworks", grep="NFS URL installs are no longer supported")
 c.add_invalid("--disk none --boot network --machine foobar", grep="domain type None with machine 'foobar'")
 c.add_invalid("--nodisks --boot network --arch mips --virt-type kvm", grep="any virtualization options for architecture 'mips'")
 c.add_invalid("--nodisks --boot network --paravirt --arch mips", grep=" 'xen' for architecture 'mips'")
 c.add_invalid("--osinfo generic --launchSecurity sev --connect " + utils.URIs.kvm_amd_sev, grep="SEV launch security requires a Q35 UEFI machine")
+c.add_invalid("--disk none --cloud-init --unattended --install fedora30", grep="Cannot use --unattended and --cloud-init at the same time")
 
 
 
diff --git a/tests/test_disk.py b/tests/test_disk.py
index ef06515..9127371 100644
--- a/tests/test_disk.py
+++ b/tests/test_disk.py
@@ -82,6 +82,7 @@ def test_disk_dir_searchable(monkeypatch):
         searchdata = virtinst.DeviceDisk.check_path_search(conn,
                 tmpdir + "/footest")
         assert searchdata.uid == os.getuid()
+        # pylint: disable=use-implicit-booleaness-not-comparison
         assert searchdata.fixlist == []
 
         # Remove perms on the tmpdir, now it should report failures
diff --git a/tests/test_misc.py b/tests/test_misc.py
index aa610f4..2cabc33 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -178,7 +178,9 @@ def test_misc_meter():
             m.update(2000)
         with unittest.mock.patch("time.time", return_value=5.0):
             m.update(4000)
-        with unittest.mock.patch("time.time", return_value=6.0):
+        with unittest.mock.patch("time.time", return_value=5.1):
+            m.update(4500)
+        with unittest.mock.patch("time.time", return_value=5.5):
             m.end()
 
     # Basic output testing
@@ -222,6 +224,20 @@ def test_misc_meter():
     out = meter.output.getvalue().replace("\r", "\n")
     utils.diff_compare(out, os.path.join(utils.DATADIR, "meter", "meter6.txt"))
 
+    def _test_meter_zero(m, startval=0, text="Meter text test"):
+        with unittest.mock.patch("time.time", return_value=1.0):
+            m.start(text, startval)
+        with unittest.mock.patch("time.time", return_value=3.0):
+            m.update(0)
+        with unittest.mock.patch("time.time", return_value=3.1):
+            m.end()
+
+    # meter with size 0 and startval size 0
+    meter = _progresspriv.TextMeter(output=io.StringIO())
+    _test_meter_zero(meter, 0)
+    out = meter.output.getvalue().replace("\r", "\n")
+    utils.diff_compare(out, os.path.join(utils.DATADIR, "meter", "meter-zero.txt"))
+
     # BaseMeter coverage
     meter = _progresspriv.BaseMeter()
     _test_meter_values(meter)
diff --git a/tests/testdriver.xml b/tests/testdriver.xml
index b213863..4e0a41e 100644
--- a/tests/testdriver.xml
+++ b/tests/testdriver.xml
@@ -294,26 +294,19 @@ Foo bar baz &amp; yeah boii &lt; &gt; yeahfoo
       </source>
       <target dev='vdac' bus='virtio'/>
     </disk>
-    <disk type='network' device='disk'>
-      <driver name='qemu' type='raw'/>
-      <source protocol='sheepdog' name='image,with,commas'>
-        <host name='example.org' port='6000'/>
-      </source>
-      <target dev='vdad' bus='virtio'/>
-    </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
       <source protocol='gluster' name='test-volume/test-gluster2.raw'>
         <host name='192.168.1.100'/>
       </source>
-      <target dev='vdae' bus='virtio'/>
+      <target dev='vdad' bus='virtio'/>
     </disk>
     <disk type='network' device='disk'>
       <driver name='qemu' type='raw'/>
       <source protocol='nbd'>
         <host transport='unix' socket='relative.sock'/>
       </source>
-      <target dev='vdaf' bus='virtio'/>
+      <target dev='vdae' bus='virtio'/>
     </disk>
 
     <!-- bus usb -->
@@ -599,6 +592,13 @@ Foo bar baz &amp; yeah boii &lt; &gt; yeahfoo
       <source file='/root/container.vmdk'/>
       <target dir='/home'/>
     </filesystem>
+    <filesystem type='mount'>
+      <driver type='virtiofs' queue='1024'/>
+      <source socket='/tmp/sock'/>
+      <target dir='tag'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </filesystem>
+
 
     <!-- tpm devices -->
     <tpm model='tpm-tis'>
@@ -1598,9 +1598,9 @@ ba</description>
 <pool type='dir'>
   <name>pool-dir</name>
   <uuid>35bb2ad9-388a-cdfe-461a-b8907f6e53fe</uuid>
-  <capacity>107374182400</capacity>
+  <capacity unit='TiB'>32</capacity>
   <allocation>0</allocation>
-  <available>107374182400</available>
+  <available unit='TiB'>32</available>
   <source>
   </source>
   <target>
@@ -2164,35 +2164,6 @@ ba</description>
 </pool>
 
 
-<pool type='sheepdog'>
-  <name>pool-sheepdog</name>
-  <uuid>581381f8-a13f-4f7c-89b5-9c9b71c64834</uuid>
-  <capacity unit='bytes'>107374182400</capacity>
-  <allocation unit='bytes'>53687091200</allocation>
-  <available unit='bytes'>53687091200</available>
-  <source>
-    <host name='localhost' port='7000'/>
-    <name>mysheeppool</name>
-  </source>
-
-  <volume type='network'>
-    <name>vol_sheepdog</name>
-    <key>sheep/vol_sheepdog</key>
-    <capacity unit='bytes'>1024</capacity>
-    <allocation unit='bytes'>0</allocation>
-    <target>
-      <path>sheepdog:vol_sheepdog</path>
-      <format type='unknown'/>
-      <permissions>
-        <mode>0600</mode>
-        <owner>-1</owner>
-        <group>-1</group>
-      </permissions>
-    </target>
-  </volume>
-</pool>
-
-
 <pool type='gluster'>
   <name>pool-gluster</name>
   <uuid>7b83ef6d-28da-44f1-841f-2011320f13b0</uuid>
diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
index 0a8e33d..df90237 100644
--- a/virtManager/addhardware.py
+++ b/virtManager/addhardware.py
@@ -371,8 +371,8 @@ class vmmAddHardware(vmmGObjectUI):
 
         msg = _("These changes will take effect after "
                 "the next guest shutdown.")
-        dtype = (hotplug_err and
-                 Gtk.MessageType.WARNING or Gtk.MessageType.INFO)
+        dtype = (Gtk.MessageType.WARNING if hotplug_err else
+                 Gtk.MessageType.INFO)
         hotplug_msg = ""
         if hotplug_err:
             hotplug_msg += (hotplug_err[0] + "\n\n" +
@@ -1560,7 +1560,7 @@ class vmmAddHardware(vmmGObjectUI):
         controller_num = [x for x in controllers if
                 (x.type == controller_type)]
         if len(controller_num) > 0:
-            index_new = max([x.index for x in controller_num]) + 1
+            index_new = max(int(x.index or 0) for x in controller_num) + 1
             dev.index = index_new
 
         dev.type = controller_type
@@ -1590,8 +1590,8 @@ class vmmAddHardware(vmmGObjectUI):
                 textent.set_text(path)
 
         reason = (isdir and
-                  self.config.CONFIG_DIR_FS or
-                  self.config.CONFIG_DIR_IMAGE)
+                  vmmStorageBrowser.REASON_FS or
+                  vmmStorageBrowser.REASON_IMAGE)
         if self._storagebrowser is None:
             self._storagebrowser = vmmStorageBrowser(self.conn)
 
diff --git a/virtManager/asyncjob.py b/virtManager/asyncjob.py
index 32d9c0a..958320b 100644
--- a/virtManager/asyncjob.py
+++ b/virtManager/asyncjob.py
@@ -7,7 +7,6 @@
 import threading
 import traceback
 
-from gi.repository import Gdk
 from gi.repository import GLib
 
 import libvirt
@@ -265,9 +264,7 @@ class vmmAsyncJob(vmmGObjectUI):
             self.topwin.present()
 
         if not self.cancel_cb and self.show_progress:
-            gdk_window = self.topwin.get_window()
-            gdk_window.set_cursor(
-                Gdk.Cursor.new_from_name(gdk_window.get_display(), "progress"))
+            self._set_cursor("progress")
         self._bg_thread.start()
 
 
diff --git a/virtManager/config.py b/virtManager/config.py
index 8379697..2c81b06 100644
--- a/virtManager/config.py
+++ b/virtManager/config.py
@@ -133,51 +133,6 @@ class _SettingsWrapper(object):
 
 
 class vmmConfig(object):
-    # key names for saving last used paths
-    CONFIG_DIR_IMAGE = "image"
-    CONFIG_DIR_ISO_MEDIA = "isomedia"
-    CONFIG_DIR_FLOPPY_MEDIA = "floppymedia"
-    CONFIG_DIR_SCREENSHOT = "screenshot"
-    CONFIG_DIR_FS = "fs"
-
-    # Metadata mapping for browse types. Prob shouldn't go here, but works
-    # for now.
-    browse_reason_data = {
-        CONFIG_DIR_IMAGE: {
-            "enable_create":  True,
-            "storage_title":  _("Locate or create storage volume"),
-            "local_title":    _("Locate existing storage"),
-            "dialog_type":    Gtk.FileChooserAction.SAVE,
-            "choose_button":  Gtk.STOCK_OPEN,
-            "gsettings_key": "image",
-        },
-
-        CONFIG_DIR_SCREENSHOT: {
-            "gsettings_key": "screenshot",
-        },
-
-        CONFIG_DIR_ISO_MEDIA: {
-            "enable_create":  False,
-            "storage_title":  _("Locate ISO media volume"),
-            "local_title":    _("Locate ISO media"),
-            "gsettings_key": "media",
-        },
-
-        CONFIG_DIR_FLOPPY_MEDIA: {
-            "enable_create":  False,
-            "storage_title":  _("Locate floppy media volume"),
-            "local_title":    _("Locate floppy media"),
-            "gsettings_key": "media",
-        },
-
-        CONFIG_DIR_FS: {
-            "enable_create":  False,
-            "storage_title":  _("Locate directory volume"),
-            "local_title":    _("Locate directory volume"),
-            "dialog_type":    Gtk.FileChooserAction.SELECT_FOLDER,
-        },
-    }
-
     CONSOLE_SCALE_NEVER = 0
     CONSOLE_SCALE_FULLSCREEN = 1
     CONSOLE_SCALE_ALWAYS = 2
@@ -627,23 +582,15 @@ class vmmConfig(object):
 
 
     # Default directory location dealings
-    def get_default_directory(self, conn, _type):
-        ignore = conn
-        browsedata = self.browse_reason_data.get(_type, {})
-        key = browsedata.get("gsettings_key", None)
-        path = None
-
-        if key:
-            path = self.conf.get("/paths/%s-default" % key)
-
-        log.debug("directory for type=%s returning=%s", _type, path)
+    def get_default_directory(self, gsettings_key):
+        path = self.conf.get("/paths/%s-default" % gsettings_key)
+        log.debug("directory for gsettings_key=%s returning=%s",
+                  gsettings_key, path)
         return path
 
-    def set_default_directory(self, folder, _type):
-        browsedata = self.browse_reason_data.get(_type, {})
-        key = browsedata.get("gsettings_key", None)
-        if not key:
+    def set_default_directory(self, gsettings_key, folder):
+        if not folder or folder.startswith("/dev"):
             return  # pragma: no cover
-
-        log.debug("saving directory for type=%s to %s", key, folder)
-        self.conf.set("/paths/%s-default" % key, folder)
+        log.debug("saving directory for gsettings_key=%s to %s",
+                  gsettings_key, folder)
+        self.conf.set("/paths/%s-default" % gsettings_key, folder)
diff --git a/virtManager/createpool.py b/virtManager/createpool.py
index 66457b5..a3e9a99 100644
--- a/virtManager/createpool.py
+++ b/virtManager/createpool.py
@@ -381,9 +381,8 @@ class vmmCreatePool(vmmGObjectUI):
         self._show_options_by_pool()
 
     def _browse_source_cb(self, src):
-        source = self.err.browse_local(self.conn,
+        source = self.err.browse_local(
                 _("Choose source path"),
-                dialog_type=Gtk.FileChooserAction.OPEN,
                 start_folder="/dev")
         if source:
             self.widget("pool-source-path").get_child().set_text(source)
@@ -394,7 +393,7 @@ class vmmCreatePool(vmmGObjectUI):
         if current:
             startfolder = os.path.dirname(current)
 
-        target = self.err.browse_local(self.conn,
+        target = self.err.browse_local(
                 _("Choose target directory"),
                 dialog_type=Gtk.FileChooserAction.SELECT_FOLDER,
                 start_folder=startfolder)
diff --git a/virtManager/createvm.py b/virtManager/createvm.py
index 7e5ded6..95aff71 100644
--- a/virtManager/createvm.py
+++ b/virtManager/createvm.py
@@ -1280,11 +1280,11 @@ class vmmCreateVM(vmmGObjectUI):
 
     def _browse_file(self, cbwidget, cb=None, is_media=False, is_dir=False):
         if is_media:
-            reason = self.config.CONFIG_DIR_ISO_MEDIA
+            reason = vmmStorageBrowser.REASON_ISO_MEDIA
         elif is_dir:
-            reason = self.config.CONFIG_DIR_FS
+            reason = vmmStorageBrowser.REASON_FS
         else:
-            reason = self.config.CONFIG_DIR_IMAGE
+            reason = vmmStorageBrowser.REASON_IMAGE
 
         if cb:
             callback = cb
diff --git a/virtManager/createvol.py b/virtManager/createvol.py
index 5845303..ea82964 100644
--- a/virtManager/createvol.py
+++ b/virtManager/createvol.py
@@ -208,7 +208,7 @@ class vmmCreateVolume(vmmGObjectUI):
             self._storage_browser.set_finish_cb(cb)
             self._storage_browser.topwin.set_modal(self.topwin.get_modal())
             self._storage_browser.set_browse_reason(
-                self.config.CONFIG_DIR_IMAGE)
+                vmmStorageBrowser.REASON_IMAGE)
 
         self._storage_browser.show(self.topwin)
 
diff --git a/virtManager/details/details.py b/virtManager/details/details.py
index 757e18a..1970d0a 100644
--- a/virtManager/details/details.py
+++ b/virtManager/details/details.py
@@ -1089,7 +1089,7 @@ class vmmDetails(vmmGObjectUI):
 
     def _browse_file(self, callback, reason=None):
         if not reason:
-            reason = self.config.CONFIG_DIR_IMAGE
+            reason = vmmStorageBrowser.REASON_IMAGE
 
         if self.storage_browser is None:
             self.storage_browser = vmmStorageBrowser(self.conn)
@@ -1235,9 +1235,9 @@ class vmmDetails(vmmGObjectUI):
     def _disk_source_browse_clicked_cb(self, src):
         disk = self._get_hw_row()[HW_LIST_COL_DEVICE]
         if disk.is_floppy():
-            reason = self.config.CONFIG_DIR_FLOPPY_MEDIA
+            reason = vmmStorageBrowser.REASON_FLOPPY_MEDIA
         else:
-            reason = self.config.CONFIG_DIR_ISO_MEDIA
+            reason = vmmStorageBrowser.REASON_ISO_MEDIA
 
         def cb(ignore, path):
             self._mediacombo.set_path(path)
diff --git a/virtManager/details/sshtunnels.py b/virtManager/details/sshtunnels.py
index 9afc1e1..cb7ca7c 100644
--- a/virtManager/details/sshtunnels.py
+++ b/virtManager/details/sshtunnels.py
@@ -22,7 +22,7 @@ class ConnectionInfo(object):
     """
     def __init__(self, conn, gdev):
         self.gtype = gdev.type
-        self.gport = gdev.port and str(gdev.port) or None
+        self.gport = str(gdev.port) if gdev.port else None
         self.gsocket = (gdev.listens and gdev.listens[0].socket) or gdev.socket
         self.gaddr = gdev.listen or "127.0.0.1"
         self.gtlsport = gdev.tlsPort or None
diff --git a/virtManager/device/fsdetails.py b/virtManager/device/fsdetails.py
index 40868d1..555c745 100644
--- a/virtManager/device/fsdetails.py
+++ b/virtManager/device/fsdetails.py
@@ -190,7 +190,7 @@ class vmmFSDetails(vmmGObjectUI):
                 self.widget("fs-format-combo"), dev.driver_format)
 
         if dev.type != DeviceFilesystem.TYPE_RAM:
-            self.widget("fs-source").set_text(dev.source)
+            self.widget("fs-source").set_text(dev.source or "")
         else:
             self.widget("fs-ram-source-spin").set_value(int(dev.source) // 1024)
         self.widget("fs-target").set_text(dev.target or "")
@@ -268,8 +268,8 @@ class vmmFSDetails(vmmGObjectUI):
                 textent.set_text(path)
 
         reason = (isdir and
-                  self.config.CONFIG_DIR_FS or
-                  self.config.CONFIG_DIR_IMAGE)
+                  vmmStorageBrowser.REASON_FS or
+                  vmmStorageBrowser.REASON_IMAGE)
 
         if self._storage_browser is None:
             self._storage_browser = vmmStorageBrowser(self.conn)
diff --git a/virtManager/error.py b/virtManager/error.py
index 8d78efa..593c89c 100644
--- a/virtManager/error.py
+++ b/virtManager/error.py
@@ -3,6 +3,7 @@
 # This work is licensed under the GNU GPLv2 or later.
 # See the COPYING file in the top-level directory.
 
+import os
 import sys
 import textwrap
 import traceback
@@ -231,49 +232,38 @@ class vmmErrorDialog(vmmGObject):
 
         return response
 
-    def browse_local(self, conn, dialog_name, start_folder=None,
+    def browse_local(self, dialog_name, start_folder=None,
                      _type=None, dialog_type=None,
-                     browse_reason=None,
-                     choose_button=None, default_name=None):
+                     choose_button=None, default_name=None,
+                     confirm_overwrite=False):
         """
         Helper function for launching a filechooser
 
         @dialog_name: String to use in the title bar of the filechooser.
-        @conn: vmmConnection used by calling class
         @start_folder: Folder the filechooser is viewing at startup
         @_type: File extension to filter by (e.g. "iso", "png")
         @dialog_type: Maps to FileChooserDialog 'action'
-        @browse_reason: The vmmConfig.CONFIG_DIR* reason we are browsing.
-            If set, this will override the 'folder' parameter with the gsettings
-            value, and store the user chosen path.
         """
-        import os
-
-        # Initial setup
-        overwrite_confirm = False
-        dialog_type = dialog_type or Gtk.FileChooserAction.OPEN
-
-        if dialog_type == Gtk.FileChooserAction.SAVE:
-            if choose_button is None:
-                choose_button = Gtk.STOCK_SAVE
-                overwrite_confirm = True
-
+        if dialog_type is None:
+            dialog_type = Gtk.FileChooserAction.OPEN
         if choose_button is None:
             choose_button = Gtk.STOCK_OPEN
 
+        buttons = (Gtk.STOCK_CANCEL,
+                   Gtk.ResponseType.CANCEL,
+                   choose_button,
+                   Gtk.ResponseType.ACCEPT)
+
         fcdialog = Gtk.FileChooserDialog(title=dialog_name,
                                     parent=self.get_parent(),
                                     action=dialog_type,
-                                    buttons=(Gtk.STOCK_CANCEL,
-                                             Gtk.ResponseType.CANCEL,
-                                             choose_button,
-                                             Gtk.ResponseType.ACCEPT))
+                                    buttons=buttons)
         fcdialog.set_default_response(Gtk.ResponseType.ACCEPT)
 
         if default_name:
             fcdialog.set_current_name(default_name)
 
-        fcdialog.set_do_overwrite_confirmation(overwrite_confirm)
+        fcdialog.set_do_overwrite_confirmation(confirm_overwrite)
 
         # Set file match pattern (ex. *.png)
         if _type is not None:
@@ -289,11 +279,6 @@ class vmmErrorDialog(vmmGObject):
                 f.set_name(name)
             fcdialog.set_filter(f)
 
-        # Set initial dialog folder
-        if browse_reason:
-            start_folder = self.config.get_default_directory(
-                conn, browse_reason)
-
         if start_folder is not None:
             if os.access(start_folder, os.R_OK):
                 fcdialog.set_current_folder(start_folder)
@@ -304,10 +289,6 @@ class vmmErrorDialog(vmmGObject):
             ret = fcdialog.get_filename()
         fcdialog.destroy()
 
-        # Store the chosen directory in gsettings if necessary
-        if ret and browse_reason and not ret.startswith("/dev"):
-            self.config.set_default_directory(
-                os.path.dirname(ret), browse_reason)
         return ret
 
 
diff --git a/virtManager/lib/statsmanager.py b/virtManager/lib/statsmanager.py
index 2849549..ece130a 100644
--- a/virtManager/lib/statsmanager.py
+++ b/virtManager/lib/statsmanager.py
@@ -66,7 +66,7 @@ class _VMStatsList(vmmGObject):
         expected = self.config.get_stats_history_length()
         current = len(self._stats)
         if current > expected:  # pragma: no cover
-            del(self._stats[expected:current])
+            del self._stats[expected:current]
 
         def _calculate_rate(record_name):
             ret = 0.0
diff --git a/virtManager/object/domain.py b/virtManager/object/domain.py
index 2d6f5bc..1570b95 100644
--- a/virtManager/object/domain.py
+++ b/virtManager/object/domain.py
@@ -1306,10 +1306,10 @@ class vmmDomain(vmmLibvirtObject):
     def get_arch(self):
         return self.get_xmlobj().os.arch
     def get_init(self):
-        import pipes
+        import shlex
         init = self.get_xmlobj().os.init
         initargs = " ".join(
-            [pipes.quote(i.val) for i in self.get_xmlobj().os.initargs])
+            [shlex.quote(i.val) for i in self.get_xmlobj().os.initargs])
         return init, initargs
 
     def get_emulator(self):
diff --git a/virtManager/object/storagepool.py b/virtManager/object/storagepool.py
index 563526b..1b4da51 100644
--- a/virtManager/object/storagepool.py
+++ b/virtManager/object/storagepool.py
@@ -32,7 +32,6 @@ POOL_TYPE_DESCS = {
     StoragePool.TYPE_MPATH: _("Multipath Device Enumerator"),
     StoragePool.TYPE_GLUSTER: _("Gluster Filesystem"),
     StoragePool.TYPE_RBD: _("RADOS Block Device/Ceph"),
-    StoragePool.TYPE_SHEEPDOG: _("Sheepdog Filesystem"),
     StoragePool.TYPE_ZFS: _("ZFS Pool"),
 }
 
@@ -128,7 +127,6 @@ class vmmStoragePool(vmmLibvirtObject):
         ]
         if not clone:
             supported.extend([
-                StoragePool.TYPE_SHEEPDOG,
                 StoragePool.TYPE_ZFS,
             ])
         return pool_type in supported
diff --git a/virtManager/storagebrowse.py b/virtManager/storagebrowse.py
index b5fa9a2..c5a2651 100644
--- a/virtManager/storagebrowse.py
+++ b/virtManager/storagebrowse.py
@@ -4,6 +4,10 @@
 # This work is licensed under the GNU GPLv2 or later.
 # See the COPYING file in the top-level directory.
 
+import os
+
+from gi.repository import Gtk
+
 from virtinst import log
 
 from .lib import uiutil
@@ -11,15 +15,53 @@ from .baseclass import vmmGObjectUI
 from .hoststorage import vmmHostStorage
 
 
+class _BrowseReasonMetadata:
+    def __init__(self, browse_reason):
+        self.enable_create = False
+        self.storage_title = None
+        self.local_title = None
+        self.gsettings_key = None
+        self.dialog_type = None
+
+        if browse_reason == vmmStorageBrowser.REASON_IMAGE:
+            self.enable_create = True
+            self.local_title = _("Locate existing storage")
+            self.storage_title = _("Locate or create storage volume")
+            self.dialog_type = Gtk.FileChooserAction.SAVE
+            self.gsettings_key = "image"
+
+        if browse_reason == vmmStorageBrowser.REASON_ISO_MEDIA:
+            self.local_title = _("Locate ISO media")
+            self.storage_title = _("Locate ISO media volume")
+            self.gsettings_key = "media"
+
+        if browse_reason == vmmStorageBrowser.REASON_FLOPPY_MEDIA:
+            self.local_title = _("Locate floppy media")
+            self.storage_title = _("Locate floppy media volume")
+            self.gsettings_key = "media"
+
+        if browse_reason == vmmStorageBrowser.REASON_FS:
+            self.local_title = _("Locate directory volume")
+            self.storage_title = _("Locate directory volume")
+            self.dialog_type = Gtk.FileChooserAction.SELECT_FOLDER
+
+        if browse_reason is None:
+            self.enable_create = True
+            self.storage_title = _("Choose Storage Volume")
+
+
 class vmmStorageBrowser(vmmGObjectUI):
+    REASON_IMAGE = "image"
+    REASON_ISO_MEDIA = "isomedia"
+    REASON_FLOPPY_MEDIA = "floppymedia"
+    REASON_FS = "fs"
+
     def __init__(self, conn):
         vmmGObjectUI.__init__(self, "storagebrowse.ui", "vmm-storage-browse")
         self.conn = conn
 
         self._first_run = False
         self._finish_cb = None
-
-        # Passed to browse_local
         self._browse_reason = None
 
         self.storagelist = vmmHostStorage(self.conn, self.builder, self.topwin,
@@ -103,15 +145,10 @@ class vmmStorageBrowser(vmmGObjectUI):
 
     def set_browse_reason(self, reason):
         self._browse_reason = reason
-        data = self.config.browse_reason_data.get(self._browse_reason, {})
-        allow_create = True
-        title = _("Choose Storage Volume")
-        if data:
-            allow_create = data["enable_create"]
-            title = data["storage_title"]
+        data = _BrowseReasonMetadata(self._browse_reason)
 
-        self.topwin.set_title(title)
-        self.storagelist.widget("vol-add").set_sensitive(allow_create)
+        self.topwin.set_title(data.storage_title)
+        self.storagelist.widget("vol-add").set_sensitive(data.enable_create)
 
 
     #############
@@ -128,7 +165,7 @@ class vmmStorageBrowser(vmmGObjectUI):
         self._finish(volume.get_target_path())
 
     def _vol_sensitive_cb(self, fmt):
-        if ((self._browse_reason == self.config.CONFIG_DIR_FS) and
+        if ((self._browse_reason == vmmStorageBrowser.REASON_FS) and
             fmt != 'dir'):
             return False
         return True
@@ -139,22 +176,27 @@ class vmmStorageBrowser(vmmGObjectUI):
     ####################
 
     def _browse_local(self):
-        dialog_type = None
-        dialog_name = None
-        choose_button = None
-
-        data = self.config.browse_reason_data.get(self._browse_reason)
-        if data:
-            dialog_name = data["local_title"] or None
-            dialog_type = data.get("dialog_type")
-            choose_button = data.get("choose_button")
-
-        filename = self.err.browse_local(self.conn,
-            dialog_type=dialog_type, browse_reason=self._browse_reason,
-            dialog_name=dialog_name, choose_button=choose_button)
-        if filename:
-            log.debug("Browse local chose path=%s", filename)
-            self._finish(filename)
+        data = _BrowseReasonMetadata(self._browse_reason)
+        gsettings_key = data.gsettings_key
+
+        if gsettings_key:
+            start_folder = self.config.get_default_directory(gsettings_key)
+
+        filename = self.err.browse_local(
+            dialog_type=data.dialog_type,
+            dialog_name=data.local_title,
+            start_folder=start_folder)
+
+        if not filename:
+            return
+
+        log.debug("Browse local chose path=%s", filename)
+
+        if gsettings_key:
+            self.config.set_default_directory(
+                gsettings_key, os.path.dirname(filename))
+
+        self._finish(filename)
 
     def _finish(self, path):
         if self._finish_cb:
diff --git a/virtManager/vmwindow.py b/virtManager/vmwindow.py
index 3ac4a6a..d554945 100644
--- a/virtManager/vmwindow.py
+++ b/virtManager/vmwindow.py
@@ -548,24 +548,31 @@ class vmmVMWindow(vmmGObjectUI):
             ret = ret.buffer  # pragma: no cover
 
         import datetime
+        import os
         now = str(datetime.datetime.now()).split(".")[0].replace(" ", "_")
         default = "Screenshot_%s_%s.png" % (self.vm.get_name(), now)
 
-        path = self.err.browse_local(
-            self.vm.conn, _("Save Virtual Machine Screenshot"),
+        start_folder = self.config.get_default_directory("screenshot")
+
+        filename = self.err.browse_local(
+            _("Save Virtual Machine Screenshot"),
             _type=("png", _("PNG files")),
             dialog_type=Gtk.FileChooserAction.SAVE,
-            browse_reason=self.config.CONFIG_DIR_SCREENSHOT,
-            default_name=default)
-        if not path:  # pragma: no cover
+            choose_button=Gtk.STOCK_SAVE,
+            start_folder=start_folder,
+            default_name=default,
+            confirm_overwrite=True)
+        if not filename:  # pragma: no cover
             log.debug("No screenshot path given, skipping save.")
             return
 
-        filename = path
         if not filename.endswith(".png"):
             filename += ".png"  # pragma: no cover
         open(filename, "wb").write(ret)
 
+        self.config.set_default_directory(
+                "screenshot", os.path.dirname(filename))
+
 
     ########################
     # Details page refresh #
diff --git a/virt_manager.egg-info/PKG-INFO b/virt_manager.egg-info/PKG-INFO
index 2982ae6..0afc228 100644
--- a/virt_manager.egg-info/PKG-INFO
+++ b/virt_manager.egg-info/PKG-INFO
@@ -1,13 +1,8 @@
 Metadata-Version: 2.1
 Name: virt-manager
 Version: 4.1.0
-Summary: UNKNOWN
 Home-page: http://virt-manager.org
 Author: Cole Robinson
 Author-email: virt-tools-list@redhat.com
 License: GPLv2+
-Platform: UNKNOWN
 License-File: COPYING
-
-UNKNOWN
-
diff --git a/virt_manager.egg-info/SOURCES.txt b/virt_manager.egg-info/SOURCES.txt
index 7bf3c47..c29ebd0 100644
--- a/virt_manager.egg-info/SOURCES.txt
+++ b/virt_manager.egg-info/SOURCES.txt
@@ -287,6 +287,7 @@ tests/data/cli/compare/virt-install-testdriver-edgecases.xml
 tests/data/cli/compare/virt-install-unattended-remote-cdrom.xml
 tests/data/cli/compare/virt-install-vz-ct-template.xml
 tests/data/cli/compare/virt-install-w2k3-cdrom.xml
+tests/data/cli/compare/virt-install-win11.xml
 tests/data/cli/compare/virt-install-win7-uefi.xml
 tests/data/cli/compare/virt-install-xen-default.xml
 tests/data/cli/compare/virt-install-xen-hvm.xml
@@ -429,6 +430,7 @@ tests/data/fakemedia/fakerhel6tree/images/xen/vmlinuz
 tests/data/inject/new-kickstart.ks
 tests/data/inject/old-kickstart.ks
 tests/data/inject/preseed.cfg
+tests/data/meter/meter-zero.txt
 tests/data/meter/meter1.txt
 tests/data/meter/meter2.txt
 tests/data/meter/meter3.txt
diff --git a/virtinst/_progresspriv.py b/virtinst/_progresspriv.py
index 5a31a18..207c647 100644
--- a/virtinst/_progresspriv.py
+++ b/virtinst/_progresspriv.py
@@ -112,10 +112,10 @@ class BaseMeter:
         assert type(amount_read) is int
 
         now = time.time()
+        self.last_amount_read = amount_read
+        self.re.update(amount_read, now)
         if (not self.last_update_time or
                 (now >= self.last_update_time + self.update_period)):
-            self.re.update(amount_read, now)
-            self.last_amount_read = amount_read
             self.last_update_time = now
             self._do_update(amount_read)
 
@@ -247,11 +247,15 @@ class TextMeter(BaseMeter):
         tl = TerminalLine(8)
         # For big screens, make it more readable.
         use_hours = bool(tl.llen > 80)
-        ui_size = tl.add(' | %5sB' % total_size)
         ui_time = tl.add('  %s' % format_time(self.re.elapsed_time(),
                                               use_hours))
         ui_end, not_done = _term_add_end(tl, self.size, amount_read)
-        dummy = not_done
+        if not not_done and amount_read == 0:
+            # Doesn't need to print total_size
+            ui_size = tl.add(' | %5s ' % ' ')
+        else:
+            ui_size = tl.add(' | %5sB' % total_size)
+
         out = '\r%-*.*s%s%s%s\n' % (tl.rest(), tl.rest(), self.text,
                                     ui_size, ui_time, ui_end)
         self.output.write(out)
diff --git a/virtinst/cli.py b/virtinst/cli.py
index c4dffd3..7615f74 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -85,7 +85,7 @@ class VirtHelpFormatter(argparse.RawDescriptionHelpFormatter):
     '''
     oldwrap = None
 
-    # pylint: disable=arguments-differ
+    # pylint: disable=arguments-differ,protected-access
     def _split_lines(self, *args, **kwargs):
         def return_default():
             return argparse.RawDescriptionHelpFormatter._split_lines(
@@ -1690,7 +1690,7 @@ def convert_old_force(options):
     if options.force:
         if not options.check:
             options.check = "all=off"
-        del(options.force)
+        del options.force
 
 
 class ParserCheck(VirtCLIParser):
@@ -2281,7 +2281,7 @@ class ParserCPU(VirtCLIParser):
                 policy = "disable"
 
             if policy:
-                del(self.optdict[key])
+                del self.optdict[key]
                 converted[policy].append(key[1:])
 
         self.optdict.update(converted)
@@ -2386,6 +2386,9 @@ class ParserCPU(VirtCLIParser):
         cls.add_arg("cache.level", "cache.level")
         cls.add_arg("cache.mode", "cache.mode")
 
+        cls.add_arg("maxphysaddr.mode", "maxphysaddr.mode")
+        cls.add_arg("maxphysaddr.bits", "maxphysaddr.bits")
+
         # CPU features
         # These are handled specially in _parse
         cls.add_arg("force", None, lookup_cb=None, cb=cls.set_feature_cb)
@@ -2750,7 +2753,7 @@ class ParserBoot(VirtCLIParser):
             if cliname not in inst.BOOT_DEVICES:
                 continue
 
-            del(self.optdict[cliname])
+            del self.optdict[cliname]
             if cliname not in boot_order:
                 boot_order.append(cliname)
 
@@ -2858,6 +2861,7 @@ class ParserBoot(VirtCLIParser):
         cls.add_arg("loader.readonly", "loader_ro", is_onoff=True)
         cls.add_arg("loader.type", "loader_type")
         cls.add_arg("loader.secure", "loader_secure", is_onoff=True)
+        cls.add_arg("loader.stateless", "loader_stateless", is_onoff=True)
 
         # Guest-Based bootloader options
         cls.add_arg("firmware", "firmware")
@@ -3696,6 +3700,11 @@ class ParserDisk(VirtCLIParser):
         cls.add_arg("driver.queues", "driver_queues")
         cls.add_arg("driver.error_policy", "error_policy")
 
+        cls.add_arg("driver.metadata_cache.max_size",
+                    "driver_metadata_cache_max_size")
+        cls.add_arg("driver.metadata_cache.max_size.unit",
+                    "driver_metadata_cache_max_size_unit")
+
         cls.add_arg("iotune.read_bytes_sec", "iotune_rbs")
         cls.add_arg("iotune.write_bytes_sec", "iotune_wbs")
         cls.add_arg("iotune.total_bytes_sec", "iotune_tbs")
diff --git a/virtinst/cloner.py b/virtinst/cloner.py
index 34a702f..9334513 100644
--- a/virtinst/cloner.py
+++ b/virtinst/cloner.py
@@ -352,8 +352,7 @@ class Cloner(object):
         """
         self._new_guest.id = None
         self._new_guest.title = None
-        self._new_guest.uuid = None
-        self._new_guest.uuid = Guest.generate_uuid(self.conn)
+        self.set_clone_uuid(Guest.generate_uuid(self.conn))
 
         for dev in self._new_guest.devices.graphics:
             if dev.port and dev.port != -1:
@@ -408,6 +407,9 @@ class Cloner(object):
         Override the new VMs generated UUId
         """
         self._new_guest.uuid = uuid
+        for sysinfo in self._new_guest.sysinfo:
+            if sysinfo.system_uuid:
+                sysinfo.system_uuid = uuid
 
     def set_replace(self, val):
         """
diff --git a/virtinst/devices/disk.py b/virtinst/devices/disk.py
index dc59fd1..9609eba 100644
--- a/virtinst/devices/disk.py
+++ b/virtinst/devices/disk.py
@@ -481,6 +481,11 @@ class DeviceDisk(Device):
     driver_iothread = XMLProperty("./driver/@iothread", is_int=True)
     driver_queues = XMLProperty("./driver/@queues", is_int=True)
 
+    driver_metadata_cache_max_size = XMLProperty(
+        "./driver/metadata_cache/max_size", is_int=True)
+    driver_metadata_cache_max_size_unit = XMLProperty(
+        "./driver/metadata_cache/max_size/@unit")
+
     error_policy = XMLProperty("./driver/@error_policy")
     serial = XMLProperty("./serial")
     wwn = XMLProperty("./wwn")
diff --git a/virtinst/domain/cpu.py b/virtinst/domain/cpu.py
index 5de42b4..c635932 100644
--- a/virtinst/domain/cpu.py
+++ b/virtinst/domain/cpu.py
@@ -102,6 +102,17 @@ class _CPUFeature(XMLBuilder):
     policy = XMLProperty("./@policy")
 
 
+class _CPUMaxphysaddr(XMLBuilder):
+    """
+    Class for generating XML for <cpu> child node <maxphysaddr>.
+    """
+    XML_NAME = "maxphysaddr"
+    _XML_PROP_ORDER = ["mode", "bits"]
+
+    mode = XMLProperty("./@mode")
+    bits = XMLProperty("./@bits", is_int=True)
+
+
 ##############
 # NUMA cells #
 ##############
@@ -211,7 +222,7 @@ class DomainCpu(XMLBuilder):
     _XML_PROP_ORDER = ["mode", "match", "check", "migratable",
             "model", "model_fallback", "model_vendor_id", "vendor",
             "topology", "cache", "features",
-            "cells", "latencies", "bandwidths"]
+            "cells", "latencies", "bandwidths", "maxphysaddr"]
 
 
     ##################
@@ -242,6 +253,8 @@ class DomainCpu(XMLBuilder):
     latencies = XMLChildProperty(_NUMALatency, relative_xpath="./numa/interconnects")
     bandwidths = XMLChildProperty(_NUMABandwidth, relative_xpath="./numa/interconnects")
 
+    maxphysaddr = XMLChildProperty(_CPUMaxphysaddr, is_single=True)
+
 
     #############################
     # Special CPU mode handling #
diff --git a/virtinst/domain/os.py b/virtinst/domain/os.py
index e2cea75..4310e62 100644
--- a/virtinst/domain/os.py
+++ b/virtinst/domain/os.py
@@ -86,6 +86,7 @@ class DomainOs(XMLBuilder):
     _XML_PROP_ORDER = [
             "firmware", "os_type", "arch", "machine", "firmware_features",
             "loader", "loader_ro", "loader_secure", "loader_type",
+            "loader_stateless",
             "nvram", "nvram_template",
             "init", "initargs", "initenvs", "initdir", "inituser", "initgroup",
             "kernel", "initrd", "kernel_args", "dtb", "acpi_tb", "acpi_tb_type",
@@ -100,6 +101,7 @@ class DomainOs(XMLBuilder):
     loader_ro = XMLProperty("./loader/@readonly", is_yesno=True)
     loader_type = XMLProperty("./loader/@type")
     loader_secure = XMLProperty("./loader/@secure", is_yesno=True)
+    loader_stateless = XMLProperty("./loader/@stateless", is_yesno=True)
 
     # BIOS bootloader options
     def _get_bootorder(self):
diff --git a/virtinst/domcapabilities.py b/virtinst/domcapabilities.py
index d22ce6a..db08bf6 100644
--- a/virtinst/domcapabilities.py
+++ b/virtinst/domcapabilities.py
@@ -113,6 +113,8 @@ class _Devices(_CapsBlock):
     graphics = XMLChildProperty(_make_capsblock("graphics"), is_single=True)
     tpm = XMLChildProperty(_make_capsblock("tpm"), is_single=True)
     filesystem = XMLChildProperty(_make_capsblock("filesystem"), is_single=True)
+    redirdev = XMLChildProperty(_make_capsblock("redirdev"), is_single=True)
+    channel = XMLChildProperty(_make_capsblock("channel"), is_single=True)
 
 
 class _Features(_CapsBlock):
@@ -334,7 +336,7 @@ class DomainCapabilities(XMLBuilder):
         """
         Return True if we know how to setup UEFI for the passed arch
         """
-        return self.arch in list(self._uefi_arch_patterns.keys())
+        return self.arch in self._uefi_arch_patterns
 
     def supports_uefi_loader(self):
         """
@@ -448,6 +450,30 @@ class DomainCapabilities(XMLBuilder):
 
         return self.devices.graphics.get_enum("type").has_value("spice")
 
+    def supports_channel_spicevmc(self):
+        """
+        Return False if libvirt explicitly advertises no support for
+        spice channel
+        """
+        if self.devices.channel.supported is None:
+            # Follow the original behavior in case of talking to older
+            # libvirt.
+            return True
+
+        return self.devices.channel.get_enum("type").has_value("spicevmc")
+
+    def supports_redirdev_usb(self):
+        """
+        Return False if libvirt explicitly advertises no support for
+        USB redirect
+        """
+        if self.devices.redirdev.supported is None:
+            # Follow the original behavior in case of talking to older
+            # libvirt.
+            return True
+
+        return self.devices.redirdev.get_enum("bus").has_value("usb")
+
     def supports_filesystem_virtiofs(self):
         """
         Return True if libvirt advertises support for virtiofs
diff --git a/virtinst/guest.py b/virtinst/guest.py
index e663602..123abfb 100644
--- a/virtinst/guest.py
+++ b/virtinst/guest.py
@@ -1127,6 +1127,8 @@ class Guest(XMLBuilder):
             self.add_device(ctrl)
 
     def _add_spice_channels(self):
+        if not self.lookup_domcaps().supports_channel_spicevmc():
+            return  # pragma: no cover
         if self.skip_default_channel:
             return
         for chn in self.devices.channel:
@@ -1155,6 +1157,8 @@ class Guest(XMLBuilder):
         self.add_device(dev)
 
     def _add_spice_usbredir(self):
+        if not self.lookup_domcaps().supports_redirdev_usb():
+            return  # pragma: no cover
         if self.skip_default_usbredir:
             return
         if self.devices.redirdev:
diff --git a/virtinst/install/installerinject.py b/virtinst/install/installerinject.py
index 0b2a9bc..98d88cf 100644
--- a/virtinst/install/installerinject.py
+++ b/virtinst/install/installerinject.py
@@ -20,7 +20,7 @@ def _run_initrd_commands(initrd, tempdir):
                                  stderr=subprocess.PIPE,
                                  cwd=tempdir)
     cpio_proc = subprocess.Popen(['cpio', '--create', '--null', '--quiet',
-                                  '--format=newc', '--owner=root:root'],
+                                  '--format=newc', '--owner=0:0'],
                                  stdin=find_proc.stdout,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE,
diff --git a/virtinst/osdict.py b/virtinst/osdict.py
index c04b1e5..0e7eb31 100644
--- a/virtinst/osdict.py
+++ b/virtinst/osdict.py
@@ -464,13 +464,6 @@ class _OsVariant(object):
         except Exception:  # pragma: no cover
             log.debug("Error checking osinfo firmware support", exc_info=True)
 
-        if self.name == "win11":  # pragma: no cover
-            # 2022-03 the libosinfo APIs for firmware haven't landed, and
-            # there's no osinfo-db entry for win11. But we know win11 requires
-            # UEFI. Hardcode it for now, so the next virt-install release has
-            # a better chance of doing the right thing for win11 when
-            # it pops up in a osinfo-db release.
-            ret = True
         return ret
 
     def get_recommended_resources(self):
diff --git a/virtinst/pollhelpers.py b/virtinst/pollhelpers.py
index ef69591..f9fcc3f 100644
--- a/virtinst/pollhelpers.py
+++ b/virtinst/pollhelpers.py
@@ -32,7 +32,7 @@ def _new_poll_helper(origmap, typename, list_cb, build_cb, support_cb):
         else:
             # Previously known object
             current[name] = origmap[name]
-            del(origmap[name])
+            del origmap[name]
 
     return (list(origmap.values()), list(new.values()), list(current.values()))
 
diff --git a/virtinst/storage.py b/virtinst/storage.py
index 509f5cb..f9a9f7a 100644
--- a/virtinst/storage.py
+++ b/virtinst/storage.py
@@ -82,7 +82,6 @@ class StoragePool(_StorageObject):
     TYPE_MPATH   = "mpath"
     TYPE_GLUSTER = "gluster"
     TYPE_RBD     = "rbd"
-    TYPE_SHEEPDOG = "sheepdog"
     TYPE_ZFS     = "zfs"
 
     @staticmethod
@@ -311,7 +310,7 @@ class StoragePool(_StorageObject):
 
     def supports_source_name(self):
         return self.type in [self.TYPE_LOGICAL, self.TYPE_GLUSTER,
-            self.TYPE_RBD, self.TYPE_SHEEPDOG, self.TYPE_ZFS]
+            self.TYPE_RBD, self.TYPE_ZFS]
 
 
     def supports_source_path(self):
@@ -323,7 +322,7 @@ class StoragePool(_StorageObject):
     def supports_hosts(self):
         return self.type in [
                 self.TYPE_NETFS, self.TYPE_ISCSI, self.TYPE_GLUSTER,
-                self.TYPE_RBD, self.TYPE_SHEEPDOG]
+                self.TYPE_RBD]
 
     def supports_format(self):
         return self.type in [self.TYPE_FS, self.TYPE_NETFS, self.TYPE_DISK]
@@ -340,8 +339,7 @@ class StoragePool(_StorageObject):
             return StorageVolume.TYPE_BLOCK
         if (self.type == StoragePool.TYPE_GLUSTER or
             self.type == StoragePool.TYPE_RBD or
-            self.type == StoragePool.TYPE_ISCSI or
-            self.type == StoragePool.TYPE_SHEEPDOG):
+            self.type == StoragePool.TYPE_ISCSI):
             return StorageVolume.TYPE_NETWORK
         return StorageVolume.TYPE_FILE
 
@@ -697,6 +695,7 @@ class StorageVolume(_StorageObject):
                 log.debug("Using vol create flags=%s", createflags)
                 vol = self.pool.createXML(xml, createflags)
 
+            meter.update(self.capacity)
             meter.end()
             log.debug("Storage volume '%s' install complete.", self.name)
             return vol
diff --git a/virtinst/virtinstall.py b/virtinst/virtinstall.py
index 6d7f56b..130c8e2 100644
--- a/virtinst/virtinstall.py
+++ b/virtinst/virtinstall.py
@@ -67,7 +67,7 @@ def check_cdrom_option_error(options):
 def convert_old_printxml(options):
     if options.xmlstep:
         options.xmlonly = options.xmlstep
-        del(options.xmlstep)
+        del options.xmlstep
 
 
 def convert_old_sound(options):
@@ -135,10 +135,10 @@ def convert_old_disks(options):
         else:
             _do_convert_old_disks(options)
 
-    del(options.file_paths)
-    del(options.disksize)
-    del(options.sparse)
-    del(options.nodisks)
+    del options.file_paths
+    del options.disksize
+    del options.sparse
+    del options.nodisks
     log.debug("Distilled --disk options: %s", options.disk)
 
 
@@ -147,7 +147,7 @@ def convert_old_os_options(options):
         return
     log.warning(
         _("--os-type is deprecated and does nothing. Please stop using it."))
-    del(options.old_os_type)
+    del options.old_os_type
 
 
 def convert_old_memory(options):
@@ -204,9 +204,9 @@ def convert_old_networks(options):
                 networks[idx] = networks[idx].replace(prefix + ":",
                                                       prefix + "=")
 
-    del(options.mac)
-    del(options.bridge)
-    del(options.nonetworks)
+    del options.mac
+    del options.bridge
+    del options.nonetworks
 
     options.network = networks
     log.debug("Distilled --network options: %s", options.network)
@@ -224,7 +224,7 @@ def convert_old_graphics(options):
     if graphics and (vnc or sdl or keymap or vncport or vnclisten):
         fail(_("Cannot mix --graphics and old style graphical options"))
 
-    optnum = sum([bool(g) for g in [vnc, nographics, sdl, graphics]])
+    optnum = sum(bool(g) for g in [vnc, nographics, sdl, graphics])
     if optnum > 1:
         raise ValueError(_("Can't specify more than one of VNC, SDL, "
                            "--graphics or --nographics"))
@@ -411,6 +411,9 @@ def build_installer(options, guest, installdata):
         else:
             extra_args = [installdata.kernel_args]
 
+    if options.unattended and options.cloud_init:
+        cli.fail_conflicting("--unattended", "--cloud-init")
+
     if options.unattended:
         unattended_data = cli.parse_unattended(options.unattended)
 
@@ -429,11 +432,15 @@ def build_installer(options, guest, installdata):
         install_bootdev = "network"
     elif installdata.is_set:
         pass
-    elif (options.import_install or
-          options.xmlonly or
-          options.boot or
-          options.cloud_init or
-          options.unattended):
+    elif options.xmlonly:
+        no_install = True
+    elif options.import_install:
+        no_install = True
+    elif options.boot_was_set:
+        no_install = True
+    elif options.cloud_init:
+        no_install = True
+    elif options.unattended:
         no_install = True
 
     installer = virtinst.Installer(guest.conn,
@@ -641,6 +648,7 @@ def _build_options_guest(conn, options):
 def build_guest_instance(conn, options):
     installdata = cli.parse_install(options.install)
     osdata = cli.parse_os_variant(options.os_variant or installdata.os)
+    options.boot_was_set = bool(options.boot)
 
     if options.reinstall:
         dummy1, guest, dummy2 = cli.get_domain_and_guest(conn, options.reinstall)
@@ -1014,7 +1022,7 @@ def xml_to_print(guest, installer, xmlonly, dry):
 
 def parse_args():
     parser = cli.setupParser(
-        "%(prog)s --name NAME --memory MB STORAGE INSTALL [options]",
+        "%(prog)s OPTIONS",
         _("Create a new virtual machine from specified install media."),
         introspection_epilog=True)
     cli.add_connect_option(parser)
diff --git a/virtinst/xmlbuilder.py b/virtinst/xmlbuilder.py
index 07a9e31..dd78038 100644
--- a/virtinst/xmlbuilder.py
+++ b/virtinst/xmlbuilder.py
@@ -262,9 +262,9 @@ class XMLProperty(_XMLPropertyBase):
         self._is_onoff = is_onoff
         self._do_abspath = do_abspath
 
-        conflicts = sum([int(bool(i)) for i in
+        conflicts = sum(int(bool(i)) for i in
                 [self._is_bool, self._is_int,
-                 self._is_yesno, self._is_onoff]])
+                 self._is_yesno, self._is_onoff])
         if conflicts > 1:
             raise xmlutil.DevError("Conflict property converter options.")
 
@@ -343,7 +343,7 @@ class XMLProperty(_XMLPropertyBase):
         propstore = xmlbuilder._propstore
 
         if self.propname in propstore:
-            del(propstore[self.propname])
+            del propstore[self.propname]
         propstore[self.propname] = val
 
     def _nonxml_fget(self, xmlbuilder):

Debdiff

File lists identical (after any substitutions)

No differences were encountered between the control files of package virt-manager

No differences were encountered between the control files of package virtinst

More details

Full run details