To be able to express some use cases of the RBD backing with libvirt, we need to be able to specify a config file for the RBD client to qemu as that is one of the commonly used options. --- docs/formatdomain.html.in | 8 ++++++++ docs/schemas/domaincommon.rng | 8 ++++++++ src/conf/domain_conf.c | 18 ++++++++++++++++-- src/qemu/qemu_command.c | 3 +++ src/util/virstoragefile.c | 5 +++++ src/util/virstoragefile.h | 2 ++ .../qemuxml2argv-disk-drive-network-rbd.args | 2 ++ .../qemuxml2argv-disk-drive-network-rbd.xml | 8 ++++++++ 8 files changed, 52 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index fc35c5a..62bca45 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1677,6 +1677,7 @@ <source protocol="rbd" name="image_name2"> <host name="hostname" port="7000"/> <snapshot name="snapname"/> + <config file="/path/to/file"/> </source> <target dev="hdc" bus="ide"/> <auth username='myuser'> @@ -2015,6 +2016,13 @@ source for storage systems such as rbd. (<span class="since">Since 1.2.11 for the qemu driver.</span>) </dd> + <dt><code>config</code></dt> + <dd> + The <code>file</code> attribute of <code>config</code> element + allows to specify a configuration file for storage backends. + + (<span class="since">Since 1.2.11</span> for 'rbd' disks in qemu) + </dd> </dl> <p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 154d222..6b2845a 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1460,6 +1460,14 @@ <empty/> </element> </optional> + <optional> + <element name="config"> + <attribute name="file"> + <ref name="absFilePath"/> + </attribute> + <empty/> + </element> + </optional> <empty/> </element> </interleave> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 37a8042..a9a26a4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3166,7 +3166,8 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev, if (dev->type == VIR_DOMAIN_DEVICE_DISK) { virDomainDiskDefPtr disk = dev->data.disk; - /* internal snapshots are currently supported only with rbd: */ + /* internal snapshots and config files are currently supported + * only with rbd: */ if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK && disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) { if (disk->src->snapshot) { @@ -3175,6 +3176,13 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev, "only with 'rbd' disks")); return -1; } + + if (disk->src->configFile) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("<config> element is currently supported " + "only with 'rbd' disks")); + return -1; + } } } @@ -5395,6 +5403,9 @@ virDomainDiskSourceParse(xmlNodePtr node, /* snapshot currently works only for remote disks */ src->snapshot = virXPathString("string(./snapshot/@name)", ctxt); + /* config file currently only works with remote disks */ + src->configFile = virXPathString("string(./config/@file)", ctxt); + if (virDomainStorageHostParse(node, &src->hosts, &src->nhosts) < 0) goto cleanup; break; @@ -16179,7 +16190,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, VIR_FREE(path); - if (src->nhosts == 0 && !src->snapshot) { + if (src->nhosts == 0 && !src->snapshot && !src->configFile) { virBufferAddLit(buf, "/>\n"); } else { virBufferAddLit(buf, ">\n"); @@ -16205,6 +16216,9 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, virBufferEscapeString(buf, "<snapshot name='%s'/>\n", src->snapshot); + virBufferEscapeString(buf, "<config file='%s'/>\n", + src->configFile); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</source>\n"); } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7923842..a19ad7e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3018,6 +3018,9 @@ qemuBuildNetworkDriveURI(virStorageSourcePtr src, } } + if (src->configFile) + virBufferEscape(&buf, '\\', ":", ":conf=%s", src->configFile); + if (virBufferCheckError(&buf) < 0) goto cleanup; diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index efd51d2..c5a309d 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1850,6 +1850,7 @@ virStorageSourceCopy(const virStorageSource *src, VIR_STRDUP(ret->relPath, src->relPath) < 0 || VIR_STRDUP(ret->backingStoreRaw, src->backingStoreRaw) < 0 || VIR_STRDUP(ret->snapshot, src->snapshot) < 0 || + VIR_STRDUP(ret->configFile, src->configFile) < 0 || VIR_STRDUP(ret->compat, src->compat) < 0) goto error; @@ -2348,6 +2349,10 @@ virStorageSourceParseRBDColonString(const char *rbdstr, } } + if (STRPREFIX(p, "conf=") && + VIR_STRDUP(src->configFile, p + strlen("conf=")) < 0) + goto error; + p = next; } VIR_FREE(options); diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index caab0b4..578fbf2 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -239,6 +239,8 @@ struct _virStorageSource { int protocol; /* virStorageNetProtocol */ char *volume; /* volume name for remote storage */ char *snapshot; /* for storage systems supporting internal snapshots */ + char *configFile; /* some storage systems use config file as part of + the source definition */ size_t nhosts; virStorageNetHostDefPtr hosts; virStorageSourcePoolDefPtr srcpool; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args index e4f1389..f634e8d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args @@ -9,4 +9,6 @@ mon3.example.org\:6322,if=virtio,format=raw' \ -drive 'file=rbd:pool/image@foo:auth_supported=none:\ mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;\ mon3.example.org\:6322,if=virtio,format=raw' \ +-drive file=rbd:pool/image@foo:auth_supported=none:\ +conf=/blah/test.conf,if=virtio,format=raw \ -net none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml index f6accd8..9ffe633 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml @@ -46,6 +46,14 @@ </source> <target dev='vdc' bus='virtio'/> </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='rbd' name='pool/image'> + <snapshot name='foo'/> + <config file='/blah/test.conf'/> + </source> + <target dev='vdd' bus='virtio'/> + </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='pci' index='0' model='pci-root'/> -- 2.1.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list