Here is a re-based re-submission of my patches to implement RBD storage pool support for
QEMU domains. Nothing in it has changed other than it has been rebased against the latest.
The race condition I located still exists, but I have some patches forthcoming to address
that issue. The code here still works well for me, but I only have the one host to test
this on.
If possible, I would like to try and get this merged for the 1.2.1 release cycle, so that
other users can benefit from the addition of added storage pool support. As always, if you
find any problems with my patches, please let me know, and I will fix them as soon as I
can.
Adam Walters (3):
qemu: conf: Implement qemuAddRBDPoolSourceHost function
qemu: conf: Implement RBD storage pool support
domain: conf: Fix secret type checking
src/conf/domain_conf.c | 6 +++--
src/qemu/qemu_conf.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 65 insertions(+), 3 deletions(-)
--
1.8.5.2
Show replies by date
This function is a helper function that grabs RBD hosts from a storage pool definition,
and applies them to the domain's disk defi
nitions at runtime. This is a pre-requisite for RBD storage pool support in the domain
XML.
Signed-off-by: Adam Walters <adam(a)pandorasboxen.com>
---
src/qemu/qemu_conf.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 4378791..2d42c3b 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1247,6 +1247,45 @@ cleanup:
}
static int
+qemuAddRBDPoolSourceHost(virDomainDiskDefPtr def,
+ virStoragePoolDefPtr pooldef)
+{
+ int ret = -1;
+ size_t i = 0;
+ char **tokens = NULL;
+
+ def->nhosts = pooldef->source.nhost;
+
+ if (VIR_ALLOC_N(def->hosts, def->nhosts) < 0)
+ goto cleanup;
+
+ for (i = 0; i < def->nhosts; i++) {
+ if (VIR_STRDUP(def->hosts[i].name, pooldef->source.hosts[i].name) < 0)
+ goto cleanup;
+
+ if (virAsprintf(&def->hosts[i].port, "%d",
+ pooldef->source.hosts[i].port ?
+ pooldef->source.hosts[i].port :
+ 6789) < 0)
+ goto cleanup;
+
+ /* Storage pools have not supported these 2 attributes yet,
+ * use the defaults.
+ */
+ def->hosts[i].transport = VIR_DOMAIN_DISK_PROTO_TRANS_TCP;
+ def->hosts[i].socket = NULL;
+ }
+
+ def->protocol = VIR_DOMAIN_DISK_PROTOCOL_RBD;
+
+ ret = 0;
+
+cleanup:
+ virStringFreeList(tokens);
+ return ret;
+}
+
+static int
qemuTranslateDiskSourcePoolAuth(virDomainDiskDefPtr def,
virStoragePoolDefPtr pooldef)
{
--
1.8.5.2
This patch modifies the qemuTranslateDiskSourcePool function to add RBD storage pool
support. The code is heavily based off of the existing iSCSI code, but modified for RBD
support. The modification calls the qemuAddRBDPoolSourceHost from my previous patch, along
with setting up the ceph user and secret, if applicable.
Signed-off-by: Adam Walters <adam(a)pandorasboxen.com>
---
src/qemu/qemu_conf.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 2d42c3b..c28908a 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1478,8 +1478,29 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
}
break;
- case VIR_STORAGE_POOL_MPATH:
case VIR_STORAGE_POOL_RBD:
+ if (def->startupPolicy) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("'startupPolicy' is only valid for "
+ "'file' type volume"));
+ goto cleanup;
+ }
+
+ def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_NETWORK;
+ def->protocol = VIR_DOMAIN_DISK_PROTOCOL_RBD;
+
+ if (!(def->src = virStorageVolGetPath(vol)))
+ goto cleanup;
+
+ if (qemuTranslateDiskSourcePoolAuth(def, pooldef) < 0)
+ goto cleanup;
+
+ if (qemuAddRBDPoolSourceHost(def, pooldef) < 0)
+ goto cleanup;
+
+ break;
+
+ case VIR_STORAGE_POOL_MPATH:
case VIR_STORAGE_POOL_SHEEPDOG:
case VIR_STORAGE_POOL_GLUSTER:
case VIR_STORAGE_POOL_LAST:
--
1.8.5.2
This patch fixes the secret type checking done in the virDomainDiskDefParseXML function.
Previously, it would not allow any volumes that utilized a secret. This patch is a simple
bypass of the checking code for volumes.
Signed-off-by: Adam Walters <adam(a)pandorasboxen.com>
---
src/conf/domain_conf.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0079234..80537cd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -5369,7 +5369,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
cur = cur->next;
}
- if (auth_secret_usage != -1 && auth_secret_usage != expected_secret_usage) {
+ if (auth_secret_usage != -1 && auth_secret_usage != expected_secret_usage
&&
+ def->type != VIR_DOMAIN_DISK_TYPE_VOLUME) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("invalid secret type '%s'"),
virSecretUsageTypeTypeToString(auth_secret_usage));
@@ -18107,7 +18108,8 @@ virDomainDiskDefForeachPath(virDomainDiskDefPtr disk,
if (!disk->src || disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK ||
(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
disk->srcpool &&
- disk->srcpool->mode == VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT))
+ (disk->srcpool->mode == VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT ||
+ disk->srcpool->actualtype == VIR_DOMAIN_DISK_TYPE_NETWORK)))
return 0;
if (iter(disk, disk->src, 0, opaque) < 0)
--
1.8.5.2