From: "Daniel P. Berrangé" <berrange@redhat.com>
To: John Snow <jsnow@redhat.com>
Cc: Peter Krempa <pkrempa@redhat.com>,
libvir-list@redhat.com, Markus Armbruster <armbru@redhat.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [libvirt PATCH] tools: add virt-qmp-proxy for proxying QMP clients to libvirt QEMU guests
Date: Fri, 27 May 2022 17:38:57 +0100 [thread overview]
Message-ID: <YpD+oSQ1G0NceUDR@redhat.com> (raw)
In-Reply-To: <CAFn=p-amy1sodeChaQvpVLwe_-L7pDAa4C9-JywdCu37VEWGBw@mail.gmail.com>
On Fri, May 27, 2022 at 12:07:55PM -0400, John Snow wrote:
> On Fri, May 27, 2022, 7:32 AM Daniel P. Berrangé <berrange@redhat.com>
> wrote:
>
> > On Fri, May 27, 2022 at 12:20:39PM +0200, Peter Krempa wrote:
> > > On Fri, May 27, 2022 at 10:47:58 +0100, Daniel P. Berrangé wrote:
> > > > Libvirt provides QMP passthrough APIs for the QEMU driver and these are
> > > > exposed in virsh. It is not especially pleasant, however, using the raw
> > > > QMP JSON syntax. QEMU has a tool 'qmp-shell' which can speak QMP and
> > > > exposes a human friendly interactive shell. It is not possible to use
> > > > this with libvirt managed guest, however, since only one client can
> > > > attach to he QMP socket at any point in time.
> > > >
> > > > The virt-qmp-proxy tool aims to solve this problem. It opens a UNIX
> > > > socket and listens for incoming client connections, speaking QMP on
> > > > the connected socket. It will forward any QMP commands received onto
> > > > the running libvirt QEMU guest, and forward any replies back to the
> > > > QMP client.
> > > >
> > > > $ virsh start demo
> > > > $ virt-qmp-proxy demo demo.qmp &
> > > > $ qmp-shell demo.qmp
> > > > Welcome to the QMP low-level shell!
> > > > Connected to QEMU 6.2.0
> > > >
> > > > (QEMU) query-kvm
> > > > {
> > > > "return": {
> > > > "enabled": true,
> > > > "present": true
> > > > }
> > > > }
> > > >
> > > > Note this tool of course has the same risks as the raw libvirt
> > > > QMP passthrough. It is safe to run query commands to fetch information
> > > > but commands which change the QEMU state risk disrupting libvirt's
> > > > management of QEMU, potentially resulting in data loss/corruption in
> > > > the worst case.
> > > >
> > > > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > > > ---
> > > >
> > > > CC'ing QEMU since this is likely of interest to maintainers and users
> > > > who work with QEMU and libvirt
> > > >
> > > > Note this impl is fairly crude in that it assumes it is receiving
> > > > the QMP commands linewise one at a time. None the less it is good
> > > > enough to work with qmp-shell already, so I figured it was worth
> > > > exposing to the world. It also lacks support for forwarding events
> > > > back to the QMP client.
> > >
> > > I originally wanted to teach the qemu tools to work with libvirt
> > > directly similarly how 'scripts/render_block_graph.py' from the qemu
> > > tree already does but I guess this is also an option.
> >
> > Yes, I do wonder about whether with John's new QMP python APIs,
> > it would be possible to plug in a livirt transport instead of
> > the socket transport. I've not spent enough time looking at the
> > Python QMP code to know if that's viable or not though.
> >
>
> I can look into it. It looks like render_block_graph works by actually
> executing a subprocess. Is there a chance of getting anything socket-like
> or stream-like out of libvirt to work with instead?
>
> As long as I can get some kind of stream going it should be easily possible
> to just replace the fd(s) the qmp lib uses and talk to libvirt instead.
Afraid not, any interface that plugs into libvirt would need to be
much higher level - send command and receive events - to map into
the libvirt APIs.
To get something stream oriented requires the proxy that I've proposd
here instead.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2022-05-27 16:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-27 9:47 [libvirt PATCH] tools: add virt-qmp-proxy for proxying QMP clients to libvirt QEMU guests Daniel P. Berrangé
2022-05-27 10:20 ` Peter Krempa
2022-05-27 10:35 ` Claudio Fontana
2022-05-27 10:48 ` Peter Krempa
2022-05-27 11:30 ` Daniel P. Berrangé
2022-05-27 11:32 ` Daniel P. Berrangé
2022-05-27 16:07 ` John Snow
2022-05-27 16:38 ` Daniel P. Berrangé [this message]
2022-05-27 14:14 ` Peter Krempa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YpD+oSQ1G0NceUDR@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=jsnow@redhat.com \
--cc=libvir-list@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).