Compare commits

...

79 Commits

Author SHA1 Message Date
antonios-f
5609eed33f Merge branch 'spice-vnc-default-audio-backend' into 'master'
src/qemu/qemu_domain.c: Fix overriding audioBackend in qemuDomainDefSuggestDefaultAudioBackend

See merge request libvirt/libvirt!271
2024-04-06 06:09:01 +00:00
Benjamin Taubmann
a39dd25715 Extend libvirt-guests to shutdown only persistent VMs
At the moment, there is no configuration option for the libvirt-guests
service that allows users to define that only persistent virtual machines
should be shutdown on host shutdown.

Currently, the service config allows to choose between two ON_SHUTDOWN
actions that are executed on running virtual machines when the host goes
down: shutdown, suspend.
The ON_SHUTDOWN action should be orthogonal to the type of the virtual
machine. However, the existing implementation, does not suspend
transient virtual machines.
This is the matrix of actions that is executed on virtual machines based
on the configured ON_SHUTDOWN action and the type of a virtual machine.

         | persistent | transient
shutdown | shutdown   | shutdown (what we want to change)
suspend  | suspend    | nothing

Add config option PERSISTENT_ONLY to libvirt-guests config that allows
users to define if the ON_SHUTDOWN action should be applied only on
persistent virtual machines. PERSISTENT_ONLY can be set to true, false,
default. The default option will implement the already existing logic.

Case 1: PERSISTENT_ONLY=default
         | persistent | transient
shutdown | shutdown   | shutdown
suspend  | suspend    | nothing

Case 2: PERSISTENT_ONLY=true
         | persistent | transient
shutdown | shutdown   | nothing
suspend  | suspend    | nothing

Case 3: PERSISTENT_ONLY=false
         | persistent | transient
shutdown | shutdown   | shutdown
suspend  | suspend    | suspend

Signed-off-by: Benjamin Taubmann <benjamin.taubmann@nutanix.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
2024-04-04 09:10:00 +02:00
Marc Hartmayer
5138dd2478 node_device_conf: virNodeDeviceGetSCSITargetCaps: fix memory leak
Make sure the old value in `scsi_target->wwpn` is free'd before replacing it.
While at it, simplify the code.

==9104== 38 bytes in 2 blocks are definitely lost in loss record 1,943 of 3,250
==9104==    at 0x483B8C0: malloc (vg_replace_malloc.c:442)
==9104==    by 0x4DFB69B: g_malloc (gmem.c:130)
==9104==    by 0x4E1921D: g_strdup (gstrfuncs.c:363)
==9104==    by 0x495D60B: g_strdup_inline (gstrfuncs.h:321)
==9104==    by 0x495D60B: virFCReadRportValue (virfcp.c:62)
==9104==    by 0x4A5F5CB: virNodeDeviceGetSCSITargetCaps (node_device_conf.c:2914)
==9104==    by 0xBF62529: udevProcessSCSITarget (node_device_udev.c:657)
==9104==    by 0xBF62529: udevGetDeviceDetails (node_device_udev.c:1406)
==9104==    by 0xBF62529: udevAddOneDevice (node_device_udev.c:1563)
==9104==    by 0xBF639B5: udevProcessDeviceListEntry (node_device_udev.c:1637)
==9104==    by 0xBF639B5: udevEnumerateDevices (node_device_udev.c:1691)
==9104==    by 0xBF639B5: nodeStateInitializeEnumerate (node_device_udev.c:2009)
==9104==    by 0x49BDBFD: virThreadHelper (virthread.c:256)
==9104==    by 0x5242069: start_thread (in /usr/lib64/libc.so.6)

Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2024-04-04 09:05:11 +02:00
Peter Krempa
e2a7dd3f7e qemucapabilitiestest: Update qemu-9.0 capabilities for RC1
Update the capabilities to v9.0.0-rc1-55-g7fcf7575f3

Notable changes:
 - Q35 machine now supports 4096 cpus

 - 'kvm-asyncpf-vmexit' cpu feature added
 - 'x2apic' cpu feature is now migratable

 - LUKS detached header support added
 - LUKS sm4 cipher alg support added

 - 'console' chardev backend type removed
 - 'memory' chardev backend type deprecated

 - 'mapped-ram' migration capability added
 - 'zero-page-detection' migration parameter added

 - 'acpi-generic-initiator' 'object' added

 - 'request-ebpf' QMP command added

 - 'legacy-reset', 'resettable-container', 'vhost-user-snd*' QOM types
   added

 - 'vdpa' property added for following device models:
    - virtio-balloon-pci
    - virtio-blk-pci
    - virtio-gpu-pci
    - virtio-iommu-pci
    - virtio-mem-pci
    - virtio-net-pci
    - virtio-scsi-pci

 - 'win2k-install-hack' property of 'ide-hd' added
 - 'aw-bits', 'granule', properties of 'virtio-iommu-pci' added
 - 'ebpf-rss-fds' property of 'virtio-net-pci' added

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
2024-04-03 10:41:45 +02:00
Rayhan Faizel
6c62ee7933 tests: Add testcase for usb-net
Add small test case to demonstrate use of usb-net with user networking
backend.

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-03 10:40:32 +02:00
Rayhan Faizel
e18c69bcd8 conf: Automatically assign address to usb-net device
This patch will allow usb-net devices to be automatically assigned a USB
address (and skip any attempt to assign a PCI one).

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-03 10:40:14 +02:00
Denis V. Lunev
d37a4aa69c remote: properly initialize objects in ACL helpers
Commit 2ecdf25929 was intended to
implement two things: reduce stack usage inside ACL helpers and
minimally initialize virDomainDef object to avoid passing garbage
inside validation framework. Though original commit has not
touched other ACL helpers.

This patch adds proper clauses to
    remoteRelayNetworkEventCheckACL
    remoteRelayStoragePoolEventCheckACL
    remoteRelayNodeDeviceEventCheckACL
    remoteRelaySecretEventCheckACL

Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-03 09:34:35 +02:00
Brett Holman
b902cfece0 virsysinfo: Try reading DMI table
Add DMI support for risc-v and mips. Attempt to read dmidecode and
fall back to old behavior if that fails.

The SMBIOS specification[1] officially supports both RISC-V and LoongArch.
Some mips-based Loongson-3 processors also have SMBIOS.

[1] https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.7.0.pdf

Signed-off-by: Brett Holman <brett.holman@canonical.com>
Reviewed-by: Kristina Hanicova <khanicov@redhat.com>
Reviewed-by: Jim Fehlig <jfehlig@suse.com>
2024-04-02 16:58:47 -06:00
Jonathon Jongsma
21af003084 qemu: enable display/ramfb for vfio pci hostdevs
Implement display="on" and ramfb="on" for vfio PCI host devices in qemu.
This enables passthrough PCI devices for display just like we did for
mdevs.

Resolves: https://issues.redhat.com/browse/RHEL-28808

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2024-04-02 11:45:54 -05:00
Jonathon Jongsma
092f933a62 conf: allow display and ramfb for vfio pci hostdevs
We already allow the user to specify display="on" and ramfb="on" for
mdev host devices. But newer GPU models will no longer use the mdev
framework, so we should enable this same functionality for other
non-mdev passthrough PCI devices.

Resolves: https://issues.redhat.com/browse/RHEL-28808

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2024-04-02 11:45:54 -05:00
Andrea Bolognani
16d37076be virsh: Show 'connected to console' message later
Right now, we display the message before actually attempting
to connect to the VM console. That operation, however, can
fail for a number of reasons: for example, is the VM doesn't
have a serial device, the output ends up looking like

  $ virsh console cirros
  Connected to domain 'cirros'
  Escape character is ^] (Ctrl + ])
  error: internal error: cannot find character device <null>

The initial message is misleading. Change things so that it's
only printed if we actually successfully connected to the VM
console.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-02 18:26:35 +02:00
Peter Krempa
1e853a64dd tests: Drop 'test-lib.sh'
We no longer have any shell-based tests that use it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
1f82833251 virshtest: Adapt virsh-uriprecedence test case
Reimplement the virsh-uriprecedence test case in virshtest. To do this
we need to add infrastructure to pass extra environment variables to the
tested virsh.

The user config files are shipped in repo rather than created in the
script.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
e57ce7fb45 tests: Reimplement 'libvirtd-fail' case directly in meson
The test simply invokes libvirtd and expects it to fail. We can do that
directly in meson without the need for a wrapper script.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
8f10dd32af tests: Re-implement '(virsh|virt-admin)-self-test' directly in meson
The self-test command for both virsh and virt-admin is self contained
and directly reports success, thus we don't actually need to run a shell
wrapper around it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
c92c63a5a3 virshtest: Adapt 'libvirtd-pool'
The test case is a fairly simple invocation of pool-create-as which can
be done easily from 'virshtest'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
3ace963662 virshtest: Adapt 'virsh-read-bufsiz' and 'virsh-read-non-seekable'
Test both situations (reading from non-regular file and reading a file
larger than (arbitrary) buffer size) via 'virshtest'.

To feed the pipe we need to create a thread that does it, but otherwise
it's fairly straightforward.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
60cc7bd1c0 virshtest: Adapt 'virsh-checkpoint' test
Invoke the majority of the command via DO_TEST_SCRIPT in 'virshtest'.
Some adaptation was needed to avoid printing of tables with volatile
data such as checkpoint creation time, which were converted to list
names-only.

To proprely test redefinition we store XMLs rather than taking them from
the defined checkpoints and use them separately to test redefinition of
checkpoint XMLs. This makes use of the 'cd' command in non-interactive
mode.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
c8d5703150 virshtest: Adapt 'virsh-snapshot' test
Invoke the majority of the command via DO_TEST_SCRIPT in 'virshtest'.
Some adaptation was needed to avoid printing of tables with volatile
data such as snapshot creation time, which were converted to list
names-only.

To proprely test redefinition we store XMLs rather than taking them from
the defined snapshots and use them separately to test redefinition of
snapshot XMLs. This makes use of the 'cd' command in non-interactive
mode.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
eb82c632e3 vsh: Allow non-interactive use of 'cd' command
For testing purposes it will come handy to change the directory from a
batch-mode script. Remove the check forbidding use of the 'cd' command
in batch mode.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
6193c4656e virsh: Fix '--name' and '--parent' used together in '(snapshot|checkpoint)-list' command
Until now when '--name' was used the parent was not printed and the
option was ignored. One option would be to declare the options mutually
exclusive, but for testing it may come handy to print both the snapshot
name and parent. Adjust the code to print them tab-separated and adjust
the docs.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
a068dec641 virshtest: Adapt 'virsh-start' and 'virsh-undefine' tests as 'lifecycle' case
The 'virsh-start' case simply tried to start an already running VM. This
can be easily tested together with the tests for undefining a VM.

For this test the test driver config with multiple VMs comes handy as we
need to test 3 situations when we undefine and stop the VM.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
6bc71ed27c virshtest: Adapt 'virsh-schedinfo'
It's a simple virsh invocation which can be done in 'virshtest'

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
090ae2b46c virshtest: Adapt 'virsh-int-overflow'
It's a simple test case invoking one virsh command thus it can be moved
to 'virshtest'

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
d8e2220c9a virshtest: Adapt 'virsh-vcpupin' test
As all cases are negative we can test them all in one virsh run.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
630b229bc9 qemuxmlconftest: Adapt XMLs from 'virsh-cpuset' and 'virsh-define-dev-segfault' cases
Rather than using 'virsh define' for the tests use the XML (or idea what
the XML is testing) and use them as 'qemuxmlconftest' cases.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
c96ac614a8 virshtest: Reimplement 'virsh-output' test
Adapt the 'tests/virsh-output-commands' file from 'virsh-output' test as
a source. Apart from expanding the bash function to each command, I've
also had to drop the negative tests for argument population, as a
command parsing error aborts the execution of the script right away
rather than just reporting the error.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
06f816cb7b virshtest: Adapt 'event' option arg handling tests from 'virsh-optparse'
Move the argument parsing tests excercising 'virsh event' options
from 'virsh-optparse' to 'virshtest'.

As the test invokes 'virsh event' with a timeout and thus waits for one
second pointlessly the patch also adds infrastructure to mark individual
cases as expensive and is skipped normally.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
2aec9b399b virshtest: Adapt numeric option arg handling tests from 'virsh-optparse'
Move the argument parsing tests excercising various numeric options
(except 'virsh event') from 'virsh-optparse' to 'virshtest'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
6a2712262e virshtest: Adapt 'snapshot-create-as' arg handling tests from 'virsh-optparse'
Move the argument parsing tests excercising 'virsh snapshot-create-as'
from 'virsh-optparse' to 'virshtest'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
1b3f148866 virshtest: Adapt argument parsing tests from 'virsh-optparse'
Move the argument parsing tests excercising 'virsh setvcpus' from
'virsh-optparse' to 'virshtest'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
52fc03ef21 virshtest: Drop support for testing against hardcoded strings
Now that all tests were converted, this is no longer needed.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
cf0d80344e virshtest: Adapt 'iothread' tests to DO_TEST_SCRIPT
Adapt the tests to be invoked in one run. Note that multiple fake VMs
were used for the distinct tests so that they don't influence each
other.

This is the final coversion of tests to run in batch mode which halved
the runtime of 'virshtest' on my machine (1.11s vs 2.33s).

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
b65f3a01a8 virshtest: Adapt 'blkiotune' tests to DO_TEST_SCRIPT
The query and update can be tested in one run and validated against
files rather than hardcoded strings.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
a5e203417a virshtest: Adapt tests for domain id lookup and state query to DO_TEST_SCRIPT
All of the commands can be tested in one 'virsh' run in batch mode and
tested against a file rather than hardcoded strings.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
4b8581b8ef virshtest: Replace list and nodeinfo tests by equivalent VIR_TEST_SCRIPT variant
Add the basic list and info commands into a script and run it via
VIR_TEST_RUN_SCRIPT to simplify the code and save up on 'virsh'
instances exec'd for the test.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
e8e79e38e5 virshtest: Drop string form of expected output data of "echo" tests
Now that the output is tested against files these are not needed any
more. The brief existence of both proved that the output is identical.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
d15b79a35c virshtest: Test against output files ("echo" tests)
Managing output files is much simpler especially with
VIR_TEST_REGENERATE_OUTPUT compared to putting the expected string blobs
into the C source file.

For now the output is tested both against the hardcoded strings as well
as the output files.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
c63b5ee98b virshtest: Prepare for simpler testing - echo tests
Embedding the expected output in a C source code makes it very hard to
extend tests. In order to be able to test the outputs against data in
files on disk we need better naming of the tests themselves.

Use virTestCounterNext/Reset with appropriate tags to give reasonable
names to the 'virsh echo' tests' and prepare the 'DO_TEST' macro for
wider use.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
5fd0653a39 virshtest: Adapt some 'escaping' tests via DO_TEST_SCRIPT
Express what's possible via a "virsh script" rather than invoking
separate virsh for each one.

We need to keep a few for parity as the argument parser behaves
differently when processing argv-like input compared to a string.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
f3d205ad44 virshtest: Drop some redundant 'echo' cases
Both argument passing and multiple command handling is already tested in
the 'multiple commands' cases.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
7fca0d4d52 virshtest: Adapt 'echo --split' tests to DO_TEST_SCRIPT
Optimize invocation of the tests to share one 'virsh' binary as they
don't influence each other.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
fdaf2ffb04 virshtest: Add support for testing commands read from input file and adapt alias tests
Add support for reading a file and passing it to virsh in 'batch' mode
so that multiple commands can be easily tested with one invocation of
virsh.

To show how it's used adapt the alias handling tests to be invoked all
at once.

As in batch mode the arguments are read from a string and separated
inside virsh, one test is kept separate to be parsed in argv mode.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
f9dbd34c49 virshtest: Filter multiple occurences of string to drop in testFilterLine
Upcoming patches will require that possibly multiple occurences of the
string to drop are present in the output string thus we need to adapt
testFilterLine to handle them.

Additionally we drop the unused return value.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
99392689cb virshtest: Allow to test failure of commands
Modify the test code so that if virsh fails both 'stdout' and 'stderr'
are captured and compared against the output and also the return value
is checked by appending it to the output.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
86bf707838 virshtest: Prepare for testing against output files
Modify testCompareOutputLit to take a filename argument and compare it
against and populate the arguments.

For tests which don't use the 'data' from virTestRun, we'll expect to
pass the output filename, thus we also propagate it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
de9dfeee9a vshCmdOptDef: Remove unused 'flags' member
Drop the last enum member VSH_OFLAG_NONE and remove the 'flags' variable
from vshCmdOptDef.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
4b44113d7b vsh: Replace 'VSH_OFLAG_EMPTY_OK' bitwise flag with a separate struct member
Replace the last bitwise flag with a separate member.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
8e39542a03 vsh: Make positional parsing of arguments opt-in
Switch the command parser from using the VSH_OFLAG_REQ_OPT flag
opting out from positional parsing of arguments to a combination of the
'positional' flags for truly positional arguments and
'unwanted_positional' preserving semantics for the existing arguments
where the parser did it due to bad design.

This patch retires VSH_OFLAG_REQ_OPT along with the infrastructure that
was needed to refactor all uses properly.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
a67f737ddf virt-admin: Annodate 'unwanted_positional' arguments
Historically the command parser in virsh parses/fills even optional
arguments with values as if they were positional unless opted out using
VSH_OFLAG_REQ_OPT. This creates unexpected situations when commands can
break in this unwanted semantics:

 $ virsh snapshot-create-as --print-xml 1 2 3
 <domainsnapshot>
   <name>2</name>
   <description>3</description>
 </domainsnapshot>

To prevent any further addition annotate the rest of the arguments with
the 'unwanted_positional' flag, so that the parser can keep parsing them
as such but any further optional argument will not have this behaviour.

Certain arguments where it makes sense are annotated as 'positional' too
in this patch.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
100cbccecd virsh: Annodate 'unwanted_positional' arguments
Historically the command parser in virsh parses/fills even optional
arguments with values as if they were positional unless opted out using
VSH_OFLAG_REQ_OPT. This creates unexpected situations when commands can
break in this unwanted semantics:

 $ virsh snapshot-create-as --print-xml 1 2 3
 <domainsnapshot>
   <name>2</name>
   <description>3</description>
 </domainsnapshot>

To prevent any further addition annotate the rest of the arguments with
the 'unwanted_positional' flag, so that the parser can keep parsing them
as such but any further optional argument will not have this behaviour.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
32a89fc670 virsh: Annotate "unwanted_positional" arguments for 'pool-(define|create)-as' commands
Annotate arguments which can be unintentionally parsed positionally.
(See previous commits for explanation.)

All of these options were added in order thus we must declare all of
them as 'unwanted_positional'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:30 +02:00
Peter Krempa
e31cd46364 virsh: volume: Mark optional 'pool' argument as 'positional'
Annotate arguments which can be unintentionally parsed positionally.
(See previous commits for explanation.)

The pool name is optional but in all cases it can be promoted to an
optional positional argument so that it can be properly aligned with the
expectations of the parser.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
1304ef40a9 virsh: Annotate some optional arguments as positional
Make certain optional arguments truly positional in cases when it makes
semantic sense.

Previously it wasn't possible to have optional positional arguments, but
the parser filled them regardless, thus this preserves functionality.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
d19b12a681 virsh-backup: Fix argument annotations of 'backup-begin' command
Mark the 'backupxml' as positional optional and the 'checkpointxml' as
'unwanted_positional' to preserve the positional parsing quirk.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
3bbc97620a virsh: Make '(snapshot|checkpoint)-create' 'xmlfile' argument positional
The argument is optional thus couldn't be marked as positional until now,
despite being parsed positionally.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
29f3ac4223 virsh: snapshot: Make 'snapshotname' argument positional
The 'snapshotname' argument is optional as by default "current" snapshot
is considered. Regardless of that we should treat it as positional as
it's the common usage. This is now possible as we can have one optional
positional argument.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
0ce337b20c vsh: Make the only argument of 'connect', 'cd', and 'help' commands positional
The intended use of those commands is to use the argument directly
without the flag. Since the argument is optional in all cases we
couldn't declare them as positional until now.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
fc7934695d vsh: Allow one optional positional argument
We already allow a optional positional _ARGV argument but there's no
reason why any other argument type could not be allowed this way.

Add checks that there's just one such argument and it's placed after
required positional arguments.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
627cf466f0 virsh-checkpoint: Make 'checkpointname' positional and required
The argument was being parsed positionally due to the command parser
quirk as we didn't opt out of it.

Since the code in virshLookupCheckpoint requires that the checkpointname
is present we can mark all the options as positional and required and
remove the redundant check from virshLookupCheckpoint.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
a7b10919e7 virsh: Require option flags for all optional arguments of 'attach-disk'
Annotate arguments which can be unintentionally parsed positionally.
(See previous commits for explanation.)

Currently virsh accepts the arguments such as:

 $ virsh attach-disk --print-xml 1 2 3 4 5 6 7 8 9 10
 <disk type='file' device='10'>
   <driver name='5' type='6' iothread='7' cache='8' io='9'/>
   <source file='2'/>
   <target dev='3' bus='4'/>
 </disk>

While making virsh require the flags is technically a breaking change,
there were multiple instances where arguments were added to the argument
list thus changing the order the positional arguments would be
interpreted as. Examples are commits: 7e157858b4, bc5a8090af,
ca21d75d25. As of such there are multiple breaks of compatibility for
the positional arguments.

As of such, require the option flag for all optional arguments with
value for 'virsh attach-disk'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
1efb794487 virsh: Fix "positional" argument annotations for 'migrate' command
Annotate arguments which can be unintentionally parsed positionally.
(See previous commits for explanation.)

Annotate '--migrateuri', '--graphicsuri', '--listen-address', '-dname',
'--timeout', '--xml', '--migrate-disks' and '--disks port' as
'unwanted_positional'. These were declared in chronological order per
git history.

All others are annotated with VSH_OFLAG_REQ_OPT which makes the parser
require the '--optionname'. This is due to the fact that '--disks-uri'
was introduced later and put in front of others declared earlier
breaking the order they would be accepted, thus changing the behaviour
between versions.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
39218865f4 virsh: Require option flags for 'blkdeviotune' arguments
Make all of the tunable parameter flags require the option name (don't
parse them positionally).

While techically this would be a breaking change if anyone were to
specify the tunable values positionally this is not the case as the
first two tunables are not compatible with each other:

  $ virsh blkdeviotune cd vda 4 5
  error: Unable to change block I/O throttle
  error: invalid argument: total and read/write of bytes_sec cannot be set at the same time

The above is produced by all implementations of the API (qemu and test
drivers). It is true that the first tunable can be specified
positionally (--total-bytes-sec) but it is misleading and shoud not be
allowed either.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
baa20d6eb8 vsh: Fix option formatting for 'VHS_OT_ARGV' options
While previous fixes kept the help output unchanged as base for the
refactors it turns out that the formatting of help for argv options is
wrong.

Specifically in SYNOPSIS the non-positional _ARGV would have the option
name in square brackets (which in other cases means that given thing is
optional) despite being required.

Similarly in the DESCRIPTION section positional versions would not show
the optional argument name and also didn't use the three dots to signal
that it can be used multiple times.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
e9e3d6dff4 virsh: Annotate rest of _ARGV arguments as positional
In most cases it's the usual/recommended way to use those commands:

 $ virsh qemu-monitor-command VMNAME cmd args args args

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
4d4f4fd516 virsh: Annotate '--diskspec' _ARGV options as unwanted positional
Our documentation in most places explicitly mentions --diskspec and it
was never meant to be positional, although we can't change the parser
any more. Annotate them as 'unwanted_positional'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
d226a2cd70 vsh: Introduce annotation for vsh options which are unexpectedly parsed positionally
Based on the rationale in previous commit, all commands which were
parsed as positional but not documented as such will be annotated with
this flag.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
348010ac93 vsh: Introduce tool to find unwanted positional arguments to 'self-test'
While the virsh option definitions specify (either explicitly after
recent refactors, or implicitly before) whether an argument is
positional or not, the actual parser is way more lax and actually and
allows also arguments which were considered/documented as non-positional
to be filled positionally unless VSH_OFLAG_REQ_OPT is used in the flags.

This creates situations such as 'snapshot-create-as' which has the
following docs:

SYNOPSIS
  snapshot-create-as <domain> [--name <string>] [--description <string>]
    [--print-xml] [--no-metadata] [--halt] [--disk-only]
    [--reuse-external] [--quiesce] [--atomic] [--live] [--validate]
    [--memspec <string>] [[--diskspec] <string>]...

Thus showing as if '--name' and '--description' required the option, but
in fact the following happens when only positionals are passed:

  $ virsh snapshot-create-as --print-xml 1 2 3 4 5
  <domainsnapshot>
    <name>2</name>
    <description>3</description>
    <disks>
      <disk name='4'/>
      <disk name='5'/>
    </disks>
  </domainsnapshot>

In the above example e.g. '--memspec' is not populated.

This disconnect makes it impossible to refactor the parser itself and
allows users to write buggy interactions with virsh.

In order to address this we'll be annotating every single of these
unwanted positional options as such so that this doesn't happen in the
future, while still preserving the quirk in the parser.

This patch introduces a tool which outputs list of options which are not
marked as positional but are lacking the VSH_OFLAG_REQ_OPT flag.

This tool will be removed once all the offenders found by it will be
addressed.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
1f3f9c81da virsh: Inline VIRSH_COMMON_OPT_NETWORK_OT_STRING macro
The macro is used in just one place and the definition of the option is
going to be modified. Inline the macro.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
d2e29eb74c virsh: Inline VIRSH_COMMON_OPT_FILE_FULL macro
The macro is used in one place only and the command definition will be
altered. Inline it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
7a696e9c3d virsh: Inline VIRSH_COMMON_OPT_DOMAIN_OT_STRING macro
Upcoming patches will need to tweak some of the properties of the
command. Since the macro is used in just two places expand it inline.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
25be987715 vshCmddefCheckInternals: Improve some checks
- move the check that completer_flags are 0 if no completer is set
   into a common place and remove duplication
 - add check that _BOOL arguments are not positional
 - add missing checks to _ALIAS

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Peter Krempa
334510a687 vshCmddefHelp: Drop empty line at the end
All virsh commands in non-quiet mode append another separator line thus
having two is unnecessary and in quiet mode it still has a trailing
blank line. Remove it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2024-04-02 14:24:29 +02:00
Pavel Hrdina
0a164b74eb qemu_snapshot: correctly update metadata when deleting external snapshot with multiple branches
XML metadata for snapshot contains only single list of disk overlays
from the moment when the snapshot was taken. When user creates multiple
branches of snapshots the parent snapshot will still list only the
original disk overlays. This may cause an issue in a specific scenario:

     s1
      |
      +- s2
      +- s3 (active)

For this snapshot topology when we delete s2 metadata for s1 are not
updated. Now when we delete s1 the code operated with incorrect
overlays from s1 metadata in order to update s3 metadata resulting in no
changes to s3 metadata.

Now when user tries to delete s3 it fails with following error:

    error: Failed to delete snapshot s3
    error: operation failed: snapshot VM disk source and parent disk source are not the same

