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 <ak...@redhat.com> CC: Osier Yang <jy...@redhat.com> CC: Anthony Liguori <aligu...@us.ibm.com> --- 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