[PATCH v4 4/5] qemu: add librbd encryption engine

Peter Krempa pkrempa at redhat.com
Thu Oct 21 11:15:45 UTC 2021


On Thu, Oct 07, 2021 at 14:21:20 -0500, Or Ozeri wrote:
> rbd encryption is new in qemu 6.1.0.
> This commit adds a new encryption engine property which
> allows the user to use this new encryption engine.
> 
> Signed-off-by: Or Ozeri <oro at il.ibm.com>
> ---
>  docs/formatstorageencryption.html.in          |  7 +-
>  docs/schemas/storagecommon.rng                |  1 +
>  src/conf/storage_encryption_conf.c            |  2 +-
>  src/conf/storage_encryption_conf.h            |  1 +
>  src/qemu/qemu_block.c                         | 26 +++++++
>  src/qemu/qemu_domain.c                        | 34 +++++++++
>  ...sk-network-rbd-encryption.x86_64-6.0.0.err |  1 +
>  ...-network-rbd-encryption.x86_64-latest.args | 45 ++++++++++++
>  .../disk-network-rbd-encryption.xml           | 63 +++++++++++++++++
>  tests/qemuxml2argvtest.c                      |  2 +
>  ...k-network-rbd-encryption.x86_64-latest.xml | 70 +++++++++++++++++++
>  tests/qemuxml2xmltest.c                       |  1 +
>  12 files changed, 251 insertions(+), 2 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-encryption.x86_64-6.0.0.err
>  create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-encryption.x86_64-latest.args
>  create mode 100644 tests/qemuxml2argvdata/disk-network-rbd-encryption.xml
>  create mode 100644 tests/qemuxml2xmloutdata/disk-network-rbd-encryption.x86_64-latest.xml
> 
> diff --git a/docs/formatstorageencryption.html.in b/docs/formatstorageencryption.html.in
> index 178fcd0d7c..02ee8f8ca3 100644
> --- a/docs/formatstorageencryption.html.in
> +++ b/docs/formatstorageencryption.html.in
> @@ -27,7 +27,12 @@
>        The <code>encryption</code> tag supports an optional <code>engine</code>
>        tag, which allows selecting which component actually handles
>        the encryption. Currently defined values of <code>engine</code> are
> -      <code>qemu</code>.
> +      <code>qemu</code> and <code>librbd</code>.
> +      Both <code>qemu</code> and <code>librbd</code> require using the qemu driver.
> +      The <code>librbd</code> engine requires qemu version >= 6.1.0,
> +      and is only applicable for RBD network disks.
> +      If the engine tag is not specified, the <code>qemu</code> engine will be
> +      used by default (assuming the qemu driver is used).

Okay, this is slightly better but it doesn't specify what's happening in
the storage driver.

>      </p>
>      <p>
>        The <code>encryption</code> tag can currently contain a sequence of

[...]


> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 354f65c6d5..13869dd79b 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -4814,6 +4814,40 @@ qemuDomainValidateStorageSource(virStorageSource *src,
>      if (src->encryption) {
>          switch (src->encryption->engine) {
>              case VIR_STORAGE_ENCRYPTION_ENGINE_QEMU:
> +                switch ((virStorageEncryptionFormatType) src->encryption->format) {
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_LUKS:
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_QCOW:
> +                        break;
> +
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT:
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_LAST:
> +                    default:
> +                        virReportEnumRangeError(virStorageEncryptionFormatType,
> +                                                src->encryption->format);
> +                        return -1;

This here is okay, because both are basically impossible.

> +                }
> +
> +                break;
> +            case VIR_STORAGE_ENCRYPTION_ENGINE_LIBRBD:
> +                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_RBD_ENCRYPTION)) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("librbd encryption is not supported by this QEMU binary"));
> +                    return -1;
> +                }
> +
> +                switch ((virStorageEncryptionFormatType) src->encryption->format) {
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_LUKS:
> +                        break;
> +
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT:
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_QCOW:
> +                    case VIR_STORAGE_ENCRYPTION_FORMAT_LAST:
> +                    default:
> +                        virReportEnumRangeError(virStorageEncryptionFormatType,
> +                                                src->encryption->format);

This creates an error message which is not very informative.
Specifically for VIR_STORAGE_ENCRYPTION_FORMAT_QCOW which is a
legitimate configuration we need a proper error message.

> +                        return -1;
> +                }
> +
>                  break;
>              case VIR_STORAGE_ENCRYPTION_ENGINE_DEFAULT:
>              case VIR_STORAGE_ENCRYPTION_ENGINE_LAST:

[...]

The test input files are okay. The output files will need some tweaking
after recent changes. I think adding the error message is trivial enough
so that I'll do it before pushing if you are okay with it.

Reviewed-by: Peter Krempa <pkrempa at redhat.com>




More information about the libvir-list mailing list