]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: implement qemuDomainGraphicsReload
authorZheng Yan <yanzheng759@huawei.com>
Tue, 11 May 2021 14:05:19 +0000 (22:05 +0800)
committerJán Tomko <jtomko@redhat.com>
Fri, 8 Mar 2024 16:00:15 +0000 (17:00 +0100)
The 'display-reload' QMP command had been introduced from QEMU 6.0.0:

https://gitlab.com/qemu-project/qemu/-/commit/9cc07651655ee86eca41059f5ead8c4e5607c734

Currently it only supports reloading TLS certificates for VNC.

Resloves: https://issues.redhat.com/browse/RHEL-16333

Signed-off-by: Zheng Yan <yanzheng759@huawei.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index 448e6b159198de4344082d78dfdd1f116e126222..d01f788aea8aabc33c2727702fbdd47e0394c454 100644 (file)
@@ -19932,6 +19932,68 @@ qemuDomainFDAssociate(virDomainPtr domain,
     return ret;
 }
 
+static int
+qemuDomainGraphicsReload(virDomainPtr domain,
+                         unsigned int type,
+                         unsigned int flags)
+{
+    int ret = -1;
+    virDomainObj *vm = NULL;
+    qemuDomainObjPrivate *priv;
+
+    virCheckFlagsGoto(0, cleanup);
+
+    if (type >= VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST) {
+        virReportInvalidArg(type,
+                            _("type must be less than %1$d"),
+                            VIR_DOMAIN_GRAPHICS_RELOAD_TYPE_LAST);
+        return -1;
+    }
+
+    if (!(vm = qemuDomainObjFromDomain(domain)))
+        return -1;
+
+    if (virDomainGraphicsReloadEnsureACL(domain->conn, vm->def))
+        goto 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 +20244,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
     .domainStartDirtyRateCalc = qemuDomainStartDirtyRateCalc, /* 7.2.0 */
     .domainSetLaunchSecurityState = qemuDomainSetLaunchSecurityState, /* 8.0.0 */
     .domainFDAssociate = qemuDomainFDAssociate, /* 9.0.0 */
+    .domainGraphicsReload = qemuDomainGraphicsReload, /* 10.2.0 */
 };
 
 
index 0f29fb02b4a4a38795800bda093fedcf84110728..34e2ccab9725afe0eea79563e97ead60b48784f5 100644 (file)
@@ -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);
+}
index 981c609e9f404070dd4eb5758fc0930981740b77..6e819452010f33de1033d6de176e2c89573bf9ba 100644 (file)
@@ -1581,3 +1581,8 @@ qemuMonitorExtractQueryStats(virJSONValue *info);
 virJSONValue *
 qemuMonitorGetStatsByQOMPath(virJSONValue *arr,
                              char *qom_path);
+
+int
+qemuMonitorDisplayReload(qemuMonitor *mon,
+                         const char *type,
+                         bool tlsCerts);
index 7aab34c7c47958a0e354ec62fff0b1e66b3b33c2..eb84a3d9384ae89a8aea75179b399dfea861cafa 100644 (file)
@@ -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;
+}
index ed0027c118e6144458e83872c7d0d1d1e56818fe..9684660d86f7e396af25f62d5c89d0f3205a6ad6 100644 (file)
@@ -825,3 +825,7 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
                           qemuMonitorQueryStatsTargetType target,
                           char **vcpus,
                           GPtrArray *providers);
+
+int qemuMonitorJSONDisplayReload(qemuMonitor *mon,
+                                 const char *type,
+                                 bool tlsCerts);