]> xenbits.xensource.com Git - libvirt.git/commitdiff
libvirt: Introduce virDomainGraphicsReload API
authorZheng Yan <yanzheng759@huawei.com>
Tue, 11 May 2021 14:05:20 +0000 (22:05 +0800)
committerJán Tomko <jtomko@redhat.com>
Fri, 8 Mar 2024 16:00:15 +0000 (17:00 +0100)
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
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>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
include/libvirt/libvirt-domain.h
src/driver-hypervisor.h
src/libvirt-domain.c
src/libvirt_public.syms

index 30cce85b29596fe4970df5ffc6ef25bd508b375c..2f5b01bbfe009a086252040c247fbe86c65a7db0 100644 (file)
@@ -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 */
index 5219344b72edcf7e6d7d8228d9c42b687e0800ab..4ce8da078dbd3bb6916ed0da4efe4d69af8188c4 100644 (file)
@@ -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;
 };
index 83abad251e333f258aa74b18f9b1a77af11ab2ae..9e3c61b66aa867ddc4834596be4f740db1f1c1f3 100644 (file)
@@ -14118,3 +14118,47 @@ 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. This can be used to reload TLS certificates
+ * without restarting the domain.
+ *
+ * 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 (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;
+}
index 0304b8f8244ec71f4ac81dba5e85f5fb8e27844b..7a3492d9d7e36df9d84c30cdb93379929c66535d 100644 (file)
@@ -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 ....