diff mbox series

qom: Support JSON in user_creatable_parse_str()

Message ID 20210312131921.421023-1-kwolf@redhat.com (mailing list archive)
State New, archived
Headers show
Series qom: Support JSON in user_creatable_parse_str() | expand

Commit Message

Kevin Wolf March 12, 2021, 1:19 p.m. UTC
Support JSON for --object in all tools and in HMP object_add in the same
way as it is supported in qobject_input_visitor_new_str().

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
Based-on: <20210311144811.313451-1-kwolf@redhat.com>

 qom/object_interfaces.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

Comments

Eric Blake March 12, 2021, 1:59 p.m. UTC | #1
On 3/12/21 7:19 AM, Kevin Wolf wrote:
> Support JSON for --object in all tools and in HMP object_add in the same
> way as it is supported in qobject_input_visitor_new_str().
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> Based-on: <20210311144811.313451-1-kwolf@redhat.com>
> 
>  qom/object_interfaces.c | 32 +++++++++++++++++++++-----------
>  1 file changed, 21 insertions(+), 11 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>
Paolo Bonzini March 12, 2021, 2:47 p.m. UTC | #2
On 12/03/21 14:59, Eric Blake wrote:
> On 3/12/21 7:19 AM, Kevin Wolf wrote:
>> Support JSON for --object in all tools and in HMP object_add in the same
>> way as it is supported in qobject_input_visitor_new_str().
>>
>> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
>> ---
>> Based-on: <20210311144811.313451-1-kwolf@redhat.com>
>>
>>   qom/object_interfaces.c | 32 +++++++++++++++++++++-----------
>>   1 file changed, 21 insertions(+), 11 deletions(-)
>>
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>
> 

Queued, thanks.

Paolo
Markus Armbruster March 12, 2021, 4:01 p.m. UTC | #3
Is this an alternative to Paolo's "[PATCH 0/3] vl: QAPIfy -object", and
if not, how do the two play together?
Kevin Wolf March 12, 2021, 4:32 p.m. UTC | #4
Am 12.03.2021 um 17:01 hat Markus Armbruster geschrieben:
> Is this an alternative to Paolo's "[PATCH 0/3] vl: QAPIfy -object", and
> if not, how do the two play together?

Paolo's patch adds JSON support to the system emulator CLI (using
QemuOpts to stay compatible with the list magic), this patch adds it to
everything else (tools don't have memory-backend, and HMP isn't a stable
interface, so they all use the same keyval-based function modified by
this patch).

Kevin
Markus Armbruster March 13, 2021, 8 a.m. UTC | #5
Recommend

    qom: Support JSON in HMP object_add and tools --object

to put the most interesting bit right in "git-log --oneline".

Kevin Wolf <kwolf@redhat.com> writes:

