Extract the common code of the URI parser and reuse it with gluster volumes. The gluster code has a separate function as multi-host support will add an alternative to the URI syntax. --- src/util/virstoragefile.c | 52 +++++++++++++++++++++++++++++++++++++---------- tests/virstoragetest.c | 5 +++++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index f8c5f64..6aaf3ff 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2538,18 +2538,10 @@ virStorageSourceParseBackingJSONPath(virStorageSourcePtr src, static int -virStorageSourceParseBackingJSONUri(virStorageSourcePtr src, - virJSONValuePtr json, - int protocol) +virStorageSourceParseBackingJSONUriStr(virStorageSourcePtr src, + const char *uri, + int protocol) { - const char *uri; - - if (!(uri = virJSONValueObjectGetString(json, "file.uri"))) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("missing URI in JSON backing volume definition")); - return -1; - } - if (virStorageSourceParseBackingURI(src, uri) < 0) return -1; @@ -2566,6 +2558,43 @@ virStorageSourceParseBackingJSONUri(virStorageSourcePtr src, } +static int +virStorageSourceParseBackingJSONUri(virStorageSourcePtr src, + virJSONValuePtr json, + int protocol) +{ + const char *uri; + + if (!(uri = virJSONValueObjectGetString(json, "file.uri"))) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("missing URI in JSON backing volume definition")); + return -1; + } + + return virStorageSourceParseBackingJSONUriStr(src, uri, protocol); +} + + +static int +virStorageSourceParseBackingJSONGluster(virStorageSourcePtr src, + virJSONValuePtr json, + int opaque ATTRIBUTE_UNUSED) +{ + const char *uri; + + /* legacy URI based syntax passed via 'filename' option */ + if ((uri = virJSONValueObjectGetString(json, "file.filename"))) + return virStorageSourceParseBackingJSONUriStr(src, uri, + VIR_STORAGE_NET_PROTOCOL_GLUSTER); + + /* gluster currently supports only URI syntax passed in as filename */ + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("missing gluster URI in JSON backing volume definition")); + + return -1; +} + + struct virStorageSourceJSONDriverParser { const char *drvname; int (*func)(virStorageSourcePtr src, virJSONValuePtr json, int opaque); @@ -2581,6 +2610,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = { {"ftp", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_FTP}, {"ftps", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_FTPS}, {"tftp", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_TFTP}, + {"gluster", virStorageSourceParseBackingJSONGluster, 0}, }; diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c index 955e4db..4250a2f 100644 --- a/tests/virstoragetest.c +++ b/tests/virstoragetest.c @@ -1375,6 +1375,11 @@ mymain(void) TEST_BACKING_PARSE(14, "json:{\"file.driver\":\"ftp\", " "\"file.uri\":\"http://example.com/file\"}", NULL); + TEST_BACKING_PARSE(15, "json:{\"file.driver\":\"gluster\", " + "\"file.filename\":\"gluster://example.com/vol/file\"}", + "<source protocol='gluster' name='vol/file'>\n" + " <host name='example.com'/>\n" + "</source>\n"); cleanup: /* Final cleanup */ -- 2.8.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list