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(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list