mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-26 14:35:18 +00:00
qemu: Unify formatting of RBD sources
This commit is contained in:
parent
d94fd0c9c2
commit
b384e2b4d7
@ -3253,72 +3253,6 @@ cleanup:
|
|||||||
return secret;
|
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)
|
static int qemuAddRBDHost(virDomainDiskDefPtr disk, char *hostport)
|
||||||
{
|
{
|
||||||
@ -3693,6 +3627,7 @@ qemuBuildNetworkDriveURI(int protocol,
|
|||||||
char *ret = NULL;
|
char *ret = NULL;
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
virURIPtr uri = NULL;
|
virURIPtr uri = NULL;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
switch ((enum virDomainDiskProtocol) protocol) {
|
switch ((enum virDomainDiskProtocol) protocol) {
|
||||||
case VIR_DOMAIN_DISK_PROTOCOL_NBD:
|
case VIR_DOMAIN_DISK_PROTOCOL_NBD:
|
||||||
@ -3835,10 +3770,51 @@ qemuBuildNetworkDriveURI(int protocol,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DISK_PROTOCOL_RBD:
|
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:
|
case VIR_DOMAIN_DISK_PROTOCOL_LAST:
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("network disk protocol '%s' not supported"),
|
|
||||||
virDomainDiskProtocolTypeToString(protocol));
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3861,17 +3837,26 @@ qemuBuildDriveURIString(virConnectPtr conn,
|
|||||||
|
|
||||||
virBufferAddLit(opt, "file=");
|
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) {
|
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,
|
if (!(secret = qemuGetSecretString(conn,
|
||||||
virDomainDiskProtocolTypeToString(disk->protocol),
|
virDomainDiskProtocolTypeToString(disk->protocol),
|
||||||
false,
|
encode,
|
||||||
disk->auth.secretType,
|
disk->auth.secretType,
|
||||||
disk->auth.username,
|
disk->auth.username,
|
||||||
disk->auth.secret.uuid,
|
disk->auth.secret.uuid,
|
||||||
disk->auth.secret.usage,
|
disk->auth.secret.usage,
|
||||||
VIR_SECRET_USAGE_TYPE_ISCSI)))
|
secretType)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4019,28 +4004,10 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|||||||
disk->src);
|
disk->src);
|
||||||
else
|
else
|
||||||
virBufferEscape(&opt, ',', ",", "file=fat:%s,", disk->src);
|
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:
|
} else if (actualType == VIR_DOMAIN_DISK_TYPE_NETWORK) {
|
||||||
case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
|
if (qemuBuildDriveURIString(conn, disk, &opt) < 0)
|
||||||
case VIR_DOMAIN_DISK_PROTOCOL_TFTP:
|
goto error;
|
||||||
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 {
|
} else {
|
||||||
if ((actualType == VIR_DOMAIN_DISK_TYPE_BLOCK) &&
|
if ((actualType == VIR_DOMAIN_DISK_TYPE_BLOCK) &&
|
||||||
(disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
|
(disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user