[libvirt PATCH 0/5] implement virDomainGraphicsReload

https://issues.redhat.com/browse/RHEL-16333 Based on the patches Huawei sent back in 2021: https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/LDTM3... * rebased * renamed * simplified (removed virTypedParams from the API and the requirement to specify the type) Ján Tomko (1): remote: implement virDomainGraphicsReload Zheng Yan (4): qemu_capabilities: Add QEMU_CAPS_DISPLAY_RELOAD libvirt: Introduce virDomainGraphicsReload API qemu: implement qemuDomainGraphicsReload virsh: Introduce domdisplay-reload command docs/manpages/virsh.rst | 15 ++++++ include/libvirt/libvirt-domain.h | 18 +++++++ src/driver-hypervisor.h | 6 +++ src/libvirt-domain.c | 50 +++++++++++++++++ src/libvirt_public.syms | 5 ++ src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_driver.c | 54 +++++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++ src/qemu/qemu_monitor.h | 5 ++ src/qemu/qemu_monitor_json.c | 23 ++++++++ src/qemu/qemu_monitor_json.h | 4 ++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 13 ++++- src/remote_protocol-structs | 6 +++ .../caps_6.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.0.0_s390x.xml | 1 + .../caps_6.0.0_x86_64.xml | 1 + .../caps_6.1.0_x86_64.xml | 1 + .../caps_6.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + .../caps_6.2.0_x86_64.xml | 1 + .../caps_7.0.0_aarch64+hvf.xml | 1 + .../caps_7.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + .../caps_7.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + .../caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + .../caps_7.2.0_x86_64+hvf.xml | 1 + .../caps_7.2.0_x86_64.xml | 1 + .../caps_8.0.0_riscv64.xml | 1 + .../caps_8.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + .../caps_8.1.0_x86_64.xml | 1 + .../caps_8.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + .../caps_8.2.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + tools/virsh-domain.c | 45 ++++++++++++++++ 40 files changed, 281 insertions(+), 1 deletion(-) -- 2.43.2

