On Wed, 12 Feb 2014 11:05:13 +0800 Fam Zheng <f...@redhat.com> wrote:
> As another convinience to allow using commands that expect a dict as > argument, this patch adds support for foo.bar=value syntax, similar to > command line argument style: > > (QEMU) blockdev-add options.driver=file options.id=drive1 > options.filename=... > > Signed-off-by: Fam Zheng <f...@redhat.com> Applied to the qmp branch, thanks. > > --- > v3: Fix error message wording. (Eric) > v2: Fix variable usage and improved error check and report. > > Applies on top of Stefan's patch > > [PATCH] QMP: allow JSON dict arguments in qmp-shell > > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > scripts/qmp/qmp-shell | 20 ++++++++++++++++++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell > index d374b35..e0e848b 100755 > --- a/scripts/qmp/qmp-shell > +++ b/scripts/qmp/qmp-shell > @@ -112,13 +112,29 @@ class QMPShell(qmp.QEMUMonitorProtocol): > value = json.loads(opt[1]) > else: > value = opt[1] > - qmpcmd['arguments'][opt[0]] = value > + optpath = opt[0].split('.') > + parent = qmpcmd['arguments'] > + curpath = [] > + for p in optpath[:-1]: > + curpath.append(p) > + d = parent.get(p, {}) > + if type(d) is not dict: > + raise QMPShellError('Cannot use "%s" as both leaf and > non-leaf key' % '.'.join(curpath)) > + parent[p] = d > + parent = d > + if optpath[-1] in parent: > + if type(parent[optpath[-1]]) is dict: > + raise QMPShellError('Cannot use "%s" as both leaf and > non-leaf key' % '.'.join(curpath)) > + else: > + raise QMPShellError('Cannot set "%s" multiple times' % > opt[0]) > + parent[optpath[-1]] = value > return qmpcmd > > def _execute_cmd(self, cmdline): > try: > qmpcmd = self.__build_cmd(cmdline) > - except: > + except Exception, e: > + print 'Error while parsing command line: %s' % e > print 'command format: <command-name> ', > print '[arg-name1=arg1] ... [arg-nameN=argN]' > return True