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
- virt-manager_4.1.0+git20230119.1.a63b40a-1~jan+nus1.dsc
- virt-manager_4.1.0+git20230119.1.a63b40a-1~jan+nus1_all.deb
- virt-manager_4.1.0+git20230119.1.a63b40a-1~jan+nus1_amd64.buildinfo
- virtinst_4.1.0+git20230119.1.a63b40a-1~jan+nus1_all.deb
- virt-manager_4.1.0+git20230119.1.a63b40a-1~jan+nus1_amd64.changes
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 & yeah boii < > 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 & yeah boii < > 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 & yeah boii < > 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 & yeah boii < > 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