[libvirt] [PATCHv1.5 10/27] qemu: Unify formatting of RBD sources
Michal Privoznik
mprivozn at redhat.com
Wed Nov 27 11:15:54 UTC 2013
On 26.11.2013 17:48, Peter Krempa wrote:
> ---
> src/qemu/qemu_command.c | 155 +++++++++++++++++++-----------------------------
> 1 file changed, 61 insertions(+), 94 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 15a6e9b..799209d 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -3253,72 +3253,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)
> {
> @@ -3693,6 +3627,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:
> @@ -3835,10 +3770,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;
> }
>
> @@ -3861,17 +3837,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;
> }
>
> @@ -4019,28 +4004,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_TFTP:
> - case VIR_DOMAIN_DISK_PROTOCOL_FTPS:
> - case VIR_DOMAIN_DISK_PROTOCOL_FTP:
> - case VIR_DOMAIN_DISK_PROTOCOL_HTTPS:
> - case VIR_DOMAIN_DISK_PROTOCOL_HTTP:
> - 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)) {
>
ACK
Michal
More information about the libvir-list
mailing list