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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list