From 816f0f93ea64c0cb5a1d4ebb59689b1671042580 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 8 Apr 2014 17:50:50 +0200 Subject: [PATCH] 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. --- src/qemu/qemu_command.c | 122 ++++++++++++++++++---------------------- src/qemu/qemu_command.h | 12 +--- src/qemu/qemu_driver.c | 19 +------ 3 files changed, 58 insertions(+), 95 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8b58d5e68a..3942a23fc3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -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; + + *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; - switch ((enum virStorageType) type) { + 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 && diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 65ba42090d..d5e8a4d671 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -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__*/ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 72834c25d9..d26a22b674 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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) -- GitLab