qemu: monitor: Add plumbing for 'snaphot-save'/'snapshot-delete' QMP commands

Signed-off-by: Nikolai Barybin <nikolai.barybin@virtuozzo.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Nikolai Barybin via Devel 2024-07-17 21:21:35 +03:00 committed by Peter Krempa
parent 2e325804cc
commit 5d0773633a
5 changed files with 150 additions and 0 deletions

View File

@ -2764,6 +2764,36 @@ qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name)
} }
int
qemuMonitorSnapshotSave(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char *vmstate_disk,
const char **disks)
{
VIR_DEBUG("jobname='%s', snapshotname='%s', vmstate_disk='%s'",
jobname, snapshotname, vmstate_disk);
QEMU_CHECK_MONITOR(mon);
return qemuMonitorJSONSnapshotSave(mon, jobname, snapshotname, vmstate_disk, disks);
}
int
qemuMonitorSnapshotDelete(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char **disks)
{
VIR_DEBUG("jobname='%s', snapshotname='%s'", jobname, snapshotname);
QEMU_CHECK_MONITOR(mon);
return qemuMonitorJSONSnapshotDelete(mon, jobname, snapshotname, disks);
}
int int
qemuMonitorBlockdevMirror(qemuMonitor *mon, qemuMonitorBlockdevMirror(qemuMonitor *mon,
const char *jobname, const char *jobname,

View File

@ -1618,3 +1618,17 @@ int
qemuMonitorDisplayReload(qemuMonitor *mon, qemuMonitorDisplayReload(qemuMonitor *mon,
const char *type, const char *type,
bool tlsCerts); bool tlsCerts);
int
qemuMonitorSnapshotSave(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char *vmstate_disk,
const char **disks);
int
qemuMonitorSnapshotDelete(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char **disks);

View File

@ -8701,3 +8701,63 @@ int qemuMonitorJSONDisplayReload(qemuMonitor *mon,
return 0; return 0;
} }
int
qemuMonitorJSONSnapshotSave(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char *vmstate_disk,
const char **disks)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
g_autoptr(virJSONValue) devices = virJSONValueNewArray();
for (; *disks; disks++) {
if (virJSONValueArrayAppendString(devices, *disks) < 0)
return -1;
}
if (!(cmd = qemuMonitorJSONMakeCommand("snapshot-save",
"s:job-id", jobname,
"s:tag", snapshotname,
"s:vmstate", vmstate_disk,
"a:devices", &devices,
NULL)))
return -1;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
return -1;
return qemuMonitorJSONCheckError(cmd, reply);
}
int
qemuMonitorJSONSnapshotDelete(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char **disks)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
g_autoptr(virJSONValue) devices = virJSONValueNewArray();
for (; *disks; disks++) {
if (virJSONValueArrayAppendString(devices, *disks) < 0)
return -1;
}
if (!(cmd = qemuMonitorJSONMakeCommand("snapshot-delete",
"s:job-id", jobname,
"s:tag", snapshotname,
"a:devices", &devices,
NULL)))
return -1;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
return -1;
return qemuMonitorJSONCheckError(cmd, reply);
}

View File

@ -825,3 +825,16 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
int qemuMonitorJSONDisplayReload(qemuMonitor *mon, int qemuMonitorJSONDisplayReload(qemuMonitor *mon,
const char *type, const char *type,
bool tlsCerts); bool tlsCerts);
int
qemuMonitorJSONSnapshotSave(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char *vmstate_disk,
const char **disks);
int
qemuMonitorJSONSnapshotDelete(qemuMonitor *mon,
const char *jobname,
const char *snapshotname,
const char **disks);

View File

@ -1217,6 +1217,38 @@ testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
return 0; return 0;
} }
static int
testQemuMonitorJSONqemuMonitorJSONSnapshot(const void *opaque)
{
const testGenericData *data = opaque;
virDomainXMLOption *xmlopt = data->xmlopt;
g_autoptr(qemuMonitorTest) test = NULL;
const char *disks[] = { "test", "disk", NULL };
if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema)))
return -1;
if (qemuMonitorTestAddItem(test, "snapshot-save",
"{\"return\":{}}") < 0)
return -1;
if (qemuMonitorTestAddItem(test, "snapshot-delete",
"{\"return\":{}}") < 0)
return -1;
if (qemuMonitorJSONSnapshotSave(qemuMonitorTestGetMonitor(test),
"jobname", "snapshotname", "vmstate", disks) < 0)
return -1;
if (qemuMonitorJSONSnapshotDelete(qemuMonitorTestGetMonitor(test),
"jobname", "snapshotname", disks) < 0)
return -1;
return 0;
}
static bool static bool
testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a, testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a,
struct qemuMonitorQueryCpusEntry *b) struct qemuMonitorQueryCpusEntry *b)
@ -2956,6 +2988,7 @@ mymain(void)
DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability); DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability);
DO_TEST(qemuMonitorJSONSendKeyHoldtime); DO_TEST(qemuMonitorJSONSendKeyHoldtime);
DO_TEST(qemuMonitorJSONNBDServerStart); DO_TEST(qemuMonitorJSONNBDServerStart);
DO_TEST(qemuMonitorJSONSnapshot);
DO_TEST_CPU_DATA("host"); DO_TEST_CPU_DATA("host");
DO_TEST_CPU_DATA("full"); DO_TEST_CPU_DATA("full");