提交 1b84dd19 编写于 作者: P Peter Krempa

storage: Parse 'nvme' disk source properties from json:{} pseudo-uri

Our code allows snapshots of NVMe based disks which means we create
overlay file with a 'json:{}' pseudo-uri refering to the NVME device.
Our parser code doesn't handle them though. Add the parser and test it
via the XML->json->XML round-trip and reference data.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NMichal Privoznik <mprivozn@redhat.com>
上级 3b06103e
......@@ -3806,6 +3806,35 @@ virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src,
}
static int
virStorageSourceParseBackingJSONNVMe(virStorageSourcePtr src,
virJSONValuePtr json,
const char *jsonstr G_GNUC_UNUSED,
int opaque G_GNUC_UNUSED)
{
g_autoptr(virStorageSourceNVMeDef) nvme = g_new0(virStorageSourceNVMeDef, 1);
const char *device = virJSONValueObjectGetString(json, "device");
if (!device || virPCIDeviceAddressParse((char *) device, &nvme->pciAddr) < 0) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("missing or malformed 'device' field of 'nvme' storage"));
return -1;
}
if (virJSONValueObjectGetNumberUlong(json, "namespace", &nvme->namespc) < 0 ||
nvme->namespc == 0) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("missing or malformed 'namespace' field of 'nvme' storage"));
return -1;
}
src->type = VIR_STORAGE_TYPE_NVME;
src->nvme = g_steal_pointer(&nvme);
return 0;
}
struct virStorageSourceJSONDriverParser {
const char *drvname;
bool formatdriver;
......@@ -3837,6 +3866,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = {
{"rbd", false, virStorageSourceParseBackingJSONRBD, 0},
{"raw", true, virStorageSourceParseBackingJSONRaw, 0},
{"vxhs", false, virStorageSourceParseBackingJSONVxHS, 0},
{"nvme", false, virStorageSourceParseBackingJSONNVMe, 0},
};
......
......@@ -1096,6 +1096,11 @@ mymain(void)
/* type VIR_STORAGE_TYPE_BLOCK is not tested since it parses back to 'file' */
/* type VIR_STORAGE_TYPE_DIR it is a 'format' driver in qemu */
TEST_JSON_FORMAT(VIR_STORAGE_TYPE_NVME,
"<source type='pci' namespace='1'>\n"
" <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>\n"
"</source>\n");
TEST_JSON_FORMAT_NET("<source protocol='http' name=''>\n"
" <host name='example.com' port='80'/>\n"
"</source>\n");
......
......@@ -1656,6 +1656,15 @@ mymain(void)
" <timeout seconds='2000'/>\n"
"</source>\n", 0);
TEST_BACKING_PARSE("json:{\"file\":{\"driver\": \"nvme\","
"\"device\": \"0000:01:00.0\","
"\"namespace\": 1"
"}"
"}",
"<source type='pci' namespace='1'>\n"
" <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>\n"
"</source>\n");
#endif /* WITH_YAJL */
cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册