On 08/05/2014 05:24 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.
Might be worth mentioning that protocol='adapter' was added as an
optional marker of the existing use.
Signed-off-by: John Ferlan <jferlan(a)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
+++ 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")
So 0 == adapter...
+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);
so whether the user omitted protocol or specified it as adapter, they
get the old style parse...
- 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);
...but here, you don't output the protocol. I can live with that (the
alternative would be to always output the protocol, whether or not it
was provided on input, and then touch up existing tests to reflect the
new output; but the end result is the same).
ACK
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org