Signed-off-by: Ryan Gahagan <rgahagan(a)cs.utexas.edu>
---
src/util/virstoragefile.c | 49 +++++++++++++++++++++++++++++++++++++++
tests/virstoragetest.c | 13 +++++++++++
2 files changed, 62 insertions(+)
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 3097e11984..d67f0f2c3f 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -3652,6 +3652,54 @@ virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src,
}
+static int
+virStorageSourceParseBackingJSONNFS(virStorageSourcePtr src,
+ virJSONValuePtr json,
+ const char *jsonstr G_GNUC_UNUSED,
+ int opaque G_GNUC_UNUSED)
+{
+ virJSONValuePtr server = virJSONValueObjectGetObject(json, "server");
+ int uidStore = -1;
+ int gidStore = -1;
+ int gotUID = virJSONValueObjectGetNumberInt(json, "user", &uidStore);
+ int gotGID = virJSONValueObjectGetNumberInt(json, "group", &gidStore);
+
+ if (!server) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("missing 'server' attribute in JSON backing
definition for NFS volume"));
+ return -1;
+ }
+
+ if (gotUID < 0 || gotGID < 0) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("missing 'user' or 'group' attribute in
JSON backing definition for NFS volume"));
+ return -1;
+ }
+
+ src->path = g_strdup(virJSONValueObjectGetString(json, "path"));
+ if (!src->path) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("missing 'path' attribute in JSON backing
definition for NFS volume"));
+ return -1;
+ }
+
+ src->nfs_user = g_strdup_printf("+%d", uidStore);
+ src->nfs_group = g_strdup_printf("+%d", gidStore);
+
+ src->type = VIR_STORAGE_TYPE_NETWORK;
+ src->protocol = VIR_STORAGE_NET_PROTOCOL_NFS;
+
+ src->hosts = g_new0(virStorageNetHostDef, 1);
+ src->nhosts = 1;
+
+ if (virStorageSourceParseBackingJSONInetSocketAddress(src->hosts,
+ server) < 0)
+ return -1;
+
+ return 0;
+}
+
+
static int
virStorageSourceParseBackingJSONNVMe(virStorageSourcePtr src,
virJSONValuePtr json,
@@ -3711,6 +3759,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] =
{
{"ssh", false, virStorageSourceParseBackingJSONSSH, 0},
{"rbd", false, virStorageSourceParseBackingJSONRBD, 0},
{"raw", true, virStorageSourceParseBackingJSONRaw, 0},
+ {"nfs", false, virStorageSourceParseBackingJSONNFS, 0},
{"vxhs", false, virStorageSourceParseBackingJSONVxHS, 0},
{"nvme", false, virStorageSourceParseBackingJSONNVMe, 0},
};
diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
index a376154def..86c7cd910c 100644
--- a/tests/virstoragetest.c
+++ b/tests/virstoragetest.c
@@ -1624,6 +1624,19 @@ mymain(void)
"<source protocol='vxhs'
name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n"
" <host name='example.com'
port='9999'/>\n"
"</source>\n");
+
TEST_BACKING_PARSE("json:{\"file\":{\"driver\":\"nfs\","
+ "\"user\":2,"
+ "\"group\":9,"
+
"\"path\":\"/foo/bar/baz\","
+ "\"server\": {
\"host\":\"example.com\","
+
"\"type\":\"inet\""
+ "}"
+ "}"
+ "}",
+ "<source protocol='nfs'
name='/foo/bar/baz'>\n"
+ " <host name='example.com'/>\n"
+ " <identity user='+2'
group='+9'/>\n"
+ "</source>\n");
TEST_BACKING_PARSE_FULL("json:{ \"driver\": \"raw\","
"\"offset\": 10752,"
"\"size\": 4063232,"
--
2.29.2