From: Zheng Yan <yanzheng759@huawei.com> The 'display-reload' QMP command was introduced in QEMU 6.0.0, so we add a compatible capability to check if target QEMU binary supports it. {"execute":"display-reload", "arguments":{"type": "vnc", "tls-certs": true}} The new QMP refer to: https://gitlab.com/qemu-project/qemu/-/commit/9cc07651655ee86eca41059f5ead8c... Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 + 26 files changed, 27 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e383d85920..5bedacb25b 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -704,6 +704,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 455 */ "blockjob.backing-mask-protocol", /* QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL */ + "display-reload", /* QEMU_CAPS_DISPLAY_RELOAD */ ); @@ -1228,6 +1229,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = { { "calc-dirty-rate", QEMU_CAPS_CALC_DIRTY_RATE }, { "query-stats", QEMU_CAPS_QUERY_STATS }, { "query-stats-schemas", QEMU_CAPS_QUERY_STATS_SCHEMAS }, + { "display-reload", QEMU_CAPS_DISPLAY_RELOAD }, }; struct virQEMUCapsStringFlags virQEMUCapsMigration[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 486a4a6f63..e475773e44 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -683,6 +683,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 455 */ QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL, /* backing-mask-protocol of block-commit/block-stream */ + QEMU_CAPS_DISPLAY_RELOAD, /* 'display-reload' qmp command is supported */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml index a1712233c5..12f634f7b0 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml @@ -134,6 +134,7 @@ <flag name='migration.blocked-reasons'/> <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> + <flag name='display-reload'/> <version>6000000</version> <microcodeVersion>61700242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_6.0.0_s390x.xml index 483962c83b..94a8406f0a 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_s390x.xml @@ -92,6 +92,7 @@ <flag name='virtio-net.rss'/> <flag name='migration.blocked-reasons'/> <flag name='virtio-crypto'/> + <flag name='display-reload'/> <version>6000000</version> <microcodeVersion>39100242</microcodeVersion> <package>qemu-6.0.0-20210517.1.4ff77070.fc33</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml index 294d6f3124..68ec4ba25a 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml @@ -170,6 +170,7 @@ <flag name='migration.blocked-reasons'/> <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> + <flag name='display-reload'/> <version>6000000</version> <microcodeVersion>43100242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml index d32ebf0c3b..d79600bc7b 100644 --- a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml @@ -176,6 +176,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6001000</version> <microcodeVersion>43100243</microcodeVersion> <package>v6.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml index 7a12ed41c4..0071226a08 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml @@ -147,6 +147,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6001050</version> <microcodeVersion>61700244</microcodeVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml index fe1bffd491..dda56d9296 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml @@ -136,6 +136,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6002000</version> <microcodeVersion>42900244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml index ca9a784c72..3e7835b72e 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml @@ -178,6 +178,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6002000</version> <microcodeVersion>43100244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml index bca905987a..b4d242ecbb 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml @@ -155,6 +155,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml index 9c61b92c1e..493fd052de 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml @@ -155,6 +155,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml index 047a867766..cc9de20f1d 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml @@ -154,6 +154,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>7000000</version> <microcodeVersion>42900243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml index 8caeba3773..c0be80d9bd 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml @@ -184,6 +184,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='display-reload'/> <version>7000000</version> <microcodeVersion>43100243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml index 536524cf18..b19a1cae39 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml @@ -155,6 +155,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7001000</version> <microcodeVersion>42900244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml index 745776b14b..e03de1a785 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml @@ -188,6 +188,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7001000</version> <microcodeVersion>43100244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml index 127b8ee4c2..a51f56b3d8 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml @@ -150,6 +150,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-7.2.0-6.fc37</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml index 4018213189..9e7fa09825 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml @@ -192,6 +192,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml index e43890fb68..23595e2605 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml @@ -192,6 +192,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml index 8976045015..c8f91178f8 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml @@ -138,6 +138,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>7002050</version> <microcodeVersion>0</microcodeVersion> <package>v7.2.0-333-g222059a0fc</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml index 3095b2fdab..3ee4094a3e 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml @@ -196,6 +196,7 @@ <flag name='rbd-encryption-layering'/> <flag name='rbd-encryption-luks-any'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>8000000</version> <microcodeVersion>43100244</microcodeVersion> <package>v8.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml index ea5eec0435..014c5f6226 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml @@ -119,6 +119,7 @@ <flag name='qcow2-discard-no-unref'/> <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>8001000</version> <microcodeVersion>39100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml index 6375f428a0..574e761c81 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml @@ -198,6 +198,7 @@ <flag name='run-with.async-teardown'/> <flag name='virtio-blk-vhost-vdpa'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>8001000</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml index bf5c80c848..f5c132348c 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml @@ -163,6 +163,7 @@ <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> + <flag name='display-reload'/> <version>8002000</version> <microcodeVersion>61700246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml index bd413b61e7..8ca3f0c4e8 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml @@ -119,6 +119,7 @@ <flag name='qcow2-discard-no-unref'/> <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> + <flag name='display-reload'/> <version>8002000</version> <microcodeVersion>39100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml index c7969d9de5..4fba1e9b43 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml @@ -200,6 +200,7 @@ <flag name='virtio-blk-vhost-vdpa'/> <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> + <flag name='display-reload'/> <version>8002000</version> <microcodeVersion>43100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index 7bf13da1db..9ec81b10ca 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -202,6 +202,7 @@ <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> <flag name='blockjob.backing-mask-protocol'/> + <flag name='display-reload'/> <version>8002050</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.2.0-952-g14639717bf</package> -- 2.43.2

From: Zheng Yan <yanzheng759@huawei.com> The new virDomainGraphicsReload API is used to make the domain reload its certificates without restart, and avoid service interruption. Currently, only QEMU VNC TLS certificates are supported, but parameters and flags are also reserved for subsequent scenarios. To reload QEMU VNC TLS certificates as an example, we can call: virDomainGraphicsReload(domain, 0, 0); Then the specified QMP message would be send to QEMU: {"execute": "display-reload", "arguments":{"type": "vnc", "tls-certs": true}} Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- include/libvirt/libvirt-domain.h | 18 ++++++++++++ src/driver-hypervisor.h | 6 ++++ src/libvirt-domain.c | 50 ++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 ++++ 4 files changed, 79 insertions(+) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 30cce85b29..2f5b01bbfe 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -6507,4 +6507,22 @@ int virDomainFDAssociate(virDomainPtr domain, int *fds, unsigned int flags); +/** + * virDomainGraphicsReloadType: + * + * Since: 10.2.0 + */ +typedef enum { + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_ANY = 0, /* reload any graphics known to libvirt (Since: 10.2.0) */ + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_VNC = 1, /* reload vnc graphics (Since: 10.2.0) */ +# ifdef VIR_ENUM_SENTINELS + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST /* (Since: 10.2.0) */ +# endif +} virDomainGraphicsReloadType; + +int +virDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags); + #endif /* LIBVIRT_DOMAIN_H */ diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 5219344b72..4ce8da078d 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1448,6 +1448,11 @@ typedef int int *fds, unsigned int flags); +typedef int +(*virDrvDomainGraphicsReload)(virDomainPtr domain, + unsigned int type, + unsigned int flags); + typedef struct _virHypervisorDriver virHypervisorDriver; /** @@ -1720,4 +1725,5 @@ struct _virHypervisorDriver { virDrvDomainGetMessages domainGetMessages; virDrvDomainStartDirtyRateCalc domainStartDirtyRateCalc; virDrvDomainFDAssociate domainFDAssociate; + virDrvDomainGraphicsReload domainGraphicsReload; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 83abad251e..5a45b16275 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -14118,3 +14118,53 @@ virDomainFDAssociate(virDomainPtr domain, virDispatchError(conn); return -1; } + + +/** + * virDomainGraphicsReload: + * @domain: a domain object + * @type: graphics type; from the virDomainGraphicsReloadType enum + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Reload domain's graphics. + * + * Returns 0 in case of success, -1 otherwise. + * + * Since: 10.2.0 + */ +int +virDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "type=%u, flags=0x%x", type, flags); + + virResetLastError(); + + virCheckDomainReturn(domain, -1); + conn = domain->conn; + virCheckReadOnlyGoto(conn->flags, error); + + if (type >= VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST) { + virReportInvalidArg(type, + _("type must be less than %1$d"), + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST); + goto error; + } + + if (conn->driver->domainGraphicsReload) { + int ret; + ret = conn->driver->domainGraphicsReload(domain, type, flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(domain->conn); + return -1; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 0304b8f824..7a3492d9d7 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -943,4 +943,9 @@ LIBVIRT_10.1.0 { virNodeDeviceUpdate; } LIBVIRT_9.7.0; +LIBVIRT_10.2.0 { + global: + virDomainGraphicsReload; +} LIBVIRT_10.1.0; + # .... define new API here using predicted next version number .... -- 2.43.2

On 2/29/24 16:23, Ján Tomko wrote:
From: Zheng Yan <yanzheng759@huawei.com>
The new virDomainGraphicsReload API is used to make the domain reload its certificates without restart, and avoid service interruption.
Currently, only QEMU VNC TLS certificates are supported, but parameters and flags are also reserved for subsequent scenarios.
To reload QEMU VNC TLS certificates as an example, we can call:
virDomainGraphicsReload(domain, 0, 0);
Then the specified QMP message would be send to QEMU: {"execute": "display-reload", "arguments":{"type": "vnc", "tls-certs": true}}
Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- include/libvirt/libvirt-domain.h | 18 ++++++++++++ src/driver-hypervisor.h | 6 ++++ src/libvirt-domain.c | 50 ++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 ++++ 4 files changed, 79 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 30cce85b29..2f5b01bbfe 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -6507,4 +6507,22 @@ int virDomainFDAssociate(virDomainPtr domain, int *fds, unsigned int flags);
+/** + * virDomainGraphicsReloadType: + * + * Since: 10.2.0 + */ +typedef enum { + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_ANY = 0, /* reload any graphics known to libvirt (Since: 10.2.0) */ + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_VNC = 1, /* reload vnc graphics (Since: 10.2.0) */ +# ifdef VIR_ENUM_SENTINELS + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST /* (Since: 10.2.0) */ +# endif +} virDomainGraphicsReloadType; + +int +virDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags); + #endif /* LIBVIRT_DOMAIN_H */ diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 5219344b72..4ce8da078d 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1448,6 +1448,11 @@ typedef int int *fds, unsigned int flags);
+typedef int +(*virDrvDomainGraphicsReload)(virDomainPtr domain, + unsigned int type, + unsigned int flags); + typedef struct _virHypervisorDriver virHypervisorDriver;
/** @@ -1720,4 +1725,5 @@ struct _virHypervisorDriver { virDrvDomainGetMessages domainGetMessages; virDrvDomainStartDirtyRateCalc domainStartDirtyRateCalc; virDrvDomainFDAssociate domainFDAssociate; + virDrvDomainGraphicsReload domainGraphicsReload; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 83abad251e..5a45b16275 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -14118,3 +14118,53 @@ virDomainFDAssociate(virDomainPtr domain, virDispatchError(conn); return -1; } + + +/** + * virDomainGraphicsReload: + * @domain: a domain object + * @type: graphics type; from the virDomainGraphicsReloadType enum + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Reload domain's graphics. + *
I'd put parts of the commit message here, because this one line description alone did not help me to understand what the API does. The commit message did.
+ * Returns 0 in case of success, -1 otherwise. + * + * Since: 10.2.0 + */ +int +virDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "type=%u, flags=0x%x", type, flags); + + virResetLastError(); + + virCheckDomainReturn(domain, -1); + conn = domain->conn; + virCheckReadOnlyGoto(conn->flags, error); + + if (type >= VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST) { + virReportInvalidArg(type, + _("type must be less than %1$d"), + VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST); + goto error; + }
I'm not entirely sure why this needs to be here. I mean, if a client is stuck with older client library they can't just pass the new value, the API errors out even before any RPC is attempted. IOW, if I'd call: virDomainGraphicsReload(dom, 2, 0); I'd expect to see an error from driver impl rather than client side. But apparently we do that for other enums too. Interesting.
+ + if (conn->driver->domainGraphicsReload) { + int ret; + ret = conn->driver->domainGraphicsReload(domain, type, flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(domain->conn); + return -1; +}
Michal

Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 13 ++++++++++++- src/remote_protocol-structs | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index f156475bd2..7b73d97b7a 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -7841,6 +7841,7 @@ static virHypervisorDriver hypervisor_driver = { .domainStartDirtyRateCalc = remoteDomainStartDirtyRateCalc, /* 7.2.0 */ .domainSetLaunchSecurityState = remoteDomainSetLaunchSecurityState, /* 8.0.0 */ .domainFDAssociate = remoteDomainFDAssociate, /* 9.0.0 */ + .domainGraphicsReload = remoteDomainGraphicsReload, /* 10.2.0 */ }; static virNetworkDriver network_driver = { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index ffe865965d..8a9b55b7d7 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -3954,6 +3954,11 @@ struct remote_domain_start_dirty_rate_calc_args { unsigned int flags; }; +struct remote_domain_graphics_reload_args { + remote_nonnull_domain dom; + unsigned int type; + unsigned int flags; +}; struct remote_domain_event_memory_device_size_change_msg { int callbackID; @@ -7036,5 +7041,11 @@ enum remote_procedure { * @acl: node_device:save:!VIR_NODE_DEVICE_UPDATE_AFFECT_CONFIG|VIR_NODE_DEVICE_UPDATE_AFFECT_LIVE * @acl: node_device:save:VIR_NODE_DEVICE_UPDATE_AFFECT_CONFIG */ - REMOTE_PROC_NODE_DEVICE_UPDATE = 447 + REMOTE_PROC_NODE_DEVICE_UPDATE = 447, + + /** + * @generate: both + * @acl: domain:write + */ + REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD = 448 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index ee2ec3e6fa..1175d9ad85 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -3301,6 +3301,11 @@ struct remote_domain_fd_associate_args { remote_nonnull_string name; u_int flags; }; +struct remote_domain_reload_graphics_args { + remote_nonnull_domain dom; + u_int type; + u_int flags; +}; enum remote_procedure { REMOTE_PROC_CONNECT_OPEN = 1, REMOTE_PROC_CONNECT_CLOSE = 2, @@ -3749,4 +3754,5 @@ enum remote_procedure { REMOTE_PROC_NETWORK_GET_METADATA = 445, REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 446, REMOTE_PROC_NODE_DEVICE_UPDATE = 447, + REMOTE_PROC_DOMAIN_RELOAD_TLS_CERTIFICATES = 448, }; -- 2.43.2

On 2/29/24 16:23, Ján Tomko wrote:
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 13 ++++++++++++- src/remote_protocol-structs | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-)
Ah yes, perks of faster compilation with clang. Squash this in: diff --git i/src/remote/remote_protocol.x w/src/remote/remote_protocol.x index 41c045ff78..adc2a953a8 100644 --- i/src/remote/remote_protocol.x +++ w/src/remote/remote_protocol.x @@ -3954,12 +3954,6 @@ struct remote_domain_start_dirty_rate_calc_args { unsigned int flags; }; -struct remote_domain_graphics_reload_args { - remote_nonnull_domain dom; - unsigned int type; - unsigned int flags; -}; - struct remote_domain_event_memory_device_size_change_msg { int callbackID; remote_nonnull_domain dom; @@ -3967,12 +3961,18 @@ struct remote_domain_event_memory_device_size_change_msg { unsigned hyper size; }; - struct remote_domain_fd_associate_args { remote_nonnull_domain dom; remote_nonnull_string name; unsigned int flags; }; + +struct remote_domain_graphics_reload_args { + remote_nonnull_domain dom; + unsigned int type; + unsigned int flags; +}; + /*----- Protocol. -----*/ /* Define the program number, protocol version and procedure numbers here. */ diff --git i/src/remote_protocol-structs w/src/remote_protocol-structs index 1175d9ad85..17826ce05a 100644 --- i/src/remote_protocol-structs +++ w/src/remote_protocol-structs @@ -3301,7 +3301,7 @@ struct remote_domain_fd_associate_args { remote_nonnull_string name; u_int flags; }; -struct remote_domain_reload_graphics_args { +struct remote_domain_graphics_reload_args { remote_nonnull_domain dom; u_int type; u_int flags; @@ -3754,5 +3754,5 @@ enum remote_procedure { REMOTE_PROC_NETWORK_GET_METADATA = 445, REMOTE_PROC_NETWORK_EVENT_CALLBACK_METADATA_CHANGE = 446, REMOTE_PROC_NODE_DEVICE_UPDATE = 447, - REMOTE_PROC_DOMAIN_RELOAD_TLS_CERTIFICATES = 448, + REMOTE_PROC_DOMAIN_GRAPHICS_RELOAD = 448, }; Michal

From: Zheng Yan <yanzheng759@huawei.com> The 'display-reload' QMP command had been introduced from QEMU 6.0.0: https://gitlab.com/qemu-project/qemu/-/commit/9cc07651655ee86eca41059f5ead8c... Currently it only supports reloading TLS certificates for VNC. https://issues.redhat.com/browse/RHEL-16333 Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.c | 10 +++++++ src/qemu/qemu_monitor.h | 5 ++++ src/qemu/qemu_monitor_json.c | 23 +++++++++++++++ src/qemu/qemu_monitor_json.h | 4 +++ 5 files changed, 96 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 448e6b1591..22e9f743cb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19932,6 +19932,59 @@ qemuDomainFDAssociate(virDomainPtr domain, return ret; } +static int +qemuDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags) +{ + int ret = -1; + virDomainObj *vm = NULL; + qemuDomainObjPrivate *priv; + + if (!(vm = qemuDomainObjFromDomain(domain))) + return -1; + + if (virDomainGraphicsReloadEnsureACL(domain->conn, vm->def)) + goto cleanup; + + virCheckFlagsGoto(0, cleanup); + + if (type == VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_ANY) { + size_t i; + for (i = 0; i < vm->def->ngraphics; i++) { + if (vm->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) + break; + } + if (i == vm->def->ngraphics) { + ret = 0; + goto cleanup; + } + } + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + goto endjob; + } + + priv = vm->privateData; + + qemuDomainObjEnterMonitor(vm); + + ret = qemuMonitorDisplayReload(priv->mon, "vnc", true); + + qemuDomainObjExitMonitor(vm); + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} static virHypervisorDriver qemuHypervisorDriver = { .name = QEMU_DRIVER_NAME, @@ -20182,6 +20235,7 @@ static virHypervisorDriver qemuHypervisorDriver = { .domainStartDirtyRateCalc = qemuDomainStartDirtyRateCalc, /* 7.2.0 */ .domainSetLaunchSecurityState = qemuDomainSetLaunchSecurityState, /* 8.0.0 */ .domainFDAssociate = qemuDomainFDAssociate, /* 9.0.0 */ + .domainGraphicsReload = qemuDomainGraphicsReload, /* 10.2.0 */ }; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 0f29fb02b4..34e2ccab97 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4501,3 +4501,13 @@ qemuMonitorGetStatsByQOMPath(virJSONValue *arr, return NULL; } + +int +qemuMonitorDisplayReload(qemuMonitor *mon, + const char *type, + bool tlsCerts) +{ + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONDisplayReload(mon, type, tlsCerts); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 981c609e9f..6e81945201 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1581,3 +1581,8 @@ qemuMonitorExtractQueryStats(virJSONValue *info); virJSONValue * qemuMonitorGetStatsByQOMPath(virJSONValue *arr, char *qom_path); + +int +qemuMonitorDisplayReload(qemuMonitor *mon, + const char *type, + bool tlsCerts); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7aab34c7c4..eb84a3d938 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8873,3 +8873,26 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon, return virJSONValueObjectStealArray(reply, "return"); } + +int qemuMonitorJSONDisplayReload(qemuMonitor *mon, + const char *type, + bool tlsCerts) +{ + g_autoptr(virJSONValue) reply = NULL; + g_autoptr(virJSONValue) cmd = NULL; + + cmd = qemuMonitorJSONMakeCommand("display-reload", + "s:type", type, + "b:tls-certs", tlsCerts, + NULL); + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index ed0027c118..9684660d86 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -825,3 +825,7 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon, qemuMonitorQueryStatsTargetType target, char **vcpus, GPtrArray *providers); + +int qemuMonitorJSONDisplayReload(qemuMonitor *mon, + const char *type, + bool tlsCerts); -- 2.43.2

On 2/29/24 16:23, Ján Tomko wrote:
From: Zheng Yan <yanzheng759@huawei.com>
The 'display-reload' QMP command had been introduced from QEMU 6.0.0:
https://gitlab.com/qemu-project/qemu/-/commit/9cc07651655ee86eca41059f5ead8c...
Currently it only supports reloading TLS certificates for VNC.
https://issues.redhat.com/browse/RHEL-16333
Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.c | 10 +++++++ src/qemu/qemu_monitor.h | 5 ++++ src/qemu/qemu_monitor_json.c | 23 +++++++++++++++ src/qemu/qemu_monitor_json.h | 4 +++ 5 files changed, 96 insertions(+)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 448e6b1591..22e9f743cb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19932,6 +19932,59 @@ qemuDomainFDAssociate(virDomainPtr domain, return ret; }
+static int +qemuDomainGraphicsReload(virDomainPtr domain, + unsigned int type, + unsigned int flags) +{ + int ret = -1; + virDomainObj *vm = NULL; + qemuDomainObjPrivate *priv; + + if (!(vm = qemuDomainObjFromDomain(domain))) + return -1; + + if (virDomainGraphicsReloadEnsureACL(domain->conn, vm->def)) + goto cleanup; + + virCheckFlagsGoto(0, cleanup);
Checking flags is way faster than looking up domain. Please swap these two. That's how we do that in majority of other APIs (if not all).
+ + if (type == VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_ANY) { + size_t i; + for (i = 0; i < vm->def->ngraphics; i++) {
I'd put an empty line before this ^^^ for() so that declaration and code blocks are visually separated.
+ if (vm->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) + break; + } + if (i == vm->def->ngraphics) { + ret = 0; + goto cleanup; + } + } + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (!virDomainObjIsActive(vm)) {
Alignment.
+ virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + goto endjob; + } + + priv = vm->privateData; + + qemuDomainObjEnterMonitor(vm); + + ret = qemuMonitorDisplayReload(priv->mon, "vnc", true); + + qemuDomainObjExitMonitor(vm); + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +}
Michal

On 2/29/24 16:23, Ján Tomko wrote:
From: Zheng Yan <yanzheng759@huawei.com>
The 'display-reload' QMP command had been introduced from QEMU 6.0.0:
https://gitlab.com/qemu-project/qemu/-/commit/9cc07651655ee86eca41059f5ead8c...
Currently it only supports reloading TLS certificates for VNC.
Forgot to add: Prefix this with 'Resolves: ' or something similar please.
Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_driver.c | 54 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.c | 10 +++++++ src/qemu/qemu_monitor.h | 5 ++++ src/qemu/qemu_monitor_json.c | 23 +++++++++++++++ src/qemu/qemu_monitor_json.h | 4 +++ 5 files changed, 96 insertions(+)
Michal

From: Zheng Yan <yanzheng759@huawei.com> Introduce the domdisplay-reload command to make the domain reload its graphics certificates #virsh domdisplay-reload <domain> --type <type> Signed-off-by: Zheng Yan <yanzheng759@huawei.com> Signed-off-by: Ján Tomko <jtomko@redhat.com> --- docs/manpages/virsh.rst | 15 ++++++++++++++ tools/virsh-domain.c | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 8224aec8c3..115b802c45 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -1783,6 +1783,21 @@ included in the URI. If *--all* is specified, then all show all possible graphical displays, for a VM could have more than one graphical displays. +domdisplay-reload +----------------- + +**Syntax:** + +:: + + domdisplay-reload <domain> [[--type] <type>] + +Reload the domain's graphical display. This reloads its TLS certificates +without restarting the domain. ``type`` can be any constant from the +`virDomainGraphicsReloadType` enum. By default any supported type is reloaded +(so far only VNC). + + domfsfreeze ----------- diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index e69d14a6aa..d3e28f38f4 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -13801,6 +13801,45 @@ cmdDomDirtyRateCalc(vshControl *ctl, const vshCmd *cmd) return true; } +/** + * "domdisplay-reload" command + */ +static const vshCmdInfo info_domdisplay_reload[] = { + {.name = "help", + .data = N_("Reload domain's graphics display certificates") + }, + {.name = "desc", + .data = N_("Reload domain's graphics display certificates") + }, + {.name = NULL} +}; + +static const vshCmdOptDef opts_domdisplay_reload[] = { + VIRSH_COMMON_OPT_DOMAIN_FULL(0), + {.name = "type", + .type = VSH_OT_INT, + .help = N_("graphics display type") + }, + {.name = NULL} +}; + +static bool +cmdDomdisplayReload(vshControl *ctl, const vshCmd *cmd) +{ + g_autoptr(virshDomain) dom = NULL; + unsigned int type = 0; + + if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) + return false; + + if (vshCommandOptUInt(ctl, cmd, "type", &type) < 0) + return false; + + if (virDomainGraphicsReload(dom, type, 0) < 0) + return false; + + return true; +} const vshCmdDef domManagementCmds[] = { {.name = "attach-device", @@ -14465,5 +14504,11 @@ const vshCmdDef domManagementCmds[] = { .info = info_dom_fd_associate, .flags = 0 }, + {.name = "domdisplay-reload", + .handler = cmdDomdisplayReload, + .opts = opts_domdisplay_reload, + .info = info_domdisplay_reload, + .flags = 0 + }, {.name = NULL} }; -- 2.43.2

On 2/29/24 16:23, Ján Tomko wrote:
https://issues.redhat.com/browse/RHEL-16333
Based on the patches Huawei sent back in 2021: https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/LDTM3... * rebased * renamed * simplified (removed virTypedParams from the API and the requirement to specify the type)
Ján Tomko (1): remote: implement virDomainGraphicsReload
Zheng Yan (4): qemu_capabilities: Add QEMU_CAPS_DISPLAY_RELOAD libvirt: Introduce virDomainGraphicsReload API qemu: implement qemuDomainGraphicsReload virsh: Introduce domdisplay-reload command
docs/manpages/virsh.rst | 15 ++++++ include/libvirt/libvirt-domain.h | 18 +++++++ src/driver-hypervisor.h | 6 +++ src/libvirt-domain.c | 50 +++++++++++++++++ src/libvirt_public.syms | 5 ++ src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_driver.c | 54 +++++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++ src/qemu/qemu_monitor.h | 5 ++ src/qemu/qemu_monitor_json.c | 23 ++++++++ src/qemu/qemu_monitor_json.h | 4 ++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 13 ++++- src/remote_protocol-structs | 6 +++ .../caps_6.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.0.0_s390x.xml | 1 + .../caps_6.0.0_x86_64.xml | 1 + .../caps_6.1.0_x86_64.xml | 1 + .../caps_6.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + .../caps_6.2.0_x86_64.xml | 1 + .../caps_7.0.0_aarch64+hvf.xml | 1 + .../caps_7.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + .../caps_7.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + .../caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + .../caps_7.2.0_x86_64+hvf.xml | 1 + .../caps_7.2.0_x86_64.xml | 1 + .../caps_8.0.0_riscv64.xml | 1 + .../caps_8.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + .../caps_8.1.0_x86_64.xml | 1 + .../caps_8.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + .../caps_8.2.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + tools/virsh-domain.c | 45 ++++++++++++++++ 40 files changed, 281 insertions(+), 1 deletion(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Ján Tomko
-
Michal Prívozník