[PATCH] scripts/qmp/qom-set: Allow setting integer value

Jonatan Pålsson posted 1 patch 3 years, 7 months ago
Test docker-quick@centos7 failed
Test docker-mingw@fedora failed
Test checkpatch passed
Test FreeBSD failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20201002201933.250878-1-jonatan.p@gmail.com
There is a newer version of this series
scripts/qmp/qom-set | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
[PATCH] scripts/qmp/qom-set: Allow setting integer value
Posted by Jonatan Pålsson 3 years, 7 months ago
If the value appears to be an integer, parse it as such.

This allows the following:

    qmp/qom-set -s ~/qmp.sock sensor.temperature 20000

.. where sensor is a tmp105 device, and temperature is an integer
property.

Signed-off-by: Jonatan Pålsson <jonatan.p@gmail.com>
---
 scripts/qmp/qom-set | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/qmp/qom-set b/scripts/qmp/qom-set
index 240a78187f..61920680eb 100755
--- a/scripts/qmp/qom-set
+++ b/scripts/qmp/qom-set
@@ -56,7 +56,10 @@ if len(args) > 1:
         path, prop = args[0].rsplit('.', 1)
     except:
         usage_error("invalid format for path/property/value")
-    value = args[1]
+    try:
+        value = int(args[1])
+    except:
+        value = args[1]
 else:
     usage_error("not enough arguments")
 
-- 
2.26.1


Re: [PATCH] scripts/qmp/qom-set: Allow setting integer value
Posted by John Snow 3 years, 7 months ago
On 10/2/20 4:19 PM, Jonatan Pålsson wrote:
> If the value appears to be an integer, parse it as such.
> 
> This allows the following:
> 
>      qmp/qom-set -s ~/qmp.sock sensor.temperature 20000
> 
> .. where sensor is a tmp105 device, and temperature is an integer
> property.
> 
> Signed-off-by: Jonatan Pålsson <jonatan.p@gmail.com>
> ---
>   scripts/qmp/qom-set | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/scripts/qmp/qom-set b/scripts/qmp/qom-set
> index 240a78187f..61920680eb 100755
> --- a/scripts/qmp/qom-set
> +++ b/scripts/qmp/qom-set
> @@ -56,7 +56,10 @@ if len(args) > 1:
>           path, prop = args[0].rsplit('.', 1)
>       except:
>           usage_error("invalid format for path/property/value")
> -    value = args[1]
> +    try:
> +        value = int(args[1])
> +    except:
> +        value = args[1]

Please catch the ValueError explicitly.

>   else:
>       usage_error("not enough arguments")
>   
> 

What happens when you don't convert it to int specifically? Does 
something break? My understanding was that QOM received everything as a 
string anyway, and does its own parsing.


Re: [PATCH] scripts/qmp/qom-set: Allow setting integer value
Posted by Jonatan Palsson 3 years, 7 months ago
On Fri, Oct 2, 2020 at 10:29 PM John Snow <jsnow@redhat.com> wrote:
>
> On 10/2/20 4:19 PM, Jonatan Pålsson wrote:
> > If the value appears to be an integer, parse it as such.
> >
> > This allows the following:
> >
> >      qmp/qom-set -s ~/qmp.sock sensor.temperature 20000
> >
> > .. where sensor is a tmp105 device, and temperature is an integer
> > property.
> >
> > Signed-off-by: Jonatan Pålsson <jonatan.p@gmail.com>
> > ---
> >   scripts/qmp/qom-set | 5 ++++-
> >   1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/scripts/qmp/qom-set b/scripts/qmp/qom-set
> > index 240a78187f..61920680eb 100755
> > --- a/scripts/qmp/qom-set
> > +++ b/scripts/qmp/qom-set
> > @@ -56,7 +56,10 @@ if len(args) > 1:
> >           path, prop = args[0].rsplit('.', 1)
> >       except:
> >           usage_error("invalid format for path/property/value")
> > -    value = args[1]
> > +    try:
> > +        value = int(args[1])
> > +    except:
> > +        value = args[1]
>
> Please catch the ValueError explicitly.

Sure, I'll send a v2.

>
> >   else:
> >       usage_error("not enough arguments")
> >
> >
>
> What happens when you don't convert it to int specifically? Does
> something break? My understanding was that QOM received everything as a
> string anyway, and does its own parsing.

With the current implementation, I see this:

scripts/qmp/qom-set -s ~/qmp.sock sensor.temperature 20000
Traceback (most recent call last):
  File "scripts/qmp/qom-set", line 66, in <module>
    print(srv.command('qom-set', path=path, property=prop, value=value))
  File "scripts/qmp/../../python/qemu/qmp.py", line 274, in command
    raise QMPResponseError(ret)
qemu.qmp.QMPResponseError: Invalid parameter type for 'temperature',
expected: integer

Re: [PATCH] scripts/qmp/qom-set: Allow setting integer value
Posted by John Snow 3 years, 7 months ago
On 10/2/20 4:36 PM, Jonatan Palsson wrote:
> On Fri, Oct 2, 2020 at 10:29 PM John Snow <jsnow@redhat.com> wrote:
>>
>> On 10/2/20 4:19 PM, Jonatan Pålsson wrote:
>>> If the value appears to be an integer, parse it as such.
>>>
>>> This allows the following:
>>>
>>>       qmp/qom-set -s ~/qmp.sock sensor.temperature 20000
>>>
>>> .. where sensor is a tmp105 device, and temperature is an integer
>>> property.
>>>
>>> Signed-off-by: Jonatan Pålsson <jonatan.p@gmail.com>
>>> ---
>>>    scripts/qmp/qom-set | 5 ++++-
>>>    1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/scripts/qmp/qom-set b/scripts/qmp/qom-set
>>> index 240a78187f..61920680eb 100755
>>> --- a/scripts/qmp/qom-set
>>> +++ b/scripts/qmp/qom-set
>>> @@ -56,7 +56,10 @@ if len(args) > 1:
>>>            path, prop = args[0].rsplit('.', 1)
>>>        except:
>>>            usage_error("invalid format for path/property/value")
>>> -    value = args[1]
>>> +    try:
>>> +        value = int(args[1])
>>> +    except:
>>> +        value = args[1]
>>
>> Please catch the ValueError explicitly.
> 
> Sure, I'll send a v2.
> 
>>
>>>    else:
>>>        usage_error("not enough arguments")
>>>
>>>
>>
>> What happens when you don't convert it to int specifically? Does
>> something break? My understanding was that QOM received everything as a
>> string anyway, and does its own parsing.
> 
> With the current implementation, I see this:
> 
> scripts/qmp/qom-set -s ~/qmp.sock sensor.temperature 20000
> Traceback (most recent call last):
>    File "scripts/qmp/qom-set", line 66, in <module>
>      print(srv.command('qom-set', path=path, property=prop, value=value))
>    File "scripts/qmp/../../python/qemu/qmp.py", line 274, in command
>      raise QMPResponseError(ret)
> qemu.qmp.QMPResponseError: Invalid parameter type for 'temperature',
> expected: integer
> 

Oh, unfortunate. I hope there aren't any cases where QOM expects a 
string, but can accept a string where a numerical value is otherwise valid.

These are just debugging scripts, so I guess this is probably okay to 
just change and see if anything explodes.

(A more robust solution might actually attempt to query QEMU to get the 
QOM property types and judiciously apply conversions. A problem for 
another day?)

--js