> Support JSON for --object in all tools and in HMP object_add in the same
> way as it is supported in qobject_input_visitor_new_str().
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> Based-on: <20210311144811.313451-1-kwolf@redhat.com>
>
>  qom/object_interfaces.c | 32 +++++++++++++++++++++-----------
>  1 file changed, 21 insertions(+), 11 deletions(-)
>
> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
> index 62d7db7629..f5ea84b6c4 100644
> --- a/qom/object_interfaces.c
> +++ b/qom/object_interfaces.c
> @@ -295,25 +295,35 @@ static void user_creatable_print_help_from_qdict(QDict *args)
>  ObjectOptions *user_creatable_parse_str(const char *optarg, Error **errp)
>  {
>      ERRP_GUARD();
> -    QDict *args;
> +    QObject *obj;
>      bool help;
>      Visitor *v;
>      ObjectOptions *options;
>  
> -    args = keyval_parse(optarg, "qom-type", &help, errp);
> -    if (*errp) {
> -        return NULL;
> -    }
> -    if (help) {
> -        user_creatable_print_help_from_qdict(args);
> -        qobject_unref(args);
> -        return NULL;
> +    if (optarg[0] == '{') {
> +        obj = qobject_from_json(optarg, errp);
> +        if (!obj) {
> +            return NULL;
> +        }
> +        v = qobject_input_visitor_new(obj);
> +    } else {
> +        QDict *args = keyval_parse(optarg, "qom-type", &help, errp);
> +        if (*errp) {
> +            return NULL;
> +        }
> +        if (help) {
> +            user_creatable_print_help_from_qdict(args);
> +            qobject_unref(args);
> +            return NULL;
> +        }
> +
> +        obj = QOBJECT(args);
> +        v = qobject_input_visitor_new_keyval(obj);
>      }
>  
> -    v = qobject_input_visitor_new_keyval(QOBJECT(args));
>      visit_type_ObjectOptions(v, NULL, &options, errp);
>      visit_free(v);
> -    qobject_unref(args);
> +    qobject_unref(obj);
>  
>      return options;
>  }

Best viewed with whitespace change ignored:

   diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
   index 2e50698075..93b8878127 100644
   --- a/qom/object_interfaces.c
   +++ b/qom/object_interfaces.c
   @@ -242,12 +242,19 @@ static void user_creatable_print_help_from_qdict(QDict *args)
    ObjectOptions *user_creatable_parse_str(const char *optarg, Error **errp)
    {
        ERRP_GUARD();
   -    QDict *args;
   +    QObject *obj;
        bool help;
        Visitor *v;
        ObjectOptions *options;

   -    args = keyval_parse(optarg, "qom-type", &help, errp);
   +    if (optarg[0] == '{') {
   +        obj = qobject_from_json(optarg, errp);
   +        if (!obj) {
   +            return NULL;
   +        }
   +        v = qobject_input_visitor_new(obj);
   +    } else {
   +        QDict *args = keyval_parse(optarg, "qom-type", &help, errp);
            if (*errp) {
                return NULL;
            }
   @@ -257,10 +264,13 @@ ObjectOptions *user_creatable_parse_str(const char *optarg, Error **errp)
                return NULL;
            }

   -    v = qobject_input_visitor_new_keyval(QOBJECT(args));
   +        obj = QOBJECT(args);
   +        v = qobject_input_visitor_new_keyval(obj);
   +    }
   +
        visit_type_ObjectOptions(v, NULL, &options, errp);
        visit_free(v);
   -    qobject_unref(args);
   +    qobject_unref(obj);

        return options;
    }

Reviewed-by: Markus Armbruster <armbru@redhat.com>
Kevin Wolf March 15, 2021, 11:56 a.m. UTC | #6
Am 13.03.2021 um 09:00 hat Markus Armbruster geschrieben:
> Recommend
> 
>     qom: Support JSON in HMP object_add and tools --object
> 
> to put the most interesting bit right in "git-log --oneline".

Makes sense. I've updated my patch locally, but Paolo has already queued
it. Paolo, can you update the subject line accordingly?

Kevin
Paolo Bonzini March 15, 2021, noon UTC | #7
On 15/03/21 12:56, Kevin Wolf wrote:
> Am 13.03.2021 um 09:00 hat Markus Armbruster geschrieben:
>> Recommend
>>
>>      qom: Support JSON in HMP object_add and tools --object
>>
>> to put the most interesting bit right in "git-log --oneline".
> 
> Makes sense. I've updated my patch locally, but Paolo has already queued
> it. Paolo, can you update the subject line accordingly?

Ok, done.

Paolo
diff mbox series

Patch

diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 62d7db7629..f5ea84b6c4 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -295,25 +295,35 @@  static void user_creatable_print_help_from_qdict(QDict *args)
 ObjectOptions *user_creatable_parse_str(const char *optarg, Error **errp)
 {
     ERRP_GUARD();
-    QDict *args;
+    QObject *obj;
     bool help;
     Visitor *v;
     ObjectOptions *options;
 
-    args = keyval_parse(optarg, "qom-type", &help, errp);
-    if (*errp) {
-        return NULL;
-    }
-    if (help) {
-        user_creatable_print_help_from_qdict(args);
-        qobject_unref(args);
-        return NULL;
+    if (optarg[0] == '{') {
+        obj = qobject_from_json(optarg, errp);
+        if (!obj) {
+            return NULL;
+        }
+        v = qobject_input_visitor_new(obj);
+    } else {
+        QDict *args = keyval_parse(optarg, "qom-type", &help, errp);
+        if (*errp) {
+            return NULL;
+        }
+        if (help) {
+            user_creatable_print_help_from_qdict(args);
+            qobject_unref(args);
+            return NULL;
+        }
+
+        obj = QOBJECT(args);
+        v = qobject_input_visitor_new_keyval(obj);
     }
 
-    v = qobject_input_visitor_new_keyval(QOBJECT(args));
     visit_type_ObjectOptions(v, NULL, &options, errp);
     visit_free(v);
-    qobject_unref(args);
+    qobject_unref(obj);
 
     return options;
 }