qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] qmp-shell: fix pretty printing of JSON respo


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v2] qmp-shell: fix pretty printing of JSON responses
Date: Wed, 24 Feb 2016 11:28:00 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

John Snow <address@hidden> writes:

> On 02/23/2016 05:51 AM, Daniel P. Berrange wrote:
>> Pretty printing of JSON responses is important to be able to understand
>> large responses from query commands in particular. Unfortunately this
>> was broken during the addition of the verbose flag in
>> 
>>   commit 1ceca07e48ead0dd2e41576c81d40e6a91cafefd
>>   Author: John Snow <address@hidden>
>>   Date:   Wed Apr 29 15:14:04 2015 -0400
>> 
>>     scripts: qmp-shell: Add verbose flag
>> 
>> This is because that change turned the python data structure into a
>> formatted JSON string before the pretty print was given it. So we're
>> just pretty printing a string, which is a no-op.
>> 
>
> Mea Culpa.
>
>> The original pretty printer would output python objects.
>> 
>> (QEMU) query-chardev
>> {   u'return': [   {   u'filename': u'vc',
>>                        u'frontend-open': False,
>>                        u'label': u'parallel0'},
>>                    {   u'filename': u'vc',
>>                        u'frontend-open': True,
>>                        u'label': u'serial0'},
>>                    {   u'filename': u'unix:/tmp/qemp,server',
>>                        u'frontend-open': True,
>>                        u'label': u'compat_monitor0'}]}
>> 
>> This fixes the problem by switching to outputting pretty formatted JSON
>> text instead. This has the added benefit that the pretty printed output
>> is now valid JSON text. Due to the way the verbose flag was handled, the
>> pretty printing now applies to the command sent, as well as its response:
>> 
>> (QEMU) query-chardev
>> {
>>     "execute": "query-chardev",
>>     "arguments": {}
>> }
>> {
>>     "return": [
>>         {
>>             "frontend-open": false,
>>             "label": "parallel0",
>>             "filename": "vc"
>>         },
>>         {
>>             "frontend-open": true,
>>             "label": "serial0",
>>             "filename": "vc"
>>         },
>>         {
>>             "frontend-open": true,
>>             "label": "compat_monitor0",
>>             "filename": "unix:/tmp/qmp,server"
>>         }
>>     ]
>> }
>> 
>
> That's good news as far as I am concerned.
>
>> Signed-off-by: Daniel P. Berrange <address@hidden>
>> ---
>>  scripts/qmp/qmp-shell | 23 ++++++++++-------------
>>  1 file changed, 10 insertions(+), 13 deletions(-)
>> 
>> diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
>> index 7a402ed..0373b24 100755
>> --- a/scripts/qmp/qmp-shell
>> +++ b/scripts/qmp/qmp-shell
>> @@ -70,7 +70,6 @@ import json
>>  import ast
>>  import readline
>>  import sys
>> -import pprint
>>  
>>  class QMPCompleter(list):
>>      def complete(self, text, state):
>> @@ -103,11 +102,11 @@ class FuzzyJSON(ast.NodeTransformer):
>>  # TODO: QMPShell's interface is a bit ugly (eg. _fill_completion() and
>>  #       _execute_cmd()). Let's design a better one.
>
> ^ Heh ^
>
>>  class QMPShell(qmp.QEMUMonitorProtocol):
>> -    def __init__(self, address, pp=None):
>> +    def __init__(self, address, pretty=False):
>>          qmp.QEMUMonitorProtocol.__init__(self, self.__get_address(address))
>>          self._greeting = None
>>          self._completer = None
>> -        self._pp = pp
>> +        self._pretty = pretty
>>          self._transmode = False
>>          self._actions = list()
>>  
>> @@ -231,11 +230,11 @@ class QMPShell(qmp.QEMUMonitorProtocol):
>>          return qmpcmd
>>  
>>      def _print(self, qmp):
>> -        jsobj = json.dumps(qmp)
>> -        if self._pp is not None:
>> -            self._pp.pprint(jsobj)
>> -        else:
>> -            print str(jsobj)
>> +        indent = None
>> +        if self._pretty:
>> +            indent = 4
>> +        jsobj = json.dumps(qmp, indent=indent)
>> +        print str(jsobj)
>>  
>>      def _execute_cmd(self, cmdline):
>>          try:
>> @@ -377,7 +376,7 @@ def main():
>>      addr = ''
>>      qemu = None
>>      hmp = False
>> -    pp = None
>> +    pretty = False
>>      verbose = False
>>  
>>      try:
>> @@ -387,9 +386,7 @@ def main():
>>                      fail_cmdline(arg)
>>                  hmp = True
>>              elif arg == "-p":
>> -                if pp is not None:
>> -                    fail_cmdline(arg)
>> -                pp = pprint.PrettyPrinter(indent=4)
>> +                pretty = True
>
> We now accept any number of -p arguments. That's probably fine.

I'd call that a bug fix.

>>              elif arg == "-v":
>>                  verbose = True
>>              else:
>> @@ -398,7 +395,7 @@ def main():
>>                  if hmp:
>>                      qemu = HMPShell(arg)
>>                  else:
>> -                    qemu = QMPShell(arg, pp)
>> +                    qemu = QMPShell(arg, pretty)
>>                  addr = arg
>>  
>>          if qemu is None:
>> 
>
> Reviewed-by: John Snow <address@hidden>

Applied to my qapi-next branch, thanks!



reply via email to

[Prev in Thread] Current Thread [Next in Thread]