util: virstoragefile: Add 'json:' pseudo-protocol parser for 'nfs' protocol

Enable parsing of backing store strings containing the native 'nfs'
protocol specification.

Signed-off-by: Ryan Gahagan <rgahagan@cs.utexas.edu>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Ryan Gahagan 2021-01-06 15:32:31 -06:00 committed by Peter Krempa
parent c7570bbef8
commit 0f1f3f1228
2 changed files with 62 additions and 0 deletions

View File

@ -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 static int
virStorageSourceParseBackingJSONNVMe(virStorageSourcePtr src, virStorageSourceParseBackingJSONNVMe(virStorageSourcePtr src,
virJSONValuePtr json, virJSONValuePtr json,
@ -3711,6 +3759,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = {
{"ssh", false, virStorageSourceParseBackingJSONSSH, 0}, {"ssh", false, virStorageSourceParseBackingJSONSSH, 0},
{"rbd", false, virStorageSourceParseBackingJSONRBD, 0}, {"rbd", false, virStorageSourceParseBackingJSONRBD, 0},
{"raw", true, virStorageSourceParseBackingJSONRaw, 0}, {"raw", true, virStorageSourceParseBackingJSONRaw, 0},
{"nfs", false, virStorageSourceParseBackingJSONNFS, 0},
{"vxhs", false, virStorageSourceParseBackingJSONVxHS, 0}, {"vxhs", false, virStorageSourceParseBackingJSONVxHS, 0},
{"nvme", false, virStorageSourceParseBackingJSONNVMe, 0}, {"nvme", false, virStorageSourceParseBackingJSONNVMe, 0},
}; };

View File

@ -1624,6 +1624,19 @@ mymain(void)
"<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n" "<source protocol='vxhs' name='c6718f6b-0401-441d-a8c3-1f0064d75ee0'>\n"
" <host name='example.com' port='9999'/>\n" " <host name='example.com' port='9999'/>\n"
"</source>\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\"," TEST_BACKING_PARSE_FULL("json:{ \"driver\": \"raw\","
"\"offset\": 10752," "\"offset\": 10752,"
"\"size\": 4063232," "\"size\": 4063232,"