This patch adds qemuMonitorGetDumpGuestMemoryCapability, which is used to check
whether the specified dump-guest-memory format is supported by qemu.
Signed-off-by: Qiao Nuohan <qiaonuohan(a)cn.fujitsu.com>
---
src/qemu/qemu_monitor.c | 21 ++++++++++++++
src/qemu/qemu_monitor.h | 3 ++
src/qemu/qemu_monitor_json.c | 65 ++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 3 ++
tests/qemumonitorjsontest.c | 43 +++++++++++++++++++++++++++++
5 files changed, 135 insertions(+)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index a2769db..8104104 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2344,6 +2344,27 @@ int qemuMonitorMigrateCancel(qemuMonitorPtr mon)
return ret;
}
+/**
+ * Returns 1 if @capability is supported, 0 if it's not, or -1 on error.
+ */
+int qemuMonitorGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
+ const char *capability)
+{
+ VIR_DEBUG("mon=%p capability=%s", mon, capability);
+
+ if (!mon) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ /* No capability is supported without JSON monitor */
+ if (!mon->json)
+ return 0;
+
+ return qemuMonitorJSONGetDumpGuestMemoryCapability(mon, capability);
+}
+
int
qemuMonitorDumpToFd(qemuMonitorPtr mon, int fd)
{
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index eabf000..00a6554 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -494,6 +494,9 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
int qemuMonitorMigrateCancel(qemuMonitorPtr mon);
+int qemuMonitorGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
+ const char *capability);
+
int qemuMonitorDumpToFd(qemuMonitorPtr mon,
int fd);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index ee3ae15..2cf706c 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -2635,6 +2635,71 @@ int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon)
}
int
+qemuMonitorJSONGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
+ const char *capability)
+{
+ int ret;
+ virJSONValuePtr cmd;
+ virJSONValuePtr reply = NULL;
+ virJSONValuePtr caps;
+ virJSONValuePtr formats;
+ size_t i;
+
+ if (!(cmd =
qemuMonitorJSONMakeCommand("query-dump-guest-memory-capability",
+ NULL)))
+ return -1;
+
+ ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+
+ if (ret == 0) {
+ if (qemuMonitorJSONHasError(reply, "CommandNotFound"))
+ goto cleanup;
+ ret = qemuMonitorJSONCheckError(cmd, reply);
+ }
+
+ if (ret < 0)
+ goto cleanup;
+
+ ret = -1;
+
+ caps = virJSONValueObjectGet(reply, "return");
+ if (!caps || caps->type != VIR_JSON_TYPE_OBJECT) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing dump guest memory capabilities"));
+ goto cleanup;
+ }
+
+ formats = virJSONValueObjectGet(caps, "formats");
+ if (!formats || formats->type != VIR_JSON_TYPE_ARRAY) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing supported dump formats"));
+ goto cleanup;
+ }
+
+ for (i = 0; i < virJSONValueArraySize(formats); i++) {
+ virJSONValuePtr dumpformat = virJSONValueArrayGet(formats, i);
+
+ if (!dumpformat || dumpformat->type != VIR_JSON_TYPE_STRING) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing entry in supported dump formats"));
+ goto cleanup;
+ }
+
+ if (STREQ(virJSONValueGetString(dumpformat), capability)) {
+ ret = 1;
+ goto cleanup;
+ }
+
+ ret = 0;
+ }
+
+cleanup:
+ virJSONValueFree(cmd);
+ virJSONValueFree(reply);
+ return ret;
+}
+
+int
qemuMonitorJSONDump(qemuMonitorPtr mon,
const char *protocol)
{
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index a93c51e..37e9456 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -147,6 +147,9 @@ int qemuMonitorJSONGetSpiceMigrationStatus(qemuMonitorPtr mon,
int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon);
+int qemuMonitorJSONGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
+ const char *capability);
+
int qemuMonitorJSONDump(qemuMonitorPtr mon,
const char *protocol);
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index d7da5a8..d21e1ce 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1959,6 +1959,48 @@ cleanup:
return ret;
}
+static int
+testQemuMonitorJSONqemuMonitorJSONGetDumpGuestMemoryCapability(const void *data)
+{
+ virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
+ qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, xmlopt);
+ int ret = -1;
+ int cap;
+ const char *reply =
+ "{"
+ " \"return\": {"
+ " \"formats\": ["
+ " \"elf\","
+ " \"kdump-zlib\","
+ " \"kdump-lzo\","
+ " \"kdump-snappy\""
+ " ]"
+ " },"
+ " \"id\": \"libvirt-9\""
+ "}";
+
+ if (!test)
+ return -1;
+
+ if (qemuMonitorTestAddItem(test, "query-dump-guest-memory-capability",
+ reply) < 0)
+ goto cleanup;
+
+ cap = qemuMonitorJSONGetDumpGuestMemoryCapability(
+ qemuMonitorTestGetMonitor(test), "elf");
+
+ if (cap != 1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "Unexpected capability: %d, expecting 1",
+ cap);
+ goto cleanup;
+ }
+
+ ret = 0;
+cleanup:
+ qemuMonitorTestFree(test);
+ return ret;
+}
struct testCPUData {
const char *name;
@@ -2187,6 +2229,7 @@ mymain(void)
DO_TEST(qemuMonitorJSONGetCPUInfo);
DO_TEST(qemuMonitorJSONGetVirtType);
DO_TEST(qemuMonitorJSONSendKey);
+ DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability);
DO_TEST_CPU_DATA("host");
DO_TEST_CPU_DATA("full");
--
1.8.5.3