[PATCH v3 0/5] qemu: Support rbd namespace attribute

Diff from v2: - rebase to master - update some qemu capabilities tests Test results of this patch series on qemu-5.0.0 and librbd1-14.2.8: disk xml: <disk type='network' device='disk'> <driver name='qemu' type='raw'/> <auth username='admin'> <secret type='ceph' usage='ceph_example'/> </auth> <source protocol='rbd' name='rbd/1' namespace='hhan'> <host name='CEPH_MON'/> </source> <target dev='vde' bus='virtio'/> </disk> Live attach and detach the disk: ➜ ~ virsh attach-device new /tmp/ceph-ns.xml Device attached successfully ➜ ~ virsh dumpxml new|xmllint --xpath //disk - <disk type="file" device="disk"> <driver name="qemu" type="qcow2"/> <source file="/var/lib/libvirt/images/new.qcow2" index="2"/> <backingStore/> <target dev="vda" bus="virtio"/> <serial>WD-WMAP9A966149</serial> <alias name="virtio-disk0"/> <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/> </disk><disk type="network" device="disk"> <driver name="qemu" type="raw"/> <auth username="admin"> <secret type="ceph" usage="ceph_example"/> </auth> <source protocol="rbd" name="rbd/1" namespace="hhan" index="3"> <host name="CEPH_MON"/> </source> <target dev="vde" bus="virtio"/> <alias name="virtio-disk4"/> <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/> </disk> ➜ ~ virsh detach-device new /tmp/ceph-ns.xml Device detached successfully ➜ ~ virsh dumpxml new|xmllint --xpath //disk - <disk type="file" device="disk"> <driver name="qemu" type="qcow2"/> <source file="/var/lib/libvirt/images/new.qcow2" index="2"/> <backingStore/> <target dev="vda" bus="virtio"/> <serial>WD-WMAP9A966149</serial> <alias name="virtio-disk0"/> <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/> </disk> It also works when start VM with this disk. And tests pass when it is tested with -blockdev disabled: <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> [...] <qemu:capabilities> <qemu:del capability='blockdev'/> <qemu:add capability='drive'/> </qemu:capabilities> </domain> v2: https://www.redhat.com/archives/libvir-list/2020-April/msg00972.html Han Han (5): qemu_capabilities: Add QEMU_CAPS_RBD_NAMESPACE conf: Support to parse rbd namespace attribute qemu: Implement rbd namespace attribute doc: rng schemas and html doc for rbd namespace attribute news: qemu: Support rbd namespace NEWS.rst | 6 +++ docs/formatdomain.rst | 5 ++- docs/schemas/domaincommon.rng | 3 ++ src/conf/domain_conf.c | 4 ++ src/qemu/qemu_block.c | 1 + src/qemu/qemu_capabilities.c | 4 ++ src/qemu/qemu_capabilities.h | 3 ++ src/qemu/qemu_command.c | 7 +++- src/util/virstoragefile.h | 1 + .../caps_5.0.0.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 + .../caps_5.0.0.riscv64.xml | 1 + .../caps_5.0.0.x86_64.xml | 1 + .../caps_5.1.0.x86_64.xml | 1 + ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 19 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml -- 2.27.0

