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:
Peter Krempa 2014-04-08 17:50:50 +02:00
parent cecd656604
commit 816f0f93ea
3 changed files with 58 additions and 95 deletions

View File

@ -3816,37 +3816,68 @@ qemuBuildNetworkDriveURI(int protocol,
int int
qemuGetDriveSourceString(int type, qemuGetDriveSourceString(virStorageSourcePtr src,
const char *src, virConnectPtr conn,
int protocol, char **source)
size_t nhosts,
virStorageNetHostDefPtr hosts,
const char *username,
const char *secret,
char **path)
{ {
*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_BLOCK:
case VIR_STORAGE_TYPE_FILE: case VIR_STORAGE_TYPE_FILE:
case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_DIR:
if (!src) if (!src->path) {
return 1; ret = 1;
goto cleanup;
}
if (VIR_STRDUP(*path, src) < 0) if (VIR_STRDUP(*source, src->path) < 0)
return -1; goto cleanup;
break; break;
case VIR_STORAGE_TYPE_NETWORK: case VIR_STORAGE_TYPE_NETWORK:
if (!(*path = qemuBuildNetworkDriveURI(protocol, if (!(*source = qemuBuildNetworkDriveURI(src->protocol,
src, src->path,
nhosts, src->nhosts,
hosts, src->hosts,
username, username,
secret))) secret)))
return -1; goto cleanup;
break; break;
case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_VOLUME:
@ -3855,52 +3886,7 @@ qemuGetDriveSourceString(int type,
break; break;
} }
return 0; ret = 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);
cleanup: cleanup:
VIR_FREE(secret); VIR_FREE(secret);
@ -4003,7 +3989,7 @@ qemuBuildDriveStr(virConnectPtr conn,
break; break;
} }
if (qemuDomainDiskGetSourceString(conn, disk, &source) < 0) if (qemuGetDriveSourceString(&disk->src, conn, &source) < 0)
goto error; goto error;
if (source && if (source &&

View File

@ -314,13 +314,7 @@ qemuParseKeywords(const char *str,
int *retnkeywords, int *retnkeywords,
int allowEmptyValue); int allowEmptyValue);
int qemuGetDriveSourceString(int type, int qemuGetDriveSourceString(virStorageSourcePtr src,
const char *src, virConnectPtr conn,
int protocol, char **source);
size_t nhosts,
virStorageNetHostDefPtr hosts,
const char *username,
const char *secret,
char **path);
#endif /* __QEMU_COMMAND_H__*/ #endif /* __QEMU_COMMAND_H__*/

View File

@ -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 { typedef enum {
VIR_DISK_CHAIN_NO_ACCESS, VIR_DISK_CHAIN_NO_ACCESS,
VIR_DISK_CHAIN_READ_ONLY, VIR_DISK_CHAIN_READ_ONLY,
@ -12758,7 +12741,7 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
if (virStorageFileInit(&snap->src) < 0) if (virStorageFileInit(&snap->src) < 0)
goto cleanup; goto cleanup;
if (qemuDomainSnapshotDiskGetSourceString(snap, &source) < 0) if (qemuGetDriveSourceString(&snap->src, NULL, &source) < 0)
goto cleanup; goto cleanup;
if (VIR_STRDUP(newsource, snap->src.path) < 0) if (VIR_STRDUP(newsource, snap->src.path) < 0)