- qemuxmlconftest: check various xml definitions of dataFileStore: types file, block, network and the case when data-file belongs to qcow2 backing image - virstoragetest: create qcow2 image chains and check that data files are properly probed by metadata parser - qemuxmlactivetest: check that status files will contain data files' node names Signed-off-by: Nikolai Barybin <nikolai.barybin@xxxxxxxxxxxxx> --- .../qcow2-data-file-in.xml | 86 ++++++++++++++++ .../qcow2-data-file-out.xml | 86 ++++++++++++++++ tests/qemuxmlactivetest.c | 2 + ...sk-qcow2-datafile-store.x86_64-latest.args | 51 ++++++++++ ...isk-qcow2-datafile-store.x86_64-latest.xml | 81 +++++++++++++++ .../disk-qcow2-datafile-store.xml | 67 +++++++++++++ tests/qemuxmlconftest.c | 1 + tests/virstoragetest.c | 98 +++++++++++++++++++ tests/virstoragetestdata/out/qcow2-data_file | 20 ++++ .../out/qcow2-qcow2_qcow2-qcow2-data_file | 31 ++++++ 10 files changed, 523 insertions(+) create mode 100644 tests/qemustatusxml2xmldata/qcow2-data-file-in.xml create mode 100644 tests/qemustatusxml2xmldata/qcow2-data-file-out.xml create mode 100644 tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/disk-qcow2-datafile-store.xml create mode 100644 tests/virstoragetestdata/out/qcow2-data_file create mode 100644 tests/virstoragetestdata/out/qcow2-qcow2_qcow2-qcow2-data_file diff --git a/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml new file mode 100644 index 0000000000..40479dd3d6 --- /dev/null +++ b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml @@ -0,0 +1,86 @@ +<domstatus state='running' reason='booted' pid='3803518'> + <taint flag='high-privileges'/> + <monitor path='/var/lib/libvirt/qemu/test.monitor' type='unix'/> + <vcpus> + <vcpu id='0' pid='3803519'/> + </vcpus> + <qemuCaps> + <flag name='vnet-hdr'/> + <flag name='qxl.vgamem_mb'/> + <flag name='qxl-vga.vgamem_mb'/> + <flag name='pc-dimm'/> + </qemuCaps> + <lockstate>testtest</lockstate> + <devices> + <device alias='balloon0'/> + <device alias='video0'/> + <device alias='serial0'/> + <device alias='net0'/> + <device alias='usb'/> + </devices> + <numad nodeset='0-2' cpuset='1,3'/> + <libDir path='/tmp'/> + <channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/> + <memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/> + <allowReboot value='yes'/> + <nodename index='0'/> + <fdset index='0'/> + <blockjobs active='no'/> + <agentTimeout>-2</agentTimeout> + <domain type='qemu' id='1'> + <name>QEMUGuest1</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='i686' 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-i386</emulator> + <disk type='block' device='cdrom'> + <driver name='qemu' type='raw'/> + <source dev='/dev/HostVG/QEMUGuest2'/> + <backingStore/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/tmp/image.qcow2'/> + <backingStore/> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file'> + <privateData> + <nodenames> + <nodename type='storage' name='test-storage-data-file'/> + </nodenames> + </privateData> + </source> + </dataFileStore> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <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='0x05' function='0x0'/> + </memballoon> + </devices> + </domain> +</domstatus> diff --git a/tests/qemustatusxml2xmldata/qcow2-data-file-out.xml b/tests/qemustatusxml2xmldata/qcow2-data-file-out.xml new file mode 100644 index 0000000000..40479dd3d6 --- /dev/null +++ b/tests/qemustatusxml2xmldata/qcow2-data-file-out.xml @@ -0,0 +1,86 @@ +<domstatus state='running' reason='booted' pid='3803518'> + <taint flag='high-privileges'/> + <monitor path='/var/lib/libvirt/qemu/test.monitor' type='unix'/> + <vcpus> + <vcpu id='0' pid='3803519'/> + </vcpus> + <qemuCaps> + <flag name='vnet-hdr'/> + <flag name='qxl.vgamem_mb'/> + <flag name='qxl-vga.vgamem_mb'/> + <flag name='pc-dimm'/> + </qemuCaps> + <lockstate>testtest</lockstate> + <devices> + <device alias='balloon0'/> + <device alias='video0'/> + <device alias='serial0'/> + <device alias='net0'/> + <device alias='usb'/> + </devices> + <numad nodeset='0-2' cpuset='1,3'/> + <libDir path='/tmp'/> + <channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/> + <memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/> + <allowReboot value='yes'/> + <nodename index='0'/> + <fdset index='0'/> + <blockjobs active='no'/> + <agentTimeout>-2</agentTimeout> + <domain type='qemu' id='1'> + <name>QEMUGuest1</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='i686' 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-i386</emulator> + <disk type='block' device='cdrom'> + <driver name='qemu' type='raw'/> + <source dev='/dev/HostVG/QEMUGuest2'/> + <backingStore/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/tmp/image.qcow2'/> + <backingStore/> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file'> + <privateData> + <nodenames> + <nodename type='storage' name='test-storage-data-file'/> + </nodenames> + </privateData> + </source> + </dataFileStore> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <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='0x05' function='0x0'/> + </memballoon> + </devices> + </domain> +</domstatus> diff --git a/tests/qemuxmlactivetest.c b/tests/qemuxmlactivetest.c index 23ac807c76..8cf44090ce 100644 --- a/tests/qemuxmlactivetest.c +++ b/tests/qemuxmlactivetest.c @@ -250,6 +250,8 @@ mymain(void) DO_TEST_STATUS("memory-backing-dir"); + DO_TEST_STATUS("qcow2-data-file"); + cleanup: qemuTestDriverFree(&driver); diff --git a/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.args b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.args new file mode 100644 index 0000000000..5a64246af6 --- /dev/null +++ b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.args @@ -0,0 +1,51 @@ +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=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 \ +-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"}' \ +-blockdev '{"driver":"file","filename":"/tmp/data-file-store","node-name":"libvirt-9-storage","read-only":false}' \ +-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock"},"export":"Volume2/Image","node-name":"libvirt-8-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-8-format","read-only":false,"driver":"qcow2","data-file":"libvirt-9-storage","file":"libvirt-8-storage"}' \ +-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-8-format","id":"virtio-disk0","bootindex":1}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-7-storage","read-only":false}' \ +-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/var/run/nbdsock"},"export":"bar","node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-6-format","read-only":false,"driver":"qcow2","data-file":"libvirt-7-storage","file":"libvirt-6-storage"}' \ +-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x3","drive":"libvirt-6-format","id":"virtio-disk1"}' \ +-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock/datafile"},"export":"Volume2/ImageDataFile","node-name":"libvirt-5-storage","read-only":false}' \ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071879","node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"qcow2","data-file":"libvirt-5-storage","file":"libvirt-4-storage"}' \ +-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x4","drive":"libvirt-4-format","id":"virtio-disk2"}' \ +-blockdev '{"driver":"file","filename":"/tmp/data-file-store-2","node-name":"libvirt-3-storage","read-only":true}' \ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071877","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","data-file":"libvirt-3-storage","file":"libvirt-2-storage"}' \ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071880","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2","file":"libvirt-1-storage","backing":"libvirt-2-format"}' \ +-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x5","drive":"libvirt-1-format","id":"virtio-disk3"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x6"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.xml new file mode 100644 index 0000000000..d0a6cb3238 --- /dev/null +++ b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.x86_64-latest.xml @@ -0,0 +1,81 @@ +<domain type='qemu'> + <name>QEMUGuest1</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> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file-store'/> + </dataFileStore> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <dataFileStore type='block'> + <format type='raw'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + </dataFileStore> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071879'/> + <dataFileStore type='network'> + <format type='raw'/> + <source protocol='nbd' name='Volume2/ImageDataFile'> + <host transport='unix' socket='/path/to/sock/datafile'/> + </source> + </dataFileStore> + <target dev='vdc' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file-store-2'/> + </dataFileStore> + </backingStore> + <target dev='vdd' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </disk> + <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'/> + <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='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/disk-qcow2-datafile-store.xml b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.xml new file mode 100644 index 0000000000..797f8d6b34 --- /dev/null +++ b/tests/qemuxmlconfdata/disk-qcow2-datafile-store.xml @@ -0,0 +1,67 @@ +<domain type='qemu'> + <name>QEMUGuest1</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> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='Volume2/Image'> + <host transport='unix' socket='/path/to/sock'/> + </source> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file-store'/> + </dataFileStore> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='qcow2'/> + <source protocol='nbd' name='bar'> + <host transport='unix' socket='/var/run/nbdsock'/> + </source> + <dataFileStore type='block'> + <format type='raw'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + </dataFileStore> + <target dev='vdb' bus='virtio'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071879'/> + <dataFileStore type='network'> + <format type='raw'/> + <source protocol='nbd' name='Volume2/ImageDataFile'> + <host transport='unix' socket='/path/to/sock/datafile'/> + </source> + </dataFileStore> + <target dev='vdc' bus='virtio'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071880'/> + <backingStore type='file'> + <format type='qcow2'/> + <source file='/var/lib/libvirt/images/rhel7.1484071877'/> + <dataFileStore type='file'> + <format type='raw'/> + <source file='/tmp/data-file-store-2'/> + </dataFileStore> + </backingStore> + <target dev='vdd' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 194a4b8553..f3c8d0ae34 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -1651,6 +1651,7 @@ mymain(void) DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-scsi-incompatible-address"); DO_TEST_CAPS_LATEST("disk-backing-chains-index"); DO_TEST_CAPS_LATEST("disk-backing-chains-noindex"); + DO_TEST_CAPS_LATEST("disk-qcow2-datafile-store"); DO_TEST_CAPS_ARCH_LATEST_FULL("disk-source-fd", "x86_64", ARG_FD_GROUP, "testgroup2", 2, 200, 205, ARG_FD_GROUP, "testgroup5", 1, 204, diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index 75d04e8030..24893064ac 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -129,6 +129,76 @@ testPrepImages(void) } +static void +testPrepImagesWithQcow2DataFiles(char **chains) +{ + g_autoptr(virCommand) cmdData1 = NULL; + g_autoptr(virCommand) cmdData2 = NULL; + g_autoptr(virCommand) cmdqcow2_1 = NULL; + g_autoptr(virCommand) cmdqcow2_2_backing = NULL; + g_autoptr(virCommand) cmdqcow2_2 = NULL; + g_autofree char *data1 = g_strdup_printf("%s/data-1", datadir); + g_autofree char *data2 = g_strdup_printf("%s/data-2", datadir); + g_autofree char *qcow2_1 = g_strdup_printf("%s/qcow2-1", datadir); + g_autofree char *qcow2_1_opt_create = g_strdup_printf("data_file=%s,data_file_raw=true", data1); + g_autofree char *qcow2_2_backing = g_strdup_printf("%s/qcow2-2-backing", datadir); + g_autofree char *qcow2_2_backing_opt_create = g_strdup_printf("data_file=%s,data_file_raw=true", data2); + g_autofree char *qcow2_2 = g_strdup_printf("%s/qcow2-2", datadir); + g_autofree char *qemuimg = virFindFileInPath("qemu-img"); + + if (!qemuimg) + return; + + /* Clean up from any earlier failed tests */ + virFileDeleteTree(datadir); + + if (g_mkdir_with_parents(datadir, 0777) < 0) { + VIR_TEST_VERBOSE("unable to create directory '%s'\n", datadir); + return; + } + + /* create 2 chains containing data-file + * 1. qcow2 image with data-file + * 2. qcow2 image with backing qcow2 image containing data-file */ + cmdData1 = virCommandNewArgList(qemuimg, "create", + "-f", "raw", + data1, "1k", NULL); + cmdData2 = virCommandNewArgList(qemuimg, "create", + "-f", "raw", + data2, "1k", NULL); + + cmdqcow2_1 = virCommandNewArgList(qemuimg, "create", + "-f", "qcow2", + "-o", qcow2_1_opt_create, + qcow2_1, "1k", NULL); + + cmdqcow2_2_backing = virCommandNewArgList(qemuimg, "create", + "-f", "qcow2", + "-o", qcow2_2_backing_opt_create, + qcow2_2_backing, "1k", NULL); + + cmdqcow2_2 = virCommandNewArgList(qemuimg, "create", + "-f", "qcow2", + "-F", "qcow2", + "-b", qcow2_2_backing, + qcow2_2, NULL); + + if (virCommandRun(cmdData1, NULL) < 0 || + virCommandRun(cmdData2, NULL) < 0 || + virCommandRun(cmdqcow2_1, NULL) < 0 || + virCommandRun(cmdqcow2_2_backing, NULL) < 0 || + virCommandRun(cmdqcow2_2, NULL) < 0) { + VIR_TEST_VERBOSE("failed to create backing chain with data file in '%s'\n", datadir); + return; + } + + chains[0] = g_steal_pointer(&qcow2_1); + chains[1] = g_steal_pointer(&qcow2_2); + + return; +} + + enum { EXP_PASS = 0, EXP_FAIL = 1, @@ -203,6 +273,26 @@ testStorageChain(const void *args) NULLSTR(virStorageFileFormatTypeToString(elt->format)), virStorageNetProtocolTypeToString(elt->protocol), NULLSTR(elt->nhosts ? elt->hosts[0].name : NULL)); + + if (elt->dataFileStore) { + g_autofree char *strippedPathDataFileRaw = virTestStablePath(elt->dataFileRaw); + g_autofree char *strippedPathDataFile = virTestStablePath(elt->dataFileStore->path); + + virBufferAsprintf(&buf, + "dataFileRaw: %s\n\n\n" + "dataFileStoreSource:\n" + "path: %s\n" + "capacity: %lld\n" + "encryption: %d\n" + "type:%s\n" + "format:%s\n", + strippedPathDataFileRaw, + strippedPathDataFile, + elt->dataFileStore->capacity, + !!elt->dataFileStore->encryption, + NULLSTR(virStorageTypeToString(elt->dataFileStore->type)), + NULLSTR(virStorageFileFormatTypeToString(elt->dataFileStore->format))); + } } virBufferTrim(&buf, "\n"); @@ -419,6 +509,7 @@ mymain(void) struct testPathRelativeBacking data4; struct testBackingParseData data5; g_autofree char *realchain = NULL; + g_auto(GStrv) qcow2chainDataFile = g_new0(char *, 2); virStorageSource fakeChain[4]; virStorageSource *chain = &fakeChain[0]; virStorageSource *chain2 = &fakeChain[1]; @@ -462,6 +553,13 @@ mymain(void) TEST_CHAIN("qcow2-qcow2_qcow2-qcow2_raw-raw", realchain, VIR_STORAGE_FILE_QCOW2, EXP_PASS); TEST_CHAIN("qcow2-auto_qcow2-qcow2_raw-raw", realchain, VIR_STORAGE_FILE_AUTO, EXP_PASS); + /* Prep 2 chains: + * 1) qcow2 image with data file + * 2) qcow2 -> qcow2 backing image with data file */ + testPrepImagesWithQcow2DataFiles(qcow2chainDataFile); + TEST_CHAIN("qcow2-data_file", qcow2chainDataFile[0], VIR_STORAGE_FILE_QCOW2, EXP_PASS); + TEST_CHAIN("qcow2-qcow2_qcow2-qcow2-data_file", qcow2chainDataFile[1], VIR_STORAGE_FILE_QCOW2, EXP_PASS); + testCleanupImages(); /* Test various combinations of qcow2 images with missing 'backing_format' */ diff --git a/tests/virstoragetestdata/out/qcow2-data_file b/tests/virstoragetestdata/out/qcow2-data_file new file mode 100644 index 0000000000..f132c9580a --- /dev/null +++ b/tests/virstoragetestdata/out/qcow2-data_file @@ -0,0 +1,20 @@ +path:ABS_BUILDDIR/virstoragedata/qcow2-1 +backingStoreRaw: <null> +backingStoreRawFormat: none(0) +capacity: 1024 +encryption: 0 +relPath:<null> +type:file +format:qcow2 +protocol:none +hostname:<null> + +dataFileRaw: ABS_BUILDDIR/virstoragedata/data-1 + + +dataFileStoreSource: +path: ABS_BUILDDIR/virstoragedata/data-1 +capacity: 0 +encryption: 0 +type:file +format:raw diff --git a/tests/virstoragetestdata/out/qcow2-qcow2_qcow2-qcow2-data_file b/tests/virstoragetestdata/out/qcow2-qcow2_qcow2-qcow2-data_file new file mode 100644 index 0000000000..3cfb1833cc --- /dev/null +++ b/tests/virstoragetestdata/out/qcow2-qcow2_qcow2-qcow2-data_file @@ -0,0 +1,31 @@ +path:ABS_BUILDDIR/virstoragedata/qcow2-2 +backingStoreRaw: ABS_BUILDDIR/virstoragedata/qcow2-2-backing +backingStoreRawFormat: qcow2(14) +capacity: 1024 +encryption: 0 +relPath:<null> +type:file +format:qcow2 +protocol:none +hostname:<null> + +path:ABS_BUILDDIR/virstoragedata/qcow2-2-backing +backingStoreRaw: <null> +backingStoreRawFormat: none(0) +capacity: 1024 +encryption: 0 +relPath:<null> +type:file +format:qcow2 +protocol:none +hostname:<null> + +dataFileRaw: ABS_BUILDDIR/virstoragedata/data-2 + + +dataFileStoreSource: +path: ABS_BUILDDIR/virstoragedata/data-2 +capacity: 0 +encryption: 0 +type:file +format:raw -- 2.43.5