monitor: introduce query-command-line-options
Libvirt has no way to probe if an option or property is supported, This patch introduces a new qmp command to query command line option information. hmp command isn't added because it's not needed. Signed-off-by: Amos Kong <akong@redhat.com> CC: Luiz Capitulino <lcapitulino@redhat.com> CC: Osier Yang <jyang@redhat.com> CC: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
		
							parent
							
								
									9953f8822c
								
							
						
					
					
						commit
						1f8f987d34
					
				| @ -3505,3 +3505,69 @@ | ||||
|     '*asl_compiler_rev':  'uint32', | ||||
|     '*file':              'str', | ||||
|     '*data':              'str' }} | ||||
| 
 | ||||
| ## | ||||
| # @CommandLineParameterType: | ||||
| # | ||||
| # Possible types for an option parameter. | ||||
| # | ||||
| # @string: accepts a character string | ||||
| # | ||||
| # @boolean: accepts "on" or "off" | ||||
| # | ||||
| # @number: accepts a number | ||||
| # | ||||
| # @size: accepts a number followed by an optional suffix (K)ilo, | ||||
| #        (M)ega, (G)iga, (T)era | ||||
| # | ||||
| # Since 1.5 | ||||
| ## | ||||
| { 'enum': 'CommandLineParameterType', | ||||
|   'data': ['string', 'boolean', 'number', 'size'] } | ||||
| 
 | ||||
| ## | ||||
| # @CommandLineParameterInfo: | ||||
| # | ||||
| # Details about a single parameter of a command line option. | ||||
| # | ||||
| # @name: parameter name | ||||
| # | ||||
| # @type: parameter @CommandLineParameterType | ||||
| # | ||||
| # @help: #optional human readable text string, not suitable for parsing. | ||||
| # | ||||
| # Since 1.5 | ||||
| ## | ||||
| { 'type': 'CommandLineParameterInfo', | ||||
|   'data': { 'name': 'str', | ||||
|             'type': 'CommandLineParameterType', | ||||
|             '*help': 'str' } } | ||||
| 
 | ||||
| ## | ||||
| # @CommandLineOptionInfo: | ||||
| # | ||||
| # Details about a command line option, including its list of parameter details | ||||
| # | ||||
| # @option: option name | ||||
| # | ||||
| # @parameters: an array of @CommandLineParameterInfo | ||||
| # | ||||
| # Since 1.5 | ||||
| ## | ||||
| { 'type': 'CommandLineOptionInfo', | ||||
|   'data': { 'option': 'str', 'parameters': ['CommandLineParameterInfo'] } } | ||||
| 
 | ||||
| ## | ||||
| # @query-command-line-options: | ||||
| # | ||||
| # Query command line option schema. | ||||
| # | ||||
| # @option: #optional option name | ||||
| # | ||||
| # Returns: list of @CommandLineOptionInfo for all options (or for the given | ||||
| #          @option).  Returns an error if the given @option doesn't exist. | ||||
| # | ||||
| # Since 1.5 | ||||
| ## | ||||
| {'command': 'query-command-line-options', 'data': { '*option': 'str' }, | ||||
|  'returns': ['CommandLineOptionInfo'] } | ||||
|  | ||||
| @ -2415,6 +2415,53 @@ EQMP | ||||
|         .mhandler.cmd_new = qmp_marshal_input_query_uuid, | ||||
|     }, | ||||
| 
 | ||||
| SQMP | ||||
| query-command-line-options | ||||
| -------------------------- | ||||
| 
 | ||||
| Show command line option schema. | ||||
| 
 | ||||
| Return a json-array of command line option schema for all options (or for | ||||
| the given option), returning an error if the given option doesn't exist. | ||||
| 
 | ||||
| Each array entry contains the following: | ||||
| 
 | ||||
