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">
|
<source protocol="rbd" name="image_name2">
|
||||||
<host name="hostname" port="7000"/>
|
<host name="hostname" port="7000"/>
|
||||||
<snapshot name="snapname"/>
|
<snapshot name="snapname"/>
|
||||||
|
<config file="/path/to/file"/>
|
||||||
</source>
|
</source>
|
||||||
<target dev="hdc" bus="ide"/>
|
<target dev="hdc" bus="ide"/>
|
||||||
<auth username='myuser'>
|
<auth username='myuser'>
|
||||||
@ -2023,6 +2024,14 @@
|
|||||||
source for storage protocols.
|
source for storage protocols.
|
||||||
Supported for 'rbd' <span class="since">since 1.2.11 (QEMU only).</span>
|
Supported for 'rbd' <span class="since">since 1.2.11 (QEMU only).</span>
|
||||||
</dd>
|
</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>
|
</dl>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
@ -1460,6 +1460,14 @@
|
|||||||
<empty/>
|
<empty/>
|
||||||
</element>
|
</element>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<element name="config">
|
||||||
|
<attribute name="file">
|
||||||
|
<ref name="absFilePath"/>
|
||||||
|
</attribute>
|
||||||
|
<empty/>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
<empty/>
|
<empty/>
|
||||||
</element>
|
</element>
|
||||||
</interleave>
|
</interleave>
|
||||||
|
@ -3169,7 +3169,8 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
|
|||||||
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
||||||
virDomainDiskDefPtr disk = dev->data.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 &&
|
if (virStorageSourceGetActualType(disk->src) != VIR_STORAGE_TYPE_NETWORK &&
|
||||||
disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) {
|
disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) {
|
||||||
if (disk->src->snapshot) {
|
if (disk->src->snapshot) {
|
||||||
@ -3178,6 +3179,13 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
|
|||||||
"only with 'rbd' disks"));
|
"only with 'rbd' disks"));
|
||||||
return -1;
|
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 */
|
/* snapshot currently works only for remote disks */
|
||||||
src->snapshot = virXPathString("string(./snapshot/@name)", ctxt);
|
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)
|
if (virDomainStorageHostParse(node, &src->hosts, &src->nhosts) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
break;
|
break;
|
||||||
@ -16167,7 +16178,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
|
|||||||
|
|
||||||
VIR_FREE(path);
|
VIR_FREE(path);
|
||||||
|
|
||||||
if (src->nhosts == 0 && !src->snapshot) {
|
if (src->nhosts == 0 && !src->snapshot && !src->configFile) {
|
||||||
virBufferAddLit(buf, "/>\n");
|
virBufferAddLit(buf, "/>\n");
|
||||||
} else {
|
} else {
|
||||||
virBufferAddLit(buf, ">\n");
|
virBufferAddLit(buf, ">\n");
|
||||||
@ -16193,6 +16204,9 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
|
|||||||
virBufferEscapeString(buf, "<snapshot name='%s'/>\n",
|
virBufferEscapeString(buf, "<snapshot name='%s'/>\n",
|
||||||
src->snapshot);
|
src->snapshot);
|
||||||
|
|
||||||
|
virBufferEscapeString(buf, "<config file='%s'/>\n",
|
||||||
|
src->configFile);
|
||||||
|
|
||||||
virBufferAdjustIndent(buf, -2);
|
virBufferAdjustIndent(buf, -2);
|
||||||
virBufferAddLit(buf, "</source>\n");
|
virBufferAddLit(buf, "</source>\n");
|
||||||
}
|
}
|
||||||
|
@ -3013,6 +3013,9 @@ qemuBuildNetworkDriveURI(virStorageSourcePtr src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (src->configFile)
|
||||||
|
virBufferEscape(&buf, '\\', ":", ":conf=%s", src->configFile);
|
||||||
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
if (virBufferCheckError(&buf) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -1849,6 +1849,7 @@ virStorageSourceCopy(const virStorageSource *src,
|
|||||||
VIR_STRDUP(ret->relPath, src->relPath) < 0 ||
|
VIR_STRDUP(ret->relPath, src->relPath) < 0 ||
|
||||||
VIR_STRDUP(ret->backingStoreRaw, src->backingStoreRaw) < 0 ||
|
VIR_STRDUP(ret->backingStoreRaw, src->backingStoreRaw) < 0 ||
|
||||||
VIR_STRDUP(ret->snapshot, src->snapshot) < 0 ||
|
VIR_STRDUP(ret->snapshot, src->snapshot) < 0 ||
|
||||||
|
VIR_STRDUP(ret->configFile, src->configFile) < 0 ||
|
||||||
VIR_STRDUP(ret->compat, src->compat) < 0)
|
VIR_STRDUP(ret->compat, src->compat) < 0)
|
||||||
goto error;
|
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;
|
p = next;
|
||||||
}
|
}
|
||||||
VIR_FREE(options);
|
VIR_FREE(options);
|
||||||
|
@ -239,6 +239,8 @@ struct _virStorageSource {
|
|||||||
int protocol; /* virStorageNetProtocol */
|
int protocol; /* virStorageNetProtocol */
|
||||||
char *volume; /* volume name for remote storage */
|
char *volume; /* volume name for remote storage */
|
||||||
char *snapshot; /* for storage systems supporting internal snapshots */
|
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;
|
size_t nhosts;
|
||||||
virStorageNetHostDefPtr hosts;
|
virStorageNetHostDefPtr hosts;
|
||||||
virStorageSourcePoolDefPtr srcpool;
|
virStorageSourcePoolDefPtr srcpool;
|
||||||
|
@ -9,4 +9,6 @@ mon3.example.org\:6322,if=virtio,format=raw' \
|
|||||||
-drive 'file=rbd:pool/image@foo:auth_supported=none:\
|
-drive 'file=rbd:pool/image@foo:auth_supported=none:\
|
||||||
mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;\
|
mon_host=mon1.example.org\:6321\;mon2.example.org\:6322\;\
|
||||||
mon3.example.org\:6322,if=virtio,format=raw' \
|
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
|
-net none -serial none -parallel none
|
||||||
|
@ -46,6 +46,14 @@
|
|||||||
</source>
|
</source>
|
||||||
<target dev='vdc' bus='virtio'/>
|
<target dev='vdc' bus='virtio'/>
|
||||||
</disk>
|
</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='usb' index='0'/>
|
||||||
<controller type='ide' index='0'/>
|
<controller type='ide' index='0'/>
|
||||||
<controller type='pci' index='0' model='pci-root'/>
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user