Add rbd namespace in aarch64 capability replies. The capability flag will be used for rbd namespace option. The rbd namespace is introduced since ceph Nautilus and qemu v5.0.0. Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml | 1 + 7 files changed, 12 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ff6ba8c9e9..7656d5f8cb 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -597,6 +597,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "spapr-tpm-proxy", "numa.hmat", "blockdev-hostdev-scsi", + + /* 380 */ + "rbd.namespace", ); @@ -1525,6 +1528,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "migrate-set-parameters/arg-type/downtime-limit", QEMU_CAPS_MIGRATION_PARAM_DOWNTIME }, { "migrate-set-parameters/arg-type/xbzrle-cache-size", QEMU_CAPS_MIGRATION_PARAM_XBZRLE_CACHE_SIZE }, { "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT }, + { "blockdev-add/arg-type/+rbd/namespace", QEMU_CAPS_RBD_NAMESPACE }, }; typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5d08941538..ef7ea9aa20 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -578,6 +578,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_NUMA_HMAT, /* -numa hmat */ QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI, /* -blockdev used for (i)SCSI hostdevs */ + /* 380 */ + QEMU_CAPS_RBD_NAMESPACE, /* -blockdev '{"driver":"rbd",...,"namespace":str}' */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml index 928af2a01c..75622ca5fd 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml @@ -199,6 +199,7 @@ <flag name='migration-param.xbzrle-cache-size'/> <flag name='numa.hmat'/> <flag name='blockdev-hostdev-scsi'/> + <flag name='rbd.namespace'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>61700241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml index e8668a25a9..1780c8a5bc 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml @@ -208,6 +208,7 @@ <flag name='spapr-tpm-proxy'/> <flag name='numa.hmat'/> <flag name='blockdev-hostdev-scsi'/> + <flag name='rbd.namespace'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>42900241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml index 85a8a46dac..d885bd9bb3 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.riscv64.xml @@ -195,6 +195,7 @@ <flag name='migration-param.xbzrle-cache-size'/> <flag name='numa.hmat'/> <flag name='blockdev-hostdev-scsi'/> + <flag name='rbd.namespace'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>0</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml index 546b9b0422..e93483f0c6 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0.x86_64.xml @@ -243,6 +243,7 @@ <flag name='intel-iommu.aw-bits'/> <flag name='numa.hmat'/> <flag name='blockdev-hostdev-scsi'/> + <flag name='rbd.namespace'/> <version>5000000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100241</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml index a9d82661e3..387a11a0c6 100644 --- a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml @@ -242,6 +242,7 @@ <flag name='intel-iommu.aw-bits'/> <flag name='numa.hmat'/> <flag name='blockdev-hostdev-scsi'/> + <flag name='rbd.namespace'/> <version>5000092</version> <kvmVersion>0</kvmVersion> <microcodeVersion>43100242</microcodeVersion> -- 2.27.0

On Thu, Aug 06, 2020 at 19:41:42 +0800, Han Han wrote:
Add rbd namespace in aarch64 capability replies.
The capability flag will be used for rbd namespace option. The rbd namespace is introduced since ceph Nautilus and qemu v5.0.0.
Signed-off-by: Han Han <hhan@redhat.com> ---
[...]
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5d08941538..ef7ea9aa20 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -578,6 +578,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_NUMA_HMAT, /* -numa hmat */ QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI, /* -blockdev used for (i)SCSI hostdevs */
+ /* 380 */ + QEMU_CAPS_RBD_NAMESPACE, /* -blockdev '{"driver":"rbd",...,"namespace":str}' */
The series doesn't actually use this capability.

Signed-off-by: Han Han <hhan@redhat.com> --- src/conf/domain_conf.c | 4 ++++ src/util/virstoragefile.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ef67efa1da..163c934428 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9601,6 +9601,7 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, /* config file currently only works with remote disks */ src->configFile = virXPathString("string(./config/@file)", ctxt); + src->namespace = virXPathString("string(./@namespace)", ctxt); if (src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTP || src->protocol == VIR_STORAGE_NET_PROTOCOL_HTTPS) @@ -25083,6 +25084,9 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, path = g_strdup_printf("%s/%s", src->volume, src->path); virBufferEscapeString(attrBuf, " name='%s'", path ? path : src->path); + if (src->namespace) + virBufferEscapeString(attrBuf, " namespace='%s'", src->namespace); + virBufferEscapeString(attrBuf, " query='%s'", src->query); if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT && diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index f73b3ee005..0364fe5e7e 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -284,6 +284,7 @@ struct _virStorageSource { char *snapshot; /* for storage systems supporting internal snapshots */ char *configFile; /* some storage systems use config file as part of the source definition */ + char *namespace; /* for the storage systems supporting namespace */ char *query; /* query string for HTTP based protocols */ size_t nhosts; virStorageNetHostDefPtr hosts; -- 2.27.0

On Thu, Aug 06, 2020 at 19:41:43 +0800, Han Han wrote:
Signed-off-by: Han Han <hhan@redhat.com> --- src/conf/domain_conf.c | 4 ++++ src/util/virstoragefile.h | 1 + 2 files changed, 5 insertions(+)
[...]
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index f73b3ee005..0364fe5e7e 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -284,6 +284,7 @@ struct _virStorageSource { char *snapshot; /* for storage systems supporting internal snapshots */ char *configFile; /* some storage systems use config file as part of the source definition */ + char *namespace; /* for the storage systems supporting namespace */
'namespace' is a c++ keyword. Consider using a different identifier.

Ceph Nautilus supports separate image namespaces within a pool for tenant isolation and QEMU added it as a rbd blockdev options from 5.0.0. This optional attribute is used to access a image with namespace. Add unit tests for this attribute. https://bugzilla.redhat.com/show_bug.cgi?id=1816909 Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 7 +++- ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 26c1b42428..beb5639707 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -872,6 +872,7 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src, "s:pool", src->volume, "s:image", src->path, "S:snapshot", src->snapshot, + "S:namespace", src->namespace, "S:conf", src->configFile, "A:server", &servers, "S:user", username, diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01812cd39b..b6288d1308 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -980,7 +980,12 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, return NULL; } - virBufferStrcat(&buf, "rbd:", src->volume, "/", src->path, NULL); + virBufferStrcat(&buf, "rbd:", src->volume, "/", NULL); + /* The filename of image with namespace: rbd:POOL/NAMESPACE/IMAGE... */ + if (src->namespace) + virBufferStrcat(&buf, src->namespace, "/", NULL); + + virBufferStrcat(&buf, src->path, NULL); if (src->snapshot) virBufferEscape(&buf, '\\', ":", "@%s", src->snapshot); diff --git a/tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args b/tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args new file mode 100644 index 0000000000..a744805d74 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ +-m 214 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-blockdev '{"driver":"rbd","pool":"pool","image":"image","namespace":"ns",\ +"server":[{"host":"mon1.example.org","port":"6321"},{"host":"mon2.example.org",\ +"port":"6322"},{"host":"mon3.example.org","port":"6322"}],\ +"node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw",\ +"file":"libvirt-1-storage"}' \ +-device virtio-blk-pci,bus=pci.0,addr=0x2,drive=libvirt-1-format,\ +id=virtio-disk0,bootindex=1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml b/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml new file mode 100644 index 0000000000..8b526c4a20 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-rbd-namespace.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='x86_64' 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-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='rbd' name='pool/image' namespace='ns'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vda' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' 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 01839cb88c..c6c18c4335 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1174,6 +1174,7 @@ mymain(void) DO_TEST_CAPS_VER("disk-network-rbd", "2.5.0"); DO_TEST_CAPS_VER("disk-network-rbd", "2.12.0"); DO_TEST_CAPS_LATEST("disk-network-rbd"); + DO_TEST_CAPS_LATEST("disk-network-rbd-namespace"); DO_TEST_FAILURE("disk-network-rbd-no-colon", NONE); DO_TEST("disk-network-sheepdog", NONE); DO_TEST_CAPS_VER("disk-network-sheepdog", "2.12.0"); diff --git a/tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml b/tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml new file mode 100644 index 0000000000..2166696ca8 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.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='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='rbd' name='pool/image' namespace='ns'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </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 a07e2b7553..653e5caa86 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -344,6 +344,7 @@ mymain(void) DO_TEST("disk-network-iscsi", QEMU_CAPS_VIRTIO_SCSI); DO_TEST("disk-network-gluster", NONE); DO_TEST("disk-network-rbd", NONE); + DO_TEST_CAPS_LATEST("disk-network-rbd-namespace"); DO_TEST("disk-network-source-auth", NONE); DO_TEST("disk-network-sheepdog", NONE); DO_TEST("disk-network-vxhs", NONE); -- 2.27.0

On Thu, Aug 06, 2020 at 19:41:44 +0800, Han Han wrote:
Ceph Nautilus supports separate image namespaces within a pool for tenant isolation and QEMU added it as a rbd blockdev options from 5.0.0. This optional attribute is used to access a image with namespace.
Add unit tests for this attribute.
https://bugzilla.redhat.com/show_bug.cgi?id=1816909
Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 7 +++- ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml
[...]
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01812cd39b..b6288d1308 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -980,7 +980,12 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, return NULL; }
- virBufferStrcat(&buf, "rbd:", src->volume, "/", src->path, NULL); + virBufferStrcat(&buf, "rbd:", src->volume, "/", NULL); + /* The filename of image with namespace: rbd:POOL/NAMESPACE/IMAGE... */ + if (src->namespace) + virBufferStrcat(&buf, src->namespace, "/", NULL); + + virBufferStrcat(&buf, src->path, NULL);
This is dead code now. qemu-5.0 will be started with -blockdev only.
if (src->snapshot) virBufferEscape(&buf, '\\', ":", "@%s", src->snapshot);
[...]
diff --git a/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml b/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml new file mode 100644 index 0000000000..8b526c4a20 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-rbd-namespace.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='x86_64' 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-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='rbd' name='pool/image' namespace='ns'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vda' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' 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>
virschematest fails after adding this file in this patch. You must add the RNG schema prior to any file using it as we invoke the schema test on all example files.

On Thu, Aug 6, 2020 at 7:58 PM Peter Krempa <pkrempa@redhat.com> wrote:
On Thu, Aug 06, 2020 at 19:41:44 +0800, Han Han wrote:
Ceph Nautilus supports separate image namespaces within a pool for tenant isolation and QEMU added it as a rbd blockdev options from 5.0.0. This optional attribute is used to access a image with namespace.
Add unit tests for this attribute.
https://bugzilla.redhat.com/show_bug.cgi?id=1816909
Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 7 +++- ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml
[...]
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01812cd39b..b6288d1308 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -980,7 +980,12 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, return NULL; }
- virBufferStrcat(&buf, "rbd:", src->volume, "/", src->path, NULL); + virBufferStrcat(&buf, "rbd:", src->volume, "/", NULL); + /* The filename of image with namespace: rbd:POOL/NAMESPACE/IMAGE... */ + if (src->namespace) + virBufferStrcat(&buf, src->namespace, "/", NULL); + + virBufferStrcat(&buf, src->path, NULL);
This is dead code now. qemu-5.0 will be started with -blockdev only.
So libvirt will not confirm the functional correctness when -blockdev is disabled by <qemu:commandline> in qemu 5.0 or after, right?
if (src->snapshot) virBufferEscape(&buf, '\\', ":", "@%s", src->snapshot);
[...]
diff --git a/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml b/tests/qemuxml2argvdata/disk-network-rbd-namespace.xml new file mode 100644 index 0000000000..8b526c4a20 --- /dev/null +++ b/tests/qemuxml2argvdata/disk-network-rbd-namespace.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='x86_64' 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-x86_64</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='rbd' name='pool/image' namespace='ns'> + <host name='mon1.example.org' port='6321'/> + <host name='mon2.example.org' port='6322'/> + <host name='mon3.example.org' port='6322'/> + </source> + <target dev='vda' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' 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>
virschematest fails after adding this file in this patch. You must add the RNG schema prior to any file using it as we invoke the schema test on all example files.
-- Best regards, ----------------------------------- Han Han Senior Quality Engineer Redhat. Email: hhan@redhat.com Phone: +861065339333

On Fri, Aug 07, 2020 at 17:11:25 +0800, Han Han wrote:
On Thu, Aug 6, 2020 at 7:58 PM Peter Krempa <pkrempa@redhat.com> wrote:
On Thu, Aug 06, 2020 at 19:41:44 +0800, Han Han wrote:
Ceph Nautilus supports separate image namespaces within a pool for tenant isolation and QEMU added it as a rbd blockdev options from 5.0.0. This optional attribute is used to access a image with namespace.
Add unit tests for this attribute.
https://bugzilla.redhat.com/show_bug.cgi?id=1816909
Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 7 +++- ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml
[...]
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01812cd39b..b6288d1308 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -980,7 +980,12 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, return NULL; }
- virBufferStrcat(&buf, "rbd:", src->volume, "/", src->path, NULL); + virBufferStrcat(&buf, "rbd:", src->volume, "/", NULL); + /* The filename of image with namespace: rbd:POOL/NAMESPACE/IMAGE... */ + if (src->namespace) + virBufferStrcat(&buf, src->namespace, "/", NULL); + + virBufferStrcat(&buf, src->path, NULL);
This is dead code now. qemu-5.0 will be started with -blockdev only.
So libvirt will not confirm the functional correctness when -blockdev is disabled by <qemu:commandline> in qemu 5.0 or after, right?
No. <qemu:capabilities> are specifically described [1] as for experiments and workarounds only and we don't strive to support anything which is not obtainable by standard qemu. [1]: In some cases e.g. when developing a new feature or for testing it may be required to control a given qemu feature (or qemu capability) to test it before it's complete or disable it for debugging purposes. Since 5.5.0 it's possible to use the same special qemu namespace as above (http://libvirt.org/schemas/domain/qemu/1.0) and use <qemu:capabilities> element to add (<qemu:add capability="capname"/>) or remove (<qemu:del capability="capname"/>) capability bits. The naming of the feature bits is the same libvirt uses in the status XML. Note that this feature is meant for experiments only and should _not_ be used in production.

