mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 12:35:17 +00:00
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:
parent
0255660658
commit
b7d1bee2b9
@ -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>
|
||||
|
@ -1460,6 +1460,14 @@
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="config">
|
||||
<attribute name="file">
|
||||
<ref name="absFilePath"/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</interleave>
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -3013,6 +3013,9 @@ qemuBuildNetworkDriveURI(virStorageSourcePtr src,
|
||||
}
|
||||
}
|
||||
|
||||
if (src->configFile)
|
||||
virBufferEscape(&buf, '\\', ":", ":conf=%s", src->configFile);
|
||||
|
||||
if (virBufferCheckError(&buf) < 0)
|
||||
goto cleanup;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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'/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user