[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] qmp: add test tool for QMP
From: |
Luiz Capitulino |
Subject: |
Re: [Qemu-devel] [PATCH] qmp: add test tool for QMP |
Date: |
Mon, 7 Nov 2011 14:08:01 -0200 |
On Mon, 7 Nov 2011 09:11:15 -0600
Anthony Liguori <address@hidden> wrote:
> I wrote this quickly to aid in testing. It's similar to qmp-shell with a few
> important differences:
>
> 1) It is not interactive. That makes it useful for scripting.
>
> 2) qmp-shell:
>
> (QEMU) set_password protocol=vnc password=foo
>
> 3) qmp:
>
> $ qmp set_password --protocol=vnc --password=foo
>
> 4) Extensible, git-style interface. If an invalid command name is passed, it
> will try to exec qmp-$1.
>
> 5) It attempts to pretty print the JSON responses in a shell friendly format
> such that tools can work with the output.
>
> Hope others will also find it useful.
>
> Signed-off-by: Anthony Liguori <address@hidden>
Acked-by: Luiz Capitulino <address@hidden>
> ---
> QMP/qmp | 120
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 120 insertions(+), 0 deletions(-)
> create mode 100755 QMP/qmp
>
> diff --git a/QMP/qmp b/QMP/qmp
> new file mode 100755
> index 0000000..7b2a3c7
> --- /dev/null
> +++ b/QMP/qmp
> @@ -0,0 +1,120 @@
> +#!/usr/bin/python
> +#
> +# QMP command line tool
> +#
> +# Copyright IBM, Corp. 2011
> +#
> +# Authors:
> +# Anthony Liguori <address@hidden>
> +#
> +# This work is licensed under the terms of the GNU GPLv2 or later.
> +# See the COPYING file in the top-level directory.
> +
> +import sys, os
> +from qmp import QEMUMonitorProtocol
> +
> +def print_response(rsp, prefix=[]):
> + if type(rsp) == list:
> + i = 0
> + for item in rsp:
> + if prefix == []:
> + prefix = ['item']
> + print_response(item, prefix[:-1] + ['%s[%d]' % (prefix[-1], i)])
> + i += 1
> + elif type(rsp) == dict:
> + for key in rsp.keys():
> + print_response(rsp[key], prefix + [key])
> + else:
> + if len(prefix):
> + print '%s: %s' % ('.'.join(prefix), rsp)
> + else:
> + print '%s' % (rsp)
> +
> +def main(args):
> + path = None
> +
> + # Use QMP_PATH if it's set
> + if os.environ.has_key('QMP_PATH'):
> + path = os.environ['QMP_PATH']
> +
> + while len(args):
> + arg = args[0]
> +
> + if arg.startswith('--'):
> + arg = arg[2:]
> + if arg.find('=') == -1:
> + value = True
> + else:
> + arg, value = arg.split('=', 1)
> +
> + if arg in ['path']:
> + path = value
> + elif arg in ['help']:
> + os.execlp('man', 'man', 'qmp')
> + else:
> + print 'Unknown argument "%s"' % arg
> +
> + args = args[1:]
> + else:
> + break
> +
> + if not path:
> + print "QMP path isn't set, use --path or set QMP_PATH"
> + return 1
> +
> + command, args = args[0], args[1:]
> +
> + if command in ['help']:
> + os.execlp('man', 'man', 'qmp')
> +
> + srv = QEMUMonitorProtocol(path)
> + srv.connect()
> +
> + def do_command(srv, cmd, **kwds):
> + rsp = srv.cmd(cmd, kwds)
> + if rsp.has_key('error'):
> + raise Exception(rsp['error']['desc'])
> + return rsp['return']
> +
> + commands = map(lambda x: x['name'], do_command(srv, 'query-commands'))
> +
> + srv.close()
> +
> + if command not in commands:
> + fullcmd = 'qmp-%s' % command
> + try:
> + os.environ['QMP_PATH'] = path
> + os.execvp(fullcmd, [fullcmd] + args)
> + except OSError, (errno, msg):
> + if errno == 2:
> + print 'Command "%s" not found.' % (fullcmd)
> + return 1
> + raise
> + return 0
> +
> + srv = QEMUMonitorProtocol(path)
> + srv.connect()
> +
> + arguments = {}
> + for arg in args:
> + if not arg.startswith('--'):
> + print 'Unknown argument "%s"' % arg
> + return 1
> +
> + arg = arg[2:]
> + if arg.find('=') == -1:
> + value = True
> + else:
> + arg, value = arg.split('=', 1)
> +
> + if arg in ['help']:
> + os.execlp('man', 'man', 'qmp-%s' % command)
> + return 1
> +
> + arguments[arg] = value
> +
> + rsp = do_command(srv, command, **arguments)
> + print_response(rsp)
> +
> +if __name__ == '__main__':
> + sys.exit(main(sys.argv[1:]))
Re: [Qemu-devel] [PATCH] qmp: add test tool for QMP, Mark Wu, 2011/11/08