]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Implement monitor code for 'set-action' command
authorPeter Krempa <pkrempa@redhat.com>
Fri, 20 Aug 2021 12:39:27 +0000 (14:39 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 25 Aug 2021 13:32:44 +0000 (15:32 +0200)
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
tests/qemumonitorjsontest.c

index 14fb605e92610e9dc7f43c88f08f2d087237243c..42846349c427222147a226305a61fd03aec4a92e 100644 (file)
@@ -4609,3 +4609,19 @@ qemuMonitorQueryDirtyRate(qemuMonitor *mon,
 
     return qemuMonitorJSONQueryDirtyRate(mon, info);
 }
+
+
+int
+qemuMonitorSetAction(qemuMonitor *mon,
+                     qemuMonitorActionShutdown shutdown,
+                     qemuMonitorActionReboot reboot,
+                     qemuMonitorActionWatchdog watchdog,
+                     qemuMonitorActionPanic panic)
+{
+    VIR_DEBUG("shutdown=%u, reboot=%u, watchdog=%u panic=%u",
+              shutdown, reboot, watchdog, panic);
+
+    QEMU_CHECK_MONITOR(mon);
+
+    return qemuMonitorJSONSetAction(mon, shutdown, reboot, watchdog, panic);
+}
index 8af271dc96efba3159b39e4d5696f93514f033e5..2f08357c0c19b3d82ed177aaa2bf19f437c5e6da 100644 (file)
@@ -101,6 +101,48 @@ struct _qemuMonitorRdmaGidStatus {
 };
 
 
+typedef enum {
+    QEMU_MONITOR_ACTION_SHUTDOWN_KEEP, /* do not change the current setting */
+    QEMU_MONITOR_ACTION_SHUTDOWN_POWEROFF,
+    QEMU_MONITOR_ACTION_SHUTDOWN_PAUSE,
+
+    QEMU_MONITOR_ACTION_SHUTDOWN_LAST
+} qemuMonitorActionShutdown;
+
+
+typedef enum {
+    QEMU_MONITOR_ACTION_REBOOT_KEEP, /* do not change the current setting */
+    QEMU_MONITOR_ACTION_REBOOT_RESET,
+    QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN,
+
+    QEMU_MONITOR_ACTION_REBOOT_LAST
+} qemuMonitorActionReboot;
+
+
+typedef enum {
+    QEMU_MONITOR_ACTION_WATCHDOG_KEEP, /* do not change the current setting */
+    QEMU_MONITOR_ACTION_WATCHDOG_RESET,
+    QEMU_MONITOR_ACTION_WATCHDOG_SHUTDOWN,
+    QEMU_MONITOR_ACTION_WATCHDOG_POWEROFF,
+    QEMU_MONITOR_ACTION_WATCHDOG_PAUSE,
+    QEMU_MONITOR_ACTION_WATCHDOG_DEBUG,
+    QEMU_MONITOR_ACTION_WATCHDOG_NONE,
+    QEMU_MONITOR_ACTION_WATCHDOG_INJECT_NMI,
+
+    QEMU_MONITOR_ACTION_WATCHDOG_LAST
+} qemuMonitorActionWatchdog;
+
+
+typedef enum {
+    QEMU_MONITOR_ACTION_PANIC_KEEP, /* do not change the current setting */
+    QEMU_MONITOR_ACTION_PANIC_PAUSE,
+    QEMU_MONITOR_ACTION_PANIC_SHUTDOWN,
+    QEMU_MONITOR_ACTION_PANIC_NONE,
+
+    QEMU_MONITOR_ACTION_PANIC_LAST
+} qemuMonitorActionPanic;
+
+
 typedef enum {
     QEMU_MONITOR_JOB_TYPE_UNKNOWN, /* internal value, not exposed by qemu */
     QEMU_MONITOR_JOB_TYPE_COMMIT,
@@ -1488,3 +1530,10 @@ struct _qemuMonitorDirtyRateInfo {
 int
 qemuMonitorQueryDirtyRate(qemuMonitor *mon,
                           qemuMonitorDirtyRateInfo *info);
+
+int
+qemuMonitorSetAction(qemuMonitor *mon,
+                     qemuMonitorActionShutdown shutdown,
+                     qemuMonitorActionReboot reboot,
+                     qemuMonitorActionWatchdog watchdog,
+                     qemuMonitorActionPanic panic);
index 8fb2bf4dc3ea56fba74c5ef4a572ed9f6acc3c4e..8d3c4031a6717df7288bb591f22a7f9dfa330af4 100644 (file)
@@ -9325,3 +9325,82 @@ qemuMonitorJSONQueryDirtyRate(qemuMonitor *mon,
 
     return qemuMonitorJSONExtractDirtyRateInfo(data, info);
 }
+
+
+VIR_ENUM_DECL(qemuMonitorActionShutdown);
+VIR_ENUM_IMPL(qemuMonitorActionShutdown,
+              QEMU_MONITOR_ACTION_SHUTDOWN_LAST,
+              "",
+              "poweroff",
+              "pause");
+
+VIR_ENUM_DECL(qemuMonitorActionReboot);
+VIR_ENUM_IMPL(qemuMonitorActionReboot,
+              QEMU_MONITOR_ACTION_REBOOT_LAST,
+              "",
+              "reset",
+              "shutdown");
+
+VIR_ENUM_DECL(qemuMonitorActionWatchdog);
+VIR_ENUM_IMPL(qemuMonitorActionWatchdog,
+              QEMU_MONITOR_ACTION_WATCHDOG_LAST,
+              "",
+              "reset",
+              "shutdown",
+              "poweroff",
+              "pause",
+              "debug",
+              "none",
+              "inject-nmi");
+
+VIR_ENUM_DECL(qemuMonitorActionPanic);
+VIR_ENUM_IMPL(qemuMonitorActionPanic,
+              QEMU_MONITOR_ACTION_PANIC_LAST,
+              "",
+              "pause",
+              "shutdown",
+              "none");
+
+
+int
+qemuMonitorJSONSetAction(qemuMonitor *mon,
+                         qemuMonitorActionShutdown shutdown,
+                         qemuMonitorActionReboot reboot,
+                         qemuMonitorActionWatchdog watchdog,
+                         qemuMonitorActionPanic panic)
+{
+    g_autoptr(virJSONValue) cmd = NULL;
+    g_autoptr(virJSONValue) reply = NULL;
+    const char *actionShutdown = NULL;
+    const char *actionReboot = NULL;
+    const char *actionWatchdog = NULL;
+    const char *actionPanic = NULL;
+
+    if (shutdown != QEMU_MONITOR_ACTION_SHUTDOWN_KEEP)
+        actionShutdown = qemuMonitorActionShutdownTypeToString(shutdown);
+
+    if (reboot != QEMU_MONITOR_ACTION_REBOOT_KEEP)
+        actionReboot = qemuMonitorActionRebootTypeToString(reboot);
+
+    if (watchdog != QEMU_MONITOR_ACTION_WATCHDOG_KEEP)
+        actionWatchdog = qemuMonitorActionWatchdogTypeToString(watchdog);
+
+    if (panic != QEMU_MONITOR_ACTION_PANIC_KEEP)
+        actionPanic = qemuMonitorActionPanicTypeToString(panic);
+
+    if (!(cmd = qemuMonitorJSONMakeCommand("set-action",
+                                           "S:shutdown", actionShutdown,
+                                           "S:reboot", actionReboot,
+                                           "S:watchdog", actionWatchdog,
+                                           "S:panic", actionPanic,
+                                           NULL)))
+        return -1;
+
+    if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+        return -1;
+
+    if (qemuMonitorJSONCheckError(cmd, reply) < 0)
+        return -1;
+
+    return 0;
+}
index fbeab2bf6d820ec5f7ecbade549c899928a96cab..c8cf734a1cc522d45b2b982f7bc2a03d703050a6 100644 (file)
@@ -703,3 +703,10 @@ qemuMonitorJSONStartDirtyRateCalc(qemuMonitor *mon,
 int
 qemuMonitorJSONQueryDirtyRate(qemuMonitor *mon,
                               qemuMonitorDirtyRateInfo *info);
+
+int
+qemuMonitorJSONSetAction(qemuMonitor *mon,
+                         qemuMonitorActionShutdown shutdown,
+                         qemuMonitorActionReboot reboot,
+                         qemuMonitorActionWatchdog watchdog,
+                         qemuMonitorActionPanic panic);
index 6d7ecb0ab1eb931971cb755049b0de8ba826ef04..9ec5f069816c90736e45e3108e01475188a361c3 100644 (file)
@@ -1204,6 +1204,11 @@ GEN_TEST_FUNC(qemuMonitorJSONBitmapRemove, "foodev", "newnode")
 GEN_TEST_FUNC(qemuMonitorJSONJobDismiss, "jobname")
 GEN_TEST_FUNC(qemuMonitorJSONJobComplete, "jobname")
 GEN_TEST_FUNC(qemuMonitorJSONBlockJobCancel, "jobname", true)
+GEN_TEST_FUNC(qemuMonitorJSONSetAction,
+              QEMU_MONITOR_ACTION_SHUTDOWN_PAUSE,
+              QEMU_MONITOR_ACTION_REBOOT_RESET,
+              QEMU_MONITOR_ACTION_WATCHDOG_SHUTDOWN,
+              QEMU_MONITOR_ACTION_PANIC_SHUTDOWN)
 
 static int
 testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
@@ -3067,6 +3072,7 @@ mymain(void)
     DO_TEST_GEN(qemuMonitorJSONJobDismiss);
     DO_TEST_GEN(qemuMonitorJSONJobComplete);
     DO_TEST_GEN(qemuMonitorJSONBlockJobCancel);
+    DO_TEST_GEN(qemuMonitorJSONSetAction);
     DO_TEST(qemuMonitorJSONGetBalloonInfo);
     DO_TEST(qemuMonitorJSONGetBlockInfo);
     DO_TEST(qemuMonitorJSONGetAllBlockStatsInfo);