For the actual deletion there is a code to figure out the correct disk
source but it was not used to update metadata as well. Due to reasons
how block commit in libvirt works we need to create a copy of that disk
source in order to have it available when updating metadata as the
original source will be freed at that point.

Resolves: https://issues.redhat.com/browse/RHEL-26276
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-02 14:14:26 +02:00
Pavel Hrdina
79654f425c qemu_snapshot: call qemuSnapshotDeleteUpdateDisks only for external snapshots
Calling this function when deleting internal snapshot isn't required
because with internal snapshots all changes are done within the file
itself so there is no file deletion and no need to update snapshot
metadata.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-04-02 14:14:26 +02:00
Jiri Denemark
ca7d1bd5ee Post-release version bump to 10.3.0
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
2024-04-02 13:43:31 +02:00
Jiri Denemark
5d9ebb126c Release of libvirt-10.2.0
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
2024-04-02 13:38:48 +02:00
김인수
222a6c8638 Translated using Weblate (Korean)
Currently translated at 100.0% (10438 of 10438 strings)

Translation: libvirt/libvirt
Translate-URL: https://translate.fedoraproject.org/projects/libvirt/libvirt/ko/

Co-authored-by: 김인수 <simmon@nplob.com>
Signed-off-by: 김인수 <simmon@nplob.com>
2024-03-29 15:36:18 +01:00
Anton Fadeev
971753af89 src/qemu/qemu_domain.c: Fix overriding audioBackend in qemuDomainDefSuggestDefaultAudioBackend
If we have Spice and VNC graphics in domain XML, and Spice graphics defined before VNC, audioBackend will be overrided in qemuDomainDefSuggestDefaultAudioBackend to VIR_DOMAIN_AUDIO_TYPE_NONE, and we will have no sound in Spice session, like this https://bugs.launchpad.net/qemu/+bug/1900352. If the flag addAudio already set, we do not need to override audioBackend. This commit fix the issue.
2023-06-29 08:52:21 +00:00
163 changed files with 6792 additions and 6630 deletions

View File

@ -8,13 +8,23 @@ the changes introduced by each of them.
For a more fine-grained view, use the `git log`_. For a more fine-grained view, use the `git log`_.
v10.2.0 (unreleased) v10.3.0 (unreleased)
==================== ====================
* **Security** * **Security**
* **Removed features** * **Removed features**
* **New features**
* **Improvements**
* **Bug fixes**
v10.2.0 (2024-04-02)
====================
* **New features** * **New features**
* ch: Basic save and restore support for ch driver * ch: Basic save and restore support for ch driver
@ -43,8 +53,6 @@ v10.2.0 (unreleased)
restarting the guest. Available via the ``virDomainGraphicsReload`` API restarting the guest. Available via the ``virDomainGraphicsReload`` API
and the ``domdisplay-reload`` virsh command. and the ``domdisplay-reload`` virsh command.
* **Improvements**
* **Bug fixes** * **Bug fixes**
* qemu: Fix migration from libvirt older than 9.10.0 when vmx is enabled * qemu: Fix migration from libvirt older than 9.10.0 when vmx is enabled

View File

@ -1386,7 +1386,7 @@ exclude_file_name_regexp--sc_prohibit_close = \
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$) (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)|tools/virt-qemu-qmp-proxy$$)
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \ exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
((^tests/(nodedevmdevctl|viracpi|virhostcpu|virpcitest|virstoragetest|qemunbdkit)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)|\.bin) ((^tests/(nodedevmdevctl|viracpi|virhostcpu|virpcitest|virstoragetest|qemunbdkit|virshtest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)|\.bin)
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \ exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
(^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$) (^(src/(util/(vircommand|virdaemon)|lxc/lxc_controller)|tests/testutils)\.c$$)
@ -1437,7 +1437,7 @@ exclude_file_name_regexp--sc_require_config_h_first = \
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers\.c$$|scripts/rpcgen/tests/test_demo\.c$$) ^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers\.c$$|scripts/rpcgen/tests/test_demo\.c$$)
exclude_file_name_regexp--sc_trailing_blank = \ exclude_file_name_regexp--sc_trailing_blank = \
/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$ /sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo|tests/virshtestdata/.*$$
exclude_file_name_regexp--sc_unmarked_diagnostics = \ exclude_file_name_regexp--sc_unmarked_diagnostics = \
^(scripts/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$ ^(scripts/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$
@ -1466,7 +1466,7 @@ exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations = \
^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$ ^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$
exclude_file_name_regexp--sc_prohibit_empty_first_line = \ exclude_file_name_regexp--sc_prohibit_empty_first_line = \
^tests/vmwareverdata/fusion-5.0.3.txt|scripts/rpcgen/tests/demo\.c$$ ^tests/vmwareverdata/fusion-5.0.3.txt|scripts/rpcgen/tests/demo\.c|^tests/virshtestdata/.*$$
exclude_file_name_regexp--sc_prohibit_useless_translation = \ exclude_file_name_regexp--sc_prohibit_useless_translation = \
^tests/virpolkittest.c ^tests/virpolkittest.c

View File

@ -4390,6 +4390,14 @@ or:
starting the guest or hot-plugging the device and starting the guest or hot-plugging the device and
``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug ``virNodeDeviceReAttach`` (or ``virsh nodedev-reattach``) after hot-unplug
or stopping the guest. or stopping the guest.
:since:`Since 10.3.0` an optional ``display`` attribute may be used to
enable using a vgpu device as a display device for the guest. Supported
values are either ``on`` or ``off`` (default). There is also an optional
``ramfb`` attribute with values of either ``on`` or ``off`` (default).
When enabled, the ``ramfb`` attribute provides a memory framebuffer device
to the guest. This framebuffer allows the vgpu to be used as a boot display
before the gpu driver is loaded within the guest. ``ramfb`` requires the
``display`` attribute to be set to ``on``.
``scsi`` ``scsi``
For SCSI devices, user is responsible to make sure the device is not used For SCSI devices, user is responsible to make sure the device is not used
by host. If supported by the hypervisor and OS, the optional ``sgio`` ( by host. If supported by the hypervisor and OS, the optional ``sgio`` (
@ -5600,6 +5608,7 @@ ne2k_pci pcnet rtl8139 e1000 virtio. :since:`Since 5.2.0`,
``virtio-transitional`` and ``virtio-non-transitional`` values are supported. ``virtio-transitional`` and ``virtio-non-transitional`` values are supported.
See `Virtio transitional devices`_ for more details. See `Virtio transitional devices`_ for more details.
:since:`Since 9.3.0` igb is also supported. :since:`Since 9.3.0` igb is also supported.
:since:`Since 10.3.0` usb-net is supported.
Setting NIC driver-specific options Setting NIC driver-specific options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -113,6 +113,28 @@ The following variables are supported:
this requires guest agent with support for time synchronization this requires guest agent with support for time synchronization
running in the guest. By default, this functionality is turned off. running in the guest. By default, this functionality is turned off.
- PERSISTENT_ONLY=default
Defines what type of guest virtual machine ON_SHUTDOWN action is applied to
* default
This implements the already existing default behavior.
If ON_SHUTDOWN action is shutdown, transient and persistent guest virtual
machines are asked to shutdown.
If ON_SHUTDOWN action is suspend, only persistent guest virtual machines
are asked to suspend.
* true
ON_SHUTDOWN action is executed only on persistent guest virtual machines.
Transient guest virtual machines are not affected.
* false
ON_SHUTDOWN action is executed on persistent and transient guest virtual
machines.
BUGS BUGS
==== ====

View File

@ -326,8 +326,6 @@ Will change current directory to *directory*. The default directory
for the ``cd`` command is the home directory or, if there is no *HOME* for the ``cd`` command is the home directory or, if there is no *HOME*
variable in the environment, the root directory. variable in the environment, the root directory.
This command is only available in interactive mode.
pwd pwd
--- ---
@ -7673,9 +7671,11 @@ If *--parent* is specified, add a column to the output table giving
the name of the parent of each snapshot. If *--roots* is specified, the name of the parent of each snapshot. If *--roots* is specified,
the list will be filtered to just snapshots that have no parents. the list will be filtered to just snapshots that have no parents.
If *--tree* is specified, the output will be in a tree format, listing If *--tree* is specified, the output will be in a tree format, listing
just snapshot names. These three options are mutually exclusive. If just snapshot names. These three options are mutually exclusive.
*--name* is specified only the snapshot name is printed. This option is
mutually exclusive with *--tree*. If *--name* is specified only the snapshot name is printed optionally
followed by a tab-separated name of the parent snapshot if *--parent* is used
as well. This option is mutually exclusive with *--tree*.
If *--from* is provided, filter the list to snapshots which are If *--from* is provided, filter the list to snapshots which are
children of the given ``snapshot``; or if *--current* is provided, children of the given ``snapshot``; or if *--current* is provided,
@ -7989,8 +7989,11 @@ the name of the parent of each checkpoint. If *--roots* is
specified, the list will be filtered to just checkpoints that have no specified, the list will be filtered to just checkpoints that have no
parents. If *--tree* is specified, the output will be in a tree parents. If *--tree* is specified, the output will be in a tree
format, listing just checkpoint names. These three options are format, listing just checkpoint names. These three options are
mutually exclusive. If *--name* is specified only the checkpoint name mutually exclusive.
is printed. This option is mutually exclusive with *--tree*.
If *--name* is specified only the checkpoint name is printed optionally
followed by a tab-separated name of the parent checkpoint if *--parent* is used
as well. This option is mutually exclusive with *--tree*.
If *--from* is provided, filter the list to checkpoints which are If *--from* is provided, filter the list to checkpoints which are
children of the given ``checkpoint``. When used in isolation or with children of the given ``checkpoint``. When used in isolation or with

View File

@ -1,6 +1,6 @@
project( project(
'libvirt', 'c', 'libvirt', 'c',
version: '10.2.0', version: '10.3.0',
license: 'LGPLv2+', license: 'LGPLv2+',
meson_version: '>= 0.56.0', meson_version: '>= 0.56.0',
default_options: [ default_options: [

View File

@ -18,7 +18,7 @@ msgstr ""
"Project-Id-Version: libvirt 6.0.0\n" "Project-Id-Version: libvirt 6.0.0\n"
"Report-Msgid-Bugs-To: https://libvirt.org/bugs.html\n" "Report-Msgid-Bugs-To: https://libvirt.org/bugs.html\n"
"POT-Creation-Date: 2024-03-22 09:54+0000\n" "POT-Creation-Date: 2024-03-22 09:54+0000\n"
"PO-Revision-Date: 2024-03-27 17:36+0000\n" "PO-Revision-Date: 2024-03-29 14:36+0000\n"
"Last-Translator: 김인수 <simmon@nplob.com>\n" "Last-Translator: 김인수 <simmon@nplob.com>\n"
"Language-Team: Korean <https://translate.fedoraproject.org/projects/libvirt/" "Language-Team: Korean <https://translate.fedoraproject.org/projects/libvirt/"
"libvirt/ko/>\n" "libvirt/ko/>\n"
@ -5758,6 +5758,9 @@ msgid ""
"virtualization is enabled in the host BIOS, and host configuration is setup " "virtualization is enabled in the host BIOS, and host configuration is setup "
"to load the mshv modules." "to load the mshv modules."
msgstr "" msgstr ""
"도메인은 MSHV 장치가 필요하지만, 사용 할 수 없습니다. 가상화가 호스트 "
"바이오스에서 활성화 되어 있는지 점검하고, 호스트 구성이 mshv 모듈을 "
"적재하도록 설정(setup)되었습니다."
msgid "Domain requires at least 1 vCPU" msgid "Domain requires at least 1 vCPU"
msgstr "도메인에는 최소 1개의 vCPU가 필요합니다" msgstr "도메인에는 최소 1개의 vCPU가 필요합니다"
@ -7703,7 +7706,7 @@ msgstr "도메인 이미지 파일 '%1$s'을(를) 열지 못했습니다"
#, c-format #, c-format
msgid "Failed to open domain save file '%1$s'" msgid "Failed to open domain save file '%1$s'"
msgstr "" msgstr "도메인 저장 파일 '%1$s'를 여는 데 실패했습니다"
#, c-format #, c-format
msgid "Failed to open file '%1$s'" msgid "Failed to open file '%1$s'"
@ -8051,7 +8054,7 @@ msgstr "도메인 '%1$s'에 대한 관리되는 저장 이미지를 제거하지
#, c-format #, c-format
msgid "Failed to remove managed save path '%1$s'" msgid "Failed to remove managed save path '%1$s'"
msgstr "" msgstr "관리된 저장 경로 '%1$s'룰 제거하는 데 실패했습니다"
#, c-format #, c-format
msgid "Failed to remove storage volume '%1$s'(%2$s)" msgid "Failed to remove storage volume '%1$s'(%2$s)"
@ -8195,7 +8198,7 @@ msgid "Failed to save VM settings"
msgstr "VM 설정을 저장하는데 실패함" msgstr "VM 설정을 저장하는데 실패함"
msgid "Failed to save domain" msgid "Failed to save domain"
msgstr "" msgstr "도메인 저장에 실패했습니다"
#, c-format #, c-format
msgid "Failed to save domain '%1$d' with libxenlight" msgid "Failed to save domain '%1$d' with libxenlight"
@ -8389,7 +8392,7 @@ msgid "Failed to shutdown domain '%1$s'"
msgstr "도메인 '%1$s'를 종료하지 못했습니다" msgstr "도메인 '%1$s'를 종료하지 못했습니다"
msgid "Failed to shutoff after domain save" msgid "Failed to shutoff after domain save"
msgstr "" msgstr "도메인 저장 후 종료하는 데 실패했습니다"
#, c-format #, c-format
msgid "Failed to soft reset VM '%1$s'. Destroying VM" msgid "Failed to soft reset VM '%1$s'. Destroying VM"
@ -8613,7 +8616,7 @@ msgid "Failed to write '%1$s'"
msgstr "'%1$s' 쓰기에 실패" msgstr "'%1$s' 쓰기에 실패"
msgid "Failed to write file header" msgid "Failed to write file header"
msgstr "" msgstr "파일 헤더를 쓰는 데 실패했습니다"
msgid "Failed to write pixel data" msgid "Failed to write pixel data"
msgstr "픽셀 데이터 쓰기 실패했습니다" msgstr "픽셀 데이터 쓰기 실패했습니다"
@ -8634,7 +8637,7 @@ msgid "Failed to write vmx file '%1$s'"
msgstr "vmx 파일 '%1$s' 쓰기에 실패" msgstr "vmx 파일 '%1$s' 쓰기에 실패"
msgid "Failed to write xml definition" msgid "Failed to write xml definition"
msgstr "" msgstr "xml 정의를 작성하는 데 실패했습니다"
msgid "Failed to write xml description" msgid "Failed to write xml description"
msgstr "xml 설명을 쓰지 못했습니다" msgstr "xml 설명을 쓰지 못했습니다"
@ -8948,16 +8951,16 @@ msgid "Get or set perf event"
msgstr "perf 이벤트 가져오기 또는 설정" msgstr "perf 이벤트 가져오기 또는 설정"
msgid "Get or set the current blkio parameters for a guest domain." msgid "Get or set the current blkio parameters for a guest domain."
msgstr "" msgstr "게스트 도메인을 위한 현재 blkio 매개변수를 가져오거나 설정합니다."
msgid "Get or set the current memory parameters for a guest domain." msgid "Get or set the current memory parameters for a guest domain."
msgstr "" msgstr "게스트 도메인을 위한 현재 메모리 매개변수를 가져오거나 설정합니다."
msgid "Get or set the current numa parameters for a guest domain." msgid "Get or set the current numa parameters for a guest domain."
msgstr "" msgstr "게스트 도메인을 위한 현재 numa 매개변수를 가져오거나 설정합니다."
msgid "Get or set the current perf events for a guest domain." msgid "Get or set the current perf events for a guest domain."
msgstr "" msgstr "게스트 도메인을 위한 현재 perf 사건을 가져오거나 설정합니다."
msgid "Get or set the current snapshot" msgid "Get or set the current snapshot"
msgstr "현재 순간찍기를 가져오거나 설정합니다" msgstr "현재 순간찍기를 가져오거나 설정합니다"
@ -11790,6 +11793,8 @@ msgid ""
"NUMA mode, one of strict, preferred and interleave or a number from the " "NUMA mode, one of strict, preferred and interleave or a number from the "
"virDomainNumatuneMemMode enum" "virDomainNumatuneMemMode enum"
msgstr "" msgstr ""
"NUMA 모드는 엄격, 선호 및 인터리브 중 하나 또는 virDomainNumatuneMemMode "
"열거형의 숫자로 구성되어 있습니다"
#, c-format #, c-format
msgid "NUMA node %1$d is not available" msgid "NUMA node %1$d is not available"
@ -13620,7 +13625,7 @@ msgid "Relative backing during copy not supported yet"
msgstr "복사 중에 상대적인 백업은 아직 지원하지 않습니다" msgstr "복사 중에 상대적인 백업은 아직 지원하지 않습니다"
msgid "Reload domain's graphics display certificates" msgid "Reload domain's graphics display certificates"
msgstr "" msgstr "도메인의 그래픽 표시 인증서를 재적재합니다"
#, c-format #, c-format
msgid "Remote command terminated with non-zero code: %1$d" msgid "Remote command terminated with non-zero code: %1$d"
@ -13804,10 +13809,10 @@ msgid "Retrieve identity details about <client> from <server>"
msgstr "<server>에서 <client>에 대한 ID 세부 정보 검색" msgstr "<server>에서 <client>에 대한 ID 세부 정보 검색"
msgid "Retrieve server's client-related configuration limits" msgid "Retrieve server's client-related configuration limits"
msgstr "" msgstr "서버의 클라이언트-관련 구성 제한 검색"
msgid "Retrieve threadpool attributes from a server." msgid "Retrieve threadpool attributes from a server."
msgstr "" msgstr "서버에서 쓰레드 풀 속성을 검색합니다."
msgid "Return pool info in bytes" msgid "Return pool info in bytes"
msgstr "바이트 단위로 풀 정보 반환" msgstr "바이트 단위로 풀 정보 반환"
@ -14279,7 +14284,7 @@ msgstr ""
"머신 유형과 호환되지 않습니다" "머신 유형과 호환되지 않습니다"
msgid "Serial only works in UNIX/PTY modes" msgid "Serial only works in UNIX/PTY modes"
msgstr "" msgstr "시리얼은 UNIX/PTY 방식에서 동작합니다"
#, c-format #, c-format
msgid "Serial port index %1$d out of [0..3] range" msgid "Serial port index %1$d out of [0..3] range"
@ -18840,7 +18845,7 @@ msgid "Unexpectedly got a network port without a plug"
msgstr "예기치 않게 플러그가 없는 네트워크 포트가 있음" msgstr "예기치 않게 플러그가 없는 네트워크 포트가 있음"
msgid "Unix Socket backend is not supported by this version of ch." msgid "Unix Socket backend is not supported by this version of ch."
msgstr "" msgstr "유닉스 소켓 백엔드는 이 채널의 버전에서 지원되지 않습니다."
msgid "Unix file descriptors not supported on this platform" msgid "Unix file descriptors not supported on this platform"
msgstr "이 기술환경에서 지원되지 않는 유닉스 파일 설명자" msgstr "이 기술환경에서 지원되지 않는 유닉스 파일 설명자"
@ -22307,10 +22312,10 @@ msgid "cannot revert snapshot of running domain"
msgstr "동작 중인 도메인의 순간찍기를 되돌릴 수 없습니다" msgstr "동작 중인 도메인의 순간찍기를 되돌릴 수 없습니다"
msgid "cannot save domain with host devices" msgid "cannot save domain with host devices"
msgstr "" msgstr "호스트 장치에 도메인을 저장 할 수 없습니다"
msgid "cannot save domain with network interfaces" msgid "cannot save domain with network interfaces"
msgstr "" msgstr "네트워크 연결장치에 도메인을 저장 할 수 없습니다"
#, c-format #, c-format
msgid "cannot save file '%1$s'" msgid "cannot save file '%1$s'"
@ -22861,10 +22866,10 @@ msgid "command '%1$s' requires <%2$s> option"
msgstr "'%1$s' 명령은 <%2$s> 옵션이 필요함" msgstr "'%1$s' 명령은 <%2$s> 옵션이 필요함"
msgid "command groups is NULL run vshInit before reloading" msgid "command groups is NULL run vshInit before reloading"
msgstr "" msgstr "명령 그룹은 NULL이고 다시 적재하기 전에 vshInit를 실행하세요"
msgid "command groups must be non-NULL" msgid "command groups must be non-NULL"
msgstr "" msgstr "명령 그룹은 비-NULL이어야 합니다"
#, c-format #, c-format
msgid "command is already running as pid %1$lld" msgid "command is already running as pid %1$lld"
@ -26318,7 +26323,7 @@ msgid "failed to read AppArmor template"
msgstr "AppArmor 템플릿을 읽는데 실패" msgstr "AppArmor 템플릿을 읽는데 실패"
msgid "failed to read CHSaveXMLHeader header" msgid "failed to read CHSaveXMLHeader header"
msgstr "" msgstr "CHSaveXMLHeader 헤더를 읽는 데 실패했습니다"
msgid "failed to read XML" msgid "failed to read XML"
msgstr "XML을 읽는 것을 실패" msgstr "XML을 읽는 것을 실패"
@ -26441,19 +26446,19 @@ msgid "failed to resolve symlink %1$s: %2$s"
msgstr "심볼릭 링크 %1$s을(를) 확인하지 못했습니다: %2$s" msgstr "심볼릭 링크 %1$s을(를) 확인하지 못했습니다: %2$s"
msgid "failed to restore domain" msgid "failed to restore domain"
msgstr "" msgstr "도메인을 복구하는 데 실패했습니다"
msgid "failed to restore domain from managed save" msgid "failed to restore domain from managed save"
msgstr "" msgstr "관리된 저장에서 도메인을 복구하는 데 실패했습니다"
msgid "failed to resume domain" msgid "failed to resume domain"
msgstr "도메인을 재개하는 것에 실패" msgstr "도메인을 재개하는 것에 실패"
msgid "failed to resume domain after restore" msgid "failed to resume domain after restore"
msgstr "" msgstr "복구 후 도메인을 재개하는 데 실패했습니다"
msgid "failed to resume domain after restore from managed save" msgid "failed to resume domain after restore from managed save"
msgstr "" msgstr "관리된 저장에서 복구 후 도메인을 재개하는 데 실패했습니다"
msgid "failed to retrieve XML" msgid "failed to retrieve XML"
msgstr "XML을 검색하지 못했습니다" msgstr "XML을 검색하지 못했습니다"
@ -26572,7 +26577,7 @@ msgid "failed to suspend domain"
msgstr "도메인을 일시 중단하지 못했습니다" msgstr "도메인을 일시 중단하지 못했습니다"
msgid "failed to suspend domain before saving" msgid "failed to suspend domain before saving"
msgstr "" msgstr "저장하기 전에 도메인을 중지하는 데 실패했습니다"
msgid "failed to take screenshot" msgid "failed to take screenshot"
msgstr "스크린샷을 찍지 못했습니다" msgstr "스크린샷을 찍지 못했습니다"
@ -27259,7 +27264,7 @@ msgid "graphics device is needed for attribute value 'display=on' in <hostdev>"
msgstr "<hostdev>의 속성 값 'display=on'에 그래픽 장치가 필요합니다" msgstr "<hostdev>의 속성 값 'display=on'에 그래픽 장치가 필요합니다"
msgid "graphics display type" msgid "graphics display type"
msgstr "" msgstr "그래픽 표시 유형"
msgid "" msgid ""
"graphics type 'egl-headless' is only supported with one of: 'vnc', 'spice' " "graphics type 'egl-headless' is only supported with one of: 'vnc', 'spice' "
@ -27489,7 +27494,7 @@ msgid "hostdev does not have an alias"
msgstr "hostdev에는 단축명령어(alias)가 없습니다" msgstr "hostdev에는 단축명령어(alias)가 없습니다"
msgid "hostdev interface missing hostdev data" msgid "hostdev interface missing hostdev data"
msgstr "hostdev 인터페이스에 hostdev 데이터가 없습니다" msgstr "hostdev 연결장치에 hostdev 자료가 없습니다"
#, c-format #, c-format
msgid "hostdev invalid secret type '%1$s'" msgid "hostdev invalid secret type '%1$s'"
@ -27605,7 +27610,8 @@ msgstr "하이퍼바이저 기능 자동 감지 재정의"
msgid "" msgid ""
"hypervisor provided conflicting CPU data: feature '%1$s' is both enabled and " "hypervisor provided conflicting CPU data: feature '%1$s' is both enabled and "
"disabled at the same time" "disabled at the same time"
msgstr "" msgstr "하이퍼바이저는 충돌하는 CPU 자료를 제공합니다: 특성 '%1$s'가 동시에 활성화 "
"및 비활성화 되었습니다"
msgid "i - turn off validation and try to redefine again" msgid "i - turn off validation and try to redefine again"
msgstr "i - 유효성 검사를 끄고 다시 재정의하십시오" msgstr "i - 유효성 검사를 끄고 다시 재정의하십시오"
@ -29610,7 +29616,7 @@ msgid "manipulate authorized SSH keys file for given user (via agent)"
msgstr "지정된 사용자에 대한 승인된 SSH 키 파일 조작(에이전트를 통해)" msgstr "지정된 사용자에 대한 승인된 SSH 키 파일 조작(에이전트를 통해)"
msgid "maplen must be non-negative" msgid "maplen must be non-negative"
msgstr "" msgstr "maplen는 비-음수이어야 합니다"
msgid "mark inactive domains with managed save state" msgid "mark inactive domains with managed save state"
msgstr "관리되는 저장 상태로 비활성 도메인 표시" msgstr "관리되는 저장 상태로 비활성 도메인 표시"
@ -29648,7 +29654,7 @@ msgid "maxcells > REMOTE_NODE_MAX_CELLS"
msgstr "maxcells > REMOTE_NODE_MAX_CELLS" msgstr "maxcells > REMOTE_NODE_MAX_CELLS"
msgid "maxcells must be non-negative" msgid "maxcells must be non-negative"
msgstr "" msgstr "maxcells은 비-음수이어야 합니다"
msgid "maxerrors too large" msgid "maxerrors too large"
msgstr "maxerrors가 너무 큽니다" msgstr "maxerrors가 너무 큽니다"
@ -29657,7 +29663,7 @@ msgid "maxids > REMOTE_DOMAIN_LIST_MAX"
msgstr "최대 ID > REMOTE_DOMAIN_LIST_MAX" msgstr "최대 ID > REMOTE_DOMAIN_LIST_MAX"
msgid "maxids must be non-negative" msgid "maxids must be non-negative"
msgstr "" msgstr "maxids는 비-음수이어야 합니다"
msgid "maximum" msgid "maximum"
msgstr "최대" msgstr "최대"
@ -29698,7 +29704,7 @@ msgid "maxinfo > REMOTE_VCPUINFO_MAX"
msgstr "maxinfo > REMOTE_VCPUINFO_MAX" msgstr "maxinfo > REMOTE_VCPUINFO_MAX"
msgid "maxinfo must be non-negative" msgid "maxinfo must be non-negative"
msgstr "" msgstr "maxinfo는 비-음수이어야 합니다"
msgid "maxnames > REMOTE_DOMAIN_LIST_MAX" msgid "maxnames > REMOTE_DOMAIN_LIST_MAX"
msgstr "최대 이름 > REMOTE_DOMAIN_LIST_MAX" msgstr "최대 이름 > REMOTE_DOMAIN_LIST_MAX"
@ -29728,13 +29734,13 @@ msgid "maxnames > REMOTE_STORAGE_VOL_LIST_MAX"
msgstr "최대 이름 > REMOTE_STORAGE_VOL_LIST_MAX" msgstr "최대 이름 > REMOTE_STORAGE_VOL_LIST_MAX"
msgid "maxnames must be non-negative" msgid "maxnames must be non-negative"
msgstr "" msgstr "maxnames는 비-음수이어야 합니다"
msgid "maxuuids > REMOTE_SECRET_LIST_MAX" msgid "maxuuids > REMOTE_SECRET_LIST_MAX"
msgstr "최대 ID > REMOTE_SECRET_LIST_MAX" msgstr "최대 ID > REMOTE_SECRET_LIST_MAX"
msgid "maxuuids must be non-negative" msgid "maxuuids must be non-negative"
msgstr "" msgstr "maxuuids는 비-음수이어야 합니다"
msgid "mdev attribute missing name or value" msgid "mdev attribute missing name or value"
msgstr "mdev 속성에 이름 또는 값이 없습니다" msgstr "mdev 속성에 이름 또는 값이 없습니다"
@ -31013,10 +31019,10 @@ msgid "msi option is only supported with a server"
msgstr "msi 옵션은 서버에서만 지원됩니다" msgstr "msi 옵션은 서버에서만 지원됩니다"
msgid "mtp is not supported with this QEMU binary" msgid "mtp is not supported with this QEMU binary"
msgstr "" msgstr "mtp는 이 QEMU 바이너리를 지원하지 않습니다"
msgid "mtp only supports passthrough accessmode" msgid "mtp only supports passthrough accessmode"
msgstr "" msgstr "mtp는 통과 접근방식(passthrough accessmode)만 지원합니다"
#, c-format #, c-format
msgid "" msgid ""
@ -31150,7 +31156,7 @@ msgid "ncpumaps > REMOTE_VCPUINFO_MAX"
msgstr "ncpumaps > REMOTE_VCPUINFO_MAX" msgstr "ncpumaps > REMOTE_VCPUINFO_MAX"
msgid "ncpumaps must be non-negative" msgid "ncpumaps must be non-negative"
msgstr "" msgstr "ncpumaps는 비-음수이어야 합니다"
#, c-format #, c-format
msgid "ncpus count exceeds maximum: %1$u > %2$u" msgid "ncpus count exceeds maximum: %1$u > %2$u"
@ -32143,7 +32149,7 @@ msgid "nparams in %1$s must be equal to %2$d"
msgstr "%1$s의 nparams는 %2$d와 같아야 합니다" msgstr "%1$s의 nparams는 %2$d와 같아야 합니다"
msgid "nparams must be non-negative" msgid "nparams must be non-negative"
msgstr "" msgstr "nparams는 비-음수이어야 합니다"
msgid "nparams too large" msgid "nparams too large"
msgstr "nparams가 너무 큽니다" msgstr "nparams가 너무 큽니다"
@ -32364,7 +32370,7 @@ msgid "only can resume paused domain"
msgstr "일시중지된 도메인만 재개할 수 있습니다" msgstr "일시중지된 도메인만 재개할 수 있습니다"
msgid "only can save running/paused domain" msgid "only can save running/paused domain"
msgstr "" msgstr "동작하는/중지된 도메인만 저장 할 수 있습니다"
msgid "only can shutdown running/paused domain" msgid "only can shutdown running/paused domain"
msgstr "실행/일시 중지된 도메인만 종료할 수 있습니다" msgstr "실행/일시 중지된 도메인만 종료할 수 있습니다"
@ -32602,7 +32608,7 @@ msgid "output an XML string for the hypervisor sysinfo, if available"
msgstr "사용 가능한 경우 하이퍼바이저 sysinfo에 대한 XML 문자열을 출력합니다" msgstr "사용 가능한 경우 하이퍼바이저 sysinfo에 대한 XML 문자열을 출력합니다"
msgid "output help for each command" msgid "output help for each command"
msgstr "" msgstr "개별 명령을 위한 도움말 출력"
msgid "output the list of options which are missing completers" msgid "output the list of options which are missing completers"
msgstr "완성자가 누락된 옵션(선택)의 목록을 출력합니다" msgstr "완성자가 누락된 옵션(선택)의 목록을 출력합니다"
@ -34122,7 +34128,7 @@ msgid "save image is incomplete"
msgstr "이미지 저장이 불완전합니다" msgstr "이미지 저장이 불완전합니다"
msgid "save image magic is incorrect" msgid "save image magic is incorrect"
msgstr "" msgstr "저장 이미지 마법이 올바르지 않습니다"
msgid "saved" msgid "saved"
msgstr "저장됨" msgstr "저장됨"
@ -36027,7 +36033,7 @@ msgstr "이벤트의 유형 불일치(실제 0x%1$x, 예상 0x%2$x)"
#, c-format #, c-format
msgid "type must be less than %1$d" msgid "type must be less than %1$d"
msgstr "" msgstr "유형은 %1$d 보다 작아야만 합니다"
msgid "type of source (block|file|network)" msgid "type of source (block|file|network)"
msgstr "원천 유형(블록|파일|네트워크)" msgstr "원천 유형(블록|파일|네트워크)"
@ -38387,7 +38393,7 @@ msgstr "virVMXContext에 parseFileName 함수 세트가 없습니다"
#, c-format #, c-format
msgid "virt type '%1$s' is not supported" msgid "virt type '%1$s' is not supported"
msgstr "" msgstr "가상 유형 '%1$s' 이 지원되지 않습니다"
#, c-format #, c-format
msgid "" msgid ""

View File

@ -6306,6 +6306,16 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
VIR_XML_PROP_NONE, VIR_XML_PROP_NONE,
&mdevsrc->ramfb) < 0) &mdevsrc->ramfb) < 0)
return -1; return -1;
} else if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
if (virXMLPropTristateSwitch(node, "display",
VIR_XML_PROP_NONE,
&pcisrc->display) < 0)
return -1;
if (virXMLPropTristateSwitch(node, "ramfb",
VIR_XML_PROP_NONE,
&pcisrc->ramfb) < 0)
return -1;
} }
switch (def->source.subsys.type) { switch (def->source.subsys.type) {
@ -26251,6 +26261,7 @@ virDomainHostdevDefFormat(virBuffer *buf,
const char *mode = virDomainHostdevModeTypeToString(def->mode); const char *mode = virDomainHostdevModeTypeToString(def->mode);
virDomainHostdevSubsysSCSI *scsisrc = &def->source.subsys.u.scsi; virDomainHostdevSubsysSCSI *scsisrc = &def->source.subsys.u.scsi;
virDomainHostdevSubsysMediatedDev *mdevsrc = &def->source.subsys.u.mdev; virDomainHostdevSubsysMediatedDev *mdevsrc = &def->source.subsys.u.mdev;
virDomainHostdevSubsysPCI *pcisrc = &def->source.subsys.u.pci;
virDomainHostdevSubsysSCSIVHost *scsihostsrc = &def->source.subsys.u.scsi_host; virDomainHostdevSubsysSCSIVHost *scsihostsrc = &def->source.subsys.u.scsi_host;
const char *type; const char *type;
@ -26319,7 +26330,14 @@ virDomainHostdevDefFormat(virBuffer *buf,
virBufferAsprintf(buf, " ramfb='%s'", virBufferAsprintf(buf, " ramfb='%s'",
virTristateSwitchTypeToString(mdevsrc->ramfb)); virTristateSwitchTypeToString(mdevsrc->ramfb));
} }
if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
if (pcisrc->display != VIR_TRISTATE_SWITCH_ABSENT)
virBufferAsprintf(buf, " display='%s'",
virTristateSwitchTypeToString(pcisrc->display));
if (pcisrc->ramfb != VIR_TRISTATE_SWITCH_ABSENT)
virBufferAsprintf(buf, " ramfb='%s'",
virTristateSwitchTypeToString(pcisrc->ramfb));
}
} }
virBufferAddLit(buf, ">\n"); virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
@ -28677,7 +28695,14 @@ virDomainUSBDeviceDefForeach(virDomainDef *def,
} }
} }
/* TODO: add def->nets here when libvirt starts supporting usb-net */ /* usb-net */
for (i = 0; i < def->nnets; i++) {
virDomainNetDef *net = def->nets[i];
if (net->model == VIR_DOMAIN_NET_MODEL_USB_NET) {
if (iter(&net->info, opaque) < 0)
return -1;
}
}
/* usb-ccid */ /* usb-ccid */
for (i = 0; i < def->ncontrollers; i++) { for (i = 0; i < def->ncontrollers; i++) {

View File

@ -236,6 +236,8 @@ struct _virDomainHostdevSubsysUSB {
struct _virDomainHostdevSubsysPCI { struct _virDomainHostdevSubsysPCI {
virPCIDeviceAddress addr; /* host address */ virPCIDeviceAddress addr; /* host address */
virDeviceHostdevPCIDriverInfo driver; virDeviceHostdevPCIDriverInfo driver;
virTristateSwitch display;
virTristateSwitch ramfb;
virBitmap *origstates; virBitmap *origstates;
}; };

View File

@ -1291,9 +1291,13 @@ virDomainDefHostdevValidate(const virDomainDef *def)
} }
} }
if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV && virTristateSwitch *ramfbsetting = NULL;
dev->source.subsys.u.mdev.ramfb == VIR_TRISTATE_SWITCH_ON) { if (dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV)
ramfbsetting = &dev->source.subsys.u.mdev.ramfb;
else if (dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
ramfbsetting = &dev->source.subsys.u.pci.ramfb;
if (ramfbsetting && *ramfbsetting == VIR_TRISTATE_SWITCH_ON) {
if (ramfbEnabled) { if (ramfbEnabled) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Only one vgpu device can have 'ramfb' enabled")); _("Only one vgpu device can have 'ramfb' enabled"));
@ -1302,6 +1306,7 @@ virDomainDefHostdevValidate(const virDomainDef *def)
ramfbEnabled = true; ramfbEnabled = true;
} }
} }
}
return 0; return 0;
} }

