util: storage: Parse 'lun' for iSCSI protocol from JSON as string or number

While the QEMU QAPI schema describes 'lun' as a number, the code dealing
with JSON strings does not strictly adhere to this schema and thus
formats the number back as a string. Use the new helper to retrieve both
possibilities.

Note that the formatting code is okay and qemu will accept it as an int.

Tweak also one of the test strings to verify that both formats work
with libvirt.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1540290
This commit is contained in:
Peter Krempa 2018-01-31 12:00:42 +01:00
parent d3da8013cc
commit f46d6e22f2
2 changed files with 6 additions and 9 deletions

View File

@ -2976,10 +2976,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
const char *transport = virJSONValueObjectGetString(json, "transport");
const char *portal = virJSONValueObjectGetString(json, "portal");
const char *target = virJSONValueObjectGetString(json, "target");
const char *lun = virJSONValueObjectGetStringOrNumber(json, "lun");
const char *uri;
char *port;
unsigned int lun = 0;
char *fulltarget = NULL;
int ret = -1;
/* legacy URI based syntax passed via 'filename' option */
@ -2990,6 +2989,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
src->type = VIR_STORAGE_TYPE_NETWORK;
src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
if (!lun)
lun = "0";
if (VIR_ALLOC(src->hosts) < 0)
goto cleanup;
@ -3026,17 +3028,12 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
*port = '\0';
}
ignore_value(virJSONValueObjectGetNumberUint(json, "lun", &lun));
if (virAsprintf(&fulltarget, "%s/%u", target, lun) < 0)
if (virAsprintf(&src->path, "%s/%s", target, lun) < 0)
goto cleanup;
VIR_STEAL_PTR(src->path, fulltarget);
ret = 0;
cleanup:
VIR_FREE(fulltarget);
return ret;
}

View File

@ -1572,7 +1572,7 @@ mymain(void)
"\"transport\":\"tcp\","
"\"portal\":\"test.org:1234\","
"\"target\":\"iqn.2016-12.com.virttest:emulated-iscsi-noauth.target\","
"\"lun\":6"
"\"lun\":\"6\""
"}"
"}",
"<source protocol='iscsi' name='iqn.2016-12.com.virttest:emulated-iscsi-noauth.target/6'>\n"