[RFC PATCH 5/6] qemu: added NFS JSON props methods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Ryan Gahagan <rgahagan@xxxxxxxxxxxxx>
---
 src/qemu/qemu_block.c  | 42 +++++++++++++++++++++++++++++++++++++++++-
 src/qemu/qemu_domain.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index b224a550f3..f93f675262 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -674,6 +674,36 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src,
 }
 
 
+static virJSONValuePtr
+qemuBlockStorageSourceGetNFSProps(virStorageSourcePtr src)
+{
+    g_autoptr(virJSONValue) server = NULL;
+    virJSONValuePtr ret = NULL;
+
+    if (src->nhosts != 1) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("NFS protocol accepts only one host"));
+        return NULL;
+    }
+
+    if (!(server = qemuBlockStorageSourceBuildJSONInetSocketAddress(&src->hosts[0])))
+        return NULL;
+
+    /* NFS disk specification example:
+     * { driver:"nfs",
+     *   user: "0",
+     *   group: "0",
+     *   server: {type:"tcp", host:"1.2.3.4", port:9999}}
+     */
+    ignore_value(virJSONValueObjectCreate(&ret,
+                                          "i:user", src->nfs_uid,
+                                          "i:group", src->nfs_gid,
+                                          "a:server", &server, NULL));
+
+    return ret;
+}
+
+
 static virJSONValuePtr
 qemuBlockStorageSourceGetCURLProps(virStorageSourcePtr src,
                                    bool onlytarget)
@@ -1181,6 +1211,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
             break;
 
         case VIR_STORAGE_NET_PROTOCOL_NFS:
+            driver = "nfs";
+            if (!(fileprops = qemuBlockStorageSourceGetNFSProps(src)))
+                return NULL;
+            break;
+
         case VIR_STORAGE_NET_PROTOCOL_NONE:
         case VIR_STORAGE_NET_PROTOCOL_LAST:
             virReportEnumRangeError(virStorageNetProtocol, src->protocol);
@@ -2500,11 +2535,16 @@ qemuBlockStorageSourceCreateGetStorageProps(virStorageSourcePtr src,
                 return -1;
             break;
 
+        case VIR_STORAGE_NET_PROTOCOL_NFS:
+            driver = "nfs";
+            if (!(location = qemuBlockStorageSourceGetNFSProps(src)))
+                return -1;
+            break;
+
             /* unsupported/impossible */
         case VIR_STORAGE_NET_PROTOCOL_NBD:
         case VIR_STORAGE_NET_PROTOCOL_ISCSI:
         case VIR_STORAGE_NET_PROTOCOL_VXHS:
-        case VIR_STORAGE_NET_PROTOCOL_NFS:
         case VIR_STORAGE_NET_PROTOCOL_HTTP:
         case VIR_STORAGE_NET_PROTOCOL_HTTPS:
         case VIR_STORAGE_NET_PROTOCOL_FTP:
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index b5a4a22ed3..64ebfb5812 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -9589,6 +9589,45 @@ qemuProcessPrepareStorageSourceTLSNBD(virStorageSourcePtr src,
 }
 
 
+/* qemuPrepareStorageSourceNFS:
+ * @src: source for a disk
+ *
+ * If src is an NFS source, translate nfs_user and nfs_group
+ * into a uid and gid field. If these strings are empty (ie "")
+ * then provide the hypervisor default uid and gid.
+ */
+ static int
+ qemuDomainPrepareStorageSourceNFS(virStorageSourcePtr src)
+ {
+    int err = 0;
+    if (virStorageSourceGetActualType(src) != VIR_STORAGE_TYPE_NETWORK)
+        return 0;
+
+    if ((virStorageNetProtocol) src->protocol != VIR_STORAGE_NET_PROTOCOL_NFS)
+        return 0;
+
+    if (src->nfs_user) {
+        err = virGetUserID(src->nfs_user, &src->nfs_uid);
+    } else {
+        /* TODO: Provide hypervisor default value */
+    }
+
+    if (err < 0)
+        return -1;
+
+    if (src->nfs_group) {
+        err = virGetGroupID(src->nfs_group, &src->nfs_gid);
+    } else {
+        /* TODO: Provide hypervisor default value */
+    }
+
+    if (err < 0)
+        return -1;
+
+    return 0;
+}
+
+
 /* qemuProcessPrepareStorageSourceTLS:
  * @source: source for a disk
  * @cfg: driver configuration
@@ -10400,6 +10439,9 @@ qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDefPtr disk,
                                           priv) < 0)
         return -1;
 
+    if (qemuDomainPrepareStorageSourceNFS(src) < 0)
+        return -1;
+
     return 0;
 }
 
-- 
2.29.0




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux