[libvirt] [PATCH V2] Allow a HTTP URL for cdrom ISO image

From: Aline Manera <alinefm@br.ibm.com> V1 -> V2: - Use -drive instead of legacy -cdrom option Aline Manera (1): Allow a HTTP URL for cdrom ISO image src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 7 ++++ .../qemuxml2argv-disk-cdrom-network.args | 5 +++ .../qemuxml2argv-disk-cdrom-network.xml | 37 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml -- 1.7.10.4

From: Aline Manera <alinefm@br.ibm.com> QEMU/KVM already allows an HTTP URL for the cdrom ISO image so add this support to libvirt as well. The xml should be as following: <disk type='network' device='cdrom'> <source protocol='http' name='/url/path'> <host name='host.name' port='80'/> </source> </disk> Signed-off-by: Aline Manera <alinefm@br.ibm.com> --- src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 7 ++++ .../qemuxml2argv-disk-cdrom-network.args | 5 +++ .../qemuxml2argv-disk-cdrom-network.xml | 37 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ea49d2c..461cc95 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -261,7 +261,8 @@ VIR_ENUM_IMPL(virDomainDiskProtocol, VIR_DOMAIN_DISK_PROTOCOL_LAST, "rbd", "sheepdog", "gluster", - "iscsi") + "iscsi", + "http") VIR_ENUM_IMPL(virDomainDiskProtocolTransport, VIR_DOMAIN_DISK_PROTO_TRANS_LAST, "tcp", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 500a5be..77fa00c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -540,6 +540,7 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG, VIR_DOMAIN_DISK_PROTOCOL_GLUSTER, VIR_DOMAIN_DISK_PROTOCOL_ISCSI, + VIR_DOMAIN_DISK_PROTOCOL_HTTP, VIR_DOMAIN_DISK_PROTOCOL_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f151173..a7c6c8e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3826,6 +3826,13 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferEscape(&opt, ',', ",", "%s,", disk->src); } break; + + case VIR_DOMAIN_DISK_PROTOCOL_HTTP: { + virBufferAsprintf(&opt, "file=http://%s:%s", + disk->hosts->name, + disk->hosts->port ? disk->hosts->port : "80"); + virBufferEscape(&opt, ',', ",", "%s,", disk->src); + } } } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) { if (qemuBuildVolumeString(conn, disk, &opt) < 0) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args new file mode 100644 index 0000000..c40ee44 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/kvm -S \ +-M pc-1.2 -m 1024 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -boot d -usb \ +-drive file=http://mirror.cogentco.com:80/pub/linux/fedora/linux/releases/19/Fedora/x86_... -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml new file mode 100644 index 0000000..464a36f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml @@ -0,0 +1,37 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/kvm</emulator> + <disk type='network' device='cdrom'> + <driver name='qemu' type='raw'/> + <source protocol='http' name='/pub/linux/fedora/linux/releases/19/Fedora/x86_64/iso/Fedora-19-x86_64-netinst.iso'> + <host name='mirror.cogentco.com' port='80'/> + </source> + <target dev='hdc' bus='ide'/> + <readonly/> + <alias name='ide0-1-0'/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 3a3c304..aeb1b4d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -443,6 +443,8 @@ mymain(void) DO_TEST("hugepages", QEMU_CAPS_MEM_PATH); DO_TEST("nosharepages", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MEM_MERGE); DO_TEST("disk-cdrom", NONE); + DO_TEST("disk-cdrom-network", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE, + QEMU_CAPS_DRIVE); DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE); DO_TEST("disk-cdrom-tray", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_TX_ALG); -- 1.7.10.4

On 08/21/2013 01:31 PM, Aline Manera wrote:
From: Aline Manera <alinefm@br.ibm.com>
QEMU/KVM already allows an HTTP URL for the cdrom ISO image so add this support to libvirt as well. The xml should be as following:
<disk type='network' device='cdrom'> <source protocol='http' name='/url/path'> <host name='host.name' port='80'/> </source> </disk>
Signed-off-by: Aline Manera <alinefm@br.ibm.com> --- src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 7 ++++ .../qemuxml2argv-disk-cdrom-network.args | 5 +++ .../qemuxml2argv-disk-cdrom-network.xml | 37 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml
You also need to patch docs/schemas/domaincommon.rng to allow 'virt-xml-validate' to accept the new syntax, as well as docs/formatdomain.html.in to describe how to use the new syntax. The .rng portion is especially important, as your patch fails 'make check' without it.
+++ b/src/qemu/qemu_command.c @@ -3826,6 +3826,13 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferEscape(&opt, ',', ",", "%s,", disk->src); } break; + + case VIR_DOMAIN_DISK_PROTOCOL_HTTP: { + virBufferAsprintf(&opt, "file=http://%s:%s", + disk->hosts->name, + disk->hosts->port ? disk->hosts->port : "80"); + virBufferEscape(&opt, ',', ",", "%s,", disk->src); + }
Missing a break. Doesn't bite now, but makes future maintenance uglier.
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/kvm -S \ +-M pc-1.2 -m 1024 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -boot d -usb \ +-drive file=http://mirror.cogentco.com:80/pub/linux/fedora/linux/releases/19/Fedora/x86_... -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
Fails 'make syntax-check': prohibit_long_lines tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args:4:-drive file=http://mirror.cogentco.com:80/pub/linux/fedora/linux/releases/19/Fedora/x86_... -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ maint.mk: Wrap long lines in expected output files Getting closer, though :) -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Wed, Aug 21, 2013 at 04:31:03PM -0300, Aline Manera wrote:
From: Aline Manera <alinefm@br.ibm.com>
QEMU/KVM already allows an HTTP URL for the cdrom ISO image so add this support to libvirt as well. The xml should be as following:
<disk type='network' device='cdrom'> <source protocol='http' name='/url/path'> <host name='host.name' port='80'/> </source> </disk>
Signed-off-by: Aline Manera <alinefm@br.ibm.com> --- src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 7 ++++ .../qemuxml2argv-disk-cdrom-network.args | 5 +++ .../qemuxml2argv-disk-cdrom-network.xml | 37 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ea49d2c..461cc95 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -261,7 +261,8 @@ VIR_ENUM_IMPL(virDomainDiskProtocol, VIR_DOMAIN_DISK_PROTOCOL_LAST, "rbd", "sheepdog", "gluster", - "iscsi") + "iscsi", + "http")
VIR_ENUM_IMPL(virDomainDiskProtocolTransport, VIR_DOMAIN_DISK_PROTO_TRANS_LAST, "tcp", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 500a5be..77fa00c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -540,6 +540,7 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG, VIR_DOMAIN_DISK_PROTOCOL_GLUSTER, VIR_DOMAIN_DISK_PROTOCOL_ISCSI, + VIR_DOMAIN_DISK_PROTOCOL_HTTP,
VIR_DOMAIN_DISK_PROTOCOL_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f151173..a7c6c8e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3826,6 +3826,13 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferEscape(&opt, ',', ",", "%s,", disk->src); } break; + + case VIR_DOMAIN_DISK_PROTOCOL_HTTP: { + virBufferAsprintf(&opt, "file=http://%s:%s", + disk->hosts->name, + disk->hosts->port ? disk->hosts->port : "80"); + virBufferEscape(&opt, ',', ",", "%s,", disk->src); + }
No need for {} around case blocks which don't have local variables defined. As Eric mentions, missing 'break' here. While you're doing this, how about also adding 'ftp' protocol support ?
} } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) { if (qemuBuildVolumeString(conn, disk, &opt) < 0)
Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 08/22/2013 10:01 AM, Daniel P. Berrange wrote:
On Wed, Aug 21, 2013 at 04:31:03PM -0300, Aline Manera wrote:
From: Aline Manera <alinefm@br.ibm.com>
QEMU/KVM already allows an HTTP URL for the cdrom ISO image so add this support to libvirt as well. The xml should be as following:
<disk type='network' device='cdrom'> <source protocol='http' name='/url/path'> <host name='host.name' port='80'/> </source> </disk>
Signed-off-by: Aline Manera <alinefm@br.ibm.com> --- src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 7 ++++ .../qemuxml2argv-disk-cdrom-network.args | 5 +++ .../qemuxml2argv-disk-cdrom-network.xml | 37 ++++++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ea49d2c..461cc95 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -261,7 +261,8 @@ VIR_ENUM_IMPL(virDomainDiskProtocol, VIR_DOMAIN_DISK_PROTOCOL_LAST, "rbd", "sheepdog", "gluster", - "iscsi") + "iscsi", + "http")
VIR_ENUM_IMPL(virDomainDiskProtocolTransport, VIR_DOMAIN_DISK_PROTO_TRANS_LAST, "tcp", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 500a5be..77fa00c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -540,6 +540,7 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG, VIR_DOMAIN_DISK_PROTOCOL_GLUSTER, VIR_DOMAIN_DISK_PROTOCOL_ISCSI, + VIR_DOMAIN_DISK_PROTOCOL_HTTP,
VIR_DOMAIN_DISK_PROTOCOL_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f151173..a7c6c8e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3826,6 +3826,13 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferEscape(&opt, ',', ",", "%s,", disk->src); } break; + + case VIR_DOMAIN_DISK_PROTOCOL_HTTP: { + virBufferAsprintf(&opt, "file=http://%s:%s", + disk->hosts->name, + disk->hosts->port ? disk->hosts->port : "80"); + virBufferEscape(&opt, ',', ",", "%s,", disk->src); + } No need for {} around case blocks which don't have local variables defined. As Eric mentions, missing 'break' here.
While you're doing this, how about also adding 'ftp' protocol support ?
Sure! I will do a patch for it too.
} } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) { if (qemuBuildVolumeString(conn, disk, &opt) < 0)
Daniel
participants (3)
-
Aline Manera
-
Daniel P. Berrange
-
Eric Blake