util: storage: Add support for URI based backing volumes in qemu's JSON pseudo-protocol

http(s), ftp(s) and tftp use URIs for volume definitions in the JSON
pseudo protocol so it's pretty straightforward to add support for them.
This commit is contained in:
Peter Krempa 2016-07-12 17:59:58 +02:00
parent 47f292dd35
commit ba05b5b7e7
2 changed files with 58 additions and 0 deletions

View File

@ -2537,6 +2537,44 @@ virStorageSourceParseBackingJSONPath(virStorageSourcePtr src,
}
static int
virStorageSourceParseBackingJSONUriStr(virStorageSourcePtr src,
const char *uri,
int protocol)
{
if (virStorageSourceParseBackingURI(src, uri) < 0)
return -1;
if (src->protocol != protocol) {
virReportError(VIR_ERR_INVALID_ARG,
_("expected protocol '%s' but got '%s' in URI JSON volume "
"definition"),
virStorageNetProtocolTypeToString(protocol),
virStorageNetProtocolTypeToString(src->protocol));
return -1;
}
return 0;
}
static int
virStorageSourceParseBackingJSONUri(virStorageSourcePtr src,
virJSONValuePtr json,
int protocol)
{
const char *uri;
if (!(uri = virJSONValueObjectGetString(json, "uri"))) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("missing URI in JSON backing volume definition"));
return -1;
}
return virStorageSourceParseBackingJSONUriStr(src, uri, protocol);
}
struct virStorageSourceJSONDriverParser {
const char *drvname;
int (*func)(virStorageSourcePtr src, virJSONValuePtr json, int opaque);
@ -2547,6 +2585,11 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = {
{"file", virStorageSourceParseBackingJSONPath, VIR_STORAGE_TYPE_FILE},
{"host_device", virStorageSourceParseBackingJSONPath, VIR_STORAGE_TYPE_BLOCK},
{"host_cdrom", virStorageSourceParseBackingJSONPath, VIR_STORAGE_TYPE_BLOCK},
{"http", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_HTTP},
{"https", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_HTTPS},
{"ftp", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_FTP},
{"ftps", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_FTPS},
{"tftp", virStorageSourceParseBackingJSONUri, VIR_STORAGE_NET_PROTOCOL_TFTP},
};

View File

@ -1376,6 +1376,21 @@ mymain(void)
TEST_BACKING_PARSE("json:{\"file.driver\":\"host_cdrom\", "
"\"file.filename\":\"/path/to/cdrom\"}",
"<source dev='/path/to/cdrom'/>\n");
TEST_BACKING_PARSE("json:{\"file.driver\":\"http\", "
"\"file.uri\":\"http://example.com/file\"}",
"<source protocol='http' name='file'>\n"
" <host name='example.com'/>\n"
"</source>\n");
TEST_BACKING_PARSE("json:{\"file\":{ \"driver\":\"http\","
"\"uri\":\"http://example.com/file\""
"}"
"}",
"<source protocol='http' name='file'>\n"
" <host name='example.com'/>\n"
"</source>\n");
TEST_BACKING_PARSE("json:{\"file.driver\":\"ftp\", "
"\"file.uri\":\"http://example.com/file\"}",
NULL);
cleanup:
/* Final cleanup */