Il 19/07/2013 14:32, John Ferlan ha scritto: > There are two ways to use a iSCSI LUN as disk source for qemu. > > * The LUN's path as it shows up on host, e.g. > /dev/disk/by-path/ip-$ip:3260-iscsi-$iqn-fc18:iscsi.iscsi0-lun-1 > > * The libiscsi URI from the storage pool source element host attribute, e.g. > iscsi://demo.org:6000/iqn.1992-01.com.example/1 > > For a "volume" type disk, if the specified "pool" is of iscsi > type, we should support to use the LUN in either of above 2 ways. > That's why to introduce a new XML tag "mode" for the disk source > (libvirt should support iscsi pool with libiscsi, but it's another > new feature, which should be done later). > > The "mode" can be either of "host" or "direct". Use "host" to indicate > use of the LUN with the path as it shows up on host. Use "direct" to > indicate to use it with the source pool host URI (future patches may support > to use network type libvirt storage too, e.g. Ceph) What is the default? Should 'direct' be valid for non-network pools? Paolo > --- > docs/formatdomain.html.in | 11 ++++- > docs/schemas/domaincommon.rng | 8 ++++ > src/conf/domain_conf.c | 22 +++++++++- > src/conf/domain_conf.h | 22 ++++++++++ > .../qemuxml2argv-disk-source-pool-mode.xml | 48 ++++++++++++++++++++++ > tests/qemuxml2xmltest.c | 1 + > 6 files changed, 110 insertions(+), 2 deletions(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index b1c3bfc..7601aaa 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -1601,7 +1601,16 @@ > <code>pool</code> and <code>volume</code>. Attribute <code>pool</code> > specifies the name of storage pool (managed by libvirt) where the disk > source resides, and attribute <code>volume</code> specifies the name of > - storage volume (managed by libvirt) used as the disk source. > + storage volume (managed by libvirt) used as the disk source. For a > + "volume" type disk, if the underlying storage pool is "iscsi", attribute > + <code>mode</code> (<span class="since">since 1.1.1</span>) can be used > + to indicate how to represent the LUN as the disk source. The value > + "host" indicates to use the LUN's path as it shows up on host, e.g. > + /dev/disk/by-path/ip-10.11.12.9:3260-iscsi-iqn.2013-06.fc:iscsi.iscsi0-lun-1). > + The value "direct" indicates to use the storage pool's > + <code>source</code> element <code>host</code> attribute as the > + disk source for the libiscsi URI, e.g. > + file=iscsi://demo.org:6000/iqn.1992-01.com.example/1. > <span class="since">Since 0.0.3; <code>type='dir'</code> since > 0.7.5; <code>type='network'</code> since > 0.8.7; <code>protocol='iscsi'</code> since 1.0.4; > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index 7a6852b..745b959 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -1174,6 +1174,14 @@ > <ref name="volName"/> > </attribute> > <optional> > + <attribute name="mode"> > + <choice> > + <value>host</value> > + <value>direct</value> > + </choice> > + </attribute> > + </optional> > + <optional> > <ref name="startupPolicy"/> > </optional> > <optional> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 57cd9b1..419958f 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -761,6 +761,11 @@ VIR_ENUM_IMPL(virDomainDiskDiscard, VIR_DOMAIN_DISK_DISCARD_LAST, > "default", > "unmap", > "ignore") > +VIR_ENUM_IMPL(virDomainDiskSourcePoolMode, > + VIR_DOMAIN_DISK_SOURCE_POOL_MODE_LAST, > + "default", > + "host", > + "direct") > > #define VIR_DOMAIN_XML_WRITE_FLAGS VIR_DOMAIN_XML_SECURE > #define VIR_DOMAIN_XML_READ_FLAGS VIR_DOMAIN_XML_INACTIVE > @@ -4645,10 +4650,12 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node, > { > char *pool = NULL; > char *volume = NULL; > + char *mode = NULL; > int ret = -1; > > pool = virXMLPropString(node, "pool"); > volume = virXMLPropString(node, "volume"); > + mode = virXMLPropString(node, "mode"); > > /* CD-ROM and Floppy allows no source */ > if (!pool && !volume) > @@ -4664,6 +4671,14 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node, > if (VIR_ALLOC(def->srcpool) < 0) > goto cleanup; > > + if (mode && (def->srcpool->mode = > + virDomainDiskSourcePoolModeTypeFromString(mode)) <= 0) { > + virReportError(VIR_ERR_XML_ERROR, > + _("unknown source mode '%s' for volume type disk"), > + mode); > + goto cleanup; > + } > + > def->srcpool->pool = pool; > pool = NULL; > def->srcpool->volume = volume; > @@ -4674,6 +4689,7 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node, > cleanup: > VIR_FREE(pool); > VIR_FREE(volume); > + VIR_FREE(mode); > return ret; > } > > @@ -14157,9 +14173,13 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, > case VIR_DOMAIN_DISK_TYPE_VOLUME: > virBufferAddLit(buf, " <source"); > > - if (def->srcpool) > + if (def->srcpool) { > virBufferAsprintf(buf, " pool='%s' volume='%s'", > def->srcpool->pool, def->srcpool->volume); > + if (def->srcpool->mode) > + virBufferAsprintf(buf, " mode='%s'", > + virDomainDiskSourcePoolModeTypeToString(def->srcpool->mode)); > + } > if (def->startupPolicy) > virBufferEscapeString(buf, " startupPolicy='%s'", startupPolicy); > > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 25dad16..982a94e 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -652,11 +652,32 @@ struct _virDomainBlockIoTuneInfo { > }; > typedef virDomainBlockIoTuneInfo *virDomainBlockIoTuneInfoPtr; > > +/* > + * Used for volume "type" disk to indicate how to represent > + * the disk source if the specified "pool" is of iscsi type. > + */ > +enum virDomainDiskSourcePoolMode { > + VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DEFAULT = 0, > + > + /* Use the path as it shows up on host, e.g. > + * /dev/disk/by-path/ip-$ip-iscsi-$iqn:iscsi.iscsi-pool0-lun-1 > + */ > + VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST, > + > + /* Use the URI from the storage pool source element host attribute. E.g. > + * file=iscsi://demo.org:6000/iqn.1992-01.com.example/1. > + */ > + VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT, > + > + VIR_DOMAIN_DISK_SOURCE_POOL_MODE_LAST > +}; > + > typedef struct _virDomainDiskSourcePoolDef virDomainDiskSourcePoolDef; > struct _virDomainDiskSourcePoolDef { > char *pool; /* pool name */ > char *volume; /* volume name */ > int voltype; /* enum virStorageVolType, internal only */ > + int mode; /* enum virDomainDiskSourcePoolMode */ > }; > typedef virDomainDiskSourcePoolDef *virDomainDiskSourcePoolDefPtr; > > @@ -2554,6 +2575,7 @@ VIR_ENUM_DECL(virDomainDiskSecretType) > VIR_ENUM_DECL(virDomainDeviceSGIO) > VIR_ENUM_DECL(virDomainDiskTray) > VIR_ENUM_DECL(virDomainDiskDiscard) > +VIR_ENUM_DECL(virDomainDiskSourcePoolMode) > VIR_ENUM_DECL(virDomainIoEventFd) > VIR_ENUM_DECL(virDomainVirtioEventIdx) > VIR_ENUM_DECL(virDomainDiskCopyOnRead) > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml > new file mode 100644 > index 0000000..b907633 > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml > @@ -0,0 +1,48 @@ > +<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</emulator> > + <disk type='volume' device='cdrom'> > + <source pool='blk-pool0' volume='blk-pool0-vol0' mode='host' startupPolicy='optional'> > + <seclabel model='selinux' relabel='yes'> > + <label>system_u:system_r:public_content_t:s0</label> > + </seclabel> > + </source> > + <target dev='hda' bus='ide'/> > + <readonly/> > + <address type='drive' controller='0' bus='0' target='0' unit='1'/> > + </disk> > + <disk type='volume' device='cdrom'> > + <source pool='blk-pool0' volume='blk-pool0-vol1' mode='direct' startupPolicy='optional'> > + <seclabel model='selinux' relabel='yes'> > + <label>system_u:system_r:public_content_t:s0</label> > + </seclabel> > + </source> > + <target dev='hda' bus='ide'/> > + <readonly/> > + <address type='drive' controller='0' bus='0' target='0' unit='2'/> > + </disk> > + <disk type='file' device='disk'> > + <source file='/tmp/idedisk.img'/> > + <target dev='hdc' bus='ide'/> > + <address type='drive' controller='0' bus='0' target='0' unit='3'/> > + </disk> > + <controller type='usb' index='0'/> > + <controller type='ide' index='0'/> > + <controller type='ide' index='1'/> > + <controller type='pci' index='0' model='pci-root'/> > + <memballoon model='virtio'/> > + </devices> > +</domain> > diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c > index 76570c5..77cac3f 100644 > --- a/tests/qemuxml2xmltest.c > +++ b/tests/qemuxml2xmltest.c > @@ -264,6 +264,7 @@ mymain(void) > > DO_TEST("disk-scsi-disk-vpd"); > DO_TEST("disk-source-pool"); > + DO_TEST("disk-source-pool-mode"); > > DO_TEST("disk-drive-discard"); > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list