From: Eric Blake <eblake@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: pbonzini@redhat.com, aliguori@us.ibm.com, qemu-devel@nongnu.org,
jyang@redhat.com, lcapitulino@redhat.com
Subject: Re: [Qemu-devel] [PATCH 2/2] monitor: introduce query-config-schema command
Date: Wed, 24 Apr 2013 08:38:25 -0600 [thread overview]
Message-ID: <5177EE61.7030909@redhat.com> (raw)
In-Reply-To: <1366807646-8473-2-git-send-email-akong@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 7443 bytes --]
On 04/24/2013 06:47 AM, Amos Kong wrote:
> 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.
Agreed that no HMP counterpart is needed. However, I don't think we
have quite the right interface yet.
>
> Signed-off-by: Amos Kong <akong@redhat.com>
> CC: Osier Yang <jyang@redhat.com>
> CC: Anthony Liguori <aliguori@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
Why just a strList? That only tells me option names. But we already
know so much more than that - we know the type and the help string.
> +#
> +# Since 1.5
> +##
> +{ 'type': 'ConfigSchemaInfo', 'data': {'option': 'str', 'params': ['str']} }
I'd rather see an array of structs, more closely mirroring what
include/qemu/option.h gives us:
# JSON representation of values of QEMUOptionParType, may grow in future
{ 'enum': 'ConfigParamType',
'data': [ 'flag', 'number', 'size', 'string' ] }
# JSON representation of QEMUOptionParameter, may grow in future
# @help is optional if no text was present
{ 'type': 'ConfigParamInfo',
'data': { 'name': 'str', 'type': 'ConfigParamType', '*help':'str' } }
# Each command line option, and its list of parameters
{ 'type': 'ConfigSchemaInfo',
'data': { 'option':'str', 'params': ['ConfigParamInfo'] } }
And that means we no longer have ['str'], which bypasses the need for
your patch 1/2.
> +
> +##
> +# @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.
That didn't read well. Also, QERR_INVALID_OPTION_GROUP is a generic
error; we don't mention any other QERR_* names in qapi-schema.json. How
about:
Returns: list of @ConfigSchemaInfo for all options (or for the given
@option). Returns an error if a given @option doesn't exist.
> +#
> +# Since 1.5
> +##
> +{'command': 'query-config-schema', 'data': {'*option': 'str'},
> + 'returns': ['ConfigSchemaInfo']}
This part looks good.
> 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.
Again, QERR_INVALID_OPTION_GROUP is not a defined error (it is shorthand
for a specific message for a GenericError class).
> +
> +- "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"
> + }
> + ]
> + }
Back to my desire for more structure, I'd like to see:
-> {"execute": "query-config-schema", "arguments" : {"option": "boot-opts"}}
<- {
"return": [
{
"params": [
{
"name": "strict",
"type": "string"
},
{
"name": "reboot-timeout",
"type": "string"
},
...
],
"option": "boot-opts"
}
]
}
Another more interesting example, showing why the "type" and optional
"help" fields are useful, assuming
https://lists.gnu.org/archive/html/qemu-devel/2013-04/msg04810.html goes in:
-> {"execute": "query-config-schema", "arguments" : {"option": "drive"}}
<- {
"return": [
{
"params": [
{
"name": "bus",
"type": "number",
"help": "bus number"
},
{
"name": "if",
"type": "string",
"help": "interface (ide, scsi, sd, mtd, floppy,
pflash, virtio)"
},
...
],
"option": "drive"
}
]
}
>
> +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));
This part of the iteration looks fine.
> + 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;
> + }
Here, you'd need to allocate a bit more structure, to match the JSON I
proposed above.
> +
> + 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);
>
Looking forward to v2.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]
next prev parent reply other threads:[~2013-04-24 14:38 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-24 12:47 [Qemu-devel] [RESEND PATCH 1/2] qapi: introduce strList and visit_type_strList() Amos Kong
2013-04-24 12:47 ` [Qemu-devel] [PATCH 2/2] monitor: introduce query-config-schema command Amos Kong
2013-04-24 14:38 ` Eric Blake [this message]
2013-04-24 16:45 ` Anthony Liguori
2013-04-24 17:33 ` [Qemu-devel] [PATCH] " Amos Kong
2013-04-24 17:36 ` [Qemu-devel] [PATCH v2] " Amos Kong
2013-04-24 18:20 ` [Qemu-devel] [PATCH] " Luiz Capitulino
2013-04-24 19:39 ` Eric Blake
2013-04-24 23:55 ` Eric Blake
2013-04-25 3:52 ` Amos Kong
2013-04-25 4:27 ` Osier Yang
2013-04-25 5:09 ` Amos Kong
2013-04-25 12:36 ` Luiz Capitulino
2013-04-25 13:30 ` Eric Blake
2013-04-25 1:14 ` Amos Kong
2013-04-25 1:35 ` Luiz Capitulino
2013-04-25 1:44 ` Eric Blake
2013-04-25 2:03 ` Amos Kong
2013-04-25 2:14 ` Luiz Capitulino
2013-04-25 1:43 ` Eric Blake
2013-04-25 3:38 ` Osier Yang
2013-04-24 14:01 ` [Qemu-devel] [RESEND PATCH 1/2] qapi: introduce strList and visit_type_strList() Eric Blake
2013-04-24 15:59 ` Amos Kong
2013-04-24 14:39 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5177EE61.7030909@redhat.com \
--to=eblake@redhat.com \
--cc=akong@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=jyang@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.