diff --git a/ChangeLog b/ChangeLog index 2a0cb0ed6fc42c8bf9da91cb7b182e1c91065fbd..1641fb1367bd55cc6df1aef25e364080fb139857 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Fri Jan 23 16:20:03 GMT 2009 Daniel P. Berrange + + * src/qemu_conf.c: Support driver format for setting disk + file types + * tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, + tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args, + tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml: + Add tests for + Fri Jan 23 17:13:47 +0100 2009 Jim Meyering .cvsignore: Add explicit list of generated files. diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 45108f32f34b10742ebcb83d020132c67c40e2df..ee5cf625207a2c00beb8310c4858c000d49b31e1 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -48,6 +48,8 @@ #include "xml.h" #include "nodeinfo.h" +#define VIR_FROM_THIS VIR_FROM_QEMU + VIR_ENUM_DECL(virDomainDiskQEMUBus) VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST, "ide", @@ -862,6 +864,18 @@ int qemudBuildCommandLine(virConnectPtr conn, ADD_ARG_LIT(vm->def->os.bootloader); } + for (i = 0 ; i < vm->def->ndisks ; i++) { + virDomainDiskDefPtr disk = vm->def->disks[i]; + + if (disk->driverName != NULL && + !STREQ(disk->driverName, "qemu")) { + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + _("unsupported driver name '%s' for disk '%s'"), + disk->driverName, disk->src); + goto error; + } + } + /* If QEMU supports -drive param instead of old -hda, -hdb, -cdrom .. */ if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) { int bootCD = 0, bootFloppy = 0, bootDisk = 0; @@ -884,8 +898,8 @@ int qemudBuildCommandLine(virConnectPtr conn, } for (i = 0 ; i < vm->def->ndisks ; i++) { - char opt[PATH_MAX]; - const char *media = NULL; + virBuffer opt = VIR_BUFFER_INITIALIZER; + char *optstr; int bootable = 0; virDomainDiskDefPtr disk = vm->def->disks[i]; int idx = virDiskNameToIndex(disk->dst); @@ -912,7 +926,6 @@ int qemudBuildCommandLine(virConnectPtr conn, case VIR_DOMAIN_DISK_DEVICE_CDROM: bootable = bootCD; bootCD = 0; - media = "media=cdrom,"; break; case VIR_DOMAIN_DISK_DEVICE_FLOPPY: bootable = bootFloppy; @@ -924,18 +937,28 @@ int qemudBuildCommandLine(virConnectPtr conn, break; } - snprintf(opt, PATH_MAX, "file=%s,if=%s,%sindex=%d%s%s", - disk->src ? disk->src : "", bus, - media ? media : "", - idx, - bootable && - disk->device == VIR_DOMAIN_DISK_DEVICE_DISK - ? ",boot=on" : "", - disk->shared && ! disk->readonly - ? ",cache=off" : ""); + virBufferVSprintf(&opt, "file=%s", disk->src ? disk->src : ""); + virBufferVSprintf(&opt, ",if=%s", bus); + if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + virBufferAddLit(&opt, ",media=cdrom"); + virBufferVSprintf(&opt, ",index=%d", idx); + if (bootable && + disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) + virBufferAddLit(&opt, ",boot=on"); + if (disk->shared && !disk->readonly) + virBufferAddLit(&opt, ",cache=off"); + if (disk->driverType) + virBufferVSprintf(&opt, ",fmt=%s", disk->driverType); + + if (virBufferError(&opt)) { + virReportOOMError(conn); + goto error; + } + + optstr = virBufferContentAndReset(&opt); ADD_ARG_LIT("-drive"); - ADD_ARG_LIT(opt); + ADD_ARG(optstr); } } else { for (i = 0 ; i < vm->def->ndisks ; i++) { diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args new file mode 100644 index 0000000000000000000000000000000000000000..cc76fa498317e9df7077847f3e29420300ad9b83 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args @@ -0,0 +1 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -pidfile /nowhere/QEMUGuest1.pid -no-acpi -boot c -drive file=/dev/HostVG/QEMUGuest1,if=ide,index=0,boot=on,fmt=qcow2 -drive file=/dev/HostVG/QEMUGuest2,if=ide,media=cdrom,index=2,fmt=raw -net none -serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml new file mode 100644 index 0000000000000000000000000000000000000000..2537da61047df874e646ac4104944f74ba44cdb1 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml @@ -0,0 +1,29 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219200 + 219200 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + + + + + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 17684fdd9d6f745111868a23a51195bb41202fa3..296256149da5c764a162903ad1a4b754a62a2702 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -194,6 +194,8 @@ mymain(int argc, char **argv) QEMUD_CMD_FLAG_DRIVE_BOOT); DO_TEST("disk-drive-boot-cdrom", QEMUD_CMD_FLAG_DRIVE | QEMUD_CMD_FLAG_DRIVE_BOOT); + DO_TEST("disk-drive-fmt-qcow", QEMUD_CMD_FLAG_DRIVE | + QEMUD_CMD_FLAG_DRIVE_BOOT); DO_TEST("disk-usb", 0); DO_TEST("graphics-vnc", 0); DO_TEST("graphics-sdl", 0); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index e5606094e6a597a9f2c2b964ebb75469002179de..5ab3adfc0d8312a88f7bc5c1d7d15a8340337445 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -97,6 +97,7 @@ mymain(int argc, char **argv) DO_TEST("disk-many"); DO_TEST("disk-xenvbd"); DO_TEST("disk-usb"); + DO_TEST("disk-drive-fmt-qcow"); DO_TEST("graphics-vnc"); DO_TEST("graphics-sdl"); DO_TEST("graphics-sdl-fullscreen");