diff mbox series

qmp-shell: Fix example with objects as values

Message ID 20190108123311.24456-1-anthony.perard@citrix.com (mailing list archive)
State New, archived
Headers show
Series qmp-shell: Fix example with objects as values | expand

Commit Message

Anthony PERARD Jan. 8, 2019, 12:33 p.m. UTC
The example shown that is suppose to let a user passes an object/array as
argument doesn't work. The quotes get removed by shlex.split() and then
both JSON parser complains. Fix the example by adding quotes and add
examples with boolean and array.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 scripts/qmp/qmp-shell | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Cleber Rosa Jan. 11, 2019, 2:37 p.m. UTC | #1
On 1/8/19 7:33 AM, Anthony PERARD wrote:
> The example shown that is suppose to let a user passes an object/array as
> argument doesn't work. The quotes get removed by shlex.split() and then
> both JSON parser complains. Fix the example by adding quotes and add
> examples with boolean and array.
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  scripts/qmp/qmp-shell | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
> index 770140772d..9937e3c888 100755
> --- a/scripts/qmp/qmp-shell
> +++ b/scripts/qmp/qmp-shell
> @@ -33,7 +33,11 @@
>  # key=value pairs also support Python or JSON object literal subset notations,
>  # without spaces. Dictionaries/objects {} are supported as are arrays [].
>  #
> -#    example-command arg-name1={'key':'value','obj'={'prop':"value"}}

Yes, I can replicate that with a command such as:

(QEMU) object-add qom-type="rng-random" id="rng1" props={"filename":
"/dev/hwrng"}

That results in:

Error while parsing command line: Expected a key=value pair, got
'/dev/hwrng}'
command format: <command-name>  [arg-name1=arg1] ... [arg-nameN=argN]

> +#  JSON:
> +#    example-command arg-name1='{"key":"value","obj":{"prop":"value"}}'
> +#    example-command arg-name1='{"key":"value","obj":[1,true,"three"]}'

The usage fix is to have the dictionary quoted, indeed:

(QEMU) object-add qom-type="rng-random" id="rng4" props="{'filename':
'/dev/hwrng'}"
{"return": {}}

> +#  free style:
> +#    example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}"
I just find the "free style" confusing... IMO how to be more creative
about escaping is optional, and adds noise to the most common use case.

Thanks,
- Cleber.

>  #
>  # Both JSON and Python formatting should work, including both styles of
>  # string literal quotes. Both paradigms of literal values should work,
>
Eduardo Habkost Jan. 14, 2019, 5:43 p.m. UTC | #2
On Fri, Jan 11, 2019 at 09:37:47AM -0500, Cleber Rosa wrote:
> 
> 
> On 1/8/19 7:33 AM, Anthony PERARD wrote:
> > The example shown that is suppose to let a user passes an object/array as
> > argument doesn't work. The quotes get removed by shlex.split() and then
> > both JSON parser complains. Fix the example by adding quotes and add
> > examples with boolean and array.
> > 
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> > ---
> >  scripts/qmp/qmp-shell | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
> > index 770140772d..9937e3c888 100755
> > --- a/scripts/qmp/qmp-shell
> > +++ b/scripts/qmp/qmp-shell
> > @@ -33,7 +33,11 @@
> >  # key=value pairs also support Python or JSON object literal subset notations,
> >  # without spaces. Dictionaries/objects {} are supported as are arrays [].

The "without spaces" part is outdated.  Now we do support spaces as long as the
argument is quoted.

> >  #
> > -#    example-command arg-name1={'key':'value','obj'={'prop':"value"}}
> 
> Yes, I can replicate that with a command such as:
> 
> (QEMU) object-add qom-type="rng-random" id="rng1" props={"filename":
> "/dev/hwrng"}
> 
> That results in:
> 
> Error while parsing command line: Expected a key=value pair, got
> '/dev/hwrng}'
> command format: <command-name>  [arg-name1=arg1] ... [arg-nameN=argN]

The example has no spaces, and you seem to have a whitespace
before "/dev/rng" above.

The problem here is that this worked before started using shlex.
qmp-shell from QEMU 3.0 worked:

  (QEMU) object-add qom-type=rng-random id="rng1" props={"filename":"/dev/hwrng"}
  {"return": {}}

Now we get this:

  (QEMU) object-add qom-type=rng-random id="rng1" props={"filename":"/dev/hwrng"}
  {"error": {"class": "GenericError", "desc": "Invalid parameter type for 'props', expected: dict"}}

This means we lost the ability to write JSON without any extra
quotes to gain the ability to have arguments with spaces.  How
hard it would be to fix that?


> 
> > +#  JSON:
> > +#    example-command arg-name1='{"key":"value","obj":{"prop":"value"}}'
> > +#    example-command arg-name1='{"key":"value","obj":[1,true,"three"]}'
> 
> The usage fix is to have the dictionary quoted, indeed:
> 
> (QEMU) object-add qom-type="rng-random" id="rng4" props="{'filename':
> '/dev/hwrng'}"
> {"return": {}}
> 
> > +#  free style:
> > +#    example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}"
> I just find the "free style" confusing... IMO how to be more creative
> about escaping is optional, and adds noise to the most common use case.

The example seems to be a simple demonstration of how escaping
works, but maybe we shouldn't encourage people to try weird
tricks with escaping.  Especially if we want to eventually make
unquoted JSON data work again.
diff mbox series

Patch

diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index 770140772d..9937e3c888 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -33,7 +33,11 @@ 
 # key=value pairs also support Python or JSON object literal subset notations,
 # without spaces. Dictionaries/objects {} are supported as are arrays [].
 #
-#    example-command arg-name1={'key':'value','obj'={'prop':"value"}}
+#  JSON:
+#    example-command arg-name1='{"key":"value","obj":{"prop":"value"}}'
+#    example-command arg-name1='{"key":"value","obj":[1,true,"three"]}'
+#  free style:
+#    example-command arg-name1="{'key':'value',\"obj\":[1,True,\"three\"]}"
 #
 # Both JSON and Python formatting should work, including both styles of
 # string literal quotes. Both paradigms of literal values should work,