On 11/12/2014 08:47 AM, Peter Krempa wrote:
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)
So this reads funny/strange... In particular, "...attribute of config
element allows to specify..."
Perhaps,
"The <code>file</code> attribute for the <code>config</code>
element
provides a fully qualified path to a configuration file to be provided
as a parameter to the client of a networked storage protocol. Supported
for 'rbd' <span class="since">since 1.2.11 (QEMU
only).</span>"
NOTE: Going for consistent usage w/ 11/12... previously snapshot had
"storage systems" and this has "storage backends". Since both seem
to
be keyed of which storage protocol is used, I went with storage protocol.
+ </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);
if (src->configfile)
Rest is fine, ACK
John
+ 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'/>