| - "option": option name (json-string) | ||||
| - "parameters": a json-array describes all parameters of the option: | ||||
|     - "name": parameter name (json-string) | ||||
|     - "type": parameter type (one of 'string', 'boolean', 'number', | ||||
|               or 'size') | ||||
|     - "help": human readable description of the parameter | ||||
|               (json-string, optional) | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| -> { "execute": "query-command-line-options", "arguments": { "option": "option-rom" } } | ||||
| <- { "return": [ | ||||
|         { | ||||
|             "parameters": [ | ||||
|                 { | ||||
|                     "name": "romfile", | ||||
|                     "type": "string" | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "bootindex", | ||||
|                     "type": "number" | ||||
|                 } | ||||
|             ], | ||||
|             "option": "option-rom" | ||||
|         } | ||||
|      ] | ||||
|    } | ||||
| 
 | ||||
| EQMP | ||||
| 
 | ||||
|     { | ||||
|         .name       = "query-command-line-options", | ||||
|         .args_type  = "option:s?", | ||||
|         .mhandler.cmd_new = qmp_marshal_input_query_command_line_options, | ||||
|     }, | ||||
| 
 | ||||
| SQMP | ||||
| query-migrate | ||||
| ------------- | ||||
|  | ||||
| @ -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,72 @@ QemuOptsList *qemu_find_opts(const char *group) | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc) | ||||
| { | ||||
|     CommandLineParameterInfoList *param_list = NULL, *entry; | ||||
|     CommandLineParameterInfo *info; | ||||
|     int i; | ||||
| 
 | ||||
|     for (i = 0; desc[i].name != NULL; i++) { | ||||
|         info = g_malloc0(sizeof(*info)); | ||||
|         info->name = g_strdup(desc[i].name); | ||||
| 
 | ||||
|         switch (desc[i].type) { | ||||
|         case QEMU_OPT_STRING: | ||||
|             info->type = COMMAND_LINE_PARAMETER_TYPE_STRING; | ||||
|             break; | ||||
|         case QEMU_OPT_BOOL: | ||||
|             info->type = COMMAND_LINE_PARAMETER_TYPE_BOOLEAN; | ||||
|             break; | ||||
|         case QEMU_OPT_NUMBER: | ||||
|             info->type = COMMAND_LINE_PARAMETER_TYPE_NUMBER; | ||||
|             break; | ||||
|         case QEMU_OPT_SIZE: | ||||
|             info->type = COMMAND_LINE_PARAMETER_TYPE_SIZE; | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if (desc[i].help) { | ||||
|             info->has_help = true; | ||||
|             info->help = g_strdup(desc[i].help); | ||||
|         } | ||||
| 
 | ||||
|         entry = g_malloc0(sizeof(*entry)); | ||||
|         entry->value = info; | ||||
|         entry->next = param_list; | ||||
|         param_list = entry; | ||||
|     } | ||||
| 
 | ||||
|     return param_list; | ||||
| } | ||||
| 
 | ||||
| CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option, | ||||
|                                                           const char *option, | ||||
|                                                           Error **errp) | ||||
| { | ||||
|     CommandLineOptionInfoList *conf_list = NULL, *entry; | ||||
|     CommandLineOptionInfo *info; | ||||
|     int i; | ||||
| 
 | ||||
|     for (i = 0; vm_config_groups[i] != NULL; i++) { | ||||
|         if (!has_option || !strcmp(option, vm_config_groups[i]->name)) { | ||||
|             info = g_malloc0(sizeof(*info)); | ||||
|             info->option = g_strdup(vm_config_groups[i]->name); | ||||
|             info->parameters = query_option_descs(vm_config_groups[i]->desc); | ||||
|             entry = g_malloc0(sizeof(*entry)); | ||||
|             entry->value = info; | ||||
|             entry->next = conf_list; | ||||
|             conf_list = entry; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (conf_list == NULL) { | ||||
|         error_setg(errp, "invalid option name: %s", option); | ||||
|     } | ||||
| 
 | ||||
|     return conf_list; | ||||
| } | ||||
| 
 | ||||
| QemuOptsList *qemu_find_opts_err(const char *group, Error **errp) | ||||
| { | ||||
|     return find_list(vm_config_groups, group, errp); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Amos Kong
						Amos Kong