Commit 5eeee3fa authored by Anthony Liguori's avatar Anthony Liguori

qom: add new command to search for types

This adds a command that allows searching for types that implement a property.
This allows you to do things like search for all available PCIDevices.  In the
future, we'll also have a standard interface for things with a BlockDriverState
property that a PCIDevice could implement.

This will enable search queries like, "any type that implements the BlockDevice
interface" which would allow management tools to present available block devices
without having to hard code device names.  Since an object can implement
multiple interfaces, one device could act both as a BlockDevice and a
NetworkDevice.
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 6acbe4c6
...@@ -1549,3 +1549,36 @@ ...@@ -1549,3 +1549,36 @@
# Since: 1.1 # Since: 1.1
## ##
{ 'command': 'block_job_cancel', 'data': { 'device': 'str' } } { 'command': 'block_job_cancel', 'data': { 'device': 'str' } }
##
# @ObjectTypeInfo:
#
# This structure describes a search result from @qom-list-types
#
# @name: the type name found in the search
#
# Since: 1.1
#
# Notes: This command is experimental and may change syntax in future releases.
##
{ 'type': 'ObjectTypeInfo',
'data': { 'name': 'str' } }
##
# @qom-list-types:
#
# This command will return a list of types given search parameters
#
# @implements: if specified, only return types that implement this type name
#
# @abstract: if true, include abstract types in the results
#
# Returns: a list of @ObjectTypeInfo or an empty list if no results are found
#
# Since: 1.1
#
# Notes: This command is experimental and may change syntax in future releases.
##
{ 'command': 'qom-list-types',
'data': { '*implements': 'str', '*abstract': 'bool' },
'returns': [ 'ObjectTypeInfo' ] }
...@@ -161,7 +161,7 @@ static const QErrorStringTable qerror_table[] = { ...@@ -161,7 +161,7 @@ static const QErrorStringTable qerror_table[] = {
}, },
{ {
.error_fmt = QERR_INVALID_PARAMETER_TYPE, .error_fmt = QERR_INVALID_PARAMETER_TYPE,
.desc = "Invalid parameter type, expected: %(expected)", .desc = "Invalid parameter type for '%(name)', expected: %(expected)",
}, },
{ {
.error_fmt = QERR_INVALID_PARAMETER_VALUE, .error_fmt = QERR_INVALID_PARAMETER_VALUE,
......
...@@ -2042,3 +2042,8 @@ EQMP ...@@ -2042,3 +2042,8 @@ EQMP
.args_type = "password:s", .args_type = "password:s",
.mhandler.cmd_new = qmp_marshal_input_change_vnc_password, .mhandler.cmd_new = qmp_marshal_input_change_vnc_password,
}, },
{
.name = "qom-list-types",
.args_type = "implements:s?,abstract:b?",
.mhandler.cmd_new = qmp_marshal_input_qom_list_types,
},
...@@ -395,3 +395,30 @@ void qmp_change(const char *device, const char *target, ...@@ -395,3 +395,30 @@ void qmp_change(const char *device, const char *target,
qmp_change_blockdev(device, target, has_arg, arg, err); qmp_change_blockdev(device, target, has_arg, arg, err);
} }
} }
static void qom_list_types_tramp(ObjectClass *klass, void *data)
{
ObjectTypeInfoList *e, **pret = data;
ObjectTypeInfo *info;
info = g_malloc0(sizeof(*info));
info->name = g_strdup(object_class_get_name(klass));
e = g_malloc0(sizeof(*e));
e->value = info;
e->next = *pret;
*pret = e;
}
ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
const char *implements,
bool has_abstract,
bool abstract,
Error **errp)
{
ObjectTypeInfoList *ret = NULL;
object_class_foreach(qom_list_types_tramp, implements, abstract, &ret);
return ret;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment