mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 06:35:24 +00:00
qemu: Refactor qemuGetDriveSourceString to take virStorageSourcePtr
Refactor the function to avoid multiple wrappers splitting identical fields from the now common metadata struct. The refactor is done by folding in the wrapper used for disk sources which allows us to lookup secrets via the secret driver. This may allow using stored secrets for snapshot disk images too in the future.
This commit is contained in:
parent
cecd656604
commit
816f0f93ea
@ -3816,37 +3816,68 @@ qemuBuildNetworkDriveURI(int protocol,
|
||||
|
||||
|
||||
int
|
||||
qemuGetDriveSourceString(int type,
|
||||
const char *src,
|
||||
int protocol,
|
||||
size_t nhosts,
|
||||
virStorageNetHostDefPtr hosts,
|
||||
const char *username,
|
||||
const char *secret,
|
||||
char **path)
|
||||
qemuGetDriveSourceString(virStorageSourcePtr src,
|
||||
virConnectPtr conn,
|
||||
char **source)
|
||||
{
|
||||
*path = NULL;
|
||||
int actualType = virStorageSourceGetActualType(src);
|
||||
char *secret = NULL;
|
||||
char *username = NULL;
|
||||
int ret = -1;
|
||||
|
||||
switch ((enum virStorageType) type) {
|
||||
*source = NULL;
|
||||
|
||||
if (conn) {
|
||||
if (actualType == VIR_STORAGE_TYPE_NETWORK &&
|
||||
src->auth.username &&
|
||||
(src->protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI ||
|
||||
src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD)) {
|
||||
bool encode = false;
|
||||
int secretType = VIR_SECRET_USAGE_TYPE_ISCSI;
|
||||
const char *protocol = virStorageNetProtocolTypeToString(src->protocol);
|
||||
|
||||
username = src->auth.username;
|
||||
|
||||
if (src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
|
||||
/* qemu requires the secret to be encoded for RBD */
|
||||
encode = true;
|
||||
secretType = VIR_SECRET_USAGE_TYPE_CEPH;
|
||||
}
|
||||
|
||||
if (!(secret = qemuGetSecretString(conn,
|
||||
protocol,
|
||||
encode,
|
||||
src->auth.secretType,
|
||||
username,
|
||||
src->auth.secret.uuid,
|
||||
src->auth.secret.usage,
|
||||
secretType)))
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
switch ((enum virStorageType) actualType) {
|
||||
case VIR_STORAGE_TYPE_BLOCK:
|
||||
case VIR_STORAGE_TYPE_FILE:
|
||||
case VIR_STORAGE_TYPE_DIR:
|
||||
if (!src)
|
||||
return 1;
|
||||
if (!src->path) {
|
||||
ret = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (VIR_STRDUP(*path, src) < 0)
|
||||
return -1;
|
||||
if (VIR_STRDUP(*source, src->path) < 0)
|
||||
goto cleanup;
|
||||
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_TYPE_NETWORK:
|
||||
if (!(*path = qemuBuildNetworkDriveURI(protocol,
|
||||
src,
|
||||
nhosts,
|
||||
hosts,
|
||||
username,
|
||||
secret)))
|
||||
return -1;
|
||||
if (!(*source = qemuBuildNetworkDriveURI(src->protocol,
|
||||
src->path,
|
||||
src->nhosts,
|
||||
src->hosts,
|
||||
username,
|
||||
secret)))
|
||||
goto cleanup;
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_TYPE_VOLUME:
|
||||
@ -3855,52 +3886,7 @@ qemuGetDriveSourceString(int type,
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qemuDomainDiskGetSourceString(virConnectPtr conn,
|
||||
virDomainDiskDefPtr disk,
|
||||
char **source)
|
||||
{
|
||||
int actualType = virStorageSourceGetActualType(&disk->src);
|
||||
char *secret = NULL;
|
||||
int ret = -1;
|
||||
|
||||
*source = NULL;
|
||||
|
||||
if (actualType == VIR_STORAGE_TYPE_NETWORK &&
|
||||
disk->src.auth.username &&
|
||||
(disk->src.protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI ||
|
||||
disk->src.protocol == VIR_STORAGE_NET_PROTOCOL_RBD)) {
|
||||
bool encode = false;
|
||||
int secretType = VIR_SECRET_USAGE_TYPE_ISCSI;
|
||||
|
||||
if (disk->src.protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
|
||||
/* qemu requires the secret to be encoded for RBD */
|
||||
encode = true;
|
||||
secretType = VIR_SECRET_USAGE_TYPE_CEPH;
|
||||
}
|
||||
|
||||
if (!(secret = qemuGetSecretString(conn,
|
||||
virStorageNetProtocolTypeToString(disk->src.protocol),
|
||||
encode,
|
||||
disk->src.auth.secretType,
|
||||
disk->src.auth.username,
|
||||
disk->src.auth.secret.uuid,
|
||||
disk->src.auth.secret.usage,
|
||||
secretType)))
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = qemuGetDriveSourceString(actualType,
|
||||
disk->src.path,
|
||||
disk->src.protocol,
|
||||
disk->src.nhosts,
|
||||
disk->src.hosts,
|
||||
disk->src.auth.username,
|
||||
secret,
|
||||
source);
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(secret);
|
||||
@ -4003,7 +3989,7 @@ qemuBuildDriveStr(virConnectPtr conn,
|
||||
break;
|
||||
}
|
||||
|
||||
if (qemuDomainDiskGetSourceString(conn, disk, &source) < 0)
|
||||
if (qemuGetDriveSourceString(&disk->src, conn, &source) < 0)
|
||||
goto error;
|
||||
|
||||
if (source &&
|
||||
|
@ -314,13 +314,7 @@ qemuParseKeywords(const char *str,
|
||||
int *retnkeywords,
|
||||
int allowEmptyValue);
|
||||
|
||||
int qemuGetDriveSourceString(int type,
|
||||
const char *src,
|
||||
int protocol,
|
||||
size_t nhosts,
|
||||
virStorageNetHostDefPtr hosts,
|
||||
const char *username,
|
||||
const char *secret,
|
||||
char **path);
|
||||
|
||||
int qemuGetDriveSourceString(virStorageSourcePtr src,
|
||||
virConnectPtr conn,
|
||||
char **source);
|
||||
#endif /* __QEMU_COMMAND_H__*/
|
||||
|
@ -11999,23 +11999,6 @@ qemuDomainMigrateGetMaxSpeed(virDomainPtr dom,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainSnapshotDiskGetSourceString(virDomainSnapshotDiskDefPtr disk,
|
||||
char **source)
|
||||
{
|
||||
*source = NULL;
|
||||
|
||||
return qemuGetDriveSourceString(virStorageSourceGetActualType(&disk->src),
|
||||
disk->src.path,
|
||||
disk->src.protocol,
|
||||
disk->src.nhosts,
|
||||
disk->src.hosts,
|
||||
NULL,
|
||||
NULL,
|
||||
source);
|
||||
}
|
||||
|
||||
|
||||
typedef enum {
|
||||
VIR_DISK_CHAIN_NO_ACCESS,
|
||||
VIR_DISK_CHAIN_READ_ONLY,
|
||||
@ -12758,7 +12741,7 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
|
||||
if (virStorageFileInit(&snap->src) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainSnapshotDiskGetSourceString(snap, &source) < 0)
|
||||
if (qemuGetDriveSourceString(&snap->src, NULL, &source) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (VIR_STRDUP(newsource, snap->src.path) < 0)
|
||||
|
Loading…
Reference in New Issue
Block a user