From 3460bd35cb5a9fdd08af1c0cb266f67d4336e494 Mon Sep 17 00:00:00 2001 Message-Id: <3460bd35cb5a9fdd08af1c0cb266f67d4336e494@dist-git> From: Peter Krempa Date: Wed, 26 Feb 2014 14:55:00 +0100 Subject: [PATCH] qemu: Unify formatting of RBD sources https://bugzilla.redhat.com/show_bug.cgi?id=1032370 (cherry picked from commit b384e2b4d71702abb45c749b7d738870cef5d9b7) Signed-off-by: Jiri Denemark --- src/qemu/qemu_command.c | 150 ++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 89 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c1dab06..e1af654 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3173,72 +3173,6 @@ cleanup: return secret; } -static int -qemuBuildRBDString(virConnectPtr conn, - virDomainDiskDefPtr disk, - virBufferPtr opt) -{ - size_t i; - int ret = 0; - char *secret = NULL; - - if (strchr(disk->src, ':')) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("':' not allowed in RBD source volume name '%s'"), - disk->src); - return -1; - } - - virBufferEscape(opt, ',', ",", "rbd:%s", disk->src); - if (disk->auth.username) { - virBufferEscape(opt, '\\', ":", ":id=%s", disk->auth.username); - /* Get the secret string using the virDomainDiskDef - * NOTE: qemu/librbd wants it base64 encoded - */ - if (!(secret = qemuGetSecretString(conn, "rbd", true, - disk->auth.secretType, - disk->auth.username, - disk->auth.secret.uuid, - disk->auth.secret.usage, - VIR_SECRET_USAGE_TYPE_CEPH))) - goto error; - - - virBufferEscape(opt, '\\', ":", - ":key=%s:auth_supported=cephx\\;none", - secret); - } else { - virBufferAddLit(opt, ":auth_supported=none"); - } - - if (disk->nhosts > 0) { - virBufferAddLit(opt, ":mon_host="); - for (i = 0; i < disk->nhosts; ++i) { - if (i) { - virBufferAddLit(opt, "\\;"); - } - - /* assume host containing : is ipv6 */ - if (strchr(disk->hosts[i].name, ':')) { - virBufferEscape(opt, '\\', ":", "[%s]", disk->hosts[i].name); - } else { - virBufferAsprintf(opt, "%s", disk->hosts[i].name); - } - if (disk->hosts[i].port) { - virBufferAsprintf(opt, "\\:%s", disk->hosts[i].port); - } - } - } - -cleanup: - VIR_FREE(secret); - - return ret; - -error: - ret = -1; - goto cleanup; -} static int qemuAddRBDHost(virDomainDiskDefPtr disk, char *hostport) { @@ -3599,6 +3533,7 @@ qemuBuildNetworkDriveURI(int protocol, char *ret = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; virURIPtr uri = NULL; + size_t i; switch ((enum virDomainDiskProtocol) protocol) { case VIR_DOMAIN_DISK_PROTOCOL_NBD: @@ -3736,10 +3671,51 @@ qemuBuildNetworkDriveURI(int protocol, break; case VIR_DOMAIN_DISK_PROTOCOL_RBD: + if (strchr(src, ':')) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("':' not allowed in RBD source volume name '%s'"), + src); + goto cleanup; + } + + virBufferStrcat(&buf, "rbd:", src, NULL); + + if (username) { + virBufferEscape(&buf, '\\', ":", ":id=%s", username); + virBufferEscape(&buf, '\\', ":", + ":key=%s:auth_supported=cephx\\;none", + secret); + } else { + virBufferAddLit(&buf, ":auth_supported=none"); + } + + if (nhosts > 0) { + virBufferAddLit(&buf, ":mon_host="); + for (i = 0; i < nhosts; i++) { + if (i) + virBufferAddLit(&buf, "\\;"); + + /* assume host containing : is ipv6 */ + if (strchr(hosts[i].name, ':')) + virBufferEscape(&buf, '\\', ":", "[%s]", hosts[i].name); + else + virBufferAsprintf(&buf, "%s", hosts[i].name); + + if (hosts[i].port) + virBufferAsprintf(&buf, "\\:%s", hosts[i].port); + } + } + + if (virBufferError(&buf) < 0) { + virReportOOMError(); + goto cleanup; + } + + ret = virBufferContentAndReset(&buf); + break; + + case VIR_DOMAIN_DISK_PROTOCOL_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("network disk protocol '%s' not supported"), - virDomainDiskProtocolTypeToString(protocol)); goto cleanup; } @@ -3762,17 +3738,26 @@ qemuBuildDriveURIString(virConnectPtr conn, virBufferAddLit(opt, "file="); - if (disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_ISCSI && + if ((disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_ISCSI || + disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) && disk->auth.username) { - /* Get the secret string using the virDomainDiskDef */ + bool encode = false; + int secretType = VIR_SECRET_USAGE_TYPE_ISCSI; + + if (disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) { + /* qemu requires the secret to be encoded for RBD */ + encode = true; + secretType = VIR_SECRET_USAGE_TYPE_CEPH; + } + if (!(secret = qemuGetSecretString(conn, virDomainDiskProtocolTypeToString(disk->protocol), - false, + encode, disk->auth.secretType, disk->auth.username, disk->auth.secret.uuid, disk->auth.secret.usage, - VIR_SECRET_USAGE_TYPE_ISCSI))) + secretType))) goto cleanup; } @@ -3918,23 +3903,10 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, disk->src); else virBufferEscape(&opt, ',', ",", "file=fat:%s,", disk->src); - } else if (actualType == VIR_DOMAIN_DISK_TYPE_NETWORK) { - switch (disk->protocol) { - case VIR_DOMAIN_DISK_PROTOCOL_RBD: - virBufferAddLit(&opt, "file="); - if (qemuBuildRBDString(conn, disk, &opt) < 0) - goto error; - virBufferAddChar(&opt, ','); - break; - case VIR_DOMAIN_DISK_PROTOCOL_NBD: - case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG: - case VIR_DOMAIN_DISK_PROTOCOL_GLUSTER: - case VIR_DOMAIN_DISK_PROTOCOL_ISCSI: - if (qemuBuildDriveURIString(conn, disk, &opt) < 0) - goto error; - break; - } + } else if (actualType == VIR_DOMAIN_DISK_TYPE_NETWORK) { + if (qemuBuildDriveURIString(conn, disk, &opt) < 0) + goto error; } else { if ((actualType == VIR_DOMAIN_DISK_TYPE_BLOCK) && (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) { -- 1.9.0