qemu: monitor: Implement monitor code for 'set-action' command

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Peter Krempa 2021-08-20 14:39:27 +02:00
parent feb0a0c7f5
commit 32c5d30f4d
5 changed files with 157 additions and 0 deletions

View 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);
}

View 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);

View 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;
}

View 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);

View 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);