[libvirt] [PATCHv1.5 04/27] qemuxml2argv: Add test for disk type='volume' with iSCSI pools
Michal Privoznik
mprivozn at redhat.com
Tue Nov 26 18:30:52 UTC 2013
On 26.11.2013 17:48, Peter Krempa wrote:
> Tweak the existing file so that it can be tested for command line
> corectness.
> ---
> src/conf/domain_conf.h | 1 +
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_command.c | 76 +-----------
> src/qemu/qemu_conf.c | 129 ++++++++++++++-------
> src/qemu/qemu_conf.h | 2 +
> .../qemuxml2argv-disk-source-pool-mode.args | 10 ++
> .../qemuxml2argv-disk-source-pool-mode.xml | 4 +-
> tests/qemuxml2argvtest.c | 2 +
> 8 files changed, 112 insertions(+), 113 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.args
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 4561ccc..a5ef2ca 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -686,6 +686,7 @@ struct _virDomainDiskSourcePoolDef {
> char *volume; /* volume name */
> int voltype; /* enum virStorageVolType, internal only */
> int pooltype; /* enum virStoragePoolType, internal only */
> + int actualtype; /* enum virDomainDiskType, internal only */
> int mode; /* enum virDomainDiskSourcePoolMode */
> };
> typedef virDomainDiskSourcePoolDef *virDomainDiskSourcePoolDefPtr;
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 205fe56..aeb3568 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -693,6 +693,7 @@ virStoragePoolSourceFree;
> virStoragePoolSourceListFormat;
> virStoragePoolSourceListNewSource;
> virStoragePoolTypeFromString;
> +virStoragePoolTypeToString;
> virStorageVolDefFindByKey;
> virStorageVolDefFindByName;
> virStorageVolDefFindByPath;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 763417f..b8129a3 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -3775,69 +3775,6 @@ qemuBuildNBDString(virConnectPtr conn, virDomainDiskDefPtr disk, virBufferPtr op
> return 0;
> }
>
> -static int
> -qemuBuildVolumeString(virConnectPtr conn,
> - virDomainDiskDefPtr disk,
> - virBufferPtr opt)
> -{
> - int ret = -1;
> -
> - switch ((virStorageVolType) disk->srcpool->voltype) {
> - case VIR_STORAGE_VOL_DIR:
> - if (!disk->readonly) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("cannot create virtual FAT disks in read-write mode"));
> - goto cleanup;
> - }
> - if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
> - virBufferEscape(opt, ',', ",", "file=fat:floppy:%s,", disk->src);
> - else
> - virBufferEscape(opt, ',', ",", "file=fat:%s,", disk->src);
> - break;
> - case VIR_STORAGE_VOL_BLOCK:
> - if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN) {
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("tray status 'open' is invalid for "
> - "block type volume"));
> - goto cleanup;
> - }
> - if (disk->srcpool->pooltype == VIR_STORAGE_POOL_ISCSI) {
> - if (disk->srcpool->mode ==
> - VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT) {
> - if (qemuBuildISCSIString(conn, disk, opt) < 0)
> - goto cleanup;
> - virBufferAddChar(opt, ',');
> - } else if (disk->srcpool->mode ==
> - VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST) {
> - virBufferEscape(opt, ',', ",", "file=%s,", disk->src);
> - }
> - } else {
> - virBufferEscape(opt, ',', ",", "file=%s,", disk->src);
> - }
> - break;
> - case VIR_STORAGE_VOL_FILE:
> - if (disk->auth.username) {
> - if (qemuBuildISCSIString(conn, disk, opt) < 0)
> - goto cleanup;
> - virBufferAddChar(opt, ',');
> - } else {
> - virBufferEscape(opt, ',', ",", "file=%s,", disk->src);
> - }
> - break;
> - case VIR_STORAGE_VOL_NETWORK:
> - case VIR_STORAGE_VOL_NETDIR:
> - case VIR_STORAGE_VOL_LAST:
> - /* Keep the compiler quiet, qemuTranslateDiskSourcePool already
> - * reported the unsupported error.
> - */
> - goto cleanup;
> - }
> -
> - ret = 0;
> -
> -cleanup:
> - return ret;
> -}
>
> char *
> qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> @@ -3851,6 +3788,7 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> virDomainDiskGeometryTransTypeToString(disk->geometry.trans);
> int idx = virDiskNameToIndex(disk->dst);
> int busid = -1, unitid = -1;
> + int actualType = qemuDiskGetActualType(disk);
>
> if (idx < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -3934,12 +3872,13 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>
> /* disk->src is NULL when we use nbd disks */
> if ((disk->src ||
> - (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
> + (actualType == VIR_DOMAIN_DISK_TYPE_NETWORK &&
> disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) &&
> !((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY ||
> disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) &&
> disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
> - if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
> +
> + if (actualType == VIR_DOMAIN_DISK_TYPE_DIR) {
> /* QEMU only supports magic FAT format for now */
> if (disk->format > 0 && disk->format != VIR_STORAGE_FILE_FAT) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -3957,7 +3896,7 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> disk->src);
> else
> virBufferEscape(&opt, ',', ",", "file=fat:%s,", disk->src);
> - } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
> + } else if (actualType == VIR_DOMAIN_DISK_TYPE_NETWORK) {
> switch (disk->protocol) {
> case VIR_DOMAIN_DISK_PROTOCOL_NBD:
> if (qemuBuildNBDString(conn, disk, &opt) < 0)
> @@ -4025,11 +3964,8 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> virBufferEscape(&opt, ',', ",", "%s,", disk->src);
> break;
> }
> - } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) {
> - if (qemuBuildVolumeString(conn, disk, &opt) < 0)
> - goto error;
> } else {
> - if ((disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK) &&
> + if ((actualType == VIR_DOMAIN_DISK_TYPE_BLOCK) &&
> (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("tray status 'open' is invalid for "
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 77df370..58a0500 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1298,6 +1298,17 @@ cleanup:
> return ret;
> }
>
> +
> +int
> +qemuDiskGetActualType(virDomainDiskDefPtr def)
> +{
> + if (def->type == VIR_DOMAIN_DISK_TYPE_VOLUME)
> + return def->srcpool->actualtype;
> +
> + return def->type;
> +}
> +
> +
> int
> qemuTranslateDiskSourcePool(virConnectPtr conn,
> virDomainDiskDefPtr def)
> @@ -1319,72 +1330,108 @@ qemuTranslateDiskSourcePool(virConnectPtr conn,
> if (!(pool = virStoragePoolLookupByName(conn, def->srcpool->pool)))
> return -1;
>
> + if (virStoragePoolIsActive(pool) != 1) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("storage pool '%s' containing volume '%s' "
> + "is not active"),
> + def->srcpool->pool, def->srcpool->volume);
> + goto cleanup;
> + }
> +
> if (!(vol = virStorageVolLookupByName(pool, def->srcpool->volume)))
> goto cleanup;
>
> if (virStorageVolGetInfo(vol, &info) < 0)
> goto cleanup;
>
> - if (def->startupPolicy &&
> - info.type != VIR_STORAGE_VOL_FILE) {
> + if (!(poolxml = virStoragePoolGetXMLDesc(pool, 0)))
> + goto cleanup;
> +
> + if (!(pooldef = virStoragePoolDefParseString(poolxml)))
> + goto cleanup;
> +
> + def->srcpool->pooltype = pooldef->type;
> + def->srcpool->voltype = info.type;
> +
> + if (def->srcpool->mode && pooldef->type != VIR_STORAGE_POOL_ISCSI) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> - _("'startupPolicy' is only valid for 'file' type volume"));
> + _("disk source mode is only valid when "
> + "storage pool is of iscsi type"));
> goto cleanup;
> }
>
> - switch ((virStorageVolType) info.type) {
> - case VIR_STORAGE_VOL_FILE:
> - case VIR_STORAGE_VOL_DIR:
> + switch ((enum virStoragePoolType) pooldef->type) {
> + case VIR_STORAGE_POOL_DIR:
> + case VIR_STORAGE_POOL_FS:
> + case VIR_STORAGE_POOL_NETFS:
> + case VIR_STORAGE_POOL_LOGICAL:
> + case VIR_STORAGE_POOL_DISK:
> + case VIR_STORAGE_POOL_SCSI:
> if (!(def->src = virStorageVolGetPath(vol)))
> goto cleanup;
> - break;
> - case VIR_STORAGE_VOL_BLOCK:
> - if (!(poolxml = virStoragePoolGetXMLDesc(pool, 0)))
> - goto cleanup;
> -
> - if (!(pooldef = virStoragePoolDefParseString(poolxml)))
> - goto cleanup;
>
> - if (def->srcpool->mode && pooldef->type != VIR_STORAGE_POOL_ISCSI) {
> - virReportError(VIR_ERR_XML_ERROR, "%s",
> - _("disk source mode is only valid when "
> - "storage pool is of iscsi type"));
> + switch (info.type) {
> + case VIR_STORAGE_VOL_FILE:
> + def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_FILE;
> + break;
> +
> + case VIR_STORAGE_VOL_DIR:
> + def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_DIR;
> + break;
> +
> + case VIR_STORAGE_VOL_BLOCK:
> + def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_BLOCK;
> + break;
> +
> + case VIR_STORAGE_VOL_NETWORK:
> + case VIR_STORAGE_VOL_NETDIR:
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unexpected storage volume type '%s' "
> + "for storage pool type '%s'"),
> + virStorageVolTypeToString(info.type),
> + virStoragePoolTypeToString(pooldef->type));
> goto cleanup;
> }
>
> - def->srcpool->pooltype = pooldef->type;
> - if (pooldef->type == VIR_STORAGE_POOL_ISCSI) {
> - /* Default to use the LUN's path on host */
> - if (!def->srcpool->mode)
> - def->srcpool->mode = VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST;
> -
> - if (def->srcpool->mode ==
> - VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT) {
> - if (qemuAddISCSIPoolSourceHost(def, pooldef) < 0)
> - goto cleanup;
> - } else if (def->srcpool->mode ==
> - VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST) {
> - if (!(def->src = virStorageVolGetPath(vol)))
> - goto cleanup;
> - }
> + break;
> +
> + case VIR_STORAGE_POOL_ISCSI:
> + switch (def->srcpool->mode) {
> + case VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DEFAULT:
> + case VIR_DOMAIN_DISK_SOURCE_POOL_MODE_LAST:
> + def->srcpool->mode = VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST;
> + def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_BLOCK;
> + /* fallthrough */
> + case VIR_DOMAIN_DISK_SOURCE_POOL_MODE_HOST:
> + if (!(def->src = virStorageVolGetPath(vol)))
> + goto cleanup;
> + break;
> +
> + case VIR_DOMAIN_DISK_SOURCE_POOL_MODE_DIRECT:
> + def->srcpool->actualtype = VIR_DOMAIN_DISK_TYPE_NETWORK;
> + def->protocol = VIR_DOMAIN_DISK_PROTOCOL_ISCSI;
>
> if (qemuTranslateDiskSourcePoolAuth(def, pooldef) < 0)
> goto cleanup;
> - } else {
> - if (!(def->src = virStorageVolGetPath(vol)))
> +
> + if (qemuAddISCSIPoolSourceHost(def, pooldef) < 0)
> goto cleanup;
> + break;
> }
> -
> break;
> - case VIR_STORAGE_VOL_NETWORK:
> - case VIR_STORAGE_VOL_NETDIR:
> - case VIR_STORAGE_VOL_LAST:
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("Using network volume as disk source is not supported"));
> +
> + case VIR_STORAGE_POOL_MPATH:
> + case VIR_STORAGE_POOL_RBD:
> + case VIR_STORAGE_POOL_SHEEPDOG:
> + case VIR_STORAGE_POOL_GLUSTER:
> + case VIR_STORAGE_POOL_LAST:
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("using '%s' pools for backing 'volume' disks "
> + "isn't yet supported"),
> + virStoragePoolTypeToString(pooldef->type));
> goto cleanup;
> }
>
> - def->srcpool->voltype = info.type;
> ret = 0;
> cleanup:
> if (ret < 0)
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
> index f9ff7af..b9786b1 100644
> --- a/src/qemu/qemu_conf.h
> +++ b/src/qemu/qemu_conf.h
> @@ -304,6 +304,8 @@ int qemuSetUnprivSGIO(virDomainDeviceDefPtr dev);
> int qemuDriverAllocateID(virQEMUDriverPtr driver);
> virDomainXMLOptionPtr virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver);
>
> +int qemuDiskGetActualType(virDomainDiskDefPtr def);
> +
> int qemuTranslateDiskSourcePool(virConnectPtr conn,
> virDomainDiskDefPtr def);
>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.args
> new file mode 100644
> index 0000000..8f6a3dd
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.args
> @@ -0,0 +1,10 @@
> +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 -nodefconfig -nodefaults \
> +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -drive \
> +file=/some/block/device/unit:0:0:1,if=none,media=cdrom,id=drive-ide0-0-1 -device \
> +ide-drive,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 -drive \
> +file=iscsi://iscsi.example.com:3260/demo-target/2,if=none,media=cdrom,id=drive-ide0-0-2 \
> +-device ide-drive,bus=ide.0,unit=2,drive=drive-ide0-0-2,id=ide0-0-2 -drive \
> +file=/tmp/idedisk.img,if=none,id=drive-ide0-0-3 -device \
> +ide-drive,bus=ide.0,unit=3,drive=drive-ide0-0-3,id=ide0-0-3 -device \
> +virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml
> index b907633..9f90293 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.xml
> @@ -15,7 +15,7 @@
> <devices>
> <emulator>/usr/bin/qemu</emulator>
> <disk type='volume' device='cdrom'>
> - <source pool='blk-pool0' volume='blk-pool0-vol0' mode='host' startupPolicy='optional'>
> + <source pool='pool-iscsi-auth' volume='unit:0:0:1' mode='host'>
> <seclabel model='selinux' relabel='yes'>
> <label>system_u:system_r:public_content_t:s0</label>
> </seclabel>
> @@ -25,7 +25,7 @@
> <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'>
Just curious, I see you're removing startupPolicy here and in other
patches. Would it hurt to leave it there?
At any rate, ACK.
Michal
More information about the libvir-list
mailing list