qapi/qom.json | 10 +++++++++- qom/qom-hmp-cmds.c | 4 ++-- qom/qom-qmp-cmds.c | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-)
This allows returning a tree of all object properties under a given
path, in a way similar to scripts/qmp/qom-tree.
Signed-off-by: Alberto Garcia <berto@igalia.com>
---
qapi/qom.json | 10 +++++++++-
qom/qom-hmp-cmds.c | 4 ++--
qom/qom-qmp-cmds.c | 22 +++++++++++++++++++++-
3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/qapi/qom.json b/qapi/qom.json
index c53ef978ff..dfe3a20725 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -33,6 +33,10 @@
# qdev device type name. Link properties form the device model
# graph.
#
+# @children: if specified, a list of @ObjectPropertyInfo describing
+# the child properties. This requires that this property's @type
+# is of the form 'child<subtype>' (since 9.0)
+#
# @description: if specified, the description of the property.
#
# @default-value: the default value, if any (since 5.0)
@@ -42,6 +46,7 @@
{ 'struct': 'ObjectPropertyInfo',
'data': { 'name': 'str',
'type': 'str',
+ '*children' : [ 'ObjectPropertyInfo' ],
'*description': 'str',
'*default-value': 'any' } }
@@ -54,6 +59,9 @@
# @path: the path within the object model. See @qom-get for a
# description of this parameter.
#
+# @recurse-children: if true, include the child properties recursively
+# in the return value (default: false) (since 9.0)
+#
# Returns: a list of @ObjectPropertyInfo that describe the properties
# of the object.
#
@@ -69,7 +77,7 @@
# { "name": "mon0", "type": "child<chardev-stdio>" } ] }
##
{ 'command': 'qom-list',
- 'data': { 'path': 'str' },
+ 'data': { 'path': 'str', '*recurse-children': 'bool' },
'returns': [ 'ObjectPropertyInfo' ],
'allow-preconfig': true }
diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
index 6e3a2175a4..7592184fc3 100644
--- a/qom/qom-hmp-cmds.c
+++ b/qom/qom-hmp-cmds.c
@@ -28,7 +28,7 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict)
return;
}
- list = qmp_qom_list(path, &err);
+ list = qmp_qom_list(path, false, false, &err);
if (err == NULL) {
ObjectPropertyInfoList *start = list;
while (list != NULL) {
@@ -206,7 +206,7 @@ void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
len = strlen(str);
readline_set_completion_index(rs, len);
- start = list = qmp_qom_list("/objects", NULL);
+ start = list = qmp_qom_list("/objects", false, false, NULL);
while (list) {
ObjectPropertyInfo *info = list->value;
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index 7c087299de..5c9cb8a09c 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -28,10 +28,15 @@
#include "qom/object_interfaces.h"
#include "qom/qom-qobject.h"
-ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
+ObjectPropertyInfoList *qmp_qom_list(const char *path,
+ bool has_recurse_children,
+ bool recurse_children,
+ Error **errp)
{
+ ERRP_GUARD();
Object *obj;
bool ambiguous = false;
+ bool recurse = has_recurse_children && recurse_children;
ObjectPropertyInfoList *props = NULL;
ObjectProperty *prop;
ObjectPropertyIterator iter;
@@ -55,8 +60,23 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
value->name = g_strdup(prop->name);
value->type = g_strdup(prop->type);
+
+ if (recurse && g_str_has_prefix(prop->type, "child<")) {
+ ObjectPropertyInfoList *children;
+ g_autofree char *childpath = g_strdup_printf("%s/%s", path,
+ prop->name);
+ children = qmp_qom_list(childpath, true, true, errp);
+ if (*errp) {
+ qapi_free_ObjectPropertyInfoList(props);
+ props = NULL;
+ goto out;
+ }
+ value->has_children = true;
+ value->children = children;
+ }
}
+out:
return props;
}
--
2.39.2
Alberto Garcia <berto@igalia.com> writes: > This allows returning a tree of all object properties under a given > path, in a way similar to scripts/qmp/qom-tree. Use case? We already have that script, and also HMP info qom-tree. > Signed-off-by: Alberto Garcia <berto@igalia.com> > --- > qapi/qom.json | 10 +++++++++- > qom/qom-hmp-cmds.c | 4 ++-- > qom/qom-qmp-cmds.c | 22 +++++++++++++++++++++- > 3 files changed, 32 insertions(+), 4 deletions(-) > > diff --git a/qapi/qom.json b/qapi/qom.json > index c53ef978ff..dfe3a20725 100644 > --- a/qapi/qom.json > +++ b/qapi/qom.json > @@ -33,6 +33,10 @@ > # qdev device type name. Link properties form the device model > # graph. > # > +# @children: if specified, a list of @ObjectPropertyInfo describing Suggest "if present". > +# the child properties. This requires that this property's @type > +# is of the form 'child<subtype>' (since 9.0) But when will it be present? In qom-list-properties's return value: never. In qom-list's return value: if and only if passed recurse-children=true. Awkward to document. > +# > # @description: if specified, the description of the property. > # > # @default-value: the default value, if any (since 5.0) > @@ -42,6 +46,7 @@ > { 'struct': 'ObjectPropertyInfo', > 'data': { 'name': 'str', > 'type': 'str', > + '*children' : [ 'ObjectPropertyInfo' ], > '*description': 'str', > '*default-value': 'any' } } > > @@ -54,6 +59,9 @@ > # @path: the path within the object model. See @qom-get for a > # description of this parameter. > # > +# @recurse-children: if true, include the child properties recursively > +# in the return value (default: false) (since 9.0) Insufficiently clear on the connection to ObjectPropertyInfo member @children, I'm afraid. > +# > # Returns: a list of @ObjectPropertyInfo that describe the properties > # of the object. > # > @@ -69,7 +77,7 @@ > # { "name": "mon0", "type": "child<chardev-stdio>" } ] } > ## > { 'command': 'qom-list', > - 'data': { 'path': 'str' }, > + 'data': { 'path': 'str', '*recurse-children': 'bool' }, > 'returns': [ 'ObjectPropertyInfo' ], > 'allow-preconfig': true } > [...]
On Fri 22 Dec 2023 11:31:12 AM +01, Markus Armbruster wrote: >> This allows returning a tree of all object properties under a given >> path, in a way similar to scripts/qmp/qom-tree. > > Use case? We already have that script, and also HMP info qom-tree. The main use case is convenience. Management tools need to manually check that the type starts with "child<" and recursively make a new QMP call. That's what e.g libvirt does: https://gitlab.com/libvirt/libvirt/-/blob/v9.10.0/src/qemu/qemu_monitor_json.c?ref_type=tags#L7367 Parsing the output of HMP info qom-tree is not an option in that case. Berto
© 2016 - 2024 Red Hat, Inc.