View File

@ -2894,9 +2894,9 @@ int
virNodeDeviceGetSCSITargetCaps(const char *sysfsPath, virNodeDeviceGetSCSITargetCaps(const char *sysfsPath,
virNodeDevCapSCSITarget *scsi_target) virNodeDevCapSCSITarget *scsi_target)
{ {
int ret = -1;
g_autofree char *dir = NULL; g_autofree char *dir = NULL;
g_autofree char *rport = NULL; g_autofree char *rport = NULL;
g_autofree char *wwpn = NULL;
VIR_DEBUG("Checking if '%s' is an FC remote port", scsi_target->name); VIR_DEBUG("Checking if '%s' is an FC remote port", scsi_target->name);
@ -2906,28 +2906,21 @@ virNodeDeviceGetSCSITargetCaps(const char *sysfsPath,
rport = g_path_get_basename(dir); rport = g_path_get_basename(dir);
if (!virFCIsCapableRport(rport)) if (!virFCIsCapableRport(rport))
goto cleanup; return -1;
if (virFCReadRportValue(rport, "port_name",
&wwpn) < 0) {
VIR_WARN("Failed to read port_name for '%s'", rport);
return -1;
}
VIR_FREE(scsi_target->rport); VIR_FREE(scsi_target->rport);
scsi_target->rport = g_steal_pointer(&rport); scsi_target->rport = g_steal_pointer(&rport);
if (virFCReadRportValue(scsi_target->rport, "port_name",
&scsi_target->wwpn) < 0) {
VIR_WARN("Failed to read port_name for '%s'", scsi_target->rport);
goto cleanup;
}
scsi_target->flags |= VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
ret = 0;
cleanup:
if (ret < 0) {
VIR_FREE(scsi_target->rport);
VIR_FREE(scsi_target->wwpn); VIR_FREE(scsi_target->wwpn);
scsi_target->flags &= ~VIR_NODE_DEV_CAP_FLAG_FC_RPORT; scsi_target->wwpn = g_steal_pointer(&wwpn);
} scsi_target->flags |= VIR_NODE_DEV_CAP_FLAG_FC_RPORT;
return 0;
return ret;
} }

View File

@ -6267,6 +6267,7 @@
<ref name="pciaddress"/> <ref name="pciaddress"/>
</element> </element>
</element> </element>
<ref name="hostdevsubsysvfiodisplay"/>
</interleave> </interleave>
</define> </define>
@ -6386,6 +6387,19 @@
</element> </element>
</define> </define>
<define name="hostdevsubsysvfiodisplay">
<optional>
<attribute name="ramfb">
<ref name="virOnOff"/>
</attribute>
</optional>
<optional>
<attribute name="display">
<ref name="virOnOff"/>
</attribute>
</optional>
</define>
<define name="hostdevsubsysmdev"> <define name="hostdevsubsysmdev">
<attribute name="type"> <attribute name="type">
<value>mdev</value> <value>mdev</value>
@ -6397,16 +6411,7 @@
<value>vfio-ap</value> <value>vfio-ap</value>
</choice> </choice>
</attribute> </attribute>
<optional> <ref name="hostdevsubsysvfiodisplay"/>
<attribute name="ramfb">
<ref name="virOnOff"/>
</attribute>
</optional>
<optional>
<attribute name="display">
<ref name="virOnOff"/>
</attribute>
</optional>
<element name="source"> <element name="source">
<ref name="mdevaddress"/> <ref name="mdevaddress"/>
</element> </element>

View File

@ -654,6 +654,11 @@ foreach daemon : virt_daemons
install_dir: sbindir, install_dir: sbindir,
install_rpath: libvirt_rpath, install_rpath: libvirt_rpath,
) )
# libvirtd_prog is needed by the test suite
if daemon['name'] == 'libvirtd'
libvirtd_prog = bin
endif
endforeach endforeach

View File

@ -4735,10 +4735,16 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
virDomainNetTeamingInfo *teaming; virDomainNetTeamingInfo *teaming;
g_autofree char *host = virPCIDeviceAddressAsString(&pcisrc->addr); g_autofree char *host = virPCIDeviceAddressAsString(&pcisrc->addr);
const char *failover_pair_id = NULL; const char *failover_pair_id = NULL;
const char *driver = NULL;
/* caller has to assign proper passthrough driver name */ /* caller has to assign proper passthrough driver name */
switch (pcisrc->driver.name) { switch (pcisrc->driver.name) {
case VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO: case VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_VFIO:
/* ramfb support requires the nohotplug variant */
if (pcisrc->ramfb == VIR_TRISTATE_SWITCH_ON)
driver = "vfio-pci-nohotplug";
else
driver = "vfio-pci";
break; break;
case VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_KVM: case VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_KVM:
@ -4762,11 +4768,13 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
failover_pair_id = teaming->persistent; failover_pair_id = teaming->persistent;
if (virJSONValueObjectAdd(&props, if (virJSONValueObjectAdd(&props,
"s:driver", "vfio-pci", "s:driver", driver,
"s:host", host, "s:host", host,
"s:id", dev->info->alias, "s:id", dev->info->alias,
"p:bootindex", dev->info->effectiveBootIndex, "p:bootindex", dev->info->effectiveBootIndex,
"S:failover_pair_id", failover_pair_id, "S:failover_pair_id", failover_pair_id,
"S:display", qemuOnOffAuto(pcisrc->display),
"B:ramfb", pcisrc->ramfb,
NULL) < 0) NULL) < 0)
return NULL; return NULL;

View File

@ -3951,8 +3951,10 @@ qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver,
audioPassthrough = true; audioPassthrough = true;
} else { } else {
audioPassthrough = false; audioPassthrough = false;
if (!*addAudio) {
*audioBackend = VIR_DOMAIN_AUDIO_TYPE_NONE; *audioBackend = VIR_DOMAIN_AUDIO_TYPE_NONE;
} }
}
*addAudio = true; *addAudio = true;
break; break;
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:

View File

