On 01/16/2018 03:52 AM, lichstor@gmail.com wrote:
> From: zhangshengyu <zhangshengyu@fusionstack.cn>
>
This needs to be split up better into multiple patches - there are many
examples of how to do that. Just see how patches were done the last time
someone added a new transport type. Typically the docs/schemas,
src/conf, src/util, xml2xml tests would go in one patch while the
src/qemu, xml2argv patches in a second patch. Each patch would be
compile-able and testable.
As pointed out before, you're still not completely following the
contributor guidelines w/r/t commit message. Furthermore, when you
"update" your patch and post a followup version, you should make a "v2"
or "v3" or "v4" in your header and then either in the cover letter or
after the '---' describe what changed since the previous patch.
The first patch would also need to update docs/formatdomain.html.in and
the commit message should also describe the new XML being added - there
are many examples.
This is adding the attribute for the <disk> <source> <host>, so why is
> ---
> docs/schemas/domaincommon.rng | 28 +++++++++++++
> src/conf/domain_conf.c | 8 ++++
> src/qemu/qemu_block.c | 24 ++++++++++-
> src/qemu/qemu_command.c | 3 ++
> src/qemu/qemu_parse_command.c | 10 ++++-
> src/storage/storage_backend_gluster.c | 1 +
> src/util/virstoragefile.c | 3 +-
> src/util/virstoragefile.h | 1 +
> .../disk-drive-network-iser-auth.args | 25 ++++++++++++
> .../disk-drive-network-iser-auth.xml | 44 ++++++++++++++++++++
> .../qemuargv2xmldata/disk-drive-network-iser.args | 25 ++++++++++++
> tests/qemuargv2xmldata/disk-drive-network-iser.xml | 41 +++++++++++++++++++
> tests/qemuargv2xmltest.c | 2 +
> ...-drive-network-iser-auth-secrettype-invalid.xml | 33 +++++++++++++++
> ...sk-drive-network-iser-auth-wrong-secrettype.xml | 33 +++++++++++++++
> .../disk-drive-network-iser-auth.args | 31 ++++++++++++++
> .../disk-drive-network-iser-auth.xml | 43 ++++++++++++++++++++
> .../disk-drive-network-iser-lun.args | 27 +++++++++++++
> .../disk-drive-network-iser-lun.xml | 28 +++++++++++++
> .../qemuxml2argvdata/disk-drive-network-iser.args | 29 +++++++++++++
> tests/qemuxml2argvdata/disk-drive-network-iser.xml | 37 +++++++++++++++++
> tests/qemuxml2argvtest.c | 7 ++++
> .../disk-drive-network-iser-auth.xml | 47 ++++++++++++++++++++++
> .../qemuxml2xmloutdata/disk-drive-network-iser.xml | 41 +++++++++++++++++++
> tests/qemuxml2xmltest.c | 2 +
> 25 files changed, 569 insertions(+), 4 deletions(-)
> create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser-auth.args
> create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser-auth.xml
> create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser.args
> create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser.xml
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-auth- secrettype-invalid.xml
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-auth-wrong- secrettype.xml
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-auth.args
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-auth.xml
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-lun.args
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser-lun.xml
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser.args
> create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser.xml
> create mode 100644 tests/qemuxml2xmloutdata/disk-drive-network-iser-auth.xml
> create mode 100644 tests/qemuxml2xmloutdata/disk-drive-network-iser.xml
>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon. rng
> index f22c932f6..819a8791d 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -1534,6 +1534,7 @@
> <choice>
> <value>tcp</value>
> <value>rdma</value>
> + <value>iser</value>
it also necessary on the <source ...> line after protocol...
> </choice>
> </attribute>
> </optional>
> @@ -1613,6 +1614,15 @@
> <optional>
> <ref name="encryption"/>
> </optional>
> + <optional>
So this is the <disk> <source> transport attribute?
> + <attribute name="transport">
> + <choice>
> + <value>tcp</value>
> + <value>rdma</value>
> + <value>iser</value>
> + </choice>
> + </attribute>
Furthermore, if it must be kept here, then since the <attribute>
sequence is repeated 3 times, may as well make a definition for it and
then use it everywhere rather than cut-copy-paste in each place.
> + </optional>
> </element>
> </define>
>
> @@ -4386,6 +4396,15 @@
> <attribute name="name">
> <text/>
> </attribute>
> + <optional>
> + <attribute name="transport">
This is the <hostdev> <source>, but I don't believe that it's actually
tested as there's no XML that I see... I also didn't check to see
whether you parsed and formatted both <disk> and <hostdev> in domain_conf...
> + <choice>
> + <value>tcp</value>
> + <value>rdma</value>
> + <value>iser</value>
> + </choice>
> + </attribute>
> + </optional>
> <interleave>
> <oneOrMore>
> <element name='host'>
> @@ -4397,6 +4416,15 @@
> <ref name="PortNumber"/>
> </attribute>
> </optional>
> + <optional>
> + <attribute name="transport">
And this is for the <hostdev> <source> <host>
> + <choice>
> + <value>tcp</value>
> + <value>rdma</value>
> + <value>iser</value>
> + </choice>
> + </attribute>
> + </optional>
> <empty/>
> </element>
> </oneOrMore>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a1c25060f..8aa193ac2 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -7075,6 +7075,7 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node, @transport is leaked
> virStorageNetHostDefPtr *hosts,
> size_t *nhosts)
> {
> + char *transport = NULL;
> xmlNodePtr child;
>
> for (child = node->children; child; child = child->next) {
> @@ -7086,6 +7087,9 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node,
> }
> }
>
> + if ((*hosts) && (transport = virXMLPropString(node, "transport")))
> + (*hosts)->transport = virStorageNetHostTransportTypeFromString(transport);
> +
Why only parsed for "<host>" but the RNG has <source> and <host>?
> return 0;
> }
>
> @@ -8490,6 +8494,7 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, extraneous blank line
> if (virDomainStorageNetworkParseHo sts(node, &src->hosts, &src->nhosts) < 0)
> goto cleanup;
>
> +
> virStorageSourceNetworkAssignDefaultPorts(src); The virStorageNetHostTransportType
>
> ret = 0;
> @@ -22371,6 +22376,9 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
>
> VIR_FREE(path);
>
> + if (src->hosts && src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER)
> + virBufferEscapeString(attrBuf, " transport='%s'", "iser");
> +
ToString should be used and not "iser"
directly.
This and the Parse makes no sense when compared to the 3 possible
options. That is, it's possible to have "tcp", "rdma", and "iser", but
you only care about "iser".
again TypeToString should be used...
> if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT &&
> !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
> src->tlsFromConfig))
> diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
> index 585f0255e..49837205f 100644
> --- a/src/qemu/qemu_block.c
> +++ b/src/qemu/qemu_block.c
> @@ -433,6 +433,12 @@ qemuBlockStorageSourceGetURI(virStorageSourcePtr src)
> if (VIR_STRDUP(uri->scheme,
> virStorageNetProtocolTypeToString(src->protocol)) < 0)
> goto cleanup;
> + } else if (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER) {
> + uri->port = src->hosts->port;
> +
> + if (VIR_STRDUP(uri->scheme,
> + virStorageNetHostTransportTypeToString(src->hosts-> transport)) < 0)
> + goto cleanup;
> } else {
> if (virAsprintf(&uri->scheme, "%s+%s",
> virStorageNetProtocolTypeToString(src->protocol),
> @@ -506,6 +512,19 @@ qemuBlockStorageSourceBuildJSONSocketAddress( virStorageNetHostDefPtr host,
> goto cleanup;
> break;
>
> + case VIR_STORAGE_NET_HOST_TRANS_ISER:
> + transport = "iser";
> + if (virAsprintf(&port, "%u", host->port) < 0)
> + goto cleanup;
> +
> + if (virJSONValueObjectCreate(&server, This doesn't make sense - the error message doesn't match the if
> + "s:type", transport,
> + "s:host", host->name,
> + "s:port", port,
> + NULL) < 0)
> + goto cleanup;
> + break;
> +
> case VIR_STORAGE_NET_HOST_TRANS_UNIX:
> if (virJSONValueObjectCreate(&server,
> "s:type", "unix",
> @@ -590,7 +609,8 @@ qemuBlockStorageSourceBuildJSONInetSocketAddress( virStorageNetHostDefPtr host)
> virJSONValuePtr ret = NULL;
> char *port = NULL;
>
> - if (host->transport != VIR_STORAGE_NET_HOST_TRANS_TCP) {
> + if (host->transport != VIR_STORAGE_NET_HOST_TRANS_TCP &&
> + host->transport != VIR_STORAGE_NET_HOST_TRANS_ISER) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("only TCP protocol can be converted to InetSocketAddress"));
conditions. Check your usage of && to considering what the other
options are and what's being checked here.
> return NULL;
> @@ -831,7 +851,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr src) Consider using a local @transport... I didn't check if src->hosts could
> "s:portal", portal,
> "s:target", target,
> "u:lun", lun,
> - "s:transport", "tcp",
> + "s:transport", virStorageNetHostTransportTypeToString(src->hosts-> transport),
be NULL here...
<sigh>
> "S:user", username,
> "S:password-secret", objalias,
> NULL));
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index b8aede32d..dd6e3be9a 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -883,6 +883,8 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src,
> if (!((src->hosts->name && strchr(src->hosts->name, ':')) ||
> (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_TCP &&
> !src->hosts->name) ||
> + (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER &&
> + !src->hosts->name) ||
> (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_UNIX &&
> src->hosts->socket &&
> src->hosts->socket[0] != '/'))) {
> @@ -891,6 +893,7 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src,
>
> switch (src->hosts->transport) {
> case VIR_STORAGE_NET_HOST_TRANS_TCP:
> + case VIR_STORAGE_NET_HOST_TRANS_ISER:
> virBufferAsprintf(&buf, "%s:%u",
> src->hosts->name, src->hosts->port);
> break;
> diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command. c
> index 5fe3f97d0..d376af208 100644
> --- a/src/qemu/qemu_parse_command.c
> +++ b/src/qemu/qemu_parse_command.c
> @@ -70,7 +70,9 @@ qemuParseDriveURIString(virDomainDiskDefPtr def, virURIPtr uri,
> if (transp)
> *transp++ = 0;
>
> - if (STRNEQ(uri->scheme, scheme)) {
> + if (STREQ(uri->scheme, "iser")) {
> + transp = (char *)"iser";
At least you attempted the parse code - it's largely forgotten.
Why do both <source> and <host> get the transport='iser'?
> + } else if (STRNEQ(uri->scheme, scheme)) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Invalid transport/scheme '%s'"), uri->scheme);
> goto error;
> @@ -709,6 +711,12 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
>
> if (qemuParseISCSIString(def) < 0)
> goto error;
> + } else if (STRPREFIX(def->src->path, "iser:")) {
> + def->src->type = VIR_STORAGE_TYPE_NETWORK;
> + def->src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
> +
> + if (qemuParseISCSIString(def) < 0)
> + goto error;
> } else if (STRPREFIX(def->src->path, "sheepdog:")) {
> char *p = def->src->path;
> char *port, *vdi;
> diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_ gluster.c
> index 5eea84f16..1452fa0cd 100644
> --- a/src/storage/storage_backend_gluster.c
> +++ b/src/storage/storage_backend_gluster.c
> @@ -608,6 +608,7 @@ virStorageFileBackendGlusterInitServer( virStorageFileBackendGlusterPr ivPtr priv,
> hoststr = host->socket;
> break;
>
> + case VIR_STORAGE_NET_HOST_TRANS_ISER:
> case VIR_STORAGE_NET_HOST_TRANS_LAST:
> break;
> }
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 5780180a9..63253a9c4 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -92,7 +92,8 @@ VIR_ENUM_IMPL(virStorageNetProtocol, VIR_STORAGE_NET_PROTOCOL_LAST,
> VIR_ENUM_IMPL(virStorageNetHostTransport, VIR_STORAGE_NET_HOST_TRANS_ LAST,
> "tcp",
> "unix",
> - "rdma")
> + "rdma",
> + "iser")
>
> VIR_ENUM_IMPL(virStorageSourcePoolMode,
> VIR_STORAGE_SOURCE_POOL_MODE_LAST,
> diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
> index ecd806c93..5a6ec7776 100644
> --- a/src/util/virstoragefile.h
> +++ b/src/util/virstoragefile.h
> @@ -147,6 +147,7 @@ typedef enum {
> VIR_STORAGE_NET_HOST_TRANS_TCP,
> VIR_STORAGE_NET_HOST_TRANS_UNIX,
> VIR_STORAGE_NET_HOST_TRANS_RDMA,
> + VIR_STORAGE_NET_HOST_TRANS_ISER,
>
> VIR_STORAGE_NET_HOST_TRANS_LAST
> } virStorageNetHostTransport;
> diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser-auth.args b/tests/qemuargv2xmldata/disk- drive-network-iser-auth.args
> new file mode 100644
> index 000000000..aaf10d8c8
> --- /dev/null
> +++ b/tests/qemuargv2xmldata/disk-drive-network-iser-auth.args
> @@ -0,0 +1,25 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-monitor unix:/tmp/test-monitor,server,nowait \
> +-no-acpi \
> +-boot c \
> +-usb \
> +-drive file=iser://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+ :\HOBlMQ1A@example.org
> +6000/iqn.1992-01.com.example%3Astorage/1,format=raw,if= virtio \
> +-drive file=iser://example.org:6000/iqn.1992-01.com.example% 3Astorage/2,\
> +format=raw,if=virtio \
> +-net none \
> +-serial none \
> +-parallel none
> diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser-auth.xml b/tests/qemuargv2xmldata/disk- drive-network-iser-auth.xml
> new file mode 100644
> index 000000000..7226443fb
> --- /dev/null
> +++ b/tests/qemuargv2xmldata/disk-drive-network-iser-auth.xml
> @@ -0,0 +1,44 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='qemuargv2xml_usage'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
Since patches weren't well formed, I didn't dig in too deep into
checking what you've done vs. how it should be done.
Does "auth" really have any bearing here? That is, is it really
necessary to supply both two tests where one only adds auth that has
nothing to do with iser transport?
John
> + </source>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/2' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
> + </disk>
> + <controller type='usb' index='0'>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
> + </controller>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser.args b/tests/qemuargv2xmldata/disk- drive-network-iser.args
> new file mode 100644
> index 000000000..c476e759e
> --- /dev/null
> +++ b/tests/qemuargv2xmldata/disk-drive-network-iser.args
> @@ -0,0 +1,25 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-monitor unix:/tmp/test-monitor,server,nowait \
> +-no-acpi \
> +-boot c \
> +-usb \
> +-drive file=iser://example.org:6000/iqn.1992-01.com.example, format=raw,\
> +if=virtio \
> +-drive file=iser://example.org:6000/iqn.1992-01.com.example/1, format=raw,\
> +if=virtio \
> +-net none \
> +-serial none \
> +-parallel none
> diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser.xml b/tests/qemuargv2xmldata/disk- drive-network-iser.xml
> new file mode 100644
> index 000000000..88f043f66
> --- /dev/null
> +++ b/tests/qemuargv2xmldata/disk-drive-network-iser.xml
> @@ -0,0 +1,41 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/0' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
> + </disk>
> + <controller type='usb' index='0'>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
> + </controller>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
> index cb010268c..59b26c647 100644
> --- a/tests/qemuargv2xmltest.c
> +++ b/tests/qemuargv2xmltest.c
> @@ -213,6 +213,8 @@ mymain(void)
> DO_TEST("disk-drive-network-nbd-unix");
> DO_TEST("disk-drive-network-iscsi");
> DO_TEST("disk-drive-network-iscsi-auth");
> + DO_TEST("disk-drive-network-iser");
> + DO_TEST("disk-drive-network-iser-auth");
> DO_TEST("disk-drive-network-gluster");
> DO_TEST("disk-drive-network-rbd");
> DO_TEST("disk-drive-network-rbd-auth");
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-auth- secrettype-invalid.xml b/tests/qemuxml2argvdata/disk- drive-network-iser-auth- secrettype-invalid.xml
> new file mode 100644
> index 000000000..dbcf484dc
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-auth- secrettype-invalid.xml
> @@ -0,0 +1,33 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-auth-wrong- secrettype.xml b/tests/qemuxml2argvdata/disk- drive-network-iser-auth-wrong- secrettype.xml
> new file mode 100644
> index 000000000..5525e9d86
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-auth-wrong- secrettype.xml
> @@ -0,0 +1,33 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='ceph' usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-auth.args b/tests/qemuxml2argvdata/disk- drive-network-iser-auth.args
> new file mode 100644
> index 000000000..5fa7a04bb
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-auth.args
> @@ -0,0 +1,31 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-nodefaults \
> +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=readline \
> +-no-acpi \
> +-boot c \
> +-usb \
> +-drive file=iser://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+ :\HOBlMQ1A@example.org
> +6000/iqn.1992-01.com.example%3Astorage/1,format=raw,if= none,\
> +id=drive-virtio-disk0 \
> +-device virtio-blk-pci,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\
> +id=virtio-disk0 \
> +-drive file=iser://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+ :\HOBlMQ1A@example.org
> +6000/iqn.1992-01.com.example%3Astorage/2,format=raw,if= none,\
> +id=drive-virtio-disk1 \
> +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\
> +id=virtio-disk1
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-auth.xml b/tests/qemuxml2argvdata/disk- drive-network-iser-auth.xml
> new file mode 100644
> index 000000000..fbcb6b4f1
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-auth.xml
> @@ -0,0 +1,43 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/2' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-lun.args b/tests/qemuxml2argvdata/disk- drive-network-iser-lun.args
> new file mode 100644
> index 000000000..d9428533b
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-lun.args
> @@ -0,0 +1,27 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-nodefconfig \
> +-nodefaults \
> +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=readline \
> +-no-acpi \
> +-boot c \
> +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 \
> +-usb \
> +-drive file=iser://example.org:3260/iqn.1992-01.com.example/0, format=raw,\
> +if=none,id=drive-scsi0-0-0-0 \
> +-device scsi-block,bus=scsi0.0,channel=0,scsi-id=0,lun=0,\
> +drive=drive-scsi0-0-0-0,id=scsi0-0-0-0
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser-lun.xml b/tests/qemuxml2argvdata/disk- drive-network-iser-lun.xml
> new file mode 100644
> index 000000000..25fa76140
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser-lun.xml
> @@ -0,0 +1,28 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='lun'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example' transport='iser'>
> + <host name='example.org' port='3260' transport='iser'/>
> + </source>
> + <target dev='sda' bus='scsi'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='scsi' index='0' model='virtio-scsi'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser.args b/tests/qemuxml2argvdata/disk- drive-network-iser.args
> new file mode 100644
> index 000000000..49ea467ff
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser.args
> @@ -0,0 +1,29 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name QEMUGuest1 \
> +-S \
> +-M pc \
> +-m 214 \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-nographic \
> +-nodefaults \
> +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/ monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=readline \
> +-no-acpi \
> +-boot c \
> +-usb \
> +-drive file=iser://example.org:6000/iqn.1992-01.com.example/0, format=raw,\
> +if=none,id=drive-virtio-disk0 \
> +-device virtio-blk-pci,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\
> +id=virtio-disk0 \
> +-drive file=iser://example.org:6000/iqn.1992-01.com.example/1, format=raw,\
> +if=none,id=drive-virtio-disk1 \
> +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\
> +id=virtio-disk1
> diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser.xml b/tests/qemuxml2argvdata/disk- drive-network-iser.xml
> new file mode 100644
> index 000000000..b1634555c
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/disk-drive-network-iser.xml
> @@ -0,0 +1,37 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example' transport='iser'>
> + <host name='example.org' port='6000'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'>
> + <host name='example.org' port='6000'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + </disk>
> + <controller type='usb' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index be32d891e..dcb35f017 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -939,6 +939,13 @@ mymain(void)
> DO_TEST("disk-drive-network-iscsi-lun",
> QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI,
> QEMU_CAPS_SCSI_BLOCK);
> + DO_TEST("disk-drive-network-iser", NONE);
> + DO_TEST("disk-drive-network-iser-auth", NONE);
> + DO_TEST_PARSE_ERROR("disk-drive-network-iser-auth- secrettype-invalid", NONE);
> + DO_TEST_PARSE_ERROR("disk-drive-network-iser-auth-wrong- secrettype", NONE);
> + DO_TEST("disk-drive-network-iser-lun",
> + QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI,
> + QEMU_CAPS_SCSI_BLOCK);
> DO_TEST("disk-drive-network-gluster",
> QEMU_CAPS_GLUSTER_DEBUG_LEVEL);
> DO_TEST("disk-drive-network-rbd", NONE);
> diff --git a/tests/qemuxml2xmloutdata/disk-drive-network-iser-auth. xml b/tests/qemuxml2xmloutdata/ disk-drive-network-iser-auth. xml
> new file mode 100644
> index 000000000..1b27fdea2
> --- /dev/null
> +++ b/tests/qemuxml2xmloutdata/disk-drive-network-iser-auth. xml
> @@ -0,0 +1,47 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + <source protocol='iscsi' name='iqn.1992-01.com.example:storage/2' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
> + </disk>
> + <controller type='usb' index='0'>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
> + </controller>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2xmloutdata/disk-drive-network-iser.xml b/tests/qemuxml2xmloutdata/ disk-drive-network-iser.xml
> new file mode 100644
> index 000000000..88f043f66
> --- /dev/null
> +++ b/tests/qemuxml2xmloutdata/disk-drive-network-iser.xml
> @@ -0,0 +1,41 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <clock offset='utc'/>
> + <on_poweroff>destroy</on_poweroff>
> + <on_reboot>restart</on_reboot>
> + <on_crash>destroy</on_crash>
> + <devices>
> + <emulator>/usr/bin/qemu-system-i686</emulator>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/0' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
> + </disk>
> + <disk type='network' device='disk'>
> + <driver name='qemu' type='raw'/>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'>
> + <host name='example.org' port='6000' transport='iser'/>
> + </source>
> + <target dev='vdb' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
> + </disk>
> + <controller type='usb' index='0'>
> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
> + </controller>
> + <controller type='pci' index='0' model='pci-root'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
> index 2be8eb2c1..aeeda2dd1 100644
> --- a/tests/qemuxml2xmltest.c
> +++ b/tests/qemuxml2xmltest.c
> @@ -515,6 +515,8 @@ mymain(void)
> DO_TEST("disk-drive-network-nbd-unix", NONE);
> DO_TEST("disk-drive-network-iscsi", NONE);
> DO_TEST("disk-drive-network-iscsi-auth", NONE);
> + DO_TEST("disk-drive-network-iser", NONE);
> + DO_TEST("disk-drive-network-iser-auth", NONE);
> DO_TEST("disk-drive-network-gluster", NONE);
> DO_TEST("disk-drive-network-rbd", NONE);
> DO_TEST("disk-drive-network-rbd-auth", NONE);
>