On Fri, Aug 7, 2020 at 5:17 PM Peter Krempa <pkrempa@redhat.com> wrote:
On Fri, Aug 07, 2020 at 17:11:25 +0800, Han Han wrote:
On Thu, Aug 6, 2020 at 7:58 PM Peter Krempa <pkrempa@redhat.com> wrote:
On Thu, Aug 06, 2020 at 19:41:44 +0800, Han Han wrote:
Ceph Nautilus supports separate image namespaces within a pool for tenant isolation and QEMU added it as a rbd blockdev options from 5.0.0. This optional attribute is used to access a image with namespace.
Add unit tests for this attribute.
https://bugzilla.redhat.com/show_bug.cgi?id=1816909
Signed-off-by: Han Han <hhan@redhat.com> --- src/qemu/qemu_block.c | 1 + src/qemu/qemu_command.c | 7 +++- ...k-network-rbd-namespace.x86_64-latest.args | 41 +++++++++++++++++++ .../disk-network-rbd-namespace.xml | 33 +++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...sk-network-rbd-namespace.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 7 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-namespace.xml create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-namespace.x86_64-latest.xml
[...]
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01812cd39b..b6288d1308 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -980,7 +980,12 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, return NULL; }
- virBufferStrcat(&buf, "rbd:", src->volume, "/", src->path, NULL); + virBufferStrcat(&buf, "rbd:", src->volume, "/", NULL); + /* The filename of image with namespace: rbd:POOL/NAMESPACE/IMAGE... */ + if (src->namespace) + virBufferStrcat(&buf, src->namespace, "/", NULL); + + virBufferStrcat(&buf, src->path, NULL);
This is dead code now. qemu-5.0 will be started with -blockdev only.
So libvirt will not confirm the functional correctness when -blockdev is disabled by <qemu:commandline> in qemu 5.0 or after, right?
No. <qemu:capabilities> are specifically described [1] as for experiments and workarounds only and we don't strive to support anything which is not obtainable by standard qemu.
Thanks for your reviewing and explanation. I will update these in v4
[1]:
In some cases e.g. when developing a new feature or for testing it may be required to control a given qemu feature (or qemu capability) to test it before it's complete or disable it for debugging purposes. Since 5.5.0 it's possible to use the same special qemu namespace as above (http://libvirt.org/schemas/domain/qemu/1.0) and use <qemu:capabilities> element to add (<qemu:add capability="capname"/>) or remove (<qemu:del capability="capname"/>) capability bits. The naming of the feature bits is the same libvirt uses in the status XML. Note that this feature is meant for experiments only and should _not_ be used in production.
-- Best regards, ----------------------------------- Han Han Senior Quality Engineer Redhat. Email: hhan@redhat.com Phone: +861065339333

Signed-off-by: Han Han <hhan@redhat.com> --- docs/formatdomain.rst | 5 ++++- docs/schemas/domaincommon.rng | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 218f0c1718..431abc6f56 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2256,7 +2256,7 @@ paravirtualized driver is specified via the ``disk`` element. </disk> <disk type='network'> <driver name="qemu" type="raw"/> - <source protocol="rbd" name="image_name2"> + <source protocol="rbd" name="image_name2" namespace="ns""> <host name="hostname" port="7000"/> <snapshot name="snapname"/> <config file="/path/to/file"/> @@ -2497,6 +2497,9 @@ paravirtualized driver is specified via the ``disk`` element. For protocols ``http`` and ``https`` an optional attribute ``query`` specifies the query string. ( :since:`Since 6.2.0` ) + For protocol ``rbd``, an optional attribute ``namespace`` specifies the + namespace of a rbd pool. ( :since:`Since 6.7.0 and QEMU 5.0.0` ) + For "iscsi" ( :since:`since 1.0.4` ), the ``name`` attribute may include a logical unit number, separated from the target's name by a slash (e.g., ``iqn.2013-07.com.example:iscsi-pool/1``). If not specified, the default diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 0d0dcbc5ce..ee09da3c7c 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1762,6 +1762,9 @@ <optional> <attribute name="name"/> </optional> + <optional> + <attribute name="namespace"/> + </optional> <zeroOrMore> <ref name="diskSourceNetworkHost"/> </zeroOrMore> -- 2.27.0

On Thu, Aug 06, 2020 at 19:41:45 +0800, Han Han wrote:
Signed-off-by: Han Han <hhan@redhat.com> --- docs/formatdomain.rst | 5 ++++- docs/schemas/domaincommon.rng | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-)
I suggest you combine this with patch 2.

Signed-off-by: Han Han <hhan@redhat.com> --- NEWS.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 63ca689b43..57d8a40731 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -13,6 +13,12 @@ v6.7.0 (unreleased) * **New features** + * qemu: Support rbd namespace attribute + + The namespaces is for the tenant isolation within a rbd pool, introduced + from Ceph Nautilus, supported since QEMU 5.0.0. In libvirt, using it by + the namespace attribute in the source element of rbd disk. + * **Improvements** * **Bug fixes** -- 2.27.0
participants (2)
-
Han Han
-
Peter Krempa