On Fri, Jun 16, 2017 at 05:29:43PM +0200, Peter Krempa wrote:
> Starting from qemu 2.9, more granular options are supported. Add parser
> for the relevant bits.
>
> With this patch libvirt is able to parse the host and target IQN of from
> the JSON pseudo-protocol specification.
>
> This corresponds to BlockdevOptionsIscsi in qemu qapi.
> ---
> src/util/virstoragefile.c | 53 +++++++++++++++++++++++++++++++++++++++++++----
> tests/virstoragetest.c | 10 +++++++++
> 2 files changed, 59 insertions(+), 4 deletions(-)
>
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index c0aa4e4c6..4f063e7f2 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -2941,18 +2941,63 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
> virJSONValuePtr json,
> int opaque ATTRIBUTE_UNUSED)
> {
> + const char *transport = virJSONValueObjectGetString(json, "transport");
> + const char *portal = virJSONValueObjectGetString(json, "portal");
> + const char *target = virJSONValueObjectGetString(json, "target");
> const char *uri;
> + const char *lun;
> + char *fulltarget = NULL;
> + int ret = -1;
>
> /* legacy URI based syntax passed via 'filename' option */
> if ((uri = virJSONValueObjectGetString(json, "filename")))
> return virStorageSourceParseBackingJSONUriStr(src, uri,
> VIR_STORAGE_NET_PROTOCOL_ISCSI);
>
> - /* iSCSI currently supports only URI syntax passed in as filename */
> - virReportError(VIR_ERR_INVALID_ARG, "%s",
> - _("missing iSCSI URI in JSON backing volume definition"));
> + src->type = VIR_STORAGE_TYPE_NETWORK;
> + src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
>
> - return -1;
> + if (VIR_ALLOC(src->hosts) < 0)
> + goto cleanup;
> +
> + src->nhosts = 1;
> +
> + if (STRNEQ_NULLABLE(transport, "tcp")) {
> + virReportError(VIR_ERR_INVALID_ARG, "%s",
> + _("only TCP transport is supported for iSCSI volumes"));
> + goto cleanup;
> + }
> +
> + src->hosts->transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
> +
> + if (!portal) {
> + virReportError(VIR_ERR_INVALID_ARG, "%s",
> + _("missing 'portal' address in iSCSI backing definition"));
> + goto cleanup;
> + }
> +
> + if (!target) {
> + virReportError(VIR_ERR_INVALID_ARG, "%s",
> + _("missing 'target' in iSCSI backing definition"));
> + goto cleanup;
> + }
> +
> + if (VIR_STRDUP(src->hosts->name, portal) < 0)
> + goto cleanup;
The @portal contains a pair of IP_ADDRESS:TCP_PORT and the structure
_virStorageNetHostDef contains a name and port so it should be parsed
separately.
> +
> + if (!(lun = virJSONValueObjectGetString(json, "lun")))
> + lun = "0";
This is int in the qapi schema.
Pavel
> +
> + if (virAsprintf(&fulltarget, "%s/%s", target, lun) < 0)
> + goto cleanup;
> +
> + VIR_STEAL_PTR(src->path, fulltarget);
> +
> + ret = 0;
> +
> + cleanup:
> + VIR_FREE(fulltarget);
> + return ret;
> }
>
>
> diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
> index 70e24a1b7..c31f4fc54 100644
> --- a/tests/virstoragetest.c
> +++ b/tests/virstoragetest.c
> @@ -1502,6 +1502,16 @@ mymain(void)
> "\"driver\": \"file\","
> "\"filename\": \"/path/to/file\" } } }",
> "<source file='/path/to/file'/>\n");
> + TEST_BACKING_PARSE("json:{\"file\":{\"driver\":\"iscsi\","
> + "\"transport\":\"tcp\","
> + "\"portal\":\"test.org\","
> + "\"target\":\"iqn.2016-12.com.virttest:emulated-iscsi-noauth.target\","
> + "\"lun\":\"6\""
> + "}"
> + "}",
> + "<source protocol='iscsi' name='iqn.2016-12.com.virttest:emulated-iscsi-noauth.target/6'>\n"
> + " <host name='test.org'/>\n"
> + "</source>\n");
>
> cleanup:
> /* Final cleanup */
> --
> 2.12.2
>
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list