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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list