storage: rbd: Implement support for passing config file option

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.
This commit is contained in:
Peter Krempa 2014-11-11 17:31:24 +01:00
parent 0255660658
commit b7d1bee2b9
8 changed files with 53 additions and 2 deletions

View File

@ -1680,6 +1680,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'>
@ -2023,6 +2024,14 @@
source for storage protocols.
Supported for 'rbd' <span class="since">since 1.2.11 (QEMU only).</span>
</dd>
<dt><code>config</code></dt>
<dd>
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>
</dd>
</dl>
<p>

View File

@ -1460,6 +1460,14 @@
<empty/>
</element>
</optional>
<optional>
<element name="config">
<attribute name="file">
<ref name="absFilePath"/>
</attribute>
<empty/>
</element>
</optional>
<empty/>
</element>
</interleave>

View File

@ -3169,7 +3169,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) {
@ -3178,6 +3179,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;
@ -16167,7 +16178,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");
@ -16193,6 +16204,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");
}

View File

@ -3013,6 +3013,9 @@ qemuBuildNetworkDriveURI(virStorageSourcePtr src,
}
}
if (src->configFile)
virBufferEscape(&buf, '\\', ":", ":conf=%s", src->configFile);
if (virBufferCheckError(&buf) < 0)
goto cleanup;

View File

@ -1849,6 +1849,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;
@ -2349,6 +2350,10 @@ virStorageSourceParseRBDColonString(const char *rbdstr,
}
}
if (STRPREFIX(p, "conf=") &&
VIR_STRDUP(src->configFile, p + strlen("conf=")) < 0)
goto error;
p = next;
}
VIR_FREE(options);

View File

@ -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;

View File

@ -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

View File

@ -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'/>