@ -2087,6 +2087,10 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def,
for (i = 0; i < def->nnets; i++) { for (i = 0; i < def->nnets; i++) {
virDomainNetDef *net = def->nets[i]; virDomainNetDef *net = def->nets[i];
if (net->model == VIR_DOMAIN_NET_MODEL_USB_NET) {
continue;
}
/* type='hostdev' network devices might be USB, and are also /* type='hostdev' network devices might be USB, and are also
* in hostdevs list anyway, so handle them with other hostdevs * in hostdevs list anyway, so handle them with other hostdevs
* instead of here. * instead of here.

View File

@ -2639,6 +2639,8 @@ typedef struct _qemuSnapshotDeleteExternalData {
virDomainSnapshotDiskDef *snapDisk; /* snapshot disk definition */ virDomainSnapshotDiskDef *snapDisk; /* snapshot disk definition */
virDomainDiskDef *domDisk; /* VM disk definition */ virDomainDiskDef *domDisk; /* VM disk definition */
virStorageSource *diskSrc; /* source of disk we are deleting */ virStorageSource *diskSrc; /* source of disk we are deleting */
virStorageSource *diskSrcMetadata; /* copy of diskSrc to be used when updating
metadata because diskSrc is freed */
virDomainMomentObj *parentSnap; virDomainMomentObj *parentSnap;
virDomainDiskDef *parentDomDisk; /* disk definition from snapshot metadata */ virDomainDiskDef *parentDomDisk; /* disk definition from snapshot metadata */
virStorageSource *parentDiskSrc; /* backing disk source of the @diskSrc */ virStorageSource *parentDiskSrc; /* backing disk source of the @diskSrc */
@ -2657,6 +2659,7 @@ qemuSnapshotDeleteExternalDataFree(qemuSnapshotDeleteExternalData *data)
if (!data) if (!data)
return; return;
virObjectUnref(data->diskSrcMetadata);
virObjectUnref(data->job); virObjectUnref(data->job);
g_slist_free_full(data->disksWithBacking, g_free); g_slist_free_full(data->disksWithBacking, g_free);
@ -2893,6 +2896,8 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *vm,
if (!data->diskSrc) if (!data->diskSrc)
return -1; return -1;
data->diskSrcMetadata = virStorageSourceCopy(data->diskSrc, false);
if (!virStorageSourceIsSameLocation(data->diskSrc, snapDiskSrc)) { if (!virStorageSourceIsSameLocation(data->diskSrc, snapDiskSrc)) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s", virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("VM disk source and snapshot disk source are not the same")); _("VM disk source and snapshot disk source are not the same"));
@ -3049,6 +3054,7 @@ typedef struct _qemuSnapshotUpdateDisksData qemuSnapshotUpdateDisksData;
struct _qemuSnapshotUpdateDisksData { struct _qemuSnapshotUpdateDisksData {
virDomainMomentObj *snap; virDomainMomentObj *snap;
virDomainObj *vm; virDomainObj *vm;
GSList *externalData;
int error; int error;
}; };
@ -3078,7 +3084,8 @@ static int
qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap, qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap,
virDomainDef *def, virDomainDef *def,
virDomainDef *parentDef, virDomainDef *parentDef,
virDomainSnapshotDiskDef *snapDisk) virDomainSnapshotDiskDef *snapDisk,
virStorageSource *diskSrc)
{ {
virDomainDiskDef *disk = NULL; virDomainDiskDef *disk = NULL;
@ -3091,7 +3098,7 @@ qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap,
if (!(parentDisk = qemuDomainDiskByName(parentDef, snapDisk->name))) if (!(parentDisk = qemuDomainDiskByName(parentDef, snapDisk->name)))
return -1; return -1;
if (virStorageSourceIsSameLocation(snapDisk->src, disk->src)) { if (virStorageSourceIsSameLocation(diskSrc, disk->src)) {
virObjectUnref(disk->src); virObjectUnref(disk->src);
disk->src = virStorageSourceCopy(parentDisk->src, false); disk->src = virStorageSourceCopy(parentDisk->src, false);
} }
@ -3102,7 +3109,7 @@ qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap,
virStorageSource *next = disk->src->backingStore; virStorageSource *next = disk->src->backingStore;
while (next) { while (next) {
if (virStorageSourceIsSameLocation(snapDisk->src, next)) { if (virStorageSourceIsSameLocation(diskSrc, next)) {
cur->backingStore = next->backingStore; cur->backingStore = next->backingStore;
next->backingStore = NULL; next->backingStore = NULL;
virObjectUnref(next); virObjectUnref(next);
@ -3128,17 +3135,15 @@ qemuSnapshotDeleteUpdateDisks(void *payload,
qemuDomainObjPrivate *priv = data->vm->privateData; qemuDomainObjPrivate *priv = data->vm->privateData;
virQEMUDriver *driver = priv->driver; virQEMUDriver *driver = priv->driver;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(data->snap); GSList *cur = NULL;
ssize_t i;
for (i = 0; i < snapdef->ndisks; i++) { for (cur = data->externalData; cur; cur = g_slist_next(cur)) {
virDomainSnapshotDiskDef *snapDisk = &(snapdef->disks[i]); qemuSnapshotDeleteExternalData *curdata = cur->data;
if (snapDisk->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NO)
continue;
if (qemuSnapshotUpdateDisksSingle(snap, snap->def->dom, if (qemuSnapshotUpdateDisksSingle(snap, snap->def->dom,
data->snap->def->dom, snapDisk) < 0) { data->snap->def->dom,
curdata->snapDisk,
curdata->diskSrcMetadata) < 0) {
data->error = -1; data->error = -1;
} }
@ -3149,7 +3154,8 @@ qemuSnapshotDeleteUpdateDisks(void *payload,
dom = data->snap->def->dom; dom = data->snap->def->dom;
if (qemuSnapshotUpdateDisksSingle(snap, snap->def->inactiveDom, if (qemuSnapshotUpdateDisksSingle(snap, snap->def->inactiveDom,
dom, snapDisk) < 0) { dom, curdata->snapDisk,
curdata->diskSrcMetadata) < 0) {
data->error = -1; data->error = -1;
} }
} }
@ -3513,6 +3519,7 @@ qemuSnapshotDeleteUpdateParent(virDomainObj *vm,
static int static int
qemuSnapshotDiscardMetadata(virDomainObj *vm, qemuSnapshotDiscardMetadata(virDomainObj *vm,
virDomainMomentObj *snap, virDomainMomentObj *snap,
GSList *externalData,
bool update_parent) bool update_parent)
{ {
qemuDomainObjPrivate *priv = vm->privateData; qemuDomainObjPrivate *priv = vm->privateData;
@ -3537,14 +3544,17 @@ qemuSnapshotDiscardMetadata(virDomainObj *vm,
if (rep.err < 0) if (rep.err < 0)
ret = -1; ret = -1;
if (virDomainSnapshotIsExternal(snap)) {
data.snap = snap; data.snap = snap;
data.vm = vm; data.vm = vm;
data.externalData = externalData;
data.error = 0; data.error = 0;
virDomainMomentForEachDescendant(snap, virDomainMomentForEachDescendant(snap,
qemuSnapshotDeleteUpdateDisks, qemuSnapshotDeleteUpdateDisks,
&data); &data);
if (data.error < 0) if (data.error < 0)
ret = -1; ret = -1;
}
virDomainMomentMoveChildren(snap, snap->parent); virDomainMomentMoveChildren(snap, snap->parent);
} }
@ -3641,7 +3651,7 @@ qemuSnapshotDiscardImpl(virQEMUDriver *driver,
} }
} }
if (qemuSnapshotDiscardMetadata(vm, snap, update_parent) < 0) if (qemuSnapshotDiscardMetadata(vm, snap, externalData, update_parent) < 0)
return -1; return -1;
return 0; return 0;

View File

@ -2478,6 +2478,14 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
_("Write filtering of PCI device configuration space is not supported by qemu")); _("Write filtering of PCI device configuration space is not supported by qemu"));
return -1; return -1;
} }
if (hostdev->source.subsys.u.pci.display == VIR_TRISTATE_SWITCH_ON) {
if (def->ngraphics == 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("graphics device is needed for attribute value 'display=on' in <hostdev>"));
return -1;
}
}
break; break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:

View File

@ -180,21 +180,21 @@ static bool
remoteRelayNetworkEventCheckACL(virNetServerClient *client, remoteRelayNetworkEventCheckACL(virNetServerClient *client,
virConnectPtr conn, virNetworkPtr net) virConnectPtr conn, virNetworkPtr net)
{ {
virNetworkDef def; g_autofree virNetworkDef *def = g_new0(virNetworkDef, 1);
g_autoptr(virIdentity) identity = NULL; g_autoptr(virIdentity) identity = NULL;
bool ret = false; bool ret = false;
/* For now, we just create a virNetworkDef with enough contents to /* For now, we just create a virNetworkDef with enough contents to
* satisfy what viraccessdriverpolkit.c references. This is a bit * satisfy what viraccessdriverpolkit.c references. This is a bit
* fragile, but I don't know of anything better. */ * fragile, but I don't know of anything better. */
def.name = net->name; def->name = net->name;
memcpy(def.uuid, net->uuid, VIR_UUID_BUFLEN); memcpy(def->uuid, net->uuid, VIR_UUID_BUFLEN);
if (!(identity = virNetServerClientGetIdentity(client))) if (!(identity = virNetServerClientGetIdentity(client)))
goto cleanup; goto cleanup;
if (virIdentitySetCurrent(identity) < 0) if (virIdentitySetCurrent(identity) < 0)
goto cleanup; goto cleanup;
ret = virConnectNetworkEventRegisterAnyCheckACL(conn, &def); ret = virConnectNetworkEventRegisterAnyCheckACL(conn, def);
cleanup: cleanup:
ignore_value(virIdentitySetCurrent(NULL)); ignore_value(virIdentitySetCurrent(NULL));
@ -206,21 +206,21 @@ remoteRelayStoragePoolEventCheckACL(virNetServerClient *client,
virConnectPtr conn, virConnectPtr conn,
virStoragePoolPtr pool) virStoragePoolPtr pool)
{ {
virStoragePoolDef def; g_autofree virStoragePoolDef *def = g_new0(virStoragePoolDef, 1);
g_autoptr(virIdentity) identity = NULL; g_autoptr(virIdentity) identity = NULL;
bool ret = false; bool ret = false;
/* For now, we just create a virStoragePoolDef with enough contents to /* For now, we just create a virStoragePoolDef with enough contents to
* satisfy what viraccessdriverpolkit.c references. This is a bit * satisfy what viraccessdriverpolkit.c references. This is a bit
* fragile, but I don't know of anything better. */ * fragile, but I don't know of anything better. */
def.name = pool->name; def->name = pool->name;
memcpy(def.uuid, pool->uuid, VIR_UUID_BUFLEN); memcpy(def->uuid, pool->uuid, VIR_UUID_BUFLEN);
if (!(identity = virNetServerClientGetIdentity(client))) if (!(identity = virNetServerClientGetIdentity(client)))
goto cleanup; goto cleanup;
if (virIdentitySetCurrent(identity) < 0) if (virIdentitySetCurrent(identity) < 0)
goto cleanup; goto cleanup;
ret = virConnectStoragePoolEventRegisterAnyCheckACL(conn, &def); ret = virConnectStoragePoolEventRegisterAnyCheckACL(conn, def);
cleanup: cleanup:
ignore_value(virIdentitySetCurrent(NULL)); ignore_value(virIdentitySetCurrent(NULL));
@ -232,20 +232,20 @@ remoteRelayNodeDeviceEventCheckACL(virNetServerClient *client,
virConnectPtr conn, virConnectPtr conn,
virNodeDevicePtr dev) virNodeDevicePtr dev)
{ {
virNodeDeviceDef def; g_autofree virNodeDeviceDef *def = g_new0(virNodeDeviceDef, 1);
g_autoptr(virIdentity) identity = NULL; g_autoptr(virIdentity) identity = NULL;
bool ret = false; bool ret = false;
/* For now, we just create a virNodeDeviceDef with enough contents to /* For now, we just create a virNodeDeviceDef with enough contents to
* satisfy what viraccessdriverpolkit.c references. This is a bit * satisfy what viraccessdriverpolkit.c references. This is a bit
* fragile, but I don't know of anything better. */ * fragile, but I don't know of anything better. */
def.name = dev->name; def->name = dev->name;
if (!(identity = virNetServerClientGetIdentity(client))) if (!(identity = virNetServerClientGetIdentity(client)))
goto cleanup; goto cleanup;
if (virIdentitySetCurrent(identity) < 0) if (virIdentitySetCurrent(identity) < 0)
goto cleanup; goto cleanup;
ret = virConnectNodeDeviceEventRegisterAnyCheckACL(conn, &def); ret = virConnectNodeDeviceEventRegisterAnyCheckACL(conn, def);
cleanup: cleanup:
ignore_value(virIdentitySetCurrent(NULL)); ignore_value(virIdentitySetCurrent(NULL));
@ -257,22 +257,22 @@ remoteRelaySecretEventCheckACL(virNetServerClient *client,
virConnectPtr conn, virConnectPtr conn,
virSecretPtr secret) virSecretPtr secret)
{ {
virSecretDef def; g_autofree virSecretDef *def = g_new0(virSecretDef, 1);
g_autoptr(virIdentity) identity = NULL; g_autoptr(virIdentity) identity = NULL;
bool ret = false; bool ret = false;
/* For now, we just create a virSecretDef with enough contents to /* For now, we just create a virSecretDef with enough contents to
* satisfy what viraccessdriverpolkit.c references. This is a bit * satisfy what viraccessdriverpolkit.c references. This is a bit
* fragile, but I don't know of anything better. */ * fragile, but I don't know of anything better. */
memcpy(def.uuid, secret->uuid, VIR_UUID_BUFLEN); memcpy(def->uuid, secret->uuid, VIR_UUID_BUFLEN);
def.usage_type = secret->usageType; def->usage_type = secret->usageType;
def.usage_id = secret->usageID; def->usage_id = secret->usageID;
if (!(identity = virNetServerClientGetIdentity(client))) if (!(identity = virNetServerClientGetIdentity(client)))
goto cleanup; goto cleanup;
if (virIdentitySetCurrent(identity) < 0) if (virIdentitySetCurrent(identity) < 0)
goto cleanup; goto cleanup;
ret = virConnectSecretEventRegisterAnyCheckACL(conn, &def); ret = virConnectSecretEventRegisterAnyCheckACL(conn, def);
cleanup: cleanup:
ignore_value(virIdentitySetCurrent(NULL)); ignore_value(virIdentitySetCurrent(NULL));

View File

@ -1249,6 +1249,8 @@ virSysinfoRead(void)
(defined(__x86_64__) || \ (defined(__x86_64__) || \
defined(__i386__) || \ defined(__i386__) || \
defined(__amd64__) || \ defined(__amd64__) || \
defined(__riscv__) || \
defined(__mips__) || \
defined(__loongarch__)) defined(__loongarch__))
return virSysinfoReadDMI(); return virSysinfoReadDMI();
#else /* WIN32 || not supported arch */ #else /* WIN32 || not supported arch */

View File

@ -3,7 +3,7 @@
<domain>kvm</domain> <domain>kvm</domain>
<machine>pc-q35-9.0</machine> <machine>pc-q35-9.0</machine>
<arch>x86_64</arch> <arch>x86_64</arch>
<vcpu max='1024'/> <vcpu max='4096'/>
<iothreads supported='yes'/> <iothreads supported='yes'/>
<os supported='yes'> <os supported='yes'>
<enum name='firmware'> <enum name='firmware'>

View File

@ -38,6 +38,7 @@
<model fallback='forbid'>EPYC</model> <model fallback='forbid'>EPYC</model>
<vendor>AMD</vendor> <vendor>AMD</vendor>
<feature policy='require' name='monitor'/> <feature policy='require' name='monitor'/>
<feature policy='require' name='x2apic'/>
<feature policy='require' name='hypervisor'/> <feature policy='require' name='hypervisor'/>
<feature policy='require' name='acpi'/> <feature policy='require' name='acpi'/>
<feature policy='require' name='ss'/> <feature policy='require' name='ss'/>

View File

@ -1,16 +0,0 @@
#!/bin/sh
# Ensure that libvirt fails when given nonexistent --config=FILE
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/src/libvirtd --version
fi
fail=0
$abs_top_builddir/src/libvirtd --config=no-such-conf --timeout=5 2> log
RET=$?
test "$RET" != "0" && exit 0 || exit 1

View File

@ -1,38 +0,0 @@
#!/bin/sh
# Get coverage of virsh pool-define-as XML formatting
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
pwd=$(pwd) || fail=1
$abs_top_builddir/tools/virsh --connect test:///default \
pool-define-as --print-xml \
P dir src-host /src/path /src/dev S /target-path \
1>out 2>&1
cat <<EOF > pool-list-exp
<pool type='dir'>
<name>P</name>
<source>
<host name='src-host'/>
<dir path='/src/path'/>
<device path='/src/dev'/>
<name>S</name>
</source>
<target>
<path>/target-path</path>
</target>
</pool>
EOF
compare pool-list-exp out || fail=1
exit $fail

View File

@ -619,6 +619,20 @@ test(
suite: 'script', suite: 'script',
) )
# vsh based client self-test, which can be run directly from meson
test('virsh self-test',
virsh_prog,
args: [ '-q', '-c', 'test:///default', 'self-test' ],
suite: 'bin',
)
if conf.has('WITH_REMOTE')
test('virt-admin self-test',
virt_admin_prog,
args: [ '-q', 'self-test' ],
suite: 'bin',
)
endif
# helpers: # helpers:
# each entry is a dictionary with following items: # each entry is a dictionary with following items:
@ -687,26 +701,15 @@ endforeach
test_scripts = [] test_scripts = []
if conf.has('WITH_LIBVIRTD') if conf.has('WITH_LIBVIRTD')
test('libvirtd fail with missing config',
libvirtd_prog,
args: [ '--config=no-such-conf', '--timeout=5' ],
should_fail: true,
suite: 'bin',
)
test_scripts += [ test_scripts += [
'libvirtd-fail',
'libvirtd-pool',
'virsh-auth', 'virsh-auth',
'virsh-checkpoint',
'virsh-cpuset',
'virsh-define-dev-segfault',
'virsh-int-overflow',
'virsh-optparse',
'virsh-output',
'virsh-read-bufsiz',
'virsh-read-non-seekable',
'virsh-schedinfo',
'virsh-self-test',
'virsh-snapshot',
'virsh-start',
'virsh-undefine',
'virsh-uriprecedence',
'virsh-vcpupin',
'virt-admin-self-test',
] ]
if conf.has('WITH_SECDRIVER_APPARMOR') if conf.has('WITH_SECDRIVER_APPARMOR')

File diff suppressed because it is too large Load Diff

View File

@ -204,9 +204,9 @@
<flag name='blockjob.backing-mask-protocol'/> <flag name='blockjob.backing-mask-protocol'/>
<flag name='display-reload'/> <flag name='display-reload'/>
<flag name='usb-mtp'/> <flag name='usb-mtp'/>
<version>8002050</version> <version>8002091</version>
<microcodeVersion>43100245</microcodeVersion> <microcodeVersion>43100245</microcodeVersion>
<package>v8.2.0-952-g14639717bf</package> <package>v9.0.0-rc1-55-g7fcf7575f3</package>
<arch>x86_64</arch> <arch>x86_64</arch>
<hostCPU type='kvm' model='base' migratability='yes'> <hostCPU type='kvm' model='base' migratability='yes'>
<property name='avx-ne-convert' type='boolean' value='false'/> <property name='avx-ne-convert' type='boolean' value='false'/>
@ -367,6 +367,7 @@
<property name='pcommit' type='boolean' value='false'/> <property name='pcommit' type='boolean' value='false'/>
<property name='vmx-vpid' type='boolean' value='false'/> <property name='vmx-vpid' type='boolean' value='false'/>
<property name='syscall' type='boolean' value='true' migratable='yes'/> <property name='syscall' type='boolean' value='true' migratable='yes'/>
<property name='kvm-asyncpf-vmexit' type='boolean' value='true' migratable='yes'/>
<property name='avx512dq' type='boolean' value='false'/> <property name='avx512dq' type='boolean' value='false'/>
<property name='svm' type='boolean' value='true' migratable='yes'/> <property name='svm' type='boolean' value='true' migratable='yes'/>
<property name='invtsc' type='boolean' value='true' migratable='no'/> <property name='invtsc' type='boolean' value='true' migratable='no'/>
@ -1916,7 +1917,7 @@
<machine type='kvm' name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-9.0' alias='q35' hotplugCpus='yes' maxCpus='1024' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-9.0' alias='q35' hotplugCpus='yes' maxCpus='4096' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-7.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-7.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' deprecated='yes' acpi='yes'/> <machine type='kvm' name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' deprecated='yes' acpi='yes'/>
@ -1941,8 +1942,8 @@
<machine type='kvm' name='pc-i440fx-5.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-i440fx-5.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-6.2' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-6.2' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-i440fx-7.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-i440fx-7.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='kvm' name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='kvm' name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<hostCPU type='tcg' model='base' migratability='yes'> <hostCPU type='tcg' model='base' migratability='yes'>
@ -2074,7 +2075,7 @@
<property name='pfthreshold' type='boolean' value='false'/> <property name='pfthreshold' type='boolean' value='false'/>
<property name='vmx-invpcid-exit' type='boolean' value='false'/> <property name='vmx-invpcid-exit' type='boolean' value='false'/>
<property name='amx-int8' type='boolean' value='false'/> <property name='amx-int8' type='boolean' value='false'/>
<property name='x2apic' type='boolean' value='false'/> <property name='x2apic' type='boolean' value='true' migratable='yes'/>
<property name='avx512vbmi' type='boolean' value='false'/> <property name='avx512vbmi' type='boolean' value='false'/>
<property name='avx512vnni' type='boolean' value='false'/> <property name='avx512vnni' type='boolean' value='false'/>
<property name='sgx-edeccssa' type='boolean' value='false'/> <property name='sgx-edeccssa' type='boolean' value='false'/>
@ -2104,6 +2105,7 @@
<property name='pcommit' type='boolean' value='true' migratable='yes'/> <property name='pcommit' type='boolean' value='true' migratable='yes'/>
<property name='vmx-vpid' type='boolean' value='false'/> <property name='vmx-vpid' type='boolean' value='false'/>
<property name='syscall' type='boolean' value='true' migratable='yes'/> <property name='syscall' type='boolean' value='true' migratable='yes'/>
<property name='kvm-asyncpf-vmexit' type='boolean' value='false'/>
<property name='avx512dq' type='boolean' value='false'/> <property name='avx512dq' type='boolean' value='false'/>
<property name='svm' type='boolean' value='true' migratable='yes'/> <property name='svm' type='boolean' value='true' migratable='yes'/>
<property name='invtsc' type='boolean' value='false'/> <property name='invtsc' type='boolean' value='false'/>
@ -2345,7 +2347,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Westmere' typename='Westmere-x86_64-cpu' usable='yes'/> <cpu type='tcg' name='Westmere' typename='Westmere-x86_64-cpu' usable='yes'/>
<cpu type='tcg' name='Snowridge-v4' typename='Snowridge-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Snowridge-v4' typename='Snowridge-v4-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='gfni'/> <blocker name='gfni'/>
<blocker name='cldemote'/> <blocker name='cldemote'/>
@ -2358,7 +2359,6 @@
<blocker name='xsaves'/> <blocker name='xsaves'/>
</cpu> </cpu>
<cpu type='tcg' name='Snowridge-v3' typename='Snowridge-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Snowridge-v3' typename='Snowridge-v3-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='gfni'/> <blocker name='gfni'/>
<blocker name='cldemote'/> <blocker name='cldemote'/>
@ -2373,7 +2373,6 @@
<blocker name='split-lock-detect'/> <blocker name='split-lock-detect'/>
</cpu> </cpu>
<cpu type='tcg' name='Snowridge-v2' typename='Snowridge-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Snowridge-v2' typename='Snowridge-v2-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='gfni'/> <blocker name='gfni'/>
<blocker name='cldemote'/> <blocker name='cldemote'/>
@ -2387,7 +2386,6 @@
<blocker name='split-lock-detect'/> <blocker name='split-lock-detect'/>
</cpu> </cpu>
<cpu type='tcg' name='Snowridge-v1' typename='Snowridge-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Snowridge-v1' typename='Snowridge-v1-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='gfni'/> <blocker name='gfni'/>
<blocker name='cldemote'/> <blocker name='cldemote'/>
@ -2401,7 +2399,6 @@
<blocker name='split-lock-detect'/> <blocker name='split-lock-detect'/>
</cpu> </cpu>
<cpu type='tcg' name='Snowridge' typename='Snowridge-x86_64-cpu' usable='no'> <cpu type='tcg' name='Snowridge' typename='Snowridge-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='gfni'/> <blocker name='gfni'/>
<blocker name='cldemote'/> <blocker name='cldemote'/>
@ -2416,7 +2413,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-v5' typename='Skylake-Server-v5-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-v5' typename='Skylake-Server-v5-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2430,7 +2426,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-v4' typename='Skylake-Server-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-v4' typename='Skylake-Server-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2443,7 +2438,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-v3' typename='Skylake-Server-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-v3' typename='Skylake-Server-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2456,7 +2450,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-v2' typename='Skylake-Server-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-v2' typename='Skylake-Server-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2471,7 +2464,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-v1' typename='Skylake-Server-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-v1' typename='Skylake-Server-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2485,7 +2477,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-noTSX-IBRS' typename='Skylake-Server-noTSX-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-noTSX-IBRS' typename='Skylake-Server-noTSX-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2498,7 +2489,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server-IBRS' typename='Skylake-Server-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server-IBRS' typename='Skylake-Server-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2513,7 +2503,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Server' typename='Skylake-Server-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Server' typename='Skylake-Server-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2527,7 +2516,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-v4' typename='Skylake-Client-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-v4' typename='Skylake-Client-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
@ -2536,7 +2524,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-v3' typename='Skylake-Client-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-v3' typename='Skylake-Client-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
@ -2544,7 +2531,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-v2' typename='Skylake-Client-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-v2' typename='Skylake-Client-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2554,7 +2540,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-v1' typename='Skylake-Client-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-v1' typename='Skylake-Client-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2563,7 +2548,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-noTSX-IBRS' typename='Skylake-Client-noTSX-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-noTSX-IBRS' typename='Skylake-Client-noTSX-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
@ -2571,7 +2555,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client-IBRS' typename='Skylake-Client-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client-IBRS' typename='Skylake-Client-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2581,7 +2564,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Skylake-Client' typename='Skylake-Client-x86_64-cpu' usable='no'> <cpu type='tcg' name='Skylake-Client' typename='Skylake-Client-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2590,7 +2572,6 @@
</cpu> </cpu>
<cpu type='tcg' name='SapphireRapids-v2' typename='SapphireRapids-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='SapphireRapids-v2' typename='SapphireRapids-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2626,7 +2607,6 @@
</cpu> </cpu>
<cpu type='tcg' name='SapphireRapids-v1' typename='SapphireRapids-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='SapphireRapids-v1' typename='SapphireRapids-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2662,7 +2642,6 @@
</cpu> </cpu>
<cpu type='tcg' name='SapphireRapids' typename='SapphireRapids-x86_64-cpu' usable='no'> <cpu type='tcg' name='SapphireRapids' typename='SapphireRapids-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2697,21 +2676,17 @@
<blocker name='xfd'/> <blocker name='xfd'/>
</cpu> </cpu>
<cpu type='tcg' name='SandyBridge-v2' typename='SandyBridge-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='SandyBridge-v2' typename='SandyBridge-v2-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='SandyBridge-v1' typename='SandyBridge-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='SandyBridge-v1' typename='SandyBridge-v1-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
</cpu> </cpu>
<cpu type='tcg' name='SandyBridge-IBRS' typename='SandyBridge-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='SandyBridge-IBRS' typename='SandyBridge-IBRS-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='SandyBridge' typename='SandyBridge-x86_64-cpu' usable='no'> <cpu type='tcg' name='SandyBridge' typename='SandyBridge-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
</cpu> </cpu>
<cpu type='tcg' name='Penryn-v1' typename='Penryn-v1-x86_64-cpu' usable='yes'/> <cpu type='tcg' name='Penryn-v1' typename='Penryn-v1-x86_64-cpu' usable='yes'/>
@ -2761,7 +2736,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Nehalem' typename='Nehalem-x86_64-cpu' usable='yes'/> <cpu type='tcg' name='Nehalem' typename='Nehalem-x86_64-cpu' usable='yes'/>
<cpu type='tcg' name='KnightsMill-v1' typename='KnightsMill-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='KnightsMill-v1' typename='KnightsMill-v1-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
<blocker name='avx512pf'/> <blocker name='avx512pf'/>
@ -2772,7 +2746,6 @@
<blocker name='avx512-4fmaps'/> <blocker name='avx512-4fmaps'/>
</cpu> </cpu>
<cpu type='tcg' name='KnightsMill' typename='KnightsMill-x86_64-cpu' usable='no'> <cpu type='tcg' name='KnightsMill' typename='KnightsMill-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
<blocker name='avx512pf'/> <blocker name='avx512pf'/>
@ -2783,26 +2756,21 @@
<blocker name='avx512-4fmaps'/> <blocker name='avx512-4fmaps'/>
</cpu> </cpu>
<cpu type='tcg' name='IvyBridge-v2' typename='IvyBridge-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='IvyBridge-v2' typename='IvyBridge-v2-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='IvyBridge-v1' typename='IvyBridge-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='IvyBridge-v1' typename='IvyBridge-v1-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
</cpu> </cpu>
<cpu type='tcg' name='IvyBridge-IBRS' typename='IvyBridge-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='IvyBridge-IBRS' typename='IvyBridge-IBRS-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='IvyBridge' typename='IvyBridge-x86_64-cpu' usable='no'> <cpu type='tcg' name='IvyBridge' typename='IvyBridge-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v6' typename='Icelake-Server-v6-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v6' typename='Icelake-Server-v6-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2826,7 +2794,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v5' typename='Icelake-Server-v5-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v5' typename='Icelake-Server-v5-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2850,7 +2817,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v4' typename='Icelake-Server-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v4' typename='Icelake-Server-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2873,7 +2839,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v3' typename='Icelake-Server-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v3' typename='Icelake-Server-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2895,7 +2860,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v2' typename='Icelake-Server-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v2' typename='Icelake-Server-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2916,7 +2880,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-v1' typename='Icelake-Server-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-v1' typename='Icelake-Server-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2939,7 +2902,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server-noTSX' typename='Icelake-Server-noTSX-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server-noTSX' typename='Icelake-Server-noTSX-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -2960,7 +2922,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Icelake-Server' typename='Icelake-Server-x86_64-cpu' usable='no'> <cpu type='tcg' name='Icelake-Server' typename='Icelake-Server-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2983,14 +2944,12 @@
</cpu> </cpu>
<cpu type='tcg' name='Haswell-v4' typename='Haswell-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-v4' typename='Haswell-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='Haswell-v3' typename='Haswell-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-v3' typename='Haswell-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -2999,13 +2958,11 @@
</cpu> </cpu>
<cpu type='tcg' name='Haswell-v2' typename='Haswell-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-v2' typename='Haswell-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
</cpu> </cpu>
<cpu type='tcg' name='Haswell-v1' typename='Haswell-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-v1' typename='Haswell-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3013,20 +2970,17 @@
</cpu> </cpu>
<cpu type='tcg' name='Haswell-noTSX-IBRS' typename='Haswell-noTSX-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-noTSX-IBRS' typename='Haswell-noTSX-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='Haswell-noTSX' typename='Haswell-noTSX-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-noTSX' typename='Haswell-noTSX-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
</cpu> </cpu>
<cpu type='tcg' name='Haswell-IBRS' typename='Haswell-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell-IBRS' typename='Haswell-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3035,7 +2989,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Haswell' typename='Haswell-x86_64-cpu' usable='no'> <cpu type='tcg' name='Haswell' typename='Haswell-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3043,7 +2996,6 @@
</cpu> </cpu>
<cpu type='tcg' name='GraniteRapids-v1' typename='GraniteRapids-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='GraniteRapids-v1' typename='GraniteRapids-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3082,7 +3034,6 @@
</cpu> </cpu>
<cpu type='tcg' name='GraniteRapids' typename='GraniteRapids-x86_64-cpu' usable='no'> <cpu type='tcg' name='GraniteRapids' typename='GraniteRapids-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3409,7 +3360,6 @@
<blocker name='xsavec'/> <blocker name='xsavec'/>
</cpu> </cpu>
<cpu type='tcg' name='Denverton-v3' typename='Denverton-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Denverton-v3' typename='Denverton-v3-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
<blocker name='arch-capabilities'/> <blocker name='arch-capabilities'/>
@ -3418,7 +3368,6 @@
<blocker name='xsaves'/> <blocker name='xsaves'/>
</cpu> </cpu>
<cpu type='tcg' name='Denverton-v2' typename='Denverton-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Denverton-v2' typename='Denverton-v2-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
<blocker name='arch-capabilities'/> <blocker name='arch-capabilities'/>
@ -3426,7 +3375,6 @@
<blocker name='xsavec'/> <blocker name='xsavec'/>
</cpu> </cpu>
<cpu type='tcg' name='Denverton-v1' typename='Denverton-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Denverton-v1' typename='Denverton-v1-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
<blocker name='arch-capabilities'/> <blocker name='arch-capabilities'/>
@ -3434,7 +3382,6 @@
<blocker name='xsavec'/> <blocker name='xsavec'/>
</cpu> </cpu>
<cpu type='tcg' name='Denverton' typename='Denverton-x86_64-cpu' usable='no'> <cpu type='tcg' name='Denverton' typename='Denverton-x86_64-cpu' usable='no'>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
<blocker name='arch-capabilities'/> <blocker name='arch-capabilities'/>
@ -3443,7 +3390,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cooperlake-v2' typename='Cooperlake-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cooperlake-v2' typename='Cooperlake-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3464,7 +3410,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cooperlake-v1' typename='Cooperlake-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cooperlake-v1' typename='Cooperlake-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3484,7 +3429,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cooperlake' typename='Cooperlake-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cooperlake' typename='Cooperlake-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3506,7 +3450,6 @@
<cpu type='tcg' name='Conroe' typename='Conroe-x86_64-cpu' usable='yes'/> <cpu type='tcg' name='Conroe' typename='Conroe-x86_64-cpu' usable='yes'/>
<cpu type='tcg' name='Cascadelake-Server-v5' typename='Cascadelake-Server-v5-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-v5' typename='Cascadelake-Server-v5-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -3523,7 +3466,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server-v4' typename='Cascadelake-Server-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-v4' typename='Cascadelake-Server-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -3539,7 +3481,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server-v3' typename='Cascadelake-Server-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-v3' typename='Cascadelake-Server-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -3555,7 +3496,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server-v2' typename='Cascadelake-Server-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-v2' typename='Cascadelake-Server-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3573,7 +3513,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server-v1' typename='Cascadelake-Server-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-v1' typename='Cascadelake-Server-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3590,7 +3529,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server-noTSX' typename='Cascadelake-Server-noTSX-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server-noTSX' typename='Cascadelake-Server-noTSX-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='avx512f'/> <blocker name='avx512f'/>
@ -3606,7 +3544,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Cascadelake-Server' typename='Cascadelake-Server-x86_64-cpu' usable='no'> <cpu type='tcg' name='Cascadelake-Server' typename='Cascadelake-Server-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3623,14 +3560,12 @@
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-v4' typename='Broadwell-v4-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-v4' typename='Broadwell-v4-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-v3' typename='Broadwell-v3-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-v3' typename='Broadwell-v3-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3639,13 +3574,11 @@
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-v2' typename='Broadwell-v2-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-v2' typename='Broadwell-v2-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-v1' typename='Broadwell-v1-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-v1' typename='Broadwell-v1-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3653,20 +3586,17 @@
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-noTSX-IBRS' typename='Broadwell-noTSX-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-noTSX-IBRS' typename='Broadwell-noTSX-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
<blocker name='spec-ctrl'/> <blocker name='spec-ctrl'/>
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-noTSX' typename='Broadwell-noTSX-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-noTSX' typename='Broadwell-noTSX-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
</cpu> </cpu>
<cpu type='tcg' name='Broadwell-IBRS' typename='Broadwell-IBRS-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell-IBRS' typename='Broadwell-IBRS-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3675,7 +3605,6 @@
</cpu> </cpu>
<cpu type='tcg' name='Broadwell' typename='Broadwell-x86_64-cpu' usable='no'> <cpu type='tcg' name='Broadwell' typename='Broadwell-x86_64-cpu' usable='no'>
<blocker name='pcid'/> <blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='tsc-deadline'/> <blocker name='tsc-deadline'/>
<blocker name='hle'/> <blocker name='hle'/>
<blocker name='invpcid'/> <blocker name='invpcid'/>
@ -3716,7 +3645,7 @@
<machine type='tcg' name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-9.0' alias='q35' hotplugCpus='yes' maxCpus='1024' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-9.0' alias='q35' hotplugCpus='yes' maxCpus='4096' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-7.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-7.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' deprecated='yes' acpi='yes'/> <machine type='tcg' name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' deprecated='yes' acpi='yes'/>
@ -3741,8 +3670,8 @@
<machine type='tcg' name='pc-i440fx-5.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-i440fx-5.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-6.2' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-6.2' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-i440fx-7.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-i440fx-7.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu' defaultRAMid='pc.ram' acpi='yes'/>
<machine type='tcg' name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/> <machine type='tcg' name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu' numaMemSupported='yes' defaultRAMid='pc.ram' acpi='yes'/>
<hypervCapabilities supported='yes'> <hypervCapabilities supported='yes'>

View File

@ -0,0 +1,46 @@
LC_ALL=C \
PATH=/bin \
HOME=/var/lib/libvirt/qemu/domain--1-D \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-D/.local/share \
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-D/.cache \
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-D/.config \
/usr/bin/qemu-system-x86_64 \
-name guest=D,debug-threads=on \
-S \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-D/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,pcspk-audiodev=audio1,acpi=on \
-accel kvm \
-cpu qemu64 \
-m size=262144k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":268435456}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid aaa3ae22-fed2-bfbd-ac02-3bea3bcfad82 \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
-chardev pty,id=charserial0 \
-device '{"driver":"isa-serial","chardev":"charserial0","id":"serial0","index":0}' \
-chardev pty,id=charserial1 \
-device '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","index":1}' \
-chardev pty,id=charserial2 \
-device '{"driver":"isa-serial","chardev":"charserial2","id":"serial2","index":2}' \
-chardev pty,id=charparallel0 \
-device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}' \
-chardev pty,id=charparallel1 \
-device '{"driver":"isa-parallel","chardev":"charparallel1","id":"parallel1"}' \
-chardev pty,id=charparallel2 \
-device '{"driver":"isa-parallel","chardev":"charparallel2","id":"parallel2"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-device '{"driver":"ES1370","id":"sound1","audiodev":"audio1","bus":"pci.0","addr":"0x2"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on

View File

@ -0,0 +1,65 @@
<domain type='kvm'>
<name>D</name>
<uuid>aaa3ae22-fed2-bfbd-ac02-3bea3bcfad82</uuid>
<memory unit='KiB'>262144</memory>
<currentMemory unit='KiB'>262144</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
</features>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<serial type='pty'>
<target type='isa-serial' port='1'>
<model name='isa-serial'/>
</target>
</serial>
<serial type='pty'>
<target type='isa-serial' port='2'>
<model name='isa-serial'/>
</target>
</serial>
<parallel type='pty'>
<target port='0'/>
</parallel>
<parallel type='pty'>
<target port='1'/>
</parallel>
<parallel type='pty'>
<target port='2'/>
</parallel>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<sound model='pcspk'/>
<sound model='es1370'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</sound>
<audio id='1' type='none'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</memballoon>
</devices>
</domain>

View File

@ -1,26 +1,11 @@
#!/bin/sh <domain type='kvm'>
# Exercise a bug whereby defining a valid domain could kill libvirtd.
# The bug can also be exercised with a simple define/dumpxml pair to virsh.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
# Domain definition from Cole Robinson.
cat <<\EOF > D.xml || fail=1
<domain type='test'>
<name>D</name> <name>D</name>
<uuid>aaa3ae22-fed2-bfbd-ac02-3bea3bcfad82</uuid> <uuid>aaa3ae22-fed2-bfbd-ac02-3bea3bcfad82</uuid>
<memory unit='KiB'>262144</memory> <memory unit='KiB'>262144</memory>
<currentMemory unit='KiB'>262144</currentMemory> <currentMemory unit='KiB'>262144</currentMemory>
<vcpu placement='static'>1</vcpu> <vcpu placement='static'>1</vcpu>
<os> <os>
<type arch='i686' machine='pc'>hvm</type> <type arch='x86_64' machine='pc'>hvm</type>
<boot dev='cdrom'/> <boot dev='cdrom'/>
</os> </os>
<features> <features>
@ -31,7 +16,7 @@ cat <<\EOF > D.xml || fail=1
<on_reboot>restart</on_reboot> <on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash> <on_crash>destroy</on_crash>
<devices> <devices>
<emulator>/usr/bin/qemu-system-i386</emulator> <emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0'/> <controller type='usb' index='0'/>
<serial type='pty'> <serial type='pty'>
<target port='0'/> <target port='0'/>
@ -59,18 +44,3 @@ cat <<\EOF > D.xml || fail=1
<memballoon model='virtio'/> <memballoon model='virtio'/>
</devices> </devices>
</domain> </domain>
EOF
url=test:///default
$abs_top_builddir/tools/virsh --connect "$url" 'define D.xml; dumpxml D' > out 2>&1 || fail=1
cat > exp <<EOF || fail=1
Domain 'D' defined from D.xml
$(cat D.xml)
EOF
compare exp out || fail=1
exit $fail

View File

@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \ -accel tcg \
-cpu EPYC,monitor=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \ -cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
-m size=219136k \ -m size=219136k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
-overcommit mem-lock=off \ -overcommit mem-lock=off \

View File

@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \ -accel tcg \
-cpu EPYC,monitor=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \ -cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
-m size=219136k \ -m size=219136k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
-overcommit mem-lock=off \ -overcommit mem-lock=off \

View File

@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine q35,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ -machine q35,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \ -accel tcg \
-cpu EPYC,monitor=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \ -cpu EPYC,monitor=on,x2apic=on,hypervisor=on,acpi=on,ss=on,erms=on,mpx=on,pcommit=on,clwb=on,umip=on,pku=on,vaes=on,la57=on,rdpid=on,pks=on,fsrm=on,cmpccxadd=on,fzrm=on,fsrs=on,fsrc=on,3dnowext=on,3dnow=on,xsaveerptr=on,wbnoinvd=on,npt=on,vgif=on,svme-addr-chk=on,vme=off,xsavec=off,misalignsse=off,osvw=off,topoext=off,fxsr-opt=off,nrip-save=off \
-m size=219136k \ -m size=219136k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
-overcommit mem-lock=off \ -overcommit mem-lock=off \

View File

@ -0,0 +1 @@
invalid argument: Failed to parse bitmap 'aaa'

View File

@ -0,0 +1,12 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<vcpu cpuset='aaa'>2</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
</devices>
</domain>

View File

@ -0,0 +1,33 @@
LC_ALL=C \
PATH=/bin \
HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest2 \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.local/share \
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.cache \
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest2/.config \
/usr/bin/qemu-system-x86_64 \
-name guest=QEMUGuest2,debug-threads=on \
-S \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest2/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \
-cpu qemu64 \
-m size=219136k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-vnc 127.0.0.1:0,audiodev=audio1 \
-device '{"driver":"vfio-pci-nohotplug","host":"0000:06:12.5","id":"hostdev0","display":"on","ramfb":true,"bus":"pci.0","addr":"0x2"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on

View File

@ -0,0 +1,44 @@
<domain type='qemu'>
<name>QEMUGuest2</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'>
<listen type='address'/>
</graphics>
<audio id='1' type='none'/>
<video>
<model type='none'/>
</video>
<hostdev mode='subsystem' type='pci' managed='no' display='on' ramfb='on'>
<source>
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</hostdev>
<memballoon model='none'/>
</devices>
</domain>

View File

@ -0,0 +1,33 @@
<domain type='qemu'>
<name>QEMUGuest2</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0'>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
</controller>
<graphics type='vnc'/>
<hostdev mode='subsystem' type='pci' display='on' ramfb='on'>
<source>
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
</source>
</hostdev>
<video>
<model type='none'/>
</video>
<memballoon model='none'/>
</devices>
</domain>

View File

@ -0,0 +1,35 @@
LC_ALL=C \
PATH=/bin \
HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
/usr/bin/qemu-system-x86_64 \
-name guest=QEMUGuest1,debug-threads=on \
-S \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
-accel tcg \
-cpu qemu64 \
-m size=4194304k \
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":4294967296}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 2d4d4b20-b19b-4713-af0a-bf1cab8b455b \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device '{"driver":"qemu-xhci","p2":1,"p3":1,"id":"usb","bus":"pci.0","addr":"0x2"}' \
-netdev '{"type":"user","id":"hostnet0"}' \
-device '{"driver":"usb-net","netdev":"hostnet0","id":"net0","mac":"00:11:22:33:44:55","bus":"usb.0","port":"1"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on

View File

@ -0,0 +1,35 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='qemu-xhci' ports='1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<interface type='user'>
<mac address='00:11:22:33:44:55'/>
<model type='usb-net'/>
</interface>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</memballoon>
</devices>
</domain>

View File

@ -0,0 +1,20 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='qemu-xhci' ports='1'/>
<interface type="user">
<mac address="00:11:22:33:44:55"/>
<model type="usb-net"/>
</interface>
<memballoon model='virtio'/>
</devices>
</domain>

View File

@ -1799,6 +1799,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("console-compat"); DO_TEST_CAPS_LATEST("console-compat");
DO_TEST_CAPS_LATEST("console-compat-auto"); DO_TEST_CAPS_LATEST("console-compat-auto");
DO_TEST_CAPS_LATEST("console-compat-crash");
DO_TEST_CAPS_LATEST("serial-vc-chardev"); DO_TEST_CAPS_LATEST("serial-vc-chardev");
DO_TEST_CAPS_LATEST("serial-pty-chardev"); DO_TEST_CAPS_LATEST("serial-pty-chardev");
@ -2075,6 +2076,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("hostdev-pci-address"); DO_TEST_CAPS_LATEST("hostdev-pci-address");
DO_TEST_CAPS_LATEST("hostdev-pci-address-device"); DO_TEST_CAPS_LATEST("hostdev-pci-address-device");
DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-pci-duplicate"); DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-pci-duplicate");
DO_TEST_CAPS_LATEST("hostdev-pci-display-ramfb");
DO_TEST_CAPS_LATEST("hostdev-vfio"); DO_TEST_CAPS_LATEST("hostdev-vfio");
DO_TEST_CAPS_LATEST("hostdev-vfio-multidomain"); DO_TEST_CAPS_LATEST("hostdev-vfio-multidomain");
DO_TEST_CAPS_LATEST("hostdev-mdev-precreated"); DO_TEST_CAPS_LATEST("hostdev-mdev-precreated");
@ -2287,6 +2289,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("cputune-numatune"); DO_TEST_CAPS_LATEST("cputune-numatune");
DO_TEST_CAPS_LATEST("vcpu-placement-static"); DO_TEST_CAPS_LATEST("vcpu-placement-static");
DO_TEST_CAPS_LATEST("cputune-cpuset-big-id"); DO_TEST_CAPS_LATEST("cputune-cpuset-big-id");
DO_TEST_CAPS_LATEST_PARSE_ERROR("cpuset-invalid");
DO_TEST_CAPS_LATEST_PARSE_ERROR("numatune-memory-invalid-nodeset"); DO_TEST_CAPS_LATEST_PARSE_ERROR("numatune-memory-invalid-nodeset");
DO_TEST_CAPS_VER("numatune-memnode", "5.2.0"); DO_TEST_CAPS_VER("numatune-memnode", "5.2.0");
@ -2976,6 +2979,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("tap-vhost"); DO_TEST_CAPS_LATEST("tap-vhost");
DO_TEST_CAPS_LATEST("mtp-usb-device") DO_TEST_CAPS_LATEST("mtp-usb-device")
DO_TEST_CAPS_LATEST("net-usb")
/* check that all input files were actually used here */ /* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0) if (testConfXMLCheck(existingTestCases) < 0)

View File

@ -1,280 +0,0 @@
# test-lib.sh: source this file; set up for tests
# Copyright (C) 2008-2013, 2016 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see
# <http://www.gnu.org/licenses/>.
#
# Based on an idea from GNU coreutils
_scriptdir="$(unset CDPATH; cd $(dirname $0) && pwd)"
test -z "$abs_srcdir" && abs_srcdir=$_scriptdir
test -z "$abs_builddir" && abs_builddir=$_scriptdir
test -z "$abs_top_srcdir" && abs_top_srcdir=$_scriptdir/..
test -z "$abs_top_builddir" && abs_top_builddir=$_scriptdir/..
test -z "$LC_ALL" && LC_ALL=C
# Skip this test if the shell lacks support for functions.
unset function_test
eval 'function_test() { return 11; }; function_test'
if test $? != 11; then
echo "$0: /bin/sh lacks support for functions; skipping this test." 1>&2
(exit 77); exit 77
fi
test_intro()
{
name=$1
if test "$verbose" = "0" ; then
echo "TEST: $name"
printf " "
fi
}
test_skip_case()
{
counter=$1
name=$2
reason=$3
if test "$verbose" = "0" ; then
mod=`expr \( $counter + 40 - 1 \) % 40`
if test "$counter" != 1 && test "$mod" = 0 ; then
printf " %-3d\n" `expr $counter - 1`
printf " "
fi
printf "_"
else
printf "%3d) %-60s ... SKIP\n" "$counter" "$name"
printf " case skipped: %s\n" "$reason"
fi
}
test_result()
{
counter=$1
name=$2
status=$3
if test "$verbose" = "0" ; then
mod=`expr \( $counter + 40 - 1 \) % 40`
if test "$counter" != 1 && test "$mod" = 0 ; then
printf " %-3d\n" `expr $counter - 1`
printf " "
fi
if test "$status" = "0" ; then
printf "."
else
printf "!"
fi
else
if test "$status" = "0" ; then
printf "%3d) %-60s ... OK\n" "$counter" "$name"
else
printf "%3d) %-60s ... FAILED\n" "$counter" "$name"
fi
fi
}
test_final()
{
counter=$1
status=$2
if test "$verbose" = "0" ; then
len=`expr 39 - \( \( $counter - 1 \) % 40 \)`
printf "%${len}s" ""
if test "$status" = "0" ; then
printf " %-3d OK\n" $counter
else
printf " %-3d FAILED\n" $counter
fi
fi
}
skip_test_()
{
echo "$0: skipping test: $@" 1>&2
(exit 77); exit 77
}
require_acl_()
{
getfacl --version < /dev/null > /dev/null 2>&1 \
&& setfacl --version < /dev/null > /dev/null 2>&1 \
|| skip_test_ "This test requires getfacl and setfacl."
id -u bin > /dev/null 2>&1 \
|| skip_test_ "This test requires a local user named bin."
}
require_ulimit_()
{
ulimit_works=yes
# Expect to be able to exec a program in 10MB of virtual memory,
# but not in 20KB. I chose "date". It must not be a shell built-in
# function, so you can't use echo, printf, true, etc.
# Of course, in coreutils, I could use $top_builddir/src/true,
# but this should be able to work for other projects, too.
( ulimit -v 10000; date ) > /dev/null 2>&1 || ulimit_works=no
( ulimit -v 20; date ) > /dev/null 2>&1 && ulimit_works=no
test $ulimit_works = no \
&& skip_test_ "this shell lacks ulimit support"
}
require_readable_root_()
{
test -r / || skip_test_ "/ is not readable"
}
# Skip the current test if strace is not available or doesn't work.
require_strace_()
{
strace -V < /dev/null > /dev/null 2>&1 ||
skip_test_ 'no strace program'
strace -qe unlink echo > /dev/null 2>&1 ||
skip_test_ 'strace does not work'
}
require_built_()
{
skip_=no
for i in "$@"; do
case " $built_programs " in
*" $i "*) ;;
*) echo "$i: not built" 1>&2; skip_=yes ;;
esac
done
test $skip_ = yes && skip_test_ "required program(s) not built"
}
uid_is_privileged_()
{
# Make sure id -u succeeds.
my_uid=$(id -u) \
|| { echo "$0: cannot run \`id -u'" 1>&2; return 1; }
# Make sure it gives valid output.
case $my_uid in
0) ;;
*[!0-9]*)
echo "$0: invalid output (\`$my_uid') from \`id -u'" 1>&2
return 1 ;;
*) return 1 ;;
esac
}
skip_if_()
{
case $1 in
root) skip_test_ must be run as root ;;
non-root) skip_test_ must be run as non-root ;;
*) ;; # FIXME?
esac
}
require_selinux_()
{
case `ls -Zd .` in
'? .'|'unlabeled .')
skip_test_ "this system (or maybe just" \
"the current file system) lacks SELinux support"
;;
esac
}
test_expensive()
{
if test "$VIR_TEST_EXPENSIVE" != 1; then
skip_test_ '
This test is very expensive, so it is disabled by default.
To change the default, configure with: meson -Dexpensive_tests=enabled
'
fi
}
require_root_() { uid_is_privileged_ || skip_test_ "must be run as root"; }
skip_if_root_() { uid_is_privileged_ && skip_test_ "must be run as non-root"; }
error_() { echo "$0: $@" 1>&2; (exit 1); exit 1; }
framework_failure() { error_ 'failure in testing framework'; }
mkfifo_or_skip_()
{
test $# = 1 || framework_failure
if ! mkfifo "$1"; then
# Make an exception of this case -- usually we interpret framework-creation
# failure as a test failure. However, in this case, when running on a SunOS
# system using a disk NFS mounted from OpenBSD, the above fails like this:
# mkfifo: cannot make fifo `fifo-10558': Not owner
skip_test_ 'NOTICE: unable to create test prerequisites'
fi
}
# Create mock XDG files/directories to avoid permission problems.
# As it points inside $test_dir_, it is automatically cleaned.
mock_xdg_()
{
export XDG_CONFIG_HOME="$t_/.config"
export XDG_CACHE_HOME="$t_/.cache"
export XDG_RUNTIME_HOME="$XDG_CACHE_HOME"
mkdir -p "$XDG_CONFIG_HOME/libvirt" "$XDG_CONFIG_HOME/virsh"
mkdir -p "$XDG_CACHE_HOME/libvirt" "$XDG_CACHE_HOME/virsh"
mkdir -p "$XDG_RUNTIME_HOME/libvirt" "$XDG_RUNTIME_HOME/virsh"
}
test_dir_=$(pwd)
this_test_() { echo "./$0" | sed 's,.*/,,'; }
this_test=$(this_test_)
verbose=0
if test -n "$VIR_TEST_DEBUG" || test -n "$VIR_TEST_VERBOSE" ; then
verbose=1
fi
debug() { :; }
if test "$VIR_TEST_DEBUG" = "2"; then
debug() { echo "$@"; }
fi
# This is a stub function that is run upon trap (upon regular exit and
# interrupt). Override it with a per-test function, e.g., to unmount
# a partition, or to undo any other global state changes.
cleanup_() { :; }
t_=$("mktemp" "-d" "$test_dir_/lv-$this_test.XXXXXXXXXX") \
|| error_ "failed to create temporary directory in $test_dir_"
# Run each test from within a temporary sub-directory named after the
# test itself, and arrange to remove it upon exception or normal exit.
trap 'st=$?; cleanup_; d='"$t_"';
cd '"$test_dir_"' && chmod -R u+rwx "$d" && rm -rf "$d" && exit $st' 0
trap '(exit $?); exit $?' 1 2 13 15
cd "$t_" || error_ "failed to cd to $t_"
if ( diff --version < /dev/null 2>&1 | grep GNU ) > /dev/null 2>&1; then
compare() { diff -u "$@"; }
elif ( cmp --version < /dev/null 2>&1 | grep GNU ) > /dev/null 2>&1; then
compare() { cmp -s "$@"; }
else
compare() { cmp "$@"; }
fi
# Local Variables:
# indent-tabs-mode: nil
# End:

View File

@ -1,178 +0,0 @@
#!/bin/sh
# simple testing of checkpoint APIs on test driver
# Copyright (C) 2019 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
test_expensive
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
mock_xdg_ || framework_failure
# The test driver loses states between restarts, so we perform a script
# with some convenient markers for later post-processing of output.
$abs_top_builddir/tools/virsh --connect test:///default >out 2>err '
# Create a series of checkpoints, with names that intentionally sort
# differently by topology than by name. For now, it is not possible
# to create fanout without hacking through redefines.
checkpoint-create-as test c1
checkpoint-create-as test c1
checkpoint-create-as test c3
checkpoint-create-as test c2
# snapshots cannot be created while checkpoints exist
echo --err marker
snapshot-create-as test s1
echo --err marker
# Checking tree view (siblings sorted alphabetically)
checkpoint-list test --tree
# Demonstrate list filtering
checkpoint-list test --roots
checkpoint-list test --leaves
checkpoint-list test --parent --no-leaves
checkpoint-list test --from c3
checkpoint-list test --from c1 --descendants --name
# Now the tree is linear, so we have an unambiguous topological order
checkpoint-list test --name
checkpoint-list test --name --topological
# Capture some XML for later redefine
checkpoint-delete test c1
echo "<!--MarkerA-->"
checkpoint-dumpxml test c3
echo "<!--MarkerB-->"
checkpoint-dumpxml test c2
echo "<!--MarkerC-->"
# Deleting current checkpoint moves current up to remaining parent
checkpoint-delete test --children-only c3
checkpoint-list test --leaves --name
checkpoint-delete test --children c3
checkpoint-list test --leaves --name
# All done
' || fail=1
# First part is expected output, --tree results in trailing spaces,
# and checkpoint-list produces timestamps
sed 's/ *$//; s/[0-9-]\{10\} [0-9:.]* .[0-9]\{4\}/TIMESTAMP/;
/MarkerA/,/MarkerC/d' < out > out.cooked || fail=1
# Second part holds domain checkpoint XMLs
sed -n '/MarkerA/,/MarkerB/p' < out > c3.xml || fail=1
sed -n '/MarkerB/,/MarkerC/p' < out > c2.xml || fail=1
cat <<\EOF > exp || fail=1
Domain checkpoint c1 created
Domain checkpoint c3 created
Domain checkpoint c2 created
c1
|
+- c3
|
+- c2
Name Creation Time
-----------------------------------
c1 TIMESTAMP
Name Creation Time
-----------------------------------
c2 TIMESTAMP
Name Creation Time Parent
--------------------------------------------
c1 TIMESTAMP
c3 TIMESTAMP c1
Name Creation Time
-----------------------------------
c2 TIMESTAMP
c2
c3
c1
c2
c3
c1
c3
c2
Domain checkpoint c1 deleted
Domain checkpoint c3 children deleted
c3
Domain checkpoint c3 deleted
EOF
compare exp out.cooked || fail=1
cat <<EOF > exp || fail=1
error: operation failed: domain moment c1 already exists
error: marker
error: Operation not supported: cannot create snapshot while checkpoint exists
error: marker
EOF
compare exp err || fail=1
# Restore state with redefine
$abs_top_builddir/tools/virsh -c test:///default >out 2>err '
# Redefine must be in topological order; this will fail
checkpoint-create test --redefine c2.xml
echo --err marker
# This is the right order
checkpoint-create test --redefine c3.xml
checkpoint-create test --redefine c2.xml
checkpoint-list test --leaves --name
checkpoint-info test c2
' || fail=1
cat <<\EOF > exp || fail=1
Domain checkpoint c3 created from 'c3.xml'
Domain checkpoint c2 created from 'c2.xml'
c2
Name: c2
Domain: test
Parent: c3
Children: 0
Descendants: 0
EOF
compare exp out || fail=1
cat <<EOF > exp || fail=1
error: invalid argument: parent c3 for moment c2 not found
error: marker
EOF
compare exp err || fail=1
(exit $fail); exit $fail

View File

@ -1,46 +0,0 @@
#!/bin/sh
# ensure that defining with an invalid vCPU cpuset elicits a diagnostic
# Copyright (C) 2008-2009 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
# generate input
$abs_top_builddir/tools/virsh --connect test:///default dumpxml 1 > xml || fail=1
# require the presence of the string we'll transform
grep '<vcpu placement' xml > /dev/null || fail=1
sed "s/vcpu placement='static'>/vcpu cpuset='aaa'>/" xml > xml-invalid || fail=1
# Require failure and a diagnostic.
$abs_top_builddir/tools/virsh --connect test:///default define xml-invalid > out 2>&1 && fail=1
cat <<\EOF > exp || fail=1
error: Failed to define domain from xml-invalid
error: invalid argument: Failed to parse bitmap 'aaa'
EOF
compare exp out || fail=1
(exit $fail); exit $fail

View File

@ -1,18 +0,0 @@
#!/bin/sh
# Ensure that an invalid domain ID isn't interpreted as a valid one.
# Before, an ID of 2^32+2 would be treated just like an ID of 2.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
echo "error: failed to get domain '4294967298'" > exp || fail=1
$abs_top_builddir/tools/virsh --quiet \
--connect test://$abs_top_srcdir/examples/xml/test/testnode.xml \
'domname 4294967298; quit' > /dev/null 2> err || fail=1
diff -u err exp || fail=1
exit $fail

View File

@ -1,292 +0,0 @@
#!/bin/sh
# Ensure that virsh option parsing doesn't regress
# Copyright (C) 2011-2012, 2014 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
test_expensive
VIRSH=$abs_top_builddir/tools/virsh
if test "$VERBOSE" = yes; then
set -x
$VIRSH --version
fi
cat <<\EOF > exp-out || framework_failure
setvcpus: <domain> trying as domain NAME
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: found option <domain>: test
EOF
fail=0
test_url=test:///default
for args in \
'test 2' \
'--domain test 2' \
'--domain=test 2' \
'test --count 2' \
'test --count=2' \
'--domain test --count 2' \
'--domain=test --count 2' \
'--domain test --count=2' \
'--domain=test --count=2' \
'--count 2 --domain test' \
'--count 2 --domain=test' \
'--count=2 --domain test' \
'--count=2 --domain=test' \
'--count 2 test' \
'--count=2 test' \
; do
$VIRSH -k0 -d0 -c $test_url setvcpus $args >out 2>>err || fail=1
LC_ALL=C sort out | compare exp-out - || fail=1
done
# Another complex parsing example
cat <<\EOF > exp-out || framework_failure
<domainsnapshot>
<description>1&lt;2</description>
<memory file='d,e'/>
<disks>
<disk name='vda' snapshot='external'>
<source file='a&amp;b,c'/>
</disk>
<disk name='vdb'/>
</disks>
</domainsnapshot>
EOF
$VIRSH -q -c $test_url snapshot-create-as --print-xml test \
--diskspec 'vda,file=a&b,,c,snapshot=external' --description '1<2' \
--diskspec vdb --memspec file=d,,e >out 2>>err || fail=1
compare exp-out out || fail=1
cat <<\EOF > exp-out || framework_failure
<domainsnapshot>
<name>name</name>
<description>vda</description>
<disks>
<disk name='vdb'/>
</disks>
</domainsnapshot>
EOF
$VIRSH -q -c $test_url snapshot-create-as --print-xml test name vda vdb \
>out 2>>err || fail=1
compare exp-out out || fail=1
cat <<\EOF > exp-out || framework_failure
<domainsnapshot>
<name>name</name>
<description>desc</description>
<disks>
<disk name='vda'/>
<disk name='vdb'/>
</disks>
</domainsnapshot>
EOF
for args in \
'test name desc vda vdb' \
'test name desc --diskspec vda vdb' \
'test name desc --diskspec vda --diskspec vdb' \
'test name desc vda vdb' \
'test --diskspec vda name --diskspec vdb desc' \
'--description desc --name name --domain test vda vdb' \
'--description desc --diskspec vda --name name --domain test vdb' \
; do
$VIRSH -q -c $test_url snapshot-create-as --print-xml $args \
>out 2>>err || fail=1
compare exp-out out || fail=1
done
test -s err && fail=1
# Test a required argv
cat <<\EOF > exp-err || framework_failure
error: this function is not supported by the connection driver: virDomainQemuMonitorCommand
EOF
$VIRSH -q -c $test_url qemu-monitor-command test a >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
### Test a regular numeric option
# Non-numeric value
cat <<\EOF > exp-err || framework_failure
error: Numeric value 'abc' for <start> option is malformed or out of range
EOF
$VIRSH -q -c $test_url cpu-stats test --start abc >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with invalid suffix
cat <<\EOF > exp-err || framework_failure
error: Numeric value '42WB' for <start> option is malformed or out of range
EOF
$VIRSH -q -c $test_url cpu-stats test --start 42WB >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with valid suffix. Suffixes are not supported for
# regular numeric options, so this value is rejected
cat <<\EOF > exp-err || framework_failure
error: Numeric value '42MB' for <start> option is malformed or out of range
EOF
$VIRSH -q -c $test_url cpu-stats test --start 42MB >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value bigger than INT_MAX
cat <<\EOF > exp-err || framework_failure
error: Numeric value '2147483648' for <start> option is malformed or out of range
EOF
$VIRSH -q -c $test_url cpu-stats test --start 2147483648 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Negative numeric value. The value is not valid for the command
# we're testing, but it has been parsed correctly
cat <<\EOF > exp-err || framework_failure
error: Invalid value for start CPU
EOF
$VIRSH -q -c $test_url cpu-stats test --start -1 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
### Test a scaled numeric option
# Non-numeric value
cat <<\EOF > exp-err || framework_failure
error: Scaled numeric value 'abc' for <size> option is malformed or out of range
EOF
$VIRSH -q -c $test_url setmaxmem test abc >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with invalid suffix
cat <<\EOF > exp-err || framework_failure
error: Scaled numeric value '42WB' for <size> option is malformed or out of range
error: invalid argument: unknown suffix 'WB'
EOF
$VIRSH -q -c $test_url setmaxmem test 42WB >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with valid suffix
$VIRSH -q -c $test_url setmaxmem test 42MB --config >out 2>err || fail=1
test -s out && fail=1
test -s err && fail=1
# Numeric value bigger than INT_MAX. No failure here because
# scaled numeric values are unsigned long long
$VIRSH -q -c $test_url setmaxmem test 2147483648 --config >out 2>err || fail=1
test -s out && fail=1
test -s err && fail=1
# Negative numeric value
cat <<\EOF > exp-err || framework_failure
error: Scaled numeric value '-1' for <size> option is malformed or out of range
EOF
$VIRSH -q -c $test_url setmaxmem test -1 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Zero. The value is not valid for the command we're testing, but
# it has been parsed correctly
cat <<\EOF > exp-err || framework_failure
error: Unable to change MaxMemorySize
error: memory in virDomainSetMemoryFlags must not be zero
EOF
$VIRSH -q -c $test_url setmaxmem test 0 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value
$VIRSH -q -c $test_url setmaxmem test 42 --config >out 2>err || fail=1
test -s out && fail=1
test -s err && fail=1
### Test the <timeout> option (numeric option converted to ms)
# Non-numeric value
cat <<\EOF > exp-err || framework_failure
error: Numeric value 'abc' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout abc >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value that's too big to be converted to ms and still
# fit inside an int
cat <<\EOF > exp-err || framework_failure
error: Numeric value '2147484' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout 2147484 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with invalid suffix
cat <<\EOF > exp-err || framework_failure
error: Numeric value '42WB' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout 42WB >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value with valid suffix. Suffixes are not supported for
# the <timeout> option, so this value is rejected
cat <<\EOF > exp-err || framework_failure
error: Numeric value '42MB' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout 42MB >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Negative value
cat <<\EOF > exp-err || framework_failure
error: Numeric value '-1' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout -1 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Zero. This is not a valid timeout, but the value is parsed
# correctly
cat <<\EOF > exp-err || framework_failure
error: Numeric value '0' for <timeout> option is malformed or out of range
EOF
$VIRSH -q -c $test_url event --all --timeout 0 >out 2>err && fail=1
test -s out && fail=1
compare exp-err err || fail=1
# Numeric value. No events will be received and the command will
# fail after a second, but the value has been parsed correctly
cat <<\EOF > exp-out || framework_failure
event loop timed out
events received: 0
EOF
$VIRSH -q -c $test_url event --all --timeout 1 >out 2>err && fail=1
test -s err && fail=1
compare exp-out out || fail=1
(exit $fail); exit $fail

View File

@ -1,29 +0,0 @@
#!/bin/sh
. "$(dirname $0)/test-lib.sh"
test_expensive
if [ ! -x /bin/bash ]; then
echo skipping test - no bash
exit 77
fi
mock_xdg_ || framework_failure
export LIBVIRT_DEFAULT_URI='test:///default'
ln -s $abs_top_builddir/tools/virsh virsh
$abs_top_srcdir/tests/virsh-output-commands > out 2>&1
echo end >> out
if compare $abs_top_srcdir/tests/virsh-output.out out; then
exit 0
else
if [ "x$VIR_TEST_REGENERATE_OUTPUT" = "x1" ]; then
cp out $abs_top_srcdir/tests/virsh-output.out
fi
exit 1
fi

View File

@ -1,94 +0,0 @@
#!/bin/bash
attach_disk()
{
./virsh attach-disk --print-xml --domain testdom $@ --source /nonexistent/file
}
set -x
./virsh attach-disk
./virsh attach-disk --print-xml --domain testdom $@ --source ""
./virsh attach-disk --print-xml --domain testdom $@ --source "" --sourcetype file
./virsh attach-disk --print-xml --domain testdom $@ --source "" --sourcetype blah
attach_disk --target hda
attach_disk --target hda --sourcetype file
attach_disk --target hda --sourcetype block
attach_disk --target hda --sourcetype nothing
attach_disk --target hda --sourcetype file --type disk
attach_disk --target hda --sourcetype block --type disk
attach_disk --target hda --sourcetype file --type cdrom
attach_disk --target hda --sourcetype block --type cdrom
attach_disk --target hda --sourcetype file --type blah
attach_disk --target hda --sourcetype block --type blah
attach_disk --target hda --sourcetype file --type disk --driver testdriver
attach_disk --target hda --sourcetype file --type disk --subdriver qcow2
attach_disk --target hda --sourcetype file --type disk --subdriver raw
attach_disk --target hda --sourcetype file --type disk --cache none
attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --cache none
attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --serial TEST_SERIAL
attach_disk --target hda --sourcetype file --type disk --mode readonly
attach_disk --target hda --sourcetype file --type disk --mode shareable
attach_disk --target hda --sourcetype file --type disk --mode whatever
attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias
attach_disk --target hda --sourcetype file --type disk --rawio
attach_disk --target hda --sourcetype file --type disk --multifunction
attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias --iothread 3 --mode readonly --cache none --driver qemu
attach_disk --target hda --sourcetype file --type disk --address ide:1.2.3
attach_disk --target hda --sourcetype file --type disk --address ide:1.2.4
attach_disk --target hda --sourcetype file --type disk --address ide:1:2:5
attach_disk --target sda --sourcetype file --type disk --address ide:1.2.3
attach_disk --target vda --sourcetype file --type disk --address ide:1.2.3
attach_disk --target sda --sourcetype file --type disk --address usb:12.34
attach_disk --target sda --sourcetype file --type disk --address usb:12.3
attach_disk --target sda --sourcetype file --type disk --address usb:12:34
attach_disk --target vda --sourcetype file --type disk --address usb:12.34
attach_disk --target hda --sourcetype file --type disk --address usb:12.34
attach_disk --target sda --sourcetype file --type disk --address scsi:1.2.3
attach_disk --target sda --sourcetype file --type disk --address scsi:1.2.4
attach_disk --target sda --sourcetype file --type disk --address scsi:1:2:5
attach_disk --target hda --sourcetype file --type disk --address scsi:1.2.3
attach_disk --target vda --sourcetype file --type disk --address scsi:1.2.3
attach_disk --target sda --sourcetype file --type disk --address sata:1.2.3
attach_disk --target sda --sourcetype file --type disk --address sata:1.2.4
attach_disk --target sda --sourcetype file --type disk --address sata:1:2:5
attach_disk --target hda --sourcetype file --type disk --address sata:1.2.3
attach_disk --target vda --sourcetype file --type disk --address sata:1.2.3
attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.78
attach_disk --target vda --sourcetype file --type disk --address pci:12:34:56:78
attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.aa
attach_disk --target hda --sourcetype file --type disk --address pci:12.34.56.aa
attach_disk --target sda --sourcetype file --type disk --address pci:12.34.56.aa
attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.78 --multifunction
attach_disk --target vda --sourcetype file --type disk --address pci:12:34:56:78 --multifunction
attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.aa --multifunction
attach_disk --target vda --sourcetype file --type disk --address ccw:12.34.56
attach_disk --target vda --sourcetype file --type disk --address ccw:12:34:56
attach_disk --target vda --sourcetype file --type disk --address ccw:12.34.56
attach_disk --target hda --sourcetype file --type disk --address ccw:12.34.56
attach_disk --target sda --sourcetype file --type disk --address ccw:12.34.56
attach_disk --target vda --sourcetype file --type disk --address test:12.34.56
attach_disk --target vda --sourcetype file --type disk --address test:12:34:56
attach_disk --target vda --sourcetype file --type disk --address test:12.34.56
./virsh attach-disk --print-xml --domain testdom $@ --source "" --source-protocol AAA
./virsh attach-disk --print-xml --domain testdom $@ --source "" --source-protocol AAA
attach_disk --target hda --source-protocol AAA --sourcetype file
attach_disk --target hda --sourcetype network
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name :port
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name :
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port --source-host-transport trnsp
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp --source-host-socket /nonexistent/socket
attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-socket /nonexistent/socket

View File

@ -1,496 +0,0 @@
+ ./virsh attach-disk
error: command 'attach-disk' requires <domain> option
error: command 'attach-disk' requires <source> option
error: command 'attach-disk' requires <target> option
+ ./virsh attach-disk --print-xml --domain testdom --source ''
error: command 'attach-disk' requires <target> option
+ ./virsh attach-disk --print-xml --domain testdom --source '' --sourcetype file
error: command 'attach-disk' requires <target> option
+ ./virsh attach-disk --print-xml --domain testdom --source '' --sourcetype blah
error: command 'attach-disk' requires <target> option
+ attach_disk --target hda
+ ./virsh attach-disk --print-xml --domain testdom --target hda --source /nonexistent/file
<disk type='file'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --source /nonexistent/file
<disk type='file'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype block
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype block --source /nonexistent/file
<disk type='block'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype nothing
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype nothing --source /nonexistent/file
error: Unknown source type: 'nothing'
+ attach_disk --target hda --sourcetype file --type disk
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype block --type disk
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype block --type disk --source /nonexistent/file
<disk type='block' device='disk'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type cdrom
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type cdrom --source /nonexistent/file
<disk type='file' device='cdrom'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype block --type cdrom
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype block --type cdrom --source /nonexistent/file
<disk type='block' device='cdrom'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type blah
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type blah --source /nonexistent/file
<disk type='file' device='blah'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype block --type blah
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype block --type blah --source /nonexistent/file
<disk type='block' device='blah'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --driver testdriver
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --driver testdriver --source /nonexistent/file
<disk type='file' device='disk'>
<driver name='testdriver'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --subdriver qcow2
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver qcow2 --source /nonexistent/file
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --subdriver raw
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver raw --source /nonexistent/file
<disk type='file' device='disk'>
<driver type='raw'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --cache none
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --cache none --source /nonexistent/file
<disk type='file' device='disk'>
<driver cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --cache none
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver qcow2 --cache none --source /nonexistent/file
<disk type='file' device='disk'>
<driver type='qcow2' cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --serial TEST_SERIAL
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver qcow2 --serial TEST_SERIAL --source /nonexistent/file
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<serial>TEST_SERIAL</serial>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --mode readonly
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --mode readonly --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<readonly/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --mode shareable
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --mode shareable --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<shareable/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --mode whatever
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --mode whatever --source /nonexistent/file
error: No support for whatever in command 'attach-disk'
+ attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias --source /nonexistent/file
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<alias name='testalias'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --rawio
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --rawio --source /nonexistent/file
<disk type='file' device='disk' rawio='yes'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --multifunction
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --multifunction --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias --iothread 3 --mode readonly --cache none --driver qemu
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias --iothread 3 --mode readonly --cache none --driver qemu --source /nonexistent/file
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread='3' cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<readonly/>
<alias name='testalias'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address ide:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address ide:1.2.3 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address ide:1.2.4
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address ide:1.2.4 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address ide:1:2:5
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address ide:1:2:5 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address ide:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address ide:1.2.3 --source /nonexistent/file
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
+ attach_disk --target vda --sourcetype file --type disk --address ide:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address ide:1.2.3 --source /nonexistent/file
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
+ attach_disk --target sda --sourcetype file --type disk --address usb:12.34
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address usb:12.34 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='34'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address usb:12.3
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address usb:12.3 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='3'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address usb:12:34
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address usb:12:34 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='34'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address usb:12.34
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address usb:12.34 --source /nonexistent/file
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
+ attach_disk --target hda --sourcetype file --type disk --address usb:12.34
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address usb:12.34 --source /nonexistent/file
error: expecting an ide:00.00.00 address.
+ attach_disk --target sda --sourcetype file --type disk --address scsi:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address scsi:1.2.3 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address scsi:1.2.4
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address scsi:1.2.4 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address scsi:1:2:5
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address scsi:1:2:5 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address scsi:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address scsi:1.2.3 --source /nonexistent/file
error: expecting an ide:00.00.00 address.
+ attach_disk --target vda --sourcetype file --type disk --address scsi:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address scsi:1.2.3 --source /nonexistent/file
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
+ attach_disk --target sda --sourcetype file --type disk --address sata:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address sata:1.2.3 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address sata:1.2.4
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address sata:1.2.4 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
+ attach_disk --target sda --sourcetype file --type disk --address sata:1:2:5
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address sata:1:2:5 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address sata:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address sata:1.2.3 --source /nonexistent/file
error: expecting an ide:00.00.00 address.
+ attach_disk --target vda --sourcetype file --type disk --address sata:1.2.3
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address sata:1.2.3 --source /nonexistent/file
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
+ attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.78
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12.34.56.78 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address pci:12:34:56:78
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12:34:56:78 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.aa
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12.34.56.aa --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0xaa'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address pci:12.34.56.aa
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address pci:12.34.56.aa --source /nonexistent/file
error: expecting an ide:00.00.00 address.
+ attach_disk --target sda --sourcetype file --type disk --address pci:12.34.56.aa
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address pci:12.34.56.aa --source /nonexistent/file
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
+ attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.78 --multifunction
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12.34.56.78 --multifunction --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78' multifunction='on'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address pci:12:34:56:78 --multifunction
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12:34:56:78 --multifunction --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78' multifunction='on'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address pci:12.34.56.aa --multifunction
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address pci:12.34.56.aa --multifunction --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0xaa' multifunction='on'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address ccw:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address ccw:12.34.56 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address ccw:12:34:56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address ccw:12:34:56 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
+ attach_disk --target vda --sourcetype file --type disk --address ccw:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address ccw:12.34.56 --source /nonexistent/file
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
+ attach_disk --target hda --sourcetype file --type disk --address ccw:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype file --type disk --address ccw:12.34.56 --source /nonexistent/file
error: expecting an ide:00.00.00 address.
+ attach_disk --target sda --sourcetype file --type disk --address ccw:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target sda --sourcetype file --type disk --address ccw:12.34.56 --source /nonexistent/file
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
+ attach_disk --target vda --sourcetype file --type disk --address test:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address test:12.34.56 --source /nonexistent/file
error: Invalid address.
+ attach_disk --target vda --sourcetype file --type disk --address test:12:34:56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address test:12:34:56 --source /nonexistent/file
error: Invalid address.
+ attach_disk --target vda --sourcetype file --type disk --address test:12.34.56
+ ./virsh attach-disk --print-xml --domain testdom --target vda --sourcetype file --type disk --address test:12.34.56 --source /nonexistent/file
error: Invalid address.
+ ./virsh attach-disk --print-xml --domain testdom --source '' --source-protocol AAA
error: command 'attach-disk' requires <target> option
+ ./virsh attach-disk --print-xml --domain testdom --source '' --source-protocol AAA
error: command 'attach-disk' requires <target> option
+ attach_disk --target hda --source-protocol AAA --sourcetype file
+ ./virsh attach-disk --print-xml --domain testdom --target hda --source-protocol AAA --sourcetype file --source /nonexistent/file
error: --source-protocol option requires --sourcetype network
+ attach_disk --target hda --sourcetype network
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source /nonexistent/file
error: --source-protocol option requires --sourcetype network
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name hostname --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname' port='port'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name hostname: --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname' port=''/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name :port
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name :port --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='' port='port'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name :
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name : --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='' port=''/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port --source-host-transport trnsp
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port --source-host-transport trnsp --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp' name='hostname' port='port'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp --source-host-socket /nonexistent/socket
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp --source-host-socket /nonexistent/socket --source /nonexistent/file
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp' socket='/nonexistent/socket'/>
</source>
<target dev='hda'/>
</disk>
+ attach_disk --target hda --sourcetype network --source-protocol TEST --source-host-socket /nonexistent/socket
+ ./virsh attach-disk --print-xml --domain testdom --target hda --sourcetype network --source-protocol TEST --source-host-socket /nonexistent/socket --source /nonexistent/file
error: Option --source-host-transport is required by option --source-host-socket
end

View File

@ -1,49 +0,0 @@
#!/bin/sh
# ensure that reading a file larger than BUFSIZ works
# Copyright (C) 2008, 2010 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
# Output a valid definition, to be used as input.
$abs_top_builddir/tools/virsh -c test:///default dumpxml 1 > xml.t || fail=1
# Change the VM name and UUID
sed -e "s|<name>test</name>|<name>newtest</name>|g" \
-e "\|<uuid>.*</uuid>|d" \
xml.t > xml
for i in before after; do
# The largest BUFSIZ I've seen is 128K. This is slightly larger.
printf %132000s ' ' > sp || fail=1
in=in-$i
# Append or prepend enough spaces to push the size over the limit:
( test $i = before && cat sp xml || cat xml sp ) > $in || fail=1
$abs_top_builddir/tools/virsh --connect test:///default define $in > out || fail=1
printf "Domain 'newtest' defined from $in\n\n" > exp || fail=1
compare exp out || fail=1
done
(exit $fail); exit $fail

View File

@ -1,51 +0,0 @@
#!/bin/sh
# ensure that certain file-reading commands can handle non-seekable files
# Copyright (C) 2008 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
cat <<\EOF > dom
<domain type='test' id='2'>
<name>t2</name>
<uuid>004b96e1-2d78-c30f-5aa5-000000000000</uuid>
<memory>8388608</memory>
<vcpu>2</vcpu>
<os>
<type>xen</type>
</os>
<on_reboot>restart</on_reboot>
<on_poweroff>destroy</on_poweroff>
<on_crash>restart</on_crash>
</domain>
EOF
$abs_top_builddir/tools/virsh -c test:///default define dom > /dev/null || fail=1
mkfifo_or_skip_ fifo
cat dom > fifo &
$abs_top_builddir/tools/virsh -c test:///default define fifo > /dev/null || fail=1
(exit $fail); exit $fail

View File

@ -1,40 +0,0 @@
#!/bin/sh
# Ensure that virsh schedinfo --set invalid=val fails
# Copyright (C) 2010-2011, 2013 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
VIRSH=$abs_top_builddir/tools/virsh
if test "$VERBOSE" = yes; then
set -x
$VIRSH --version
fi
printf 'Scheduler : fair\n\n' > exp-out || framework_failure
printf 'error: invalid scheduler option: j\n' > exp-err || framework_failure
fail=0
test_url=test:///default
$VIRSH -c $test_url schedinfo 1 --set j=k >out 2>err && fail=1
compare exp-out out || fail=1
compare exp-err err || fail=1
(exit $fail); exit $fail

View File

@ -1,48 +0,0 @@
#!/bin/sh
# run virsh self-test to make sure command option structures are valid
# Copyright (C) 2016 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
fail=0
basename=$(basename $0)
if test "x$basename" = "xvirsh-self-test" ; then
binary=virsh
extra_args="-c test:///default"
elif test "x$basename" = "xvirt-admin-self-test" ; then
binary=virt-admin
extra_args=""
else
echo "Unknown binary: $basename";
exit 1
fi
test_intro "$0"
$abs_top_builddir/tools/${binary} ${extra_args} self-test > /dev/null
status=$?
test_result 1 "$0" ${status}
if test "${status}" != "0" ; then
fail=1
fi
test_final $counter $fail
(exit $fail); exit $fail

View File

@ -1,233 +0,0 @@
#!/bin/sh
# simple testing of snapshot APIs on test driver
# Copyright (C) 2019 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
test_expensive
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
mock_xdg_ || framework_failure
# The test driver loses states between restarts, so we perform a script
# with some convenient markers for later post-processing of output.
$abs_top_builddir/tools/virsh --connect test:///default >out 2>err '
# Create a series of snapshots, with names that intentionally sort
# differently by topology than by name. Use revert to create fanout.
snapshot-create-as test s1
snapshot-create-as test s1
snapshot-create-as test s3
snapshot-create-as test s2
snapshot-revert test s3
snapshot-create-as test s6
snapshot-create-as test s5
snapshot-revert test s6
snapshot-create-as test s4
snapshot-revert test s1
snapshot-create-as test s7
snapshot-create-as test s8
# checkpoints cannot be created while snapshots exist
echo --err marker
checkpoint-create-as test c1
echo --err marker
# Checking tree view (siblings sorted alphabetically)
snapshot-list test --tree
# Current was last one created, but we can change that
snapshot-current test --name
snapshot-current test s1
snapshot-current test --name
# Deleting current root leads to multiple roots, demonstrate list filtering
snapshot-delete test --current
echo --err marker
snapshot-current test --name
echo --err marker
snapshot-list test --roots
snapshot-list test --leaves
snapshot-list test --parent --no-leaves
snapshot-list test --from s3
snapshot-list test --from s3 --descendants --name
# More fun with delete flags, current node moves up to remaining parent
snapshot-current test s4
snapshot-delete test --children-only s6
snapshot-current test --name
snapshot-delete test --children s7
snapshot-current test --name
snapshot-delete test s6
snapshot-current test --name
# Now the tree is linear, so we have an unambiguous topological order
snapshot-list test --name
snapshot-list test --name --topological
# Capture some XML for later redefine
echo "<!--MarkerA-->"
snapshot-dumpxml test s3
echo "<!--MarkerB-->"
snapshot-dumpxml test s2
echo "<!--MarkerC-->"
# All done
' || fail=1
# First part is expected output, --tree results in trailing spaces,
# and snapshot-list produces timestamps
sed 's/ *$//; s/[0-9-]\{10\} [0-9:.]* .[0-9]\{4\}/TIMESTAMP/;
/MarkerA/,/MarkerC/d' < out > out.cooked || fail=1
# Second part holds domain snapshot XMLs
sed -n '/MarkerA/,/MarkerB/p' < out > s3.xml || fail=1
sed -n '/MarkerB/,/MarkerC/p' < out > s2.xml || fail=1
cat <<\EOF > exp || fail=1
Domain snapshot s1 created
Domain snapshot s3 created
Domain snapshot s2 created
Domain snapshot s3 reverted
Domain snapshot s6 created
Domain snapshot s5 created
Domain snapshot s6 reverted
Domain snapshot s4 created
Domain snapshot s1 reverted
Domain snapshot s7 created
Domain snapshot s8 created
s1
|
+- s3
| |
| +- s2
| +- s6
| |
| +- s4
| +- s5
|
+- s7
|
+- s8
s8
Snapshot s1 set as current
s1
Domain snapshot s1 deleted
Name Creation Time State
---------------------------------------------
s3 TIMESTAMP running
s7 TIMESTAMP running
Name Creation Time State
---------------------------------------------
s2 TIMESTAMP running
s4 TIMESTAMP running
s5 TIMESTAMP running
s8 TIMESTAMP running
Name Creation Time State Parent
------------------------------------------------------
s3 TIMESTAMP running
s6 TIMESTAMP running s3
s7 TIMESTAMP running
Name Creation Time State
---------------------------------------------
s2 TIMESTAMP running
s6 TIMESTAMP running
s2
s4
s5
s6
Snapshot s4 set as current
Domain snapshot s6 children deleted
s6
Domain snapshot s7 deleted
s6
Domain snapshot s6 deleted
s3
s2
s3
s3
s2
EOF
compare exp out.cooked || fail=1
cat <<EOF > exp || fail=1
error: operation failed: domain moment s1 already exists
error: marker
error: Operation not supported: cannot create checkpoint while snapshot exists
error: marker
error: marker
error: domain 'test' has no current snapshot
error: marker
EOF
compare exp err || fail=1
# Restore state with redefine
$abs_top_builddir/tools/virsh -c test:///default >out 2>err '
# Redefine must be in topological order; this will fail
snapshot-create test --redefine s2.xml --validate
echo --err marker
# This is the right order
snapshot-create test --redefine s3.xml --validate
snapshot-create test --redefine s2.xml --current --validate
snapshot-info test --current
' || fail=1
cat <<\EOF > exp || fail=1
Domain snapshot s3 created from 's3.xml'
Domain snapshot s2 created from 's2.xml'
Name: s2
Domain: test
Current: yes
State: running
Location: internal
Parent: s3
Children: 0
Descendants: 0
Metadata: yes
EOF
compare exp out || fail=1
cat <<EOF > exp || fail=1
error: invalid argument: parent s3 for moment s2 not found
error: marker
EOF
compare exp err || fail=1
(exit $fail); exit $fail

View File

@ -1,41 +0,0 @@
#!/bin/sh
# ensure that virsh start works properly
# Copyright (C) 2008 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
test_url=test:///default
# expect this to fail
$abs_top_builddir/tools/virsh -c $test_url start test > out 2> err && fail=1
# stdout gets a newline
echo > exp || fail=1
compare exp out || fail=1
echo 'error: Domain is already active' > exp || fail=1
compare exp err || fail=1
(exit $fail); exit $fail

View File

@ -1,76 +0,0 @@
#!/bin/sh
# exercise virsh's "undefine" command
# Copyright (C) 2008-2009, 2011 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
# Attempt to undefine a running domain, by domain name. Every time a new
# connection is opened to the test driver, it starts life with a new
# persistent running domain named 'test' with a different uuid, so
# testing this command requires batch mode use of virsh.
$abs_top_builddir/tools/virsh -c test:///default \
'dominfo test; undefine test; dominfo test' > out1 2>&1
test $? = 0 || fail=1
sed '/^Persistent/n; /:/d' < out1 > out
cat <<\EOF > exp || fail=1
Persistent: yes
Domain 'test' has been undefined
Persistent: no
EOF
compare exp out || fail=1
# A similar diagnostic when specifying a domain ID
$abs_top_builddir/tools/virsh -c test:///default \
'dominfo 1; undefine 1; dominfo 1' > out1 2>&1
test $? = 0 || fail=1
sed '/^Persistent/n; /:/d' < out1 > out
cat <<\EOF > exp || fail=1
Persistent: yes
Domain '1' has been undefined
Persistent: no
EOF
compare exp out || fail=1
# Succeed, now: first shut down, then undefine, both via name.
$abs_top_builddir/tools/virsh -c test:///default \
'shutdown test; undefine test; dominfo test' > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > expout || fail=1
Domain 'test' is being shutdown
Domain 'test' has been undefined
error: failed to get domain 'test'
EOF
compare expout out || fail=1
(exit $fail); exit $fail

View File

@ -1,97 +0,0 @@
#!/bin/sh
. "$(dirname $0)/test-lib.sh"
# This test checks if virsh obeys the proper precedence of different
# URI settings
test_intro "virsh-uriprecedence"
virsh_bin="$abs_top_builddir/tools/virsh"
virsh_cmd="$virsh_bin"
counter=0
ret=0
mock_xdg_ || framework_failure
is_uri_good()
{
echo "$1" | grep -F "$good_uri" >/dev/null
}
test_uri_internal()
{
test_name=$1
test_cmd="$virsh_cmd \"$2\""
result=0
debug "Running '$test_cmd'"
out="$($virsh_cmd "$2")"
if ! is_uri_good "$out"; then
debug "Invalid output: '$out'"
result=1
ret=1
fi
counter="$((counter+1))"
test_result "$counter" "$1" "$result"
}
test_uri_connect()
{
test_uri_internal "$1" "connect; uri"
}
test_uri_noconnect()
{
test_uri_internal "$1" "uri"
}
test_uri()
{
test_uri_connect "$1"
test_uri_noconnect "$1"
}
# Precedence is the following (lowest priority first):
#
# 1) if run as root, 'uri_default' from /etc/libvirtd/libvirt.conf,
# otherwise qemu:///session. There is no way to mock this file for
# virsh/libvirt.so and the user may have set anything in there that
# would spoil the test, so we don't test this
#
# 2) 'uri_default' from $XDG_CONFIG_HOME/libvirt/libvirt.conf
#
# 3) LIBVIRT_DEFAULT_URI
#
# 4) VIRSH_DEFAULT_CONNECT_URI
#
# 5) parameter -c (--connect)
unset LIBVIRT_DEFAULT_URI
unset VIRSH_DEFAULT_CONNECT_URI
bad_uri="test:///default?bad_uri"
good_uri="test:///default?good_uri"
printf "uri_default=\"%s\"\n" "$good_uri" >"$XDG_CONFIG_HOME/libvirt/libvirt.conf"
if uid_is_privileged_; then
counter="$((counter+1))"
test_skip_case "$counter" "User config file" "must not be run as root"
else
test_uri "User config file"
fi
printf "uri_default=\"%s\"\n" "$bad_uri" >"$XDG_CONFIG_HOME/libvirt/libvirt.conf"
export LIBVIRT_DEFAULT_URI="$good_uri"
test_uri "LIBVIRT_DEFAULT_URI"
export LIBVIRT_DEFAULT_URI="$bad_uri"
export VIRSH_DEFAULT_CONNECT_URI="$good_uri"
test_uri "VIRSH_DEFAULT_CONNECT_URI"
export VIRSH_DEFAULT_CONNECT_URI="$bad_uri"
virsh_cmd="$virsh_bin --connect $good_uri"
test_uri "Parameter"
test_final "$counter" "$ret"
(exit "$ret"); exit "$ret"

View File

@ -1,100 +0,0 @@
#!/bin/sh
# ensure that an invalid CPU spec elicits a diagnostic
# Copyright (C) 2008 Red Hat, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
# <http://www.gnu.org/licenses/>.
. "$(dirname $0)/test-lib.sh"
if test "$VERBOSE" = yes; then
set -x
$abs_top_builddir/tools/virsh --version
fi
fail=0
# Invalid syntax.
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test a 0,1 > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: Numeric value 'a' for <vcpu> option is malformed or out of range
EOF
compare exp out || fail=1
# An out-of-range vCPU number deserves a diagnostic, too.
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 0,1 > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: invalid argument: requested vcpu '100' is not present in the domain
EOF
compare exp out || fail=1
# Negative number
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test -100 0,1 > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: Numeric value '-100' for <vcpu> option is malformed or out of range
EOF
compare exp out || fail=1
# missing argument
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test --cpulist 0,1 > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: vcpupin: Missing vCPU number in pin mode.
EOF
compare exp out || fail=1
# An out-of-range vCPU number when get information with live flag
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --live > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: vcpu 100 is out of range of live cpu count 2
EOF
compare exp out || fail=1
# An out-of-range vCPU number when get information without flag
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: vcpu 100 is out of range of live cpu count 2
EOF
compare exp out || fail=1
# An out-of-range vCPU number when get information with config flag
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --config > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: vcpu 100 is out of range of persistent cpu count 2
EOF
compare exp out || fail=1
# An out-of-range vCPU number when get information with current flag
$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --current > out 2>&1
test $? = 1 || fail=1
cat <<\EOF > exp || fail=1
error: vcpu 100 is out of range of live cpu count 2
EOF
compare exp out || fail=1
(exit $fail); exit $fail

View File

@ -1,11 +1,14 @@
#include <config.h> #include <config.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include "internal.h" #include "internal.h"
#include "testutils.h" #include "testutils.h"
#include "vircommand.h" #include "vircommand.h"
#include "util/virthread.h"
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
#ifdef WIN32 #ifdef WIN32
@ -18,125 +21,60 @@ main(void)
#else #else
# define DOM_FC4_UUID "ef861801-45b9-11cb-88e3-afbfe5370493" static void testFilterLine(char *buffer,
# define DOM_FC5_UUID "08721f99-3d1d-4aec-96eb-97803297bb36"
# define SECURITY_LABEL "libvirt-test (enforcing)"
# define FC4_MESSAGES "tainted: network configuration using opaque shell scripts"
# define FC5_MESSAGES "tainted: running with undesirable elevated privileges\n\
tainted: network configuration using opaque shell scripts\n\
tainted: use of host cdrom passthrough\n\
tainted: custom device tree blob used\n\
tainted: use of deprecated configuration settings\n\
deprecated configuration: CPU model Deprecated-Test"
# define GET_BLKIO_PARAMETER "/dev/hda,700"
# define SET_BLKIO_PARAMETER "/dev/hda,1000"
# define EQUAL "="
static const char *dominfo_fc4 = "\
Id: 2\n\
Name: fc4\n\
UUID: " DOM_FC4_UUID "\n\
OS Type: linux\n\
State: running\n\
CPU(s): 1\n\
Max memory: 261072 KiB\n\
Used memory: 131072 KiB\n\
Persistent: yes\n\
Autostart: disable\n\
Managed save: no\n\
Security model: testSecurity\n\
Security DOI: \n\
Security label: " SECURITY_LABEL "\n\
Messages: " FC4_MESSAGES "\n\
\n";
static const char *domuuid_fc4 = DOM_FC4_UUID "\n\n";
static const char *domid_fc4 = "2\n\n";
static const char *domname_fc4 = "fc4\n\n";
static const char *domstate_fc4 = "running\n\n";
static const char *dominfo_fc5 = "\
Id: 3\n\
Name: fc5\n\
UUID: " DOM_FC5_UUID "\n\
OS Type: linux\n\
State: running\n\
CPU(s): 4\n\
Max memory: 2097152 KiB\n\
Used memory: 2097152 KiB\n\
Persistent: yes\n\
Autostart: disable\n\
Managed save: no\n\
Security model: testSecurity\n\
Security DOI: \n\
Security label: " SECURITY_LABEL "\n\
Messages: " FC5_MESSAGES "\n\
\n";
static const char *get_blkio_parameters = "\
weight : 800\n\
device_weight : " GET_BLKIO_PARAMETER "\n\
device_read_iops_sec: " GET_BLKIO_PARAMETER "\n\
device_write_iops_sec: " GET_BLKIO_PARAMETER "\n\
device_read_bytes_sec: " GET_BLKIO_PARAMETER "\n\
device_write_bytes_sec: " GET_BLKIO_PARAMETER "\n\
\n";
static const char *set_blkio_parameters = "\
\n\
weight : 500\n\
device_weight : " SET_BLKIO_PARAMETER "\n\
device_read_iops_sec: " SET_BLKIO_PARAMETER "\n\
device_write_iops_sec: " SET_BLKIO_PARAMETER "\n\
device_read_bytes_sec: " SET_BLKIO_PARAMETER "\n\
device_write_bytes_sec: " SET_BLKIO_PARAMETER "\n\
\n";
static int testFilterLine(char *buffer,
const char *toRemove) const char *toRemove)
{ {
char *start; char *start;
char *end;
if (!(start = strstr(buffer, toRemove))) while ((start = strstr(buffer, toRemove))) {
return -1; char *end;
if (!(end = strstr(start+1, "\n"))) { if (!(end = strstr(start+1, "\n"))) {
*start = '\0'; *start = '\0';
} else { } else {
memmove(start, end, strlen(end)+1); memmove(start, end, strlen(end)+1);
} }
return 0; }
} }
static int static int
testCompareOutputLit(const char *expectData, testCompareOutputLit(const char *expectFile,
const char *filter, const char *const argv[]) const char *filter,
const char *const *env,
const char *const argv[])
{ {
g_autofree char *actualData = NULL; g_autofree char *actual = NULL;
const char *empty = ""; const char *empty = "";
g_autoptr(virCommand) cmd = NULL; g_autoptr(virCommand) cmd = NULL;
g_autofree char *errbuf = NULL; int exitstatus = 0;
cmd = virCommandNewArgs(argv); cmd = virCommandNewArgs(argv);
virCommandAddEnvString(cmd, "LANG=C"); virCommandAddEnvString(cmd, "LANG=C");
while (env && *env) {
virCommandAddEnvString(cmd, *env);
env++;
}
virCommandSetInputBuffer(cmd, empty); virCommandSetInputBuffer(cmd, empty);
virCommandSetOutputBuffer(cmd, &actualData); virCommandSetOutputBuffer(cmd, &actual);
virCommandSetErrorBuffer(cmd, &errbuf); virCommandSetErrorBuffer(cmd, &actual);
if (virCommandRun(cmd, NULL) < 0) if (virCommandRun(cmd, &exitstatus) < 0)
return -1; return -1;
if (STRNEQ(errbuf, "")) { if (exitstatus != 0) {
fprintf(stderr, "Command reported error: %s", errbuf); g_autofree char *tmp = g_steal_pointer(&actual);
return -1;
actual = g_strdup_printf("%s\n## Exit code: %d\n", tmp, exitstatus);
} }
if (filter && testFilterLine(actualData, filter) < 0) if (filter)
return -1; testFilterLine(actual, filter);
if (virTestCompareToString(expectData, actualData) < 0) { if (virTestCompareToFileFull(actual, expectFile, false) < 0)
return -1; return -1;
}
return 0; return 0;
} }
@ -151,292 +89,116 @@ static char *custom_uri;
"--connect", \ "--connect", \
custom_uri custom_uri
static int testCompareListDefault(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_DEFAULT, "list", NULL };
const char *exp = "\
Id Name State\n\
----------------------\n\
1 test running\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareListCustom(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "list", NULL };
const char *exp = "\
Id Name State\n\
----------------------\n\
1 fv0 running\n\
2 fc4 running\n\
3 fc5 running\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareNodeinfoDefault(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_DEFAULT, "nodeinfo", NULL };
const char *exp = "\
CPU model: i686\n\
CPU(s): 16\n\
CPU frequency: 1400 MHz\n\
CPU socket(s): 2\n\
Core(s) per socket: 2\n\
Thread(s) per core: 2\n\
NUMA cell(s): 2\n\
Memory size: 3145728 KiB\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareNodeinfoCustom(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = {
VIRSH_CUSTOM,
"nodeinfo",
NULL
};
const char *exp = "\
CPU model: i986\n\
CPU(s): 50\n\
CPU frequency: 6000 MHz\n\
CPU socket(s): 4\n\
Core(s) per socket: 4\n\
Thread(s) per core: 2\n\
NUMA cell(s): 4\n\
Memory size: 8192000 KiB\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDominfoByID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "2", NULL };
const char *exp = dominfo_fc4;
return testCompareOutputLit(exp, "\nCPU time:", argv);
}
static int testCompareDominfoByUUID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", DOM_FC4_UUID, NULL };
const char *exp = dominfo_fc4;
return testCompareOutputLit(exp, "\nCPU time:", argv);
}
static int testCompareDominfoByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "fc4", NULL };
const char *exp = dominfo_fc4;
return testCompareOutputLit(exp, "\nCPU time:", argv);
}
static int testCompareTaintedDominfoByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "fc5", NULL };
const char *exp = dominfo_fc5;
return testCompareOutputLit(exp, "\nCPU time:", argv);
}
static int testCompareDomuuidByID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "2", NULL };
const char *exp = domuuid_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomuuidByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "fc4", NULL };
const char *exp = domuuid_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomidByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domid", "fc4", NULL };
const char *exp = domid_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomidByUUID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domid", DOM_FC4_UUID, NULL };
const char *exp = domid_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomnameByID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domname", "2", NULL };
const char *exp = domname_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomnameByUUID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domname", DOM_FC4_UUID, NULL };
const char *exp = domname_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomstateByID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domstate", "2", NULL };
const char *exp = domstate_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomstateByUUID(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domstate", DOM_FC4_UUID, NULL };
const char *exp = domstate_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomstateByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domstate", "fc4", NULL };
const char *exp = domstate_fc4;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareDomControlInfoByName(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domcontrol", "fc4", NULL };
const char *exp = "ok\n\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareGetBlkioParameters(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "blkiotune", "fv0", NULL };
const char *exp = get_blkio_parameters;
return testCompareOutputLit(exp, NULL, argv);
}
static int testCompareSetBlkioParameters(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "blkiotune fv0\
--weight 500\
--device-weights\
" SET_BLKIO_PARAMETER "\
--device-read-iops-sec\
" SET_BLKIO_PARAMETER "\
--device-write-iops-sec\
" SET_BLKIO_PARAMETER "\
--device-read-bytes-sec\
" SET_BLKIO_PARAMETER "\
--device-write-bytes-sec\
" SET_BLKIO_PARAMETER ";\
blkiotune fv0", NULL };
const char *exp = set_blkio_parameters;
return testCompareOutputLit(exp, NULL, argv);
}
static int testIOThreadAdd(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "iothreadinfo --domain fc4;\
iothreadadd --domain fc4 --id 6;\
iothreadinfo --domain fc4", NULL};
const char *exp = "\
IOThread ID CPU Affinity\n\
-----------------------------\n\
2 0\n\
4 0\n\
\n\
\n\
IOThread ID CPU Affinity\n\
-----------------------------\n\
2 0\n\
4 0\n\
6 0\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testIOThreadDel(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "iothreadinfo --domain fc4;\
iothreaddel --domain fc4 --id 2;\
iothreadinfo --domain fc4", NULL};
const char *exp = "\
IOThread ID CPU Affinity\n\
-----------------------------\n\
2 0\n\
4 0\n\
\n\
\n\
IOThread ID CPU Affinity\n\
-----------------------------\n\
4 0\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testIOThreadSet(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM, "domstats --domain fc4;\
iothreadset --domain fc4\
--id 2 --poll-max-ns 100\
--poll-shrink 10 --poll-grow 10;\
domstats --domain fc4", NULL};
const char *exp = "\
Domain: 'fc4'\n\
state.state" EQUAL "1\n\
state.reason" EQUAL "0\n\
iothread.count" EQUAL "2\n\
iothread.2.poll-max-ns" EQUAL "32768\n\
iothread.2.poll-grow" EQUAL "0\n\
iothread.2.poll-shrink" EQUAL "0\n\
iothread.4.poll-max-ns" EQUAL "32768\n\
iothread.4.poll-grow" EQUAL "0\n\
iothread.4.poll-shrink" EQUAL "0\n\n\
\n\
Domain: 'fc4'\n\
state.state" EQUAL "1\n\
state.reason" EQUAL "0\n\
iothread.count" EQUAL "2\n\
iothread.2.poll-max-ns" EQUAL "100\n\
iothread.2.poll-grow" EQUAL "10\n\
iothread.2.poll-shrink" EQUAL "10\n\
iothread.4.poll-max-ns" EQUAL "32768\n\
iothread.4.poll-grow" EQUAL "0\n\
iothread.4.poll-shrink" EQUAL "0\n\n";
return testCompareOutputLit(exp, NULL, argv);
}
static int testIOThreadPin(const void *data G_GNUC_UNUSED)
{
const char *const argv[] = { VIRSH_CUSTOM,
"iothreadadd --domain fc5 --id 2;\
iothreadinfo --domain fc5;\
iothreadpin --domain fc5 --iothread 2\
--cpulist 0;\
iothreadinfo --domain fc5", NULL};
const char *exp = "\n\
IOThread ID CPU Affinity\n\
-----------------------------\n\
2 0-3\n\
\n\
\n\
IOThread ID CPU Affinity\n\
-----------------------------\n\
2 0\n\
\n";
return testCompareOutputLit(exp, NULL, argv);
}
struct testInfo { struct testInfo {
const char *testname; /* used to generate output filename */
const char *filter;
const char *const *argv; const char *const *argv;
const char *result; bool expensive;
const char *const *env; /* extra environment variables to pass */
bool forbid_root;
}; };
static int testCompareEcho(const void *data) static int testCompare(const void *data)
{ {
const struct testInfo *info = data; const struct testInfo *info = data;
return testCompareOutputLit(info->result, NULL, info->argv); g_autofree char *outfile = NULL;
if (info->expensive && virTestGetExpensive() == 0)
return EXIT_AM_SKIP;
if (info->forbid_root && geteuid() == 0)
return EXIT_AM_SKIP;
if (info->testname) {
outfile = g_strdup_printf("%s/virshtestdata/%s.out",
abs_srcdir, info->testname);
}
return testCompareOutputLit(outfile, info->filter, info->env, info->argv);
}
static void
testPipeFeeder(void *opaque)
{
/* feed more than observed buffer size which was historically 128k in the
* test this was adapted from */
size_t emptyspace = 140 * 1024;
const char *pipepath = opaque;
const char *xml =
"<domain type='test' id='2'>\n"
" <name>t2</name>\n"
" <uuid>004b96e1-2d78-c30f-5aa5-000000000000</uuid>\n"
" <memory>8388608</memory>\n"
" <vcpu>2</vcpu>\n"
" <os>\n"
" <type>xen</type>\n"
" </os>\n"
"</domain>\n";
size_t xmlsize = strlen(xml);
g_autofree char *doc = g_new0(char, emptyspace + xmlsize + 1);
VIR_AUTOCLOSE fd = -1;
if ((fd = open(pipepath, O_RDWR)) < 0) {
fprintf(stderr, "\nfailed to open pipe '%s': %s\n", pipepath, g_strerror(errno));
return;
}
memset(doc, ' ', emptyspace);
virStrcpy(doc + emptyspace, xml, xmlsize);
if (safewrite(fd, doc, emptyspace + xmlsize + 1) < 0) {
fprintf(stderr, "\nfailed to write to pipe '%s': %s\n", pipepath, g_strerror(errno));
return;
}
}
static int
testVirshPipe(const void *data G_GNUC_UNUSED)
{
char tmpdir[] = "/tmp/libvirt_virshtest_XXXXXXX";
g_autofree char *pipepath = NULL;
virThread feeder;
bool join = false;
g_autofree char *cmdstr = NULL;
const char *argv[] = { VIRSH_DEFAULT, NULL, NULL };
int ret = -1;
if (!g_mkdtemp(tmpdir)) {
fprintf(stderr, "\nfailed to create temporary directory\n");
return -1;
}
pipepath = g_strdup_printf("%s/pipe", tmpdir);
cmdstr = g_strdup_printf("define %s ; list --all", pipepath);
argv[3] = cmdstr;
if (mkfifo(pipepath, 0600) < 0) {
fprintf(stderr, "\nfailed to create pipe '%s': %s\n", pipepath, g_strerror(errno));
goto cleanup;
}
if (virThreadCreate(&feeder, true, testPipeFeeder, pipepath) < 0)
goto cleanup;
join = true;
if (testCompareOutputLit(abs_srcdir "/virshtestdata/read-big-pipe.out",
"/tmp/libvirt_virshtest", NULL, argv) < 0)
goto cleanup;
ret = 0;
cleanup:
if (join)
virThreadJoin(&feeder);
unlink(pipepath);
rmdir(tmpdir);
return ret;
} }
@ -448,218 +210,236 @@ mymain(void)
custom_uri = g_strdup_printf("test://%s/../examples/xml/test/testnode.xml", custom_uri = g_strdup_printf("test://%s/../examples/xml/test/testnode.xml",
abs_srcdir); abs_srcdir);
if (virTestRun("virsh list (default)", # define DO_TEST_SCRIPT_FULL(testname_, expensive, testfilter, ...) \
testCompareListDefault, NULL) != 0) { \
ret = -1; const char *testname = testname_; \
g_autofree char *infile = g_strdup_printf("%s/virshtestdata/%s.in", \
if (virTestRun("virsh list (custom)", abs_srcdir, testname); \
testCompareListCustom, NULL) != 0) const char *myargv[] = { __VA_ARGS__, NULL, NULL }; \
ret = -1; const char **tmp = myargv; \
const struct testInfo info = { testname, testfilter, myargv, expensive, NULL, false}; \
if (virTestRun("virsh nodeinfo (default)", g_autofree char *scriptarg = NULL; \
testCompareNodeinfoDefault, NULL) != 0) if (virFileReadAll(infile, 256 * 1024, &scriptarg) < 0) { \
ret = -1; fprintf(stderr, "\nfailed to load '%s'\n", infile); \
if (virTestRun("virsh nodeinfo (custom)",
testCompareNodeinfoCustom, NULL) != 0)
ret = -1;
if (virTestRun("virsh dominfo (by id)",
testCompareDominfoByID, NULL) != 0)
ret = -1;
if (virTestRun("virsh dominfo (by uuid)",
testCompareDominfoByUUID, NULL) != 0)
ret = -1;
if (virTestRun("virsh dominfo (by name)",
testCompareDominfoByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh dominfo (by name, more tainted messages)",
testCompareTaintedDominfoByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh domid (by name)",
testCompareDomidByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh domid (by uuid)",
testCompareDomidByUUID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domuuid (by id)",
testCompareDomuuidByID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domuuid (by name)",
testCompareDomuuidByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh domname (by id)",
testCompareDomnameByID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domname (by uuid)",
testCompareDomnameByUUID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domstate (by id)",
testCompareDomstateByID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domstate (by uuid)",
testCompareDomstateByUUID, NULL) != 0)
ret = -1;
if (virTestRun("virsh domstate (by name)",
testCompareDomstateByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh domcontrol (by name)",
testCompareDomControlInfoByName, NULL) != 0)
ret = -1;
if (virTestRun("virsh blkiotune (get parameters)",
testCompareGetBlkioParameters, NULL) != 0)
ret = -1;
if (virTestRun("virsh blkiotune (set parameters)",
testCompareSetBlkioParameters, NULL) != 0)
ret = -1;
if (virTestRun("virsh iothreadadd",
testIOThreadAdd, NULL) != 0)
ret = -1;
if (virTestRun("virsh iothreaddel",
testIOThreadDel, NULL) != 0)
ret = -1;
if (virTestRun("virsh iothreadset",
testIOThreadSet, NULL) != 0)
ret = -1;
if (virTestRun("virsh iothreadpin",
testIOThreadPin, NULL) != 0)
ret = -1;
/* It's a bit awkward listing result before argument, but that's a
* limitation of C99 vararg macros. */
# define DO_TEST(i, result, ...) \
do { \
const char *myargv[] = { VIRSH_DEFAULT, __VA_ARGS__, NULL }; \
const struct testInfo info = { myargv, result }; \
if (virTestRun("virsh echo " #i, \
testCompareEcho, &info) < 0) \
ret = -1; \ ret = -1; \
} \
while (*tmp) \
tmp++; \
*tmp = scriptarg; \
if (virTestRun(testname, testCompare, &info) < 0) \
ret = -1; \
} while (0);
# define DO_TEST_SCRIPT(testname_, testfilter, ...) \
DO_TEST_SCRIPT_FULL(testname_, false, testfilter, __VA_ARGS__);
DO_TEST_SCRIPT("info-default", NULL, VIRSH_DEFAULT);
DO_TEST_SCRIPT("info-custom", NULL, VIRSH_CUSTOM);
DO_TEST_SCRIPT("domain-id", "\nCPU time:", VIRSH_CUSTOM);
DO_TEST_SCRIPT("blkiotune", NULL, VIRSH_CUSTOM);
DO_TEST_SCRIPT("iothreads", NULL, VIRSH_CUSTOM);
# define DO_TEST_INFO(infostruct) \
if (virTestRun((infostruct)->testname, testCompare, (infostruct)) < 0) \
ret = -1;
# define DO_TEST_FULL(testname, filter, ...) \
do { \
const char *myargv[] = { __VA_ARGS__, NULL }; \
const struct testInfo info = { testname, NULL, myargv, false, NULL, false }; \
DO_TEST_INFO(&info); \
} while (0) } while (0)
/* automatically numbered test invocation */
# define DO_TEST(...) \
DO_TEST_FULL(virTestCounterNext(), NULL, VIRSH_DEFAULT, __VA_ARGS__);
/* Arg parsing quote removal tests. */ /* Arg parsing quote removal tests. */
DO_TEST(0, "\n", virTestCounterReset("echo-quote-removal-");
"echo"); DO_TEST("echo a \t b");
DO_TEST(1, "a\n", DO_TEST("echo \"a \t b\"");
"echo", "a"); DO_TEST("echo 'a \t b'");
DO_TEST(2, "a b\n", DO_TEST("echo a\\ \\\t\\ b");
"echo", "a", "b"); DO_TEST("echo", "'", "\"", "\\;echo\ta");
DO_TEST(3, "a b\n", DO_TEST("echo \\' \\\" \\;echo\ta");
"echo a \t b"); DO_TEST("echo \\' \\\" \\\\;echo\ta");
DO_TEST(4, "a \t b\n", DO_TEST("echo \"'\" '\"' '\\'\"\\\\\"");
"echo \"a \t b\"");
DO_TEST(5, "a \t b\n",
"echo 'a \t b'");
DO_TEST(6, "a \t b\n",
"echo a\\ \\\t\\ b");
DO_TEST(7, "\n\n",
"echo ; echo");
DO_TEST(8, "a\nb\n",
";echo a; ; echo b;");
DO_TEST(9, "' \" \\;echo\ta\n",
"echo", "'", "\"", "\\;echo\ta");
DO_TEST(10, "' \" ;echo a\n",
"echo \\' \\\" \\;echo\ta");
DO_TEST(11, "' \" \\\na\n",
"echo \\' \\\" \\\\;echo\ta");
DO_TEST(12, "' \" \\\\\n",
"echo \"'\" '\"' '\\'\"\\\\\"");
/* Tests of echo flags. */ /* Tests of echo flags. */
DO_TEST(13, "a A 0 + * ; . ' \" / ? = \n < > &\n", DO_TEST_SCRIPT("echo-escaping", NULL, VIRSH_DEFAULT);
"echo", "a", "A", "0", "+", "*", ";", ".", "'", "\"", "/", "?",
"=", " ", "\n", "<", ">", "&"); virTestCounterReset("echo-escaping-");
DO_TEST(14, "a A 0 + '*' ';' . ''\\''' '\"' / '?' = ' ' '\n' '<' '>' '&'\n", DO_TEST("echo", "a", "A", "0", "+", "*", ";", ".", "'", "\"", "/", "?", "=", " ", "\n", "<", ">", "&");
"echo", "--shell", "a", "A", "0", "+", "*", ";", ".", "'", "\"", DO_TEST("echo", "--shell", "a", "A", "0", "+", "*", ";", ".", "'", "\"", "/", "?", "=", " ", "\n", "<", ">", "&");
"/", "?", "=", " ", "\n", "<", ">", "&"); DO_TEST("echo", "--xml", "a", "A", "0", "+", "*", ";", ".", "'", "\"", "/", "?", "=", " ", "\n", "<", ">", "&");
DO_TEST(15, "a A 0 + * ; . &apos; &quot; / ? = \n &lt; &gt; &amp;\n",
"echo", "--xml", "a", "A", "0", "+", "*", ";", ".", "'", "\"",
"/", "?", "=", " ", "\n", "<", ">", "&");
DO_TEST(16, "a A 0 + '*' ';' . ''\\''' '\"' / '?' = ' ' '\n' '<' '>' '&'\n",
"echo", "--shell", "a", "A", "0", "+", "*", ";", ".", "\'",
"\"", "/", "?", "=", " ", "\n", "<", ">", "&");
DO_TEST(17, "\n",
"echo", "");
DO_TEST(18, "''\n",
"echo", "--shell", "");
DO_TEST(19, "\n",
"echo", "--xml", "");
DO_TEST(20, "''\n",
"echo", "--shell", "");
DO_TEST(21, "\n",
"echo ''");
DO_TEST(22, "''\n",
"echo --shell \"\"");
DO_TEST(23, "\n",
"echo --xml ''");
DO_TEST(24, "''\n",
"echo --shell \"\"''");
/* Tests of -- handling. */ /* Tests of -- handling. */
DO_TEST(25, "a\n", virTestCounterReset("dash-dash-argument-");
"--", "echo", "--shell", "a"); DO_TEST("--", "echo", "--shell", "a");
DO_TEST(26, "a\n", DO_TEST("--", "echo", "a", "--shell");
"--", "echo", "a", "--shell"); DO_TEST("--", "echo", "--", "a", "--shell");
DO_TEST(27, "a --shell\n", DO_TEST("echo", "--", "--", "--shell", "a");
"--", "echo", "--", "a", "--shell"); DO_TEST("echo --s\\h'e'\"l\"l -- a");
DO_TEST(28, "-- --shell a\n", DO_TEST("echo \t '-'\"-\" \t --shell \t a");
"echo", "--", "--", "--shell", "a");
DO_TEST(29, "a\n",
"echo --s\\h'e'\"l\"l -- a");
DO_TEST(30, "--shell a\n",
"echo \t '-'\"-\" \t --shell \t a");
/* Tests of alias handling. */ /* Tests of alias handling. */
DO_TEST(31, "hello\n", "echo", "--string", "hello"); DO_TEST_SCRIPT("echo-alias", NULL, VIRSH_DEFAULT);
DO_TEST(32, "hello\n", "echo --string hello"); DO_TEST_FULL("echo-alias-argv", NULL, VIRSH_DEFAULT, "echo", "--str", "hello");
DO_TEST(33, "hello\n", "echo", "--str", "hello");
DO_TEST(34, "hello\n", "echo --str hello");
DO_TEST(35, "hello\n", "echo --hi");
/* Tests of multiple commands. */ /* Tests of multiple commands. */
DO_TEST(36, "a\nb\n", " echo a; echo b;"); virTestCounterReset("multiple-commands-");
DO_TEST(37, "a\nb\n", "\necho a\n echo b\n"); DO_TEST(" echo a; echo b;");
DO_TEST(38, "a\nb\n", "ec\\\nho a\n echo \\\n b;"); DO_TEST("\necho a\n echo b\n");
DO_TEST(39, "a\n b\n", "\"ec\\\nho\" a\n echo \"\\\n b\";"); DO_TEST("ec\\\nho a\n echo \\\n b;");
DO_TEST(40, "a\n\\\n b\n", "ec\\\nho a\n echo '\\\n b';"); DO_TEST("\"ec\\\nho\" a\n echo \"\\\n b\";");
DO_TEST(41, "a\n", "echo a # b"); DO_TEST("ec\\\nho a\n echo '\\\n b';");
DO_TEST(42, "a\nc\n", "echo a #b\necho c"); DO_TEST("echo a # b");
DO_TEST(43, "a\nc\n", "echo a # b\\\necho c"); DO_TEST("echo a #b\necho c");
DO_TEST(44, "a # b\n", "echo a '#' b"); DO_TEST("echo a # b\\\necho c");
DO_TEST(45, "a # b\n", "echo a \\# b"); DO_TEST("echo a '#' b");
DO_TEST(46, "a\n", "#unbalanced; 'quotes\"\necho a # b"); DO_TEST("echo a \\# b");
DO_TEST(47, "a\n", "\\# ignored;echo a\n'#also' ignored"); DO_TEST("#unbalanced; 'quotes\"\necho a # b");
DO_TEST("\\# ignored;echo a\n'#also' ignored");
/* test of splitting in vshStringToArray */ /* test of splitting in vshStringToArray */
DO_TEST(48, "a\nb,c,\nd,,e,,\nf,,,e\n", DO_TEST_SCRIPT("echo-split", NULL, VIRSH_DEFAULT, "-q");
"-q", "echo", "--split", "a,b,,c,,,d,,,,e,,,,,f,,,,,,e");
DO_TEST(49, "\na\nb,c,\nd,,e,,\nf,,,e\n\n", /* comprehensive coverage of argument assignment */
"-q", "echo", "--split", ",a,b,,c,,,d,,,,e,,,,,f,,,,,,e,"); DO_TEST_SCRIPT("argument-assignment", NULL, VIRSH_DEFAULT, "-k0", "-d0");
DO_TEST(50, ",a\nb,c,\nd,,e,,\nf,,,e,\n", DO_TEST_SCRIPT("snapshot-create-args", NULL, VIRSH_DEFAULT, "-q");
"-q", "echo", "--split", ",,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,"); DO_TEST_SCRIPT("numeric-parsing", NULL, VIRSH_DEFAULT);
DO_TEST(51, ",\na\nb,c,\nd,,e,,\nf,,,e,\n\n", /* The 'numeric-parsing-event' invokes virsh event with a 1 second timeout,
"-q", "echo", "--split", ",,,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,,"); * thus is marked expensive */
DO_TEST(52, ",,a\nb,c,\nd,,e,,\nf,,,e,,\n", DO_TEST_SCRIPT_FULL("numeric-parsing-event", true, NULL, VIRSH_DEFAULT);
"-q", "echo", "--split", ",,,,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,,,"); DO_TEST_SCRIPT("attach-disk", NULL, VIRSH_DEFAULT);
# undef DO_TEST DO_TEST_SCRIPT("vcpupin", NULL, VIRSH_DEFAULT);
DO_TEST_SCRIPT("lifecycle", "\nCPU time:", VIRSH_CUSTOM);
DO_TEST_FULL("domain-id-overflow", NULL, VIRSH_CUSTOM, "-q", "domname", "4294967298");
DO_TEST_FULL("schedinfo-invalid-argument", NULL, VIRSH_DEFAULT, "schedinfo", "1", "--set", "j=k");
DO_TEST_FULL("pool-define-as", NULL, VIRSH_DEFAULT, "-q",
"pool-define-as", "--print-xml", "P", "dir", "src-host",
"/src/path", "/src/dev", "S", "/target-path");
DO_TEST_SCRIPT("snapshot", "<creationTime", VIRSH_DEFAULT);
DO_TEST_FULL("snapshot-redefine", NULL, VIRSH_DEFAULT,
"cd " abs_srcdir "/virshtestdata ;"
"echo 'Redefine must be in topological order; this will fail' ;"
"snapshot-create test --redefine snapshot-s2.xml --validate ;"
"echo 'correct order' ;"
"snapshot-create test --redefine snapshot-s3.xml --validate ;"
"snapshot-create test --redefine snapshot-s2.xml --current --validate ;"
"snapshot-info test --current");
DO_TEST_SCRIPT("checkpoint", "<creationTime", VIRSH_DEFAULT);
DO_TEST_FULL("checkpoint-redefine", NULL, VIRSH_DEFAULT,
"cd " abs_srcdir "/virshtestdata ;"
"echo 'Redefine must be in topological order; this will fail' ;"
"checkpoint-create test --redefine checkpoint-c2.xml ;"
"echo 'correct order' ;"
"checkpoint-create test --redefine checkpoint-c3.xml ;"
"checkpoint-create test --redefine checkpoint-c2.xml ;"
"checkpoint-info test c2");
if (virTestRun("read-big-pipe", testVirshPipe, NULL) < 0)
ret = -1;
/* Test precedence of URI lookup in virsh:
*
* Precedence is the following (lowest priority first):
*
* 1) if run as root, 'uri_default' from /etc/libvirtd/libvirt.conf,
* otherwise qemu:///session. There is no way to mock this file for
* virsh/libvirt.so and the user may have set anything in there that
* would spoil the test, so we don't test this
*
* 2) 'uri_default' from $XDG_CONFIG_HOME/libvirt/libvirt.conf
*
* 3) LIBVIRT_DEFAULT_URI
*
* 4) VIRSH_DEFAULT_CONNECT_URI
*
* 5) parameter -c (--connect)
*
* There are two pre-prepared directories in tests/virshtestdata/ serving
* as mock XDG_CONFIG_HOME containing the test configs.
*/
{
const char *uriTest = "uri; connect; uri";
const char *myargv_noconnect[] = { abs_top_builddir "/tools/virsh", uriTest, NULL };
const char *xdgDirBad = "XDG_CONFIG_HOME=" abs_srcdir "/virshtestdata/uriprecedence-xdg/bad/";
struct testInfo info = { NULL, NULL, myargv_noconnect, false, NULL, false };
/* test 1 - default from config */
{
const char *myenv[] = {
"XDG_CONFIG_HOME=" abs_srcdir "/virshtestdata/uriprecedence-xdg/good/",
NULL,
};
info.testname = "uriprecedence-xdg-config";
info.env = myenv;
info.forbid_root = true;
DO_TEST_INFO(&info);
}
/* all other tests don't care */
info.forbid_root = false;
/* test 2 - LIBVIRT_DEFAULT_URI env variable */
{
const char *myenv[] = {
xdgDirBad,
"LIBVIRT_DEFAULT_URI=test:///default?good_uri",
NULL,
};
info.testname = "uriprecedence-LIBVIRT_DEFAULT_URI";
info.env = myenv;
DO_TEST_INFO(&info);
}
/* test 3 - VIRSH_DEFAULT_CONNECT_URI env variable */
{
const char *myenv[] = {
xdgDirBad,
"LIBVIRT_DEFAULT_URI=test:///default?bad_uri",
"VIRSH_DEFAULT_CONNECT_URI=test:///default?good_uri",
NULL,
};
info.testname = "uriprecedence-VIRSH_DEFAULT_CONNECT_URI";
info.env = myenv;
DO_TEST_INFO(&info);
}
/* test 3 - --connect parameter */
{
const char *myenv[] = {
xdgDirBad,
"LIBVIRT_DEFAULT_URI=test:///default?bad_uri",
"VIRSH_DEFAULT_CONNECT_URI=test:///default?bad_uri",
NULL,
};
const char *myargv[] = {
abs_top_builddir "/tools/virsh",
"--connect", "test:///default?good_uri",
uriTest,
NULL,
};
info.testname = "uriprecedence-param";
info.env = myenv;
info.argv = myargv;
DO_TEST_INFO(&info);
}
}
VIR_FREE(custom_uri); VIR_FREE(custom_uri);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;

View File

@ -0,0 +1,15 @@
setvcpus test 2
setvcpus --domain test 2
setvcpus --domain=test 2
setvcpus test --count 2
setvcpus test --count=2
setvcpus --domain test --count 2
setvcpus --domain=test --count 2
setvcpus --domain test --count=2
setvcpus --domain=test --count=2
setvcpus --count 2 --domain test
setvcpus --count 2 --domain=test
setvcpus --count=2 --domain test
setvcpus --count=2 --domain=test
setvcpus --count 2 test
setvcpus --count=2 test

View File

@ -0,0 +1,91 @@
commands: "setvcpus test 2
setvcpus --domain test 2
setvcpus --domain=test 2
setvcpus test --count 2
setvcpus test --count=2
setvcpus --domain test --count 2
setvcpus --domain=test --count 2
setvcpus --domain test --count=2
setvcpus --domain=test --count=2
setvcpus --count 2 --domain test
setvcpus --count 2 --domain=test
setvcpus --count=2 --domain test
setvcpus --count=2 --domain=test
setvcpus --count 2 test
setvcpus --count=2 test
"
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: count(optdata): 2
setvcpus: domain(optdata): test
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME
setvcpus: found option <domain>: test
setvcpus: <domain> trying as domain NAME

View File

@ -0,0 +1,79 @@
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype block
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype nothing
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype block --type disk
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type cdrom
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype block --type cdrom
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type blah
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype block --type blah
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --driver testdriver
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver qcow2
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver raw
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --cache none
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver qcow2 --cache none
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver qcow2 --serial TEST_SERIAL
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --mode readonly
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --mode shareable
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --mode whatever
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --rawio
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --multifunction
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --subdriver qcow2 --alias testalias --iothread 3 --mode readonly --cache none --driver qemu
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address ide:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address ide:1.2.4
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address ide:1:2:5
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address ide:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address ide:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address usb:12.34
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address usb:12.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address usb:12:34
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address usb:12.34
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address usb:12.34
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address scsi:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address scsi:1.2.4
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address scsi:1:2:5
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address scsi:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address scsi:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address sata:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address sata:1.2.4
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address sata:1:2:5
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address sata:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address sata:1.2.3
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12.34.56.78
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12:34:56:78
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12.34.56.aa
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address pci:12.34.56.aa
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address pci:12.34.56.aa
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12.34.56.78 --multifunction
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12:34:56:78 --multifunction
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address pci:12.34.56.aa --multifunction
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address ccw:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address ccw:12:34:56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address ccw:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype file --type disk --address ccw:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target sda --sourcetype file --type disk --address ccw:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address test:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address test:12:34:56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target vda --sourcetype file --type disk --address test:12.34.56
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --source-protocol AAA --sourcetype file
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name hostname
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name :port
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name :
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-name hostname:port --source-host-transport trnsp
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-transport trnsp --source-host-socket /nonexistent/socket
attach-disk --print-xml --domain testdom --source /nonexistent/file --target hda --sourcetype network --source-protocol TEST --source-host-socket /nonexistent/socket

View File

@ -0,0 +1,343 @@
<disk type='file'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='block'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
error: Unknown source type: 'nothing'
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='block' device='disk'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='block' device='cdrom'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='blah'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='block' device='blah'>
<source dev='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver name='testdriver'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver type='raw'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver type='qcow2' cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<serial>TEST_SERIAL</serial>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<readonly/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<shareable/>
</disk>
error: No support for whatever in command 'attach-disk'
<disk type='file' device='disk'>
<driver type='qcow2'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<alias name='testalias'/>
</disk>
<disk type='file' device='disk' rawio='yes'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread='3' cache='none'/>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<readonly/>
<alias name='testalias'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='hda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='34'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='3'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='usb' bus='12' port='34'/>
</disk>
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
error: expecting an ide:00.00.00 address.
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
error: expecting an ide:00.00.00 address.
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='3'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='4'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='sda'/>
<address type='drive' controller='1' bus='2' unit='5'/>
</disk>
error: expecting an ide:00.00.00 address.
error: expecting a pci:0000.00.00.00 or ccw:00.0.0000 address.
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0xaa'/>
</disk>
error: expecting an ide:00.00.00 address.
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78' multifunction='on'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0x78' multifunction='on'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='pci' domain='0x0012' bus='0x34' slot='0x56' function='0xaa' multifunction='on'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
<disk type='file' device='disk'>
<source file='/nonexistent/file'/>
<target dev='vda'/>
<address type='ccw' cssid='0x12' ssid='0x34' devno='0x0056'/>
</disk>
error: expecting an ide:00.00.00 address.
error: expecting a scsi:00.00.00 or usb:00.00 or sata:00.00.00 address.
error: Invalid address.
error: Invalid address.
error: Invalid address.
error: --source-protocol option requires --sourcetype network
error: --source-protocol option requires --sourcetype network
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname'/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname' port='port'/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='hostname' port=''/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='' port='port'/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host name='' port=''/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp' name='hostname' port='port'/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp'/>
</source>
<target dev='hda'/>
</disk>
<disk type='network'>
<source protocol='TEST' name='/nonexistent/file'>
<host transport='trnsp' socket='/nonexistent/socket'/>
</source>
<target dev='hda'/>
</disk>
error: Option --source-host-transport is required by option --source-host-socket
## Exit code: 1

View File

@ -0,0 +1,3 @@
blkiotune fv0
blkiotune fv0 --weight 500 --device-weights /dev/hda,1000 --device-read-iops-sec /dev/hda,1000 --device-write-iops-sec /dev/hda,1000 --device-read-bytes-sec /dev/hda,1000 --device-write-bytes-sec /dev/hda,1000
blkiotune fv0

View File

@ -0,0 +1,15 @@
weight : 800
device_weight : /dev/hda,700
device_read_iops_sec: /dev/hda,700
device_write_iops_sec: /dev/hda,700
device_read_bytes_sec: /dev/hda,700
device_write_bytes_sec: /dev/hda,700
weight : 500
device_weight : /dev/hda,1000
device_read_iops_sec: /dev/hda,1000
device_write_iops_sec: /dev/hda,1000
device_read_bytes_sec: /dev/hda,1000
device_write_bytes_sec: /dev/hda,1000

View File

@ -0,0 +1,41 @@
<domaincheckpoint>
<name>c2</name>
<parent>
<name>c3</name>
</parent>
<creationTime>1234</creationTime>
<disks>
<disk name='vda' checkpoint='bitmap' bitmap='c2'/>
</disks>
<domain type='test'>
<name>test</name>
<uuid>6695eb01-f6a4-8304-79aa-97f2502e193f</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='i686'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<source file='/guest/diskimage1'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</disk>
<interface type='network'>
<mac address='aa:bb:cc:dd:ee:ff'/>
<source network='default'/>
<target dev='testnet0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</interface>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</memballoon>
</devices>
</domain>
</domaincheckpoint>

View File

@ -0,0 +1,38 @@
<domaincheckpoint>
<name>c3</name>
<creationTime>5678</creationTime>
<disks>
<disk name='vda' checkpoint='bitmap' bitmap='c3'/>
</disks>
<domain type='test'>
<name>test</name>
<uuid>6695eb01-f6a4-8304-79aa-97f2502e193f</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='i686'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<source file='/guest/diskimage1'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</disk>
<interface type='network'>
<mac address='aa:bb:cc:dd:ee:ff'/>
<source network='default'/>
<target dev='testnet0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</interface>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</memballoon>
</devices>
</domain>
</domaincheckpoint>

View File

@ -0,0 +1,13 @@
Redefine must be in topological order; this will fail
error: invalid argument: parent c3 for moment c2 not found
correct order
Domain checkpoint c3 created from 'checkpoint-c3.xml'
Domain checkpoint c2 created from 'checkpoint-c2.xml'
Name: c2
Domain: test
Parent: c3
Children: 0
Descendants: 0

View File

@ -0,0 +1,35 @@
echo Create a series of checkpoints, with names that intentionally sort
echo differently by topology than by name. For now, it is not possible
echo to create fanout without hacking through redefines.
checkpoint-create-as test c1
checkpoint-create-as test c1
checkpoint-create-as test c3
checkpoint-create-as test c2
echo snapshots cannot be created while checkpoints exist
snapshot-create-as test s1
echo Checking tree view (siblings sorted alphabetically)
checkpoint-list test --tree
echo Demonstrate list filtering
checkpoint-list test --roots --name
checkpoint-list test --leaves --name
checkpoint-list test --parent --no-leaves --name
checkpoint-list test --from c3 --name
checkpoint-list test --from c1 --descendants --name
echo Now the tree is linear, so we have an unambiguous topological order
checkpoint-list test --name
checkpoint-list test --name --topological
echo validate XML
checkpoint-delete test c1
checkpoint-dumpxml test c3
checkpoint-dumpxml test c2
echo Deleting current checkpoint moves current up to remaining parent
checkpoint-delete test --children-only c3
checkpoint-list test --leaves --name
checkpoint-delete test --children c3
checkpoint-list test --leaves --name

View File

@ -0,0 +1,133 @@
Create a series of checkpoints, with names that intentionally sort
differently by topology than by name. For now, it is not possible
to create fanout without hacking through redefines.
Domain checkpoint c1 created
error: operation failed: domain moment c1 already exists
Domain checkpoint c3 created
Domain checkpoint c2 created
snapshots cannot be created while checkpoints exist
error: Operation not supported: cannot create snapshot while checkpoint exists
Checking tree view (siblings sorted alphabetically)
c1
|
+- c3
|
+- c2
Demonstrate list filtering
c1
c2
c1
c3 c1
c2
c2
c3
Now the tree is linear, so we have an unambiguous topological order
c1
c2
c3
c1
c3
c2
validate XML
Domain checkpoint c1 deleted
<domaincheckpoint>
<name>c3</name>
<disks>
<disk name='vda' checkpoint='bitmap' bitmap='c3'/>
</disks>
<domain type='test'>
<name>test</name>
<uuid>6695eb01-f6a4-8304-79aa-97f2502e193f</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='i686'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<source file='/guest/diskimage1'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</disk>
<interface type='network'>
<mac address='aa:bb:cc:dd:ee:ff'/>
<source network='default'/>
<target dev='testnet0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</interface>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</memballoon>
</devices>
</domain>
</domaincheckpoint>
<domaincheckpoint>
<name>c2</name>
<parent>
<name>c3</name>
</parent>
<disks>
<disk name='vda' checkpoint='bitmap' bitmap='c2'/>
</disks>
<domain type='test'>
<name>test</name>
<uuid>6695eb01-f6a4-8304-79aa-97f2502e193f</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='i686'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='file' device='disk'>
<source file='/guest/diskimage1'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</disk>
<interface type='network'>
<mac address='aa:bb:cc:dd:ee:ff'/>
<source network='default'/>
<target dev='testnet0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</interface>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</memballoon>
</devices>
</domain>
</domaincheckpoint>
Deleting current checkpoint moves current up to remaining parent
Domain checkpoint c3 children deleted
c3
Domain checkpoint c3 deleted

View File

@ -0,0 +1 @@
a

View File

@ -0,0 +1 @@
a

View File

@ -0,0 +1 @@
a --shell

View File

@ -0,0 +1 @@
-- --shell a

View File

@ -0,0 +1 @@
a

View File

@ -0,0 +1 @@
--shell a

View File

@ -0,0 +1,3 @@
error: failed to get domain '4294967298'
## Exit code: 1

View File

@ -0,0 +1,18 @@
dominfo ef861801-45b9-11cb-88e3-afbfe5370493
dominfo fc4
dominfo fc5
domid fc4
domid ef861801-45b9-11cb-88e3-afbfe5370493
domuuid 2
domuuid fc4
domname 2
domname ef861801-45b9-11cb-88e3-afbfe5370493
domstate 2
domstate ef861801-45b9-11cb-88e3-afbfe5370493
domstate fc4
domcontrol fc4

View File

@ -0,0 +1,73 @@
Id: 2
Name: fc4
UUID: ef861801-45b9-11cb-88e3-afbfe5370493
OS Type: linux
State: running
CPU(s): 1
Max memory: 261072 KiB
Used memory: 131072 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: testSecurity
Security DOI:
Security label: libvirt-test (enforcing)
Messages: tainted: network configuration using opaque shell scripts
Id: 2
Name: fc4
UUID: ef861801-45b9-11cb-88e3-afbfe5370493
OS Type: linux
State: running
CPU(s): 1
Max memory: 261072 KiB
Used memory: 131072 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: testSecurity
Security DOI:
Security label: libvirt-test (enforcing)
Messages: tainted: network configuration using opaque shell scripts
Id: 3
Name: fc5
UUID: 08721f99-3d1d-4aec-96eb-97803297bb36
OS Type: linux
State: running
CPU(s): 4
Max memory: 2097152 KiB
Used memory: 2097152 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: testSecurity
Security DOI:
Security label: libvirt-test (enforcing)
Messages: tainted: running with undesirable elevated privileges
tainted: network configuration using opaque shell scripts
tainted: use of host cdrom passthrough
tainted: custom device tree blob used
tainted: use of deprecated configuration settings
deprecated configuration: CPU model Deprecated-Test
2
2
ef861801-45b9-11cb-88e3-afbfe5370493
ef861801-45b9-11cb-88e3-afbfe5370493
fc4
fc4
running
running
running
ok

View File

@ -0,0 +1 @@
hello

View File

@ -0,0 +1,3 @@
echo --string hello
echo --str hello
echo --hi;

View File

@ -0,0 +1,3 @@
hello
hello
hello

View File

@ -0,0 +1,2 @@
a A 0 + * ; . ' " / ? =
< > &

View File

@ -0,0 +1,2 @@
a A 0 + '*' ';' . ''\''' '"' / '?' = ' ' '
' '<' '>' '&'

View File

@ -0,0 +1,2 @@
a A 0 + * ; . &apos; &quot; / ? =
&lt; &gt; &amp;

View File

@ -0,0 +1,11 @@
echo a A 0 + * . \' / ? = < > &
echo --xml a A 0 + * . \' / ? = < > &
echo --shell a A 0 + * . \' / ? = < > &
echo ""
echo --shell
echo --xml
echo --shell
echo ''
echo --shell ""
echo --xml ''
echo --shell ""''

View File

@ -0,0 +1,11 @@
a A 0 + * . ' / ? = < > &
a A 0 + * . &apos; / ? = &lt; &gt; &amp;
a A 0 + '*' . ''\''' / '?' = '<' '>' '&'
''
''

View File

@ -0,0 +1 @@
a b

View File

@ -0,0 +1 @@
a b

View File

@ -0,0 +1 @@
a b

View File

@ -0,0 +1 @@
a b

View File

@ -0,0 +1 @@
' " \;echo a

View File

@ -0,0 +1 @@
' " ;echo a

View File

@ -0,0 +1,2 @@
' " \
a

View File

@ -0,0 +1 @@
' " \\

View File

@ -0,0 +1,5 @@
echo --split a,b,,c,,,d,,,,e,,,,,f,,,,,,e
echo --split ,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,
echo --split ,,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,
echo --split ,,,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,,
echo --split ,,,,a,b,,c,,,d,,,,e,,,,,f,,,,,,e,,,,

View File

@ -0,0 +1,24 @@
a
b,c,
d,,e,,
f,,,e
a
b,c,
d,,e,,
f,,,e
,a
b,c,
d,,e,,
f,,,e,
,
a
b,c,
d,,e,,
f,,,e,
,,a
b,c,
d,,e,,
f,,,e,,

View File

@ -0,0 +1,2 @@
list
nodeinfo

View File

@ -0,0 +1,15 @@
Id Name State
----------------------
1 fv0 running
2 fc4 running
3 fc5 running
CPU model: i986
CPU(s): 50
CPU frequency: 6000 MHz
CPU socket(s): 4
Core(s) per socket: 4
Thread(s) per core: 2
NUMA cell(s): 4
Memory size: 8192000 KiB

Some files were not shown because too many files have changed in this diff Show More