[Libvirt-cim] [PATCH v4 2/3] hostdev: Add iSCSI hostdev XML
John Ferlan
jferlan at redhat.com
Tue Aug 5 23:24:20 UTC 2014
Wow *that*'s not what I was trying to - ignore...
John
On 08/05/2014 07:22 PM, John Ferlan wrote:
> Introduce a new structure to handle an iSCSI host device based on the
> existing virDomainHostdevSubsysSCSI by adding a "protocol='iscsi'" to
> the <source/> element. The hostdev structure mimics the existing
> <disk/> element for an iSCSI device (network) device. New XML is:
>
> <hostdev mode='subsystem' type='scsi' managed='yes'>
> <source protocol='iscsi' name='iqn.1992-01.com.example'>
> <host name='example.org' port='3260'/>
> <auth username='myname'>
> <secret type='iscsi' usage='mycluster_myname'/>
> </auth>
> </source>
> <address type='drive' controller='0' bus='0' target='2' unit='5'/>
> </hostdev>
>
> The controller element will mimic the existing scsi_host code insomuch
> as when 'lsi' and 'virtio-scsi' are used.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> Changes since v3:
> * Rework RNG to match comments from review 8/8
> * Move the <auth> inside the <source>
> * Modify the tests and html doc to match where the <auth> is found
>
> docs/formatdomain.html.in | 144 +++++++++++++-------
> docs/schemas/domaincommon.rng | 51 ++++++-
> src/conf/domain_conf.c | 150 ++++++++++++++++++---
> .../qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args | 14 ++
> .../qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml | 46 +++++++
> .../qemuxml2argv-hostdev-scsi-lsi-iscsi.args | 14 ++
> .../qemuxml2argv-hostdev-scsi-lsi-iscsi.xml | 40 ++++++
> ...emuxml2argv-hostdev-scsi-virtio-iscsi-auth.args | 16 +++
> ...qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml | 46 +++++++
> .../qemuxml2argv-hostdev-scsi-virtio-iscsi.args | 16 +++
> .../qemuxml2argv-hostdev-scsi-virtio-iscsi.xml | 40 ++++++
> tests/qemuxml2argvtest.c | 16 +++
> tests/qemuxml2xmltest.c | 5 +
> 13 files changed, 529 insertions(+), 69 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index e5b1adb..8b294bd 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -2824,57 +2824,107 @@
> </devices>
> ...</pre>
>
> +
> + <p>or:</p>
> +
> +<pre>
> + ...
> + <devices>
> + <hostdev mode='subsystem' type='scsi'>
> + <source protocol='iscsi' name='iqn.2014-08.com.example:iscsi-nopool/1'>
> + <host name='example.com' port='3260'/>
> + <auth username='myuser'>
> + <secret type='iscsi' usage='libvirtiscsi'/>
> + </auth>
> + </source>
> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> + </hostdev>
> + </devices>
> + ...</pre>
> +
> <dl>
> <dt><code>hostdev</code></dt>
> <dd>The <code>hostdev</code> element is the main container for describing
> - host devices. For usb device passthrough <code>mode</code> is always
> - "subsystem" and <code>type</code> is "usb" for a USB device, "pci"
> - for a PCI device and "scsi" for a SCSI device. When
> - <code>managed</code> is "yes" for a PCI
> - device, it is detached from the host before being passed on to
> - the guest, and reattached to the host after the guest exits.
> - If <code>managed</code> is omitted or "no", and for USB
> - devices, the user is responsible to
> - call <code>virNodeDeviceDettach</code> (or <code>virsh
> - nodedev-dettach</code>) before starting the guest or
> - hot-plugging the device,
> - and <code>virNodeDeviceReAttach</code> (or <code>virsh
> - nodedev-reattach</code>) after hot-unplug or stopping the
> - guest. For SCSI device, user is responsible to make sure the device
> - is not used by host.
> - The optional <code>sgio</code> (<span class="since">since 1.0.6</span>)
> - attribute indicates whether the kernel will filter unprivileged
> - SG_IO commands for the disk, valid settings are "filtered" or
> - "unfiltered". Defaults to "filtered".
> + host devices. For each device, the <code>mode</code> is always
> + "subsystem" and the <code>type</code> is one of the following values
> + with additional attributes noted.
> + <dl>
> + <dt>usb</dt>
> + <dd>For USB devices, the user is responsible to call
> + <code>virNodeDeviceDettach</code> (or
> + <code>virsh nodedev-detach</code>) before starting the guest
> + or hot-plugging the device and <code>virNodeDeviceReAttach</code>
> + (or <code>virsh nodedev-reattach</code>) after hot-unplug or
> + stopping the guest.
> + </dd>
> + <dt>pci</dt>
> + <dd>For PCI devices, when <code>managed</code> is "yes" it is
> + detached from the host before being passed on to the guest
> + and reattached to the host after the guest exits. If
> + <code>managed</code> is omitted or "no", follow the steps
> + described for a USB device to detach before starting the
> + guest or hot-plugging and reattach after stopping the guest
> + or hot-unplug.
> + </dd>
> + <dt>scsi</dt>
> + <dd>For SCSI devices, user is responsible to make sure the device
> + is not used by host. The optional <code>sgio</code>
> + (<span class="since">since 1.0.6</span>) attribute indicates
> + whether the kernel will filter unprivileged SG_IO commands for
> + the disk, valid settings are "filtered" or "unfiltered".
> + The default is "filtered".
> + </dd>
> + </dl>
> </dd>
> <dt><code>source</code></dt>
> - <dd>The source element describes the device as seen from the host.
> - The USB device can either be addressed by vendor / product id using the
> - <code>vendor</code> and <code>product</code> elements or by the device's
> - address on the hosts using the <code>address</code> element. PCI devices
> - on the other hand can only be described by their <code>address</code>.
> - SCSI devices are described by both the <code>adapter</code> and
> - <code>address</code> elements.
> -
> - <span class="since">Since 1.0.0</span>, the <code>source</code> element
> - of USB devices may contain <code>startupPolicy</code> attribute which can
> - be used to define policy what to do if the specified host USB device is
> - not found. The attribute accepts the following values:
> - <table class="top_table">
> - <tr>
> - <td> mandatory </td>
> - <td> fail if missing for any reason (the default) </td>
> - </tr>
> - <tr>
> - <td> requisite </td>
> - <td> fail if missing on boot up,
> - drop if missing on migrate/restore/revert </td>
> - </tr>
> - <tr>
> - <td> optional </td>
> - <td> drop if missing at any start attempt </td>
> - </tr>
> - </table>
> + <dd>The source element describes the device as seen from the host using
> + the following mechanism to describe:
> + <dl>
> + <dt>usb</dt>
> + <dd>The USB device can either be addressed by vendor / product id
> + using the <code>vendor</code> and <code>product</code> elements
> + or by the device's address on the host using the
> + <code>address</code> element.
> + <p>
> + <span class="since">Since 1.0.0</span>, the <code>source</code>
> + element of USB devices may contain <code>startupPolicy</code>
> + attribute which can be used to define policy what to do if the
> + specified host USB device is not found. The attribute accepts
> + the following values:
> + </p>
> + <table class="top_table">
> + <tr>
> + <td> mandatory </td>
> + <td> fail if missing for any reason (the default) </td>
> + </tr>
> + <tr>
> + <td> requisite </td>
> + <td> fail if missing on boot up,
> + drop if missing on migrate/restore/revert </td>
> + </tr>
> + <tr>
> + <td> optional </td>
> + <td> drop if missing at any start attempt </td>
> + </tr>
> + </table>
> + </dd>
> + <dt>pci</dt>
> + <dd>PCI devices can only be described by their <code>address</code>.
> + </dd>
> + <dt>scsi</dt>
> + <dd>SCSI devices are described by both the <code>adapter</code>
> + and <code>address</code> elements.
> + <p>
> + <span class="since">Since 1.2.8</span>, the <code>source</code>
> + element of a SCSI device may contain the <code>protocol</code>
> + attribute. When the attribute is set to "iscsi", the host
> + device XML follows the network <a href="#elementsDisks">disk</a>
> + device using the same <code>name</code> attribute and optionally
> + using the <code>auth</code> element to provide the authentication
> + credentials to the iSCSI server.
> + </p>
> + </dd>
> + </dl>
> </dd>
> <dt><code>vendor</code>, <code>product</code></dt>
> <dd>The <code>vendor</code> and <code>product</code> elements each have an
> @@ -3589,7 +3639,7 @@
> before being passed on to the guest, and reattached to the host
> after the guest exits. If <code>managed</code> is omitted or "no",
> the user is responsible to call <code>virNodeDeviceDettach</code>
> - (or <code>virsh nodedev-dettach</code>) before starting the guest
> + (or <code>virsh nodedev-detach</code>) before starting the guest
> or hot-plugging the device, and <code>virNodeDeviceReAttach</code>
> (or <code>virsh nodedev-reattach</code>) after hot-unplug or
> stopping the guest.
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 11f0fd0..b7a1b6f 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -3589,12 +3589,51 @@
> </attribute>
> </optional>
> <element name="source">
> - <interleave>
> - <ref name="sourceinfoadapter"/>
> - <element name="address">
> - <ref name="scsiaddress"/>
> - </element>
> - </interleave>
> + <choice>
> + <group> <!-- scsi_host adapter -->
> + <optional>
> + <attribute name="protocol">
> + <choice>
> + <value>adapter</value> <!-- scsi_host, default, optional -->
> + </choice>
> + </attribute>
> + </optional>
> + <interleave>
> + <ref name="sourceinfoadapter"/>
> + <element name="address">
> + <ref name="scsiaddress"/>
> + </element>
> + </interleave>
> + </group>
> + <group> <!-- iscsi adapter -->
> + <attribute name="protocol">
> + <choice>
> + <value>iscsi</value> <!-- iscsi, required -->
> + </choice>
> + </attribute>
> + <attribute name="name">
> + <text/>
> + </attribute>
> + <interleave>
> + <oneOrMore>
> + <element name='host'>
> + <attribute name='name'>
> + <text/>
> + </attribute>
> + <optional>
> + <attribute name='port'>
> + <ref name="PortNumber"/>
> + </attribute>
> + </optional>
> + <empty/>
> + </element>
> + </oneOrMore>
> + <optional>
> + <ref name='diskAuth'/>
> + </optional>
> + </interleave>
> + </group>
> + </choice>
> </element>
> </define>
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 358afae..d87ca24 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -597,6 +597,11 @@ VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend,
> "vfio",
> "xen")
>
> +VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol,
> + VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST,
> + "adapter",
> + "iscsi")
> +
> VIR_ENUM_IMPL(virDomainHostdevCaps, VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST,
> "storage",
> "misc",
> @@ -4213,10 +4218,96 @@ virDomainHostdevSubsysSCSIHostDefParseXML(xmlNodePtr sourcenode,
> }
>
> static int
> +virDomainHostdevSubsysSCSIiSCSIDefParseXML(xmlNodePtr sourcenode,
> + virDomainHostdevSubsysSCSIPtr def)
> +{
> + int ret = -1;
> + int auth_secret_usage = -1;
> + xmlNodePtr cur;
> + virStorageAuthDefPtr authdef = NULL;
> + virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &def->u.iscsi;
> +
> + /* Similar to virDomainDiskSourceParse for a VIR_STORAGE_TYPE_NETWORK */
> +
> + if (!(iscsisrc->path = virXMLPropString(sourcenode, "name"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("missing iSCSI hostdev source path name"));
> + goto cleanup;
> + }
> +
> + if (virDomainStorageHostParse(sourcenode, &iscsisrc->hosts,
> + &iscsisrc->nhosts) < 0)
> + goto cleanup;
> +
> + if (iscsisrc->nhosts < 1) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("missing the host address for the iSCSI hostdev"));
> + goto cleanup;
> + }
> + if (iscsisrc->nhosts > 1) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("only one source host address may be specified "
> + "for the iSCSI hostdev"));
> + goto cleanup;
> + }
> +
> + cur = sourcenode->children;
> + while (cur != NULL) {
> + if (cur->type == XML_ELEMENT_NODE &&
> + xmlStrEqual(cur->name, BAD_CAST "auth")) {
> + if (!(authdef = virStorageAuthDefParse(sourcenode->doc, cur)))
> + goto cleanup;
> + if ((auth_secret_usage =
> + virSecretUsageTypeFromString(authdef->secrettype)) < 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("invalid secret type %s"),
> + authdef->secrettype);
> + goto cleanup;
> + }
> + if (auth_secret_usage != VIR_SECRET_USAGE_TYPE_ISCSI) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("hostdev invalid secret type '%s'"),
> + authdef->secrettype);
> + goto cleanup;
> + }
> + iscsisrc->auth = authdef;
> + authdef = NULL;
> + }
> + cur = cur->next;
> + }
> + ret = 0;
> +
> + cleanup:
> + virStorageAuthDefFree(authdef);
> + return ret;
> +}
> +
> +static int
> virDomainHostdevSubsysSCSIDefParseXML(xmlNodePtr sourcenode,
> virDomainHostdevSubsysSCSIPtr scsisrc)
> {
> - return virDomainHostdevSubsysSCSIHostDefParseXML(sourcenode, scsisrc);
> + char *protocol = NULL;
> + int ret = -1;
> +
> + if ((protocol = virXMLPropString(sourcenode, "protocol"))) {
> + scsisrc->protocol =
> + virDomainHostdevSubsysSCSIProtocolTypeFromString(protocol);
> + if (scsisrc->protocol < 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Unknown SCSI subsystem protocol '%s'"),
> + protocol);
> + goto cleanup;
> + }
> + }
> +
> + if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
> + ret = virDomainHostdevSubsysSCSIiSCSIDefParseXML(sourcenode, scsisrc);
> + else
> + ret = virDomainHostdevSubsysSCSIHostDefParseXML(sourcenode, scsisrc);
> +
> + cleanup:
> + VIR_FREE(protocol);
> + return ret;
> }
>
> /* Check if a drive type address $controller:0:0:$unit is already
> @@ -15761,6 +15852,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
> virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
> virDomainHostdevSubsysSCSIPtr scsisrc = &def->source.subsys.u.scsi;
> virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
> + virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
>
> if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
> pcisrc->backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) {
> @@ -15777,17 +15869,27 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
> }
>
> virBufferAddLit(buf, "<source");
> - if (def->startupPolicy) {
> - const char *policy;
> - policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
> - virBufferAsprintf(buf, " startupPolicy='%s'", policy);
> + if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
> + if (def->startupPolicy) {
> + const char *policy;
> + policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
> + virBufferAsprintf(buf, " startupPolicy='%s'", policy);
> + }
> + if (usbsrc->autoAddress && (flags & VIR_DOMAIN_XML_MIGRATABLE))
> + virBufferAddLit(buf, " autoAddress='yes'");
> +
> + if (def->missing && !(flags & VIR_DOMAIN_XML_INACTIVE))
> + virBufferAddLit(buf, " missing='yes'");
> }
> - if (usbsrc->autoAddress && (flags & VIR_DOMAIN_XML_MIGRATABLE))
> - virBufferAddLit(buf, " autoAddress='yes'");
>
> - if (def->missing &&
> - !(flags & VIR_DOMAIN_XML_INACTIVE))
> - virBufferAddLit(buf, " missing='yes'");
> + if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
> + scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
> + const char *protocol =
> + virDomainHostdevSubsysSCSIProtocolTypeToString(scsisrc->protocol);
> +
> + virBufferAsprintf(buf, " protocol='%s' name='%s'",
> + protocol, iscsisrc->path);
> + }
>
> virBufferAddLit(buf, ">\n");
>
> @@ -15828,12 +15930,20 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
> }
> break;
> case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
> - virBufferAsprintf(buf, "<adapter name='%s'/>\n",
> - scsihostsrc->adapter);
> - virBufferAsprintf(buf, "<address %sbus='%d' target='%d' unit='%d'/>\n",
> - includeTypeInAddr ? "type='scsi' " : "",
> - scsihostsrc->bus, scsihostsrc->target,
> - scsihostsrc->unit);
> + if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
> + virBufferAddLit(buf, "<host");
> + virBufferEscapeString(buf, " name='%s'", iscsisrc->hosts[0].name);
> + virBufferEscapeString(buf, " port='%s'", iscsisrc->hosts[0].port);
> + virBufferAddLit(buf, "/>\n");
> + } else {
> + virBufferAsprintf(buf, "<adapter name='%s'/>\n",
> + scsihostsrc->adapter);
> + virBufferAsprintf(buf,
> + "<address %sbus='%d' target='%d' unit='%d'/>\n",
> + includeTypeInAddr ? "type='scsi' " : "",
> + scsihostsrc->bus, scsihostsrc->target,
> + scsihostsrc->unit);
> + }
> break;
> default:
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -15842,8 +15952,16 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
> return -1;
> }
>
> + if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
> + scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI &&
> + iscsisrc->auth) {
> + if (virStorageAuthDefFormat(buf, iscsisrc->auth) < 0)
> + return -1;
> + }
> +
> virBufferAdjustIndent(buf, -2);
> virBufferAddLit(buf, "</source>\n");
> +
> return 0;
> }
>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
> new file mode 100644
> index 0000000..6638dce
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.args
> @@ -0,0 +1,14 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu -S -M \
> +pc -m 214 -smp 1 -nographic -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
> +-device lsi,id=scsi0,bus=pci.0,addr=0x3 -usb \
> +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
> +-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
> +:3260/iqn.1992-01.com.example,if=none,format=raw,id=drive-hostdev0 \
> +-device scsi-generic,bus=scsi0.0,scsi-id=4,drive=drive-hostdev0,id=hostdev0 \
> +-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
> +:3260/iqn.1992-01.com.example/1,if=none,format=raw,id=drive-hostdev1 \
> +-device scsi-generic,bus=scsi0.0,scsi-id=5,drive=drive-hostdev1,id=hostdev1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
> new file mode 100644
> index 0000000..3bfded4
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi-auth.xml
> @@ -0,0 +1,46 @@
> +<domain type='qemu'>
> + <name>QEMUGuest2</name>
> + <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219100</memory>
> + <currentMemory unit='KiB'>219100</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</emulator>
> + <disk type='block' device='disk'>
> + <source dev='/dev/HostVG/QEMUGuest2'/>
> + <target dev='hda' bus='ide'/>
> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> + </disk>
> + <controller type='scsi' index='0'/>
> + <controller type='usb' index='0'/>
> + <controller type='ide' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example'>
> + <host name='example.org' port='3260'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + </source>
> + <address type='drive' controller='0' bus='0' target='0' unit='4'/>
> + </hostdev>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
> + <host name='example.org' port='3260'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + </source>
> + <address type='drive' controller='0' bus='0' target='0' unit='5'/>
> + </hostdev>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
> new file mode 100644
> index 0000000..2aebe9c
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.args
> @@ -0,0 +1,14 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu -S -M \
> +pc -m 214 -smp 1 -nographic -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
> +-device lsi,id=scsi0,bus=pci.0,addr=0x3 -usb \
> +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
> +-drive file=iscsi://example.org:3260/iqn.1992-01.com.example,if=none,\
> +format=raw,id=drive-hostdev0 \
> +-device scsi-generic,bus=scsi0.0,scsi-id=4,drive=drive-hostdev0,id=hostdev0 \
> +-drive file=iscsi://example.org:3260/iqn.1992-01.com.example/1,if=none,\
> +format=raw,id=drive-hostdev1 \
> +-device scsi-generic,bus=scsi0.0,scsi-id=5,drive=drive-hostdev1,id=hostdev1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
> new file mode 100644
> index 0000000..8a05099
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi-iscsi.xml
> @@ -0,0 +1,40 @@
> +<domain type='qemu'>
> + <name>QEMUGuest2</name>
> + <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219100</memory>
> + <currentMemory unit='KiB'>219100</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</emulator>
> + <disk type='block' device='disk'>
> + <source dev='/dev/HostVG/QEMUGuest2'/>
> + <target dev='hda' bus='ide'/>
> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> + </disk>
> + <controller type='scsi' index='0'/>
> + <controller type='usb' index='0'/>
> + <controller type='ide' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example'>
> + <host name='example.org' port='3260'/>
> + </source>
> + <address type='drive' controller='0' bus='0' target='0' unit='4'/>
> + </hostdev>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
> + <host name='example.org' port='3260'/>
> + </source>
> + <address type='drive' controller='0' bus='0' target='0' unit='5'/>
> + </hostdev>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
> new file mode 100644
> index 0000000..7fd3a00
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.args
> @@ -0,0 +1,16 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu -S -M \
> +pc -m 214 -smp 1 -nographic -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
> +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 -usb \
> +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
> +-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
> +:3260/iqn.1992-01.com.example,if=none,format=raw,id=drive-hostdev0 \
> +-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=4,\
> +drive=drive-hostdev0,id=hostdev0 \
> +-drive file=iscsi://myname:AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A@example.org\
> +:3260/iqn.1992-01.com.example/1,if=none,format=raw,id=drive-hostdev1 \
> +-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=5,\
> +drive=drive-hostdev1,id=hostdev1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
> new file mode 100644
> index 0000000..d4dba4a
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi-auth.xml
> @@ -0,0 +1,46 @@
> +<domain type='qemu'>
> + <name>QEMUGuest2</name>
> + <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219100</memory>
> + <currentMemory unit='KiB'>219100</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</emulator>
> + <disk type='block' device='disk'>
> + <source dev='/dev/HostVG/QEMUGuest2'/>
> + <target dev='hda' bus='ide'/>
> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> + </disk>
> + <controller type='scsi' index='0' model='virtio-scsi'/>
> + <controller type='usb' index='0'/>
> + <controller type='ide' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example'>
> + <host name='example.org' port='3260'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + </source>
> + <address type='drive' controller='0' bus='0' target='2' unit='4'/>
> + </hostdev>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
> + <host name='example.org' port='3260'/>
> + <auth username='myname'>
> + <secret type='iscsi' usage='mycluster_myname'/>
> + </auth>
> + </source>
> + <address type='drive' controller='0' bus='0' target='2' unit='5'/>
> + </hostdev>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
> new file mode 100644
> index 0000000..e4b6e97
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.args
> @@ -0,0 +1,16 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu -S -M \
> +pc -m 214 -smp 1 -nographic -nodefaults -monitor \
> +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
> +-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x3 -usb \
> +-drive file=/dev/HostVG/QEMUGuest2,if=none,id=drive-ide0-0-0 \
> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
> +-drive file=iscsi://example.org:3260/iqn.1992-01.com.example,if=none,\
> +format=raw,id=drive-hostdev0 \
> +-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=4,\
> +drive=drive-hostdev0,id=hostdev0 \
> +-drive file=iscsi://example.org:3260/iqn.1992-01.com.example/1,if=none,\
> +format=raw,id=drive-hostdev1 \
> +-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=2,lun=5,\
> +drive=drive-hostdev1,id=hostdev1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
> new file mode 100644
> index 0000000..13c0930
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-iscsi.xml
> @@ -0,0 +1,40 @@
> +<domain type='qemu'>
> + <name>QEMUGuest2</name>
> + <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219100</memory>
> + <currentMemory unit='KiB'>219100</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</emulator>
> + <disk type='block' device='disk'>
> + <source dev='/dev/HostVG/QEMUGuest2'/>
> + <target dev='hda' bus='ide'/>
> + <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> + </disk>
> + <controller type='scsi' index='0' model='virtio-scsi'/>
> + <controller type='usb' index='0'/>
> + <controller type='ide' index='0'/>
> + <controller type='pci' index='0' model='pci-root'/>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example'>
> + <host name='example.org' port='3260'/>
> + </source>
> + <address type='drive' controller='0' bus='0' target='2' unit='4'/>
> + </hostdev>
> + <hostdev mode='subsystem' type='scsi' managed='yes'>
> + <source protocol='iscsi' name='iqn.1992-01.com.example/1'>
> + <host name='example.org' port='3260'/>
> + </source>
> + <address type='drive' controller='0' bus='0' target='2' unit='5'/>
> + </hostdev>
> + <memballoon model='virtio'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 12ecabc..609c1bc 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -1353,6 +1353,22 @@ mymain(void)
> QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
> QEMU_CAPS_DEVICE_SCSI_GENERIC,
> QEMU_CAPS_DEVICE_SCSI_GENERIC_BOOTINDEX);
> + DO_TEST("hostdev-scsi-lsi-iscsi", QEMU_CAPS_DRIVE,
> + QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
> + QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI,
> + QEMU_CAPS_DEVICE_SCSI_GENERIC);
> + DO_TEST("hostdev-scsi-lsi-iscsi-auth", QEMU_CAPS_DRIVE,
> + QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
> + QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI,
> + QEMU_CAPS_DEVICE_SCSI_GENERIC);
> + DO_TEST("hostdev-scsi-virtio-iscsi", QEMU_CAPS_DRIVE,
> + QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
> + QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
> + QEMU_CAPS_DEVICE_SCSI_GENERIC);
> + DO_TEST("hostdev-scsi-virtio-iscsi-auth", QEMU_CAPS_DRIVE,
> + QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
> + QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_SCSI,
> + QEMU_CAPS_DEVICE_SCSI_GENERIC);
>
> DO_TEST("mlock-on", QEMU_CAPS_MLOCK);
> DO_TEST_FAILURE("mlock-on", NONE);
> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
> index 451dedc..7d416d0 100644
> --- a/tests/qemuxml2xmltest.c
> +++ b/tests/qemuxml2xmltest.c
> @@ -361,6 +361,11 @@ mymain(void)
>
> DO_TEST_DIFFERENT("hostdev-scsi-autogen-address");
>
> + DO_TEST("hostdev-scsi-lsi-iscsi");
> + DO_TEST("hostdev-scsi-lsi-iscsi-auth");
> + DO_TEST("hostdev-scsi-virtio-iscsi");
> + DO_TEST("hostdev-scsi-virtio-iscsi-auth");
> +
> DO_TEST_DIFFERENT("s390-defaultconsole");
>
> DO_TEST("pcihole64");
>
More information about the Libvirt-cim
mailing list