Hello John,
I have questions:
>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".
This is because for other types are optional, there was no this line here,
therefor I added this and only care iser.
Consider using a local @transport... I didn't check if
src->hosts could
be NULL here...
This is used for iSCSI only, in this case, from my other
place modification I should make sure src->hosts won't be NULL, and can it
be local?
For those samples like "auth", I don't think those are all necessary, but
if I don't add those, the tests won't pass. Because iser is some strange,
just part of iSCSI, it is all same as iscsi except transport..
Why do both <source> and <host> get the
transport='iser'?
From qemu command line and code architecture I believe both place are need,
do you
think we should use "iser" in only source or host section? I can do
dig search.
Best Regards,
Charles.
On Wed, Jan 17, 2018 at 7:10 AM, John Ferlan <jferlan(a)redhat.com> wrote:
On 01/16/2018 03:52 AM, lichstor(a)gmail.com wrote:
> From: zhangshengyu <zhangshengyu(a)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.
> ---
> 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>
This is adding the attribute for the <disk> <source> <host>, so why is
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,
> 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 = virStorageNetHostTransportType
FromString(transport);
> +
@transport is leaked
Why only parsed for "<host>" but the RNG has <source> and
<host>?
> return 0;
> }
>
> @@ -8490,6 +8494,7 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
> if (virDomainStorageNetworkParseHosts(node, &src->hosts,
&src->nhosts) < 0)
> goto cleanup;
>
> +
extraneous blank line
> virStorageSourceNetworkAssignDefaultPorts(src);
>
> 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");
> +
The virStorageNetHostTransportTypeToString 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".
> 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,
> + virStorageNetHostTransportType
ToString(src->hosts->transport)) < 0)
> + goto cleanup;
> } else {
> if (virAsprintf(&uri->scheme, "%s+%s",
> virStorageNetProtocolTypeToStr
ing(src->protocol),
> @@ -506,6 +512,19 @@
qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr
host,
> goto cleanup;
> break;
>
> + case VIR_STORAGE_NET_HOST_TRANS_ISER:
> + transport = "iser";
again TypeToString should be used...
> + if (virAsprintf(&port, "%u", host->port) < 0)
> + goto cleanup;
> +
> + if (virJSONValueObjectCreate(&server,
> + "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"));
This doesn't make sense - the error message doesn't match the if
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)
> "s:portal", portal,
> "s:target", target,
> "u:lun", lun,
> - "s:transport",
"tcp",
> + "s:transport",
virStorageNetHostTransportTypeToString(src->hosts->transport),
Consider using a local @transport... I didn't check if src->hosts could
be NULL here...
> "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";
<sigh>
At least you attempted the parse code - it's largely forgotten.
> + } 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(
virStorageFileBackendGlusterPrivPtr 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'/>
Why do both <source> and <host> get the 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);
>