qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/2] monitor: introduce query-config-schema command


From: Amos Kong
Subject: [Qemu-devel] [PATCH 2/2] monitor: introduce query-config-schema command
Date: Wed, 24 Apr 2013 20:47:26 +0800

Libvirt has no way to probe if an option or property is supported,
This patch introdues a new qmp command to query configuration schema
information. hmp command isn't added because it's not needed.

Signed-off-by: Amos Kong <address@hidden>
CC: Osier Yang <address@hidden>
CC: Anthony Liguori <address@hidden>
---
 qapi-schema.json   |   29 +++++++++++++++++++++++++++++
 qmp-commands.hx    |   40 ++++++++++++++++++++++++++++++++++++++++
 util/qemu-config.c |   40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/qapi-schema.json b/qapi-schema.json
index 751d3c2..aeab057 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3505,3 +3505,32 @@
     '*asl_compiler_rev':  'uint32',
     '*file':              'str',
     '*data':              'str' }}
+
+##
+# @ConfigSchemaInfo:
+#
+# Configration schema information.
+#
+# @option: option name
+#
+# @params: parameters strList of one option
+#
+# Since 1.5
+##
+{ 'type': 'ConfigSchemaInfo', 'data': {'option': 'str', 'params': ['str']} }
+
+##
+# @query-config-schema
+#
+# Query configuration schema information of options
+#
+# @option: #optional option name
+#
+# Returns: returns @ConfigSchemaInfo if option is assigned, returns
+#          @ConfigSchemaInfo list if no option is assigned, returns an error
+#          QERR_INVALID_OPTION_GROUP if assigned option doesn't exist.
+#
+# Since 1.5
+##
+{'command': 'query-config-schema', 'data': {'*option': 'str'},
+ 'returns': ['ConfigSchemaInfo']}
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 4d65422..c6399be 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -2414,6 +2414,46 @@ EQMP
         .args_type  = "",
         .mhandler.cmd_new = qmp_marshal_input_query_uuid,
     },
+SQMP
+query-config-schema
+------------
+
+Show configuration schema.
+
+Return configuration schema of one option if option is assigned, return
+configuration schema list of all options if no option is assigned. return
+an error QERR_INVALID_OPTION_GROUP if assigned option doesn't exist.
+
+- "option": option name
+- "params": parameters string list of one option
+
+Example:
+
+-> {"execute": "query-config-schema", "arguments" : {"option": "boot-opts"}}
+<- {
+    "return": [
+        {
+            "params": [
+                "strict",
+                "reboot-timeout",
+                "splash-time",
+                "splash",
+                "menu",
+                "once",
+                "order"
+            ],
+            "option": "boot-opts"
+        }
+    ]
+  }
+
+EQMP
+
+    {
+        .name       = "query-config-schema",
+        .args_type  = "option:s?",
+        .mhandler.cmd_new = qmp_marshal_input_query_config_schema,
+    },
 
 SQMP
 query-migrate
diff --git a/util/qemu-config.c b/util/qemu-config.c
index 01ca890..e8b4466 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -5,6 +5,7 @@
 #include "qapi/qmp/qerror.h"
 #include "hw/qdev.h"
 #include "qapi/error.h"
+#include "qmp-commands.h"
 
 static QemuOptsList *vm_config_groups[32];
 
@@ -37,6 +38,45 @@ QemuOptsList *qemu_find_opts(const char *group)
     return ret;
 }
 
+ConfigSchemaInfoList *qmp_query_config_schema(bool has_option,
+                                              const char *option, Error **errp)
+{
+    ConfigSchemaInfoList *conf_list = NULL, *entry;
+    ConfigSchemaInfo *info;
+    strList *str_list = NULL, *str_entry;
+    int entries, i, j;
+
+    entries = ARRAY_SIZE(vm_config_groups);
+
+    for (i = 0; i < entries; i++) {
+        if (vm_config_groups[i] != NULL &&
+            (!has_option || !strcmp(option, vm_config_groups[i]->name))) {
+            info = g_malloc0(sizeof(*info));
+            info->option = g_strdup(vm_config_groups[i]->name);
+            str_list = NULL;
+
+            for (j = 0; vm_config_groups[i]->desc[j].name != NULL; j++) {
+                str_entry = g_malloc0(sizeof(*str_entry));
+                str_entry->value = g_strdup(vm_config_groups[i]->desc[j].name);
+                str_entry->next = str_list;
+                str_list = str_entry;
+            }
+
+            info->params = str_list;
+            entry = g_malloc0(sizeof(*entry));
+            entry->value = info;
+            entry->next = conf_list;
+            conf_list = entry;
+        }
+    }
+
+    if (conf_list == NULL) {
+        error_set(errp, QERR_INVALID_OPTION_GROUP, option);
+    }
+
+    return conf_list;
+}
+
 QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
 {
     return find_list(vm_config_groups, group, errp);
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]