[PATCH v3 3/5] qemu: Implement rbd namespace attribute

Han Han posted 5 patches 5 years, 6 months ago
There is a newer version of this series
[PATCH v3 3/5] qemu: Implement rbd namespace attribute
Posted by Han Han 5 years, 6 months ago
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

Re: [PATCH v3 3/5] qemu: Implement rbd namespace attribute
Posted by Peter Krempa 5 years, 6 months ago
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.

Re: [PATCH v3 3/5] qemu: Implement rbd namespace attribute
Posted by Han Han 5 years, 6 months ago
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
Re: [PATCH v3 3/5] qemu: Implement rbd namespace attribute
Posted by Peter Krempa 5 years, 6 months ago
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.

Re: [PATCH v3 3/5] qemu: Implement rbd namespace attribute
Posted by Han Han 5 years, 6 months ago
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