[libvirt] [PATCH 04/03] qemu: Refactor qemuGetDriveSourceString to take virStorageSourcePtr

Peter Krempa pkrempa at redhat.com
Tue Apr 8 15:55:14 UTC 2014


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 1766a5b..8b4a57a 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 7f8b875..bad6ac0 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -307,13 +307,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 72834c2..d26a22b 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)
-- 
1.9.1




More information about the libvir-list mailing list