qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>,
	Adam Litke <agl@us.ibm.com>,
	qemu-devel@nongnu.org, Avi Kivity <avi@redhat.com>
Subject: Re: [Qemu-devel] Re: [PATCH 00/15] QAPI Round 1 (core code generator) (v2)
Date: Wed, 16 Mar 2011 13:32:50 -0500	[thread overview]
Message-ID: <4D810252.9080300@codemonkey.ws> (raw)
In-Reply-To: <20110316150918.718b425a@doriath>

On 03/16/2011 01:09 PM, Luiz Capitulino wrote:
>> This is a shift in our direction but the good news is that the practical
>> impact is small.  But I don't think there's a lot of value of focusing
>> on non-C consumers because any non-C consumer is capable of consuming a
>> good C interface (but the inverse is not true).
> I disagree. To access a C interface from a high-level language you usually
> have to write bindings. Using something like QMP instead of writing bindings
> is a lot easier.

I think you're confusing multiple points.

A C friendly interface has the following properties:

1) arguments have a well defined order
2) variant arrays are not used
3) variant types are not used
4) structures only have items added to the end of them with some sort of 
way to determine at run time whether the argument is present
5) functions don't increase their number of arguments

An API that follows these rules is a Good Library interface in C.  It 
also happens to be a Good Library interface in Python and just about 
every other language.

You can design interfaces in Python that rely on variant arrays or 
types, or that add keyword values to arguments, but the absence of those 
does not make a Bad Library in Python.

This has nothing to do with the need for bindings.  The need for 
bindings is entirely based on whether the RPC being used is 
self-describing.  JSON is.

That said, I think we made a critical mistake in QMP that practically 
means that we need bindings for QMP.  There is no argument ordering.  So 
I can write a Python class that does:

import qmp

qmp.eject_device(device='ide0-hd0')

But I cannot write a library today that does:

qmp.eject_device('ide0-hd0')

Without using a library that has knowledge of the QMP schema.  This is 
somewhat unfortunate and I've been thinking about adding another code 
generation mode in qmp-gen.py to generate wrappers that would enable the 
more natural usage in Python.

> Also, what's the problem with C consumers using QMP? Libvirt is C, and it
> does it just fine.

I was going to cut and paste libvirt's code that handles query-pci to 
show you how complex it is to use vs. just using libqmp but it turns out 
libvirt doesn't implement query-pci in QMP mode and falls back to the 
human monitor.  I think that might be as good of a way to show my point 
though :-)

>> But the same sort of compatibility considerations apply to using QMP
>> within QEMU.  If you add a new field to a function call, we need to
>> modify any internal usage of the API.
> What's the problem of doing this?

If we have a bunch of code in QEMU that relies on doing

qmp_set_vnc_password(password, &err);

And then we add a new parameter to set_vnc_password(), we now need to 
touch ever place we call this.

Good external interfaces also happen to be good internal interfaces and 
encourage better modularity within QEMU itself.  It also means that for 
subsystems that we can convert to be largely implemented in terms of 
QMP, we have the option to move them into an external process which is 
good from a security PoV.

>> If we add a field to a structure,
>> as long as we use feature flags (we do), only the places that care to
>> set that field need to worry about it.
> Why do we need this in an internal interface?

It's about eating our own dog food.  It helps us ensure that we're 
really providing high quality external interfaces.

Regards,

Anthony Liguori

  reply	other threads:[~2011-03-16 18:33 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-11 23:05 [Qemu-devel] [PATCH 00/15] QAPI Round 1 (core code generator) (v2) Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 01/15] qapi: add code generator for qmp-types (v2) Anthony Liguori
2011-03-11 23:12   ` [Qemu-devel] " Anthony Liguori
2011-03-12 11:29   ` [Qemu-devel] " Blue Swirl
2011-03-12 15:00     ` Anthony Liguori
2011-03-18 14:18       ` Luiz Capitulino
2011-03-18 14:14   ` [Qemu-devel] " Luiz Capitulino
2011-03-11 23:05 ` [Qemu-devel] [PATCH 02/15] qapi: add code generator for type marshallers Anthony Liguori
2011-03-18 15:13   ` [Qemu-devel] " Luiz Capitulino
2011-03-11 23:05 ` [Qemu-devel] [PATCH 03/15] qapi: add core QMP server support (v2) Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 04/15] qapi: add signal support to core QMP server Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 05/15] qapi: add QAPI module type Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 06/15] qapi: add code generators for QMP command marshaling Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 07/15] qapi: add query-version QMP command Anthony Liguori
2011-03-12 11:19   ` Blue Swirl
2011-03-12 15:06     ` Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 08/15] qapi: add new QMP server that uses CharDriverState (v2) Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 09/15] vl: add a new -qmp2 option to expose experimental QMP server Anthony Liguori
2011-03-11 23:14   ` [Qemu-devel] " Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 10/15] qapi: add QMP quit command Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 11/15] qapi: add QMP qmp_capabilities command Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 12/15] qapi: add QMP put-event command Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 13/15] qapi: add code generator for libqmp (v2) Anthony Liguori
2011-03-12 11:10   ` Blue Swirl
2011-03-12 14:53     ` Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 14/15] qapi: add test-libqmp Anthony Liguori
2011-03-12 11:23   ` Blue Swirl
2011-03-12 14:59     ` Anthony Liguori
2011-03-11 23:05 ` [Qemu-devel] [PATCH 15/15] qapi: generate HTML report for test-libqmp Anthony Liguori
2011-03-16 14:34 ` [Qemu-devel] Re: [PATCH 00/15] QAPI Round 1 (core code generator) (v2) Luiz Capitulino
2011-03-16 14:49   ` Paolo Bonzini
2011-03-16 15:00     ` Luiz Capitulino
2011-03-16 16:06       ` Anthony Liguori
2011-03-16 16:03     ` Anthony Liguori
2011-03-16 16:31       ` Paolo Bonzini
2011-03-16 18:06         ` Anthony Liguori
2011-03-16 15:59   ` Anthony Liguori
2011-03-16 18:09     ` Luiz Capitulino
2011-03-16 18:32       ` Anthony Liguori [this message]
2011-03-16 19:27         ` Luiz Capitulino
2011-03-16 20:00           ` Anthony Liguori
2011-03-18 14:10             ` Luiz Capitulino
2011-03-18 14:22               ` Anthony Liguori
2011-03-17 12:21     ` Kevin Wolf
2011-03-17 12:46       ` Anthony Liguori
2011-03-17 13:15         ` Kevin Wolf
2011-03-17 13:28           ` Anthony Liguori
2011-03-17 14:04             ` Kevin Wolf
2011-03-17 15:49               ` Anthony Liguori

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=4D810252.9080300@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=agl@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=avi@redhat.com \
    --cc=lcapitulino@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).