On 2/29/24 16:23, Ján Tomko wrote:
From: Zheng Yan <yanzheng759(a)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(a)huawei.com>
Signed-off-by: Ján Tomko <jtomko(a)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