qapi-code-gen.txt 42.8 KB
Newer Older
1 2
= How to use the QAPI code generator =

3 4 5 6 7 8 9 10
Copyright IBM Corp. 2011
Copyright (C) 2012-2015 Red Hat, Inc.

This work is licensed under the terms of the GNU GPL, version 2 or
later. See the COPYING file in the top-level directory.

== Introduction ==

11
QAPI is a native C API within QEMU which provides management-level
12 13 14 15
functionality to internal and external users. For external
users/processes, this interface is made available by a JSON-based wire
format for the QEMU Monitor Protocol (QMP) for controlling qemu, as
well as the QEMU Guest Agent (QGA) for communicating with the guest.
16 17
The remainder of this document uses "Client JSON Protocol" when
referring to the wire contents of a QMP or QGA connection.
18

19 20 21 22 23
To map Client JSON Protocol interfaces to the native C QAPI
implementations, a JSON-based schema is used to define types and
function signatures, and a set of scripts is used to generate types,
signatures, and marshaling/dispatch code. This document will describe
how the schemas, scripts, and resulting code are used.
24 25 26 27


== QMP/Guest agent schema ==

28 29 30 31 32 33 34 35 36 37 38
A QAPI schema file is designed to be loosely based on JSON
(http://www.ietf.org/rfc/rfc7159.txt) with changes for quoting style
and the use of comments; a QAPI schema file is then parsed by a python
code generation program.  A valid QAPI schema consists of a series of
top-level expressions, with no commas between them.  Where
dictionaries (JSON objects) are used, they are parsed as python
OrderedDicts so that ordering is preserved (for predictable layout of
generated C structs and parameter lists).  Ordering doesn't matter
between top-level expressions or the keys within an expression, but
does matter within dictionary values for 'data' and 'returns' members
of a single expression.  QAPI schema input is written using 'single
39 40 41 42 43 44 45
quotes' instead of JSON's "double quotes" (in contrast, Client JSON
Protocol uses no comments, and while input accepts 'single quotes' as
an extension, output is strict JSON using only "double quotes").  As
in JSON, trailing commas are not permitted in arrays or dictionaries.
Input must be ASCII (although QMP supports full Unicode strings, the
QAPI parser does not).  At present, there is no place where a QAPI
schema requires the use of JSON numbers or null.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Comments are allowed; anything between an unquoted # and the following
newline is ignored.  Although there is not yet a documentation
generator, a form of stylized comments has developed for consistently
documenting details about an expression and when it was added to the
schema.  The documentation is delimited between two lines of ##, then
the first line names the expression, an optional overview is provided,
then individual documentation about each member of 'data' is provided,
and finally, a 'Since: x.y.z' tag lists the release that introduced
the expression.  Optional fields are tagged with the phrase
'#optional', often with their default value; and extensions added
after the expression was first released are also given a '(since
x.y.z)' comment.  For example:

    ##
    # @BlockStats:
    #
    # Statistics of a virtual block device or a block backing device.
    #
    # @device: #optional If the stats are for a virtual block device, the name
    #          corresponding to the virtual block device.
    #
    # @stats:  A @BlockDeviceStats for the device.
    #
    # @parent: #optional This describes the file block device if it has one.
    #
    # @backing: #optional This describes the backing block device if it has one.
    #           (Since 2.0)
    #
    # Since: 0.14.0
    ##
E
Eric Blake 已提交
77
    { 'struct': 'BlockStats',
78 79 80 81 82 83 84 85 86
      'data': {'*device': 'str', 'stats': 'BlockDeviceStats',
               '*parent': 'BlockStats',
               '*backing': 'BlockStats'} }

The schema sets up a series of types, as well as commands and events
that will use those types.  Forward references are allowed: the parser
scans in two passes, where the first pass learns all type names, and
the second validates the schema and generates the code.  This allows
the definition of complex structs that can have mutually recursive
87 88 89 90 91
types, and allows for indefinite nesting of Client JSON Protocol that
satisfies the schema.  A type name should not be defined more than
once.  It is permissible for the schema to contain additional types
not used by any commands or events in the Client JSON Protocol, for
the side effect of generated C code used internally.
92

93
There are seven top-level expressions recognized by the parser:
E
Eric Blake 已提交
94
'include', 'command', 'struct', 'enum', 'union', 'alternate', and
95 96 97 98
'event'.  There are several groups of types: simple types (a number of
built-in types, such as 'int' and 'str'; as well as enumerations),
complex types (structs and two flavors of unions), and alternate types
(a choice between other types).  The 'command' and 'event' expressions
99 100 101 102 103 104 105 106 107 108
can refer to existing types by name, or list an anonymous type as a
dictionary. Listing a type name inside an array refers to a
single-dimension array of that type; multi-dimension arrays are not
directly supported (although an array of a complex struct that
contains an array member is possible).

Types, commands, and events share a common namespace.  Therefore,
generally speaking, type definitions should always use CamelCase for
user-defined type names, while built-in types are lowercase. Type
definitions should not end in 'Kind', as this namespace is used for
109 110
creating implicit C enums for visiting union types, or in 'List', as
this namespace is used for creating array types.  Command names,
111 112 113 114
and field names within a type, should be all lower case with words
separated by a hyphen.  However, some existing older commands and
complex types use underscore; when extending such expressions,
consistency is preferred over blindly avoiding underscore.  Event
115 116 117
names should be ALL_CAPS with words separated by underscore.  Field
names cannot start with 'has-' or 'has_', as this is reserved for
tracking optional fields.
118 119 120

Any name (command, event, type, field, or enum value) beginning with
"x-" is marked experimental, and may be withdrawn or changed
121 122 123 124 125 126 127 128 129 130 131
incompatibly in a future release.  All names must begin with a letter,
and contain only ASCII letters, digits, dash, and underscore.  There
are two exceptions: enum values may start with a digit, and any
extensions added by downstream vendors should start with a prefix
matching "__RFQDN_" (for the reverse-fully-qualified-domain-name of
the vendor), even if the rest of the name uses dash (example:
__com.redhat_drive-mirror).  Names beginning with 'q_' are reserved
for the generator: QMP names that resemble C keywords or other
problematic strings will be munged in C to use this prefix.  For
example, a field named "default" in qapi becomes "q_default" in the
generated C code.
132 133 134 135 136

In the rest of this document, usage lines are given for each
expression type, with literal strings written in lower case and
placeholders written in capitals.  If a literal string includes a
prefix of '*', that key/value pair can be omitted from the expression.
E
Eric Blake 已提交
137
For example, a usage statement that includes '*base':STRUCT-NAME
138
means that an expression has an optional key 'base', which if present
E
Eric Blake 已提交
139
must have a value that forms a struct name.
140 141 142 143


=== Built-in Types ===

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
The following types are predefined, and map to C as follows:

  Schema    C          JSON
  str       char *     any JSON string, UTF-8
  number    double     any JSON number
  int       int64_t    a JSON number without fractional part
                       that fits into the C integer type
  int8      int8_t     likewise
  int16     int16_t    likewise
  int32     int32_t    likewise
  int64     int64_t    likewise
  uint8     uint8_t    likewise
  uint16    uint16_t   likewise
  uint32    uint32_t   likewise
  uint64    uint64_t   likewise
  size      uint64_t   like uint64_t, except StringInputVisitor
                       accepts size suffixes
  bool      bool       JSON true or false
162
  any       QObject *  any JSON value
K
Kevin Wolf 已提交
163

164 165 166

=== Includes ===

167 168
Usage: { 'include': STRING }

169 170
The QAPI schema definitions can be modularized using the 'include' directive:

171
 { 'include': 'path/to/file.json' }
172 173

The directive is evaluated recursively, and include paths are relative to the
174
file using the directive. Multiple includes of the same file are
175
idempotent.  No other keys should appear in the expression, and the include
176 177 178 179 180 181 182
value should be a string.

As a matter of style, it is a good idea to have all files be
self-contained, but at the moment, nothing prevents an included file
from making a forward reference to a type that is only introduced by
an outer file.  The parser may be made stricter in the future to
prevent incomplete include files.
183 184


E
Eric Blake 已提交
185
=== Struct types ===
K
Kevin Wolf 已提交
186

E
Eric Blake 已提交
187
Usage: { 'struct': STRING, 'data': DICT, '*base': STRUCT-NAME }
188

E
Eric Blake 已提交
189
A struct is a dictionary containing a single 'data' key whose
190 191 192
value is a dictionary.  This corresponds to a struct in C or an Object
in JSON. Each value of the 'data' dictionary must be the name of a
type, or a one-element array containing a type name.  An example of a
E
Eric Blake 已提交
193
struct is:
194

E
Eric Blake 已提交
195
 { 'struct': 'MyType',
196
   'data': { 'member1': 'str', 'member2': 'int', '*member3': 'str' } }
197

198
The use of '*' as a prefix to the name means the member is optional in
199
the corresponding JSON protocol usage.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

The default initialization value of an optional argument should not be changed
between versions of QEMU unless the new default maintains backward
compatibility to the user-visible behavior of the old default.

With proper documentation, this policy still allows some flexibility; for
example, documenting that a default of 0 picks an optimal buffer size allows
one release to declare the optimal size at 512 while another release declares
the optimal size at 4096 - the user-visible behavior is not the bytes used by
the buffer, but the fact that the buffer was optimal size.

On input structures (only mentioned in the 'data' side of a command), changing
from mandatory to optional is safe (older clients will supply the option, and
newer clients can benefit from the default); changing from optional to
mandatory is backwards incompatible (older clients may be omitting the option,
and must continue to work).

On output structures (only mentioned in the 'returns' side of a command),
changing from mandatory to optional is in general unsafe (older clients may be
expecting the field, and could crash if it is missing), although it can be done
if the only way that the optional argument will be omitted is when it is
triggered by the presence of a new input flag to the command that older clients
don't know to send.  Changing from optional to mandatory is safe.

A structure that is used in both input and output of various commands
must consider the backwards compatibility constraints of both directions
of use.
227

E
Eric Blake 已提交
228
A struct definition can specify another struct as its base.
229
In this case, the fields of the base type are included as top-level fields
230 231
of the new struct's dictionary in the Client JSON Protocol wire
format. An example definition is:
232

E
Eric Blake 已提交
233 234
 { 'struct': 'BlockdevOptionsGenericFormat', 'data': { 'file': 'str' } }
 { 'struct': 'BlockdevOptionsGenericCOWFormat',
235 236 237 238 239 240 241 242 243
   'base': 'BlockdevOptionsGenericFormat',
   'data': { '*backing': 'str' } }

An example BlockdevOptionsGenericCOWFormat object on the wire could use
both fields like this:

 { "file": "/some/place/my-image",
   "backing": "/some/place/my-backing-file" }

244

K
Kevin Wolf 已提交
245 246
=== Enumeration types ===

247
Usage: { 'enum': STRING, 'data': ARRAY-OF-STRING }
248
       { 'enum': STRING, '*prefix': STRING, 'data': ARRAY-OF-STRING }
249 250 251

An enumeration type is a dictionary containing a single 'data' key
whose value is a list of strings.  An example enumeration is:
252 253 254

 { 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] }

255 256 257 258 259
Nothing prevents an empty enumeration, although it is probably not
useful.  The list of strings should be lower case; if an enum name
represents multiple words, use '-' between words.  The string 'max' is
not allowed as an enum value, and values should not be repeated.

260 261 262 263 264 265 266
The enum constants will be named by using a heuristic to turn the
type name into a set of underscore separated words. For the example
above, 'MyEnum' will turn into 'MY_ENUM' giving a constant name
of 'MY_ENUM_VALUE1' for the first value. If the default heuristic
does not result in a desirable name, the optional 'prefix' field
can be used when defining the enum.

267 268 269
The enumeration values are passed as strings over the Client JSON
Protocol, but are encoded as C enum integral values in generated code.
While the C code starts numbering at 0, it is better to use explicit
270 271 272 273 274
comparisons to enum values than implicit comparisons to 0; the C code
will also include a generated enum member ending in _MAX for tracking
the size of the enum, useful when using common functions for
converting between strings and enum values.  Since the wire format
always passes by name, it is acceptable to reorder or add new
275 276 277 278 279
enumeration members in any location without breaking clients of Client
JSON Protocol; however, removing enum values would break
compatibility.  For any struct that has a field that will only contain
a finite set of string values, using an enum type for that field is
better than open-coding the field to be type 'str'.
280 281


K
Kevin Wolf 已提交
282 283
=== Union types ===

284
Usage: { 'union': STRING, 'data': DICT }
E
Eric Blake 已提交
285
or:    { 'union': STRING, 'data': DICT, 'base': STRUCT-NAME,
286
         'discriminator': ENUM-MEMBER-OF-BASE }
K
Kevin Wolf 已提交
287

288
Union types are used to let the user choose between several different
289 290 291 292
variants for an object.  There are two flavors: simple (no
discriminator or base), flat (both discriminator and base).  A union
type is defined using a data dictionary as explained in the following
paragraphs.
K
Kevin Wolf 已提交
293

294 295
A simple union type defines a mapping from automatic discriminator
values to data types like in this example:
K
Kevin Wolf 已提交
296

E
Eric Blake 已提交
297 298
 { 'struct': 'FileOptions', 'data': { 'filename': 'str' } }
 { 'struct': 'Qcow2Options',
K
Kevin Wolf 已提交
299 300 301 302 303 304
   'data': { 'backing-file': 'str', 'lazy-refcounts': 'bool' } }

 { 'union': 'BlockdevOptions',
   'data': { 'file': 'FileOptions',
             'qcow2': 'Qcow2Options' } }

305 306 307 308
In the Client JSON Protocol, a simple union is represented by a
dictionary that contains the 'type' field as a discriminator, and a
'data' field that is of the specified data type corresponding to the
discriminator value, as in these examples:
K
Kevin Wolf 已提交
309

310
 { "type": "file", "data" : { "filename": "/some/place/my-image" } }
K
Kevin Wolf 已提交
311 312 313
 { "type": "qcow2", "data" : { "backing-file": "/some/place/my-image",
                               "lazy-refcounts": true } }

314 315 316 317 318
The generated C code uses a struct containing a union. Additionally,
an implicit C enum 'NameKind' is created, corresponding to the union
'Name', for accessing the various branches of the union.  No branch of
the union can be named 'max', as this would collide with the implicit
enum.  The value for each branch can be of any type.
K
Kevin Wolf 已提交
319

E
Eric Blake 已提交
320
A flat union definition specifies a struct as its base, and
321 322 323 324 325
avoids nesting on the wire.  All branches of the union must be
complex types, and the top-level fields of the union dictionary on
the wire will be combination of fields from both the base type and the
appropriate branch type (when merging two dictionaries, there must be
no keys in common).  The 'discriminator' field must be the name of an
E
Eric Blake 已提交
326
enum-typed member of the base struct.
K
Kevin Wolf 已提交
327

328 329 330 331
The following example enhances the above simple union example by
adding a common field 'readonly', renaming the discriminator to
something more applicable, and reducing the number of {} required on
the wire:
332

333
 { 'enum': 'BlockdevDriver', 'data': [ 'file', 'qcow2' ] }
E
Eric Blake 已提交
334
 { 'struct': 'BlockdevCommonOptions',
335
   'data': { 'driver': 'BlockdevDriver', 'readonly': 'bool' } }
336 337 338
 { 'union': 'BlockdevOptions',
   'base': 'BlockdevCommonOptions',
   'discriminator': 'driver',
339
   'data': { 'file': 'FileOptions',
340 341
             'qcow2': 'Qcow2Options' } }

342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
Resulting in these JSON objects:

 { "driver": "file", "readonly": true,
   "filename": "/some/place/my-image" }
 { "driver": "qcow2", "readonly": false,
   "backing-file": "/some/place/my-image", "lazy-refcounts": true }

Notice that in a flat union, the discriminator name is controlled by
the user, but because it must map to a base member with enum type, the
code generator can ensure that branches exist for all values of the
enum (although the order of the keys need not match the declaration of
the enum).  In the resulting generated C data types, a flat union is
represented as a struct with the base member fields included directly,
and then a union of structures for each branch of the struct.

A simple union can always be re-written as a flat union where the base
class has a single member named 'type', and where each branch of the
E
Eric Blake 已提交
359
union has a struct with a single member named 'data'.  That is,
360

361
 { 'union': 'Simple', 'data': { 'one': 'str', 'two': 'int' } }
362

363
is identical on the wire to:
364

365
 { 'enum': 'Enum', 'data': ['one', 'two'] }
E
Eric Blake 已提交
366 367 368
 { 'struct': 'Base', 'data': { 'type': 'Enum' } }
 { 'struct': 'Branch1', 'data': { 'data': 'str' } }
 { 'struct': 'Branch2', 'data': { 'data': 'int' } }
369
 { 'union': 'Flat', 'base': 'Base', 'discriminator': 'type',
370
   'data': { 'one': 'Branch1', 'two': 'Branch2' } }
K
Kevin Wolf 已提交
371

372

373
=== Alternate types ===
K
Kevin Wolf 已提交
374

375 376 377 378 379 380 381 382
Usage: { 'alternate': STRING, 'data': DICT }

An alternate type is one that allows a choice between two or more JSON
data types (string, integer, number, or object, but currently not
array) on the wire.  The definition is similar to a simple union type,
where each branch of the union names a QAPI type.  For example:

 { 'alternate': 'BlockRef',
K
Kevin Wolf 已提交
383 384 385
   'data': { 'definition': 'BlockdevOptions',
             'reference': 'str' } }

386 387 388 389
Just like for a simple union, an implicit C enum 'NameKind' is created
to enumerate the branches for the alternate 'Name'.

Unlike a union, the discriminator string is never passed on the wire
390 391 392 393 394 395 396 397 398 399
for the Client JSON Protocol.  Instead, the value's JSON type serves
as an implicit discriminator, which in turn means that an alternate
can only express a choice between types represented differently in
JSON.  If a branch is typed as the 'bool' built-in, the alternate
accepts true and false; if it is typed as any of the various numeric
built-ins, it accepts a JSON number; if it is typed as a 'str'
built-in or named enum type, it accepts a JSON string; and if it is
typed as a complex type (struct or union), it accepts a JSON object.
Two different complex types, for instance, aren't permitted, because
both are represented as a JSON object.
400 401 402

The example alternate declaration above allows using both of the
following example objects:
K
Kevin Wolf 已提交
403 404 405 406

 { "file": "my_existing_block_device_id" }
 { "file": { "driver": "file",
             "readonly": false,
E
Eric Blake 已提交
407
             "filename": "/tmp/mydisk.qcow2" } }
K
Kevin Wolf 已提交
408 409


K
Kevin Wolf 已提交
410
=== Commands ===
411

412
Usage: { 'command': STRING, '*data': COMPLEX-TYPE-NAME-OR-DICT,
413
         '*returns': TYPE-NAME,
414 415 416 417
         '*gen': false, '*success-response': false }

Commands are defined by using a dictionary containing several members,
where three members are most common.  The 'command' member is a
418 419
mandatory string, and determines the "execute" value passed in a
Client JSON Protocol command exchange.
420 421

The 'data' argument maps to the "arguments" dictionary passed in as
422 423
part of a Client JSON Protocol command.  The 'data' member is optional
and defaults to {} (an empty dictionary).  If present, it must be the
424 425 426
string name of a complex type, or a dictionary that declares an
anonymous type with the same semantics as a 'struct' expression, with
one exception noted below when 'gen' is used.
427 428

The 'returns' member describes what will appear in the "return" field
429 430 431 432 433
of a Client JSON Protocol reply on successful completion of a command.
The member is optional from the command declaration; if absent, the
"return" field will be an empty dictionary.  If 'returns' is present,
it must be the string name of a complex or built-in type, a
one-element array containing the name of a complex or built-in type,
434 435 436 437 438 439 440
with one exception noted below when 'gen' is used.  Although it is
permitted to have the 'returns' member name a built-in type or an
array of built-in types, any command that does this cannot be extended
to return additional information in the future; thus, new commands
should strongly consider returning a dictionary-based type or an array
of dictionaries, even if the dictionary only contains one field at the
present.
441 442 443 444 445 446

All commands in Client JSON Protocol use a dictionary to report
failure, with no way to specify that in QAPI.  Where the error return
is different than the usual GenericError class in order to help the
client react differently to certain error conditions, it is worth
documenting this in the comments before the command declaration.
447 448 449 450 451

Some example commands:

 { 'command': 'my-first-command',
   'data': { 'arg1': 'str', '*arg2': 'str' } }
E
Eric Blake 已提交
452
 { 'struct': 'MyType', 'data': { '*value': 'str' } }
453 454 455
 { 'command': 'my-second-command',
   'returns': [ 'MyType' ] }

456
which would validate this Client JSON Protocol transaction:
457 458 459 460 461 462 463 464

 => { "execute": "my-first-command",
      "arguments": { "arg1": "hello" } }
 <= { "return": { } }
 => { "execute": "my-second-command" }
 <= { "return": [ { "value": "one" }, { } ] }

In rare cases, QAPI cannot express a type-safe representation of a
465 466 467 468 469
corresponding Client JSON Protocol command.  You then have to suppress
generation of a marshalling function by including a key 'gen' with
boolean value false, and instead write your own function.  Please try
to avoid adding new commands that rely on this, and instead use
type-safe unions.  For an example of this usage:
470 471

 { 'command': 'netdev_add',
472
   'data': {'type': 'str', 'id': 'str'},
473 474 475 476 477 478 479 480 481 482
   'gen': false }

Normally, the QAPI schema is used to describe synchronous exchanges,
where a response is expected.  But in some cases, the action of a
command is expected to change state in a way that a successful
response is not possible (although the command will still return a
normal dictionary error on failure).  When a successful reply is not
possible, the command expression should include the optional key
'success-response' with boolean value false.  So far, only QGA makes
use of this field.
483 484


W
Wenchao Xia 已提交
485 486
=== Events ===

487 488 489 490 491 492
Usage: { 'event': STRING, '*data': COMPLEX-TYPE-NAME-OR-DICT }

Events are defined with the keyword 'event'.  It is not allowed to
name an event 'MAX', since the generator also produces a C enumeration
of all event names with a generated _MAX value at the end.  When
'data' is also specified, additional info will be included in the
E
Eric Blake 已提交
493
event, with similar semantics to a 'struct' expression.  Finally there
494 495
will be C API generated in qapi-event.h; when called by QEMU code, a
message with timestamp will be emitted on the wire.
W
Wenchao Xia 已提交
496 497 498 499 500 501 502 503 504 505 506

An example event is:

{ 'event': 'EVENT_C',
  'data': { '*a': 'int', 'b': 'str' } }

Resulting in this JSON object:

{ "event": "EVENT_C",
  "data": { "b": "test string" },
  "timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
507

508

509 510 511 512 513 514 515 516
== Client JSON Protocol introspection ==

Clients of a Client JSON Protocol commonly need to figure out what
exactly the server (QEMU) supports.

For this purpose, QMP provides introspection via command
query-qmp-schema.  QGA currently doesn't support introspection.

517 518 519 520 521 522 523 524 525 526 527
While Client JSON Protocol wire compatibility should be maintained
between qemu versions, we cannot make the same guarantees for
introspection stability.  For example, one version of qemu may provide
a non-variant optional member of a struct, and a later version rework
the member to instead be non-optional and associated with a variant.
Likewise, one version of qemu may list a member with open-ended type
'str', and a later version could convert it to a finite set of strings
via an enum type; or a member may be converted from a specific type to
an alternate that represents a choice between the original type and
something else.

528 529
query-qmp-schema returns a JSON array of SchemaInfo objects.  These
objects together describe the wire ABI, as defined in the QAPI schema.
530 531 532 533
There is no specified order to the SchemaInfo objects returned; a
client must search for a particular name throughout the entire array
to learn more about that name, but is at least guaranteed that there
will be no collisions between type, command, and event names.
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551

However, the SchemaInfo can't reflect all the rules and restrictions
that apply to QMP.  It's interface introspection (figuring out what's
there), not interface specification.  The specification is in the QAPI
schema.  To understand how QMP is to be used, you need to study the
QAPI schema.

Like any other command, query-qmp-schema is itself defined in the QAPI
schema, along with the SchemaInfo type.  This text attempts to give an
overview how things work.  For details you need to consult the QAPI
schema.

SchemaInfo objects have common members "name" and "meta-type", and
additional variant members depending on the value of meta-type.

Each SchemaInfo object describes a wire ABI entity of a certain
meta-type: a command, event or one of several kinds of type.

552 553
SchemaInfo for commands and events have the same name as in the QAPI
schema.
554 555

Command and event names are part of the wire ABI, but type names are
556 557 558 559 560 561
not.  Therefore, the SchemaInfo for types have auto-generated
meaningless names.  For readability, the examples in this section use
meaningful type names instead.

To examine a type, start with a command or event using it, then follow
references by name.
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591

QAPI schema definitions not reachable that way are omitted.

The SchemaInfo for a command has meta-type "command", and variant
members "arg-type" and "ret-type".  On the wire, the "arguments"
member of a client's "execute" command must conform to the object type
named by "arg-type".  The "return" member that the server passes in a
success response conforms to the type named by "ret-type".

If the command takes no arguments, "arg-type" names an object type
without members.  Likewise, if the command returns nothing, "ret-type"
names an object type without members.

Example: the SchemaInfo for command query-qmp-schema

    { "name": "query-qmp-schema", "meta-type": "command",
      "arg-type": ":empty", "ret-type": "SchemaInfoList" }

    Type ":empty" is an object type without members, and type
    "SchemaInfoList" is the array of SchemaInfo type.

The SchemaInfo for an event has meta-type "event", and variant member
"arg-type".  On the wire, a "data" member that the server passes in an
event conforms to the object type named by "arg-type".

If the event carries no additional information, "arg-type" names an
object type without members.  The event may not have a data member on
the wire then.

Each command or event defined with dictionary-valued 'data' in the
592
QAPI schema implicitly defines an object type.
593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613

Example: the SchemaInfo for EVENT_C from section Events

    { "name": "EVENT_C", "meta-type": "event",
      "arg-type": ":obj-EVENT_C-arg" }

    Type ":obj-EVENT_C-arg" is an implicitly defined object type with
    the two members from the event's definition.

The SchemaInfo for struct and union types has meta-type "object".

The SchemaInfo for a struct type has variant member "members".

The SchemaInfo for a union type additionally has variant members "tag"
and "variants".

"members" is a JSON array describing the object's common members, if
any.  Each element is a JSON object with members "name" (the member's
name), "type" (the name of its type), and optionally "default".  The
member is optional if "default" is present.  Currently, "default" can
only have value null.  Other values are reserved for future
614 615 616
extensions.  The "members" array is in no particular order; clients
must search the entire object when learning whether a particular
member is supported.
617 618 619 620 621 622 623 624 625 626 627 628 629

Example: the SchemaInfo for MyType from section Struct types

    { "name": "MyType", "meta-type": "object",
      "members": [
          { "name": "member1", "type": "str" },
          { "name": "member2", "type": "int" },
          { "name": "member3", "type": "str", "default": null } ] }

"tag" is the name of the common member serving as type tag.
"variants" is a JSON array describing the object's variant members.
Each element is a JSON object with members "case" (the value of type
tag this element applies to) and "type" (the name of an object type
630 631 632
that provides the variant members for this type tag value).  The
"variants" array is in no particular order, and is not guaranteed to
list cases in the same order as the corresponding "tag" enum type.
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652

Example: the SchemaInfo for flat union BlockdevOptions from section
Union types

    { "name": "BlockdevOptions", "meta-type": "object",
      "members": [
          { "name": "driver", "type": "BlockdevDriver" },
          { "name": "readonly", "type": "bool"} ],
      "tag": "driver",
      "variants": [
          { "case": "file", "type": "FileOptions" },
          { "case": "qcow2", "type": "Qcow2Options" } ] }

Note that base types are "flattened": its members are included in the
"members" array.

A simple union implicitly defines an enumeration type for its implicit
discriminator (called "type" on the wire, see section Union types).

A simple union implicitly defines an object type for each of its
653
variants.
654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672

Example: the SchemaInfo for simple union BlockdevOptions from section
Union types

    { "name": "BlockdevOptions", "meta-type": "object",
      "members": [
          { "name": "kind", "type": "BlockdevOptionsKind" } ],
      "tag": "type",
      "variants": [
          { "case": "file", "type": ":obj-FileOptions-wrapper" },
          { "case": "qcow2", "type": ":obj-Qcow2Options-wrapper" } ] }

    Enumeration type "BlockdevOptionsKind" and the object types
    ":obj-FileOptions-wrapper", ":obj-Qcow2Options-wrapper" are
    implicitly defined.

The SchemaInfo for an alternate type has meta-type "alternate", and
variant member "members".  "members" is a JSON array.  Each element is
a JSON object with member "type", which names a type.  Values of the
673 674
alternate type conform to exactly one of its member types.  There is
no guarantee on the order in which "members" will be listed.
675 676 677 678 679 680 681 682 683 684

Example: the SchemaInfo for BlockRef from section Alternate types

    { "name": "BlockRef", "meta-type": "alternate",
      "members": [
          { "type": "BlockdevOptions" },
          { "type": "str" } ] }

The SchemaInfo for an array type has meta-type "array", and variant
member "element-type", which names the array's element type.  Array
685 686 687 688
types are implicitly defined.  For convenience, the array's name may
resemble the element type; however, clients should examine member
"element-type" instead of making assumptions based on parsing member
"name".
689 690 691

Example: the SchemaInfo for ['str']

692
    { "name": "[str]", "meta-type": "array",
693 694 695
      "element-type": "str" }

The SchemaInfo for an enumeration type has meta-type "enum" and
696 697 698
variant member "values".  The values are listed in no particular
order; clients must search the entire enum when learning whether a
particular value is supported.
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723

Example: the SchemaInfo for MyEnum from section Enumeration types

    { "name": "MyEnum", "meta-type": "enum",
      "values": [ "value1", "value2", "value3" ] }

The SchemaInfo for a built-in type has the same name as the type in
the QAPI schema (see section Built-in Types), with one exception
detailed below.  It has variant member "json-type" that shows how
values of this type are encoded on the wire.

Example: the SchemaInfo for str

    { "name": "str", "meta-type": "builtin", "json-type": "string" }

The QAPI schema supports a number of integer types that only differ in
how they map to C.  They are identical as far as SchemaInfo is
concerned.  Therefore, they get all mapped to a single type "int" in
SchemaInfo.

As explained above, type names are not part of the wire ABI.  Not even
the names of built-in types.  Clients should examine member
"json-type" instead of hard-coding names of built-in types.


724 725
== Code generation ==

726 727 728 729 730 731
Schemas are fed into four scripts to generate all the code/files that,
paired with the core QAPI libraries, comprise everything required to
take JSON commands read in by a Client JSON Protocol server, unmarshal
the arguments into the underlying C types, call into the corresponding
C function, and map the response back to a Client JSON Protocol
response to be returned to the user.
732 733 734 735 736 737 738

As an example, we'll use the following schema, which describes a single
complex user-defined type (which will produce a C struct, along with a list
node structure that can be used to chain together a list of such types in
case we want to accept/return a list of this type with a command), and a
command which takes that type as a parameter and returns the same type:

739
    $ cat example-schema.json
E
Eric Blake 已提交
740
    { 'struct': 'UserDefOne',
741 742 743 744 745 746
      'data': { 'integer': 'int', 'string': 'str' } }

    { 'command': 'my-command',
      'data':    {'arg1': 'UserDefOne'},
      'returns': 'UserDefOne' }

747 748
    { 'event': 'MY_EVENT' }

749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
=== scripts/qapi-types.py ===

Used to generate the C types defined by a schema. The following files are
created:

$(prefix)qapi-types.h - C types corresponding to types defined in
                        the schema you pass in
$(prefix)qapi-types.c - Cleanup functions for the above C types

The $(prefix) is an optional parameter used as a namespace to keep the
generated code from one schema/code-generation separated from others so code
can be generated/used from multiple schemas without clobbering previously
created code.

Example:

765
    $ python scripts/qapi-types.py --output-dir="qapi-generated" \
766
    --prefix="example-" example-schema.json
767
    $ cat qapi-generated/example-qapi-types.c
768 769
[Uninteresting stuff omitted...]

770
    void qapi_free_UserDefOne(UserDefOne *obj)
771
    {
772
        QapiDeallocVisitor *qdv;
773 774 775 776 777 778
        Visitor *v;

        if (!obj) {
            return;
        }

779 780
        qdv = qapi_dealloc_visitor_new();
        v = qapi_dealloc_get_visitor(qdv);
781
        visit_type_UserDefOne(v, &obj, NULL, NULL);
782
        qapi_dealloc_visitor_cleanup(qdv);
783
    }
784

785
    void qapi_free_UserDefOneList(UserDefOneList *obj)
786
    {
787
        QapiDeallocVisitor *qdv;
788 789 790 791 792 793
        Visitor *v;

        if (!obj) {
            return;
        }

794 795
        qdv = qapi_dealloc_visitor_new();
        v = qapi_dealloc_get_visitor(qdv);
796
        visit_type_UserDefOneList(v, &obj, NULL, NULL);
797
        qapi_dealloc_visitor_cleanup(qdv);
798
    }
799
    $ cat qapi-generated/example-qapi-types.h
800 801 802 803
[Uninteresting stuff omitted...]

    #ifndef EXAMPLE_QAPI_TYPES_H
    #define EXAMPLE_QAPI_TYPES_H
804

805
[Built-in types omitted...]
806 807 808

    typedef struct UserDefOne UserDefOne;

809 810 811 812 813 814 815 816 817 818
    typedef struct UserDefOneList UserDefOneList;

    struct UserDefOne {
        int64_t integer;
        char *string;
    };

    void qapi_free_UserDefOne(UserDefOne *obj);

    struct UserDefOneList {
819 820 821 822
        union {
            UserDefOne *value;
            uint64_t padding;
        };
823
        UserDefOneList *next;
824 825
    };

826
    void qapi_free_UserDefOneList(UserDefOneList *obj);
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849

    #endif

=== scripts/qapi-visit.py ===

Used to generate the visitor functions used to walk through and convert
a QObject (as provided by QMP) to a native C data structure and
vice-versa, as well as the visitor function used to dealloc a complex
schema-defined C type.

The following files are generated:

$(prefix)qapi-visit.c: visitor function for a particular C type, used
                       to automagically convert QObjects into the
                       corresponding C type and vice-versa, as well
                       as for deallocating memory for an existing C
                       type

$(prefix)qapi-visit.h: declarations for previously mentioned visitor
                       functions

Example:

850
    $ python scripts/qapi-visit.py --output-dir="qapi-generated"
851
    --prefix="example-" example-schema.json
852
    $ cat qapi-generated/example-qapi-visit.c
853
[Uninteresting stuff omitted...]
854

855
    static void visit_type_UserDefOne_fields(Visitor *v, UserDefOne **obj, Error **errp)
856 857
    {
        Error *err = NULL;
M
Markus Armbruster 已提交
858

859
        visit_type_int(v, &(*obj)->integer, "integer", &err);
860 861 862
        if (err) {
            goto out;
        }
863
        visit_type_str(v, &(*obj)->string, "string", &err);
864 865 866
        if (err) {
            goto out;
        }
867

868
    out:
869 870
        error_propagate(errp, err);
    }
871

872
    void visit_type_UserDefOne(Visitor *v, UserDefOne **obj, const char *name, Error **errp)
873
    {
874 875
        Error *err = NULL;

876
        visit_start_struct(v, (void **)obj, "UserDefOne", name, sizeof(UserDefOne), &err);
877 878
        if (!err) {
            if (*obj) {
879
                visit_type_UserDefOne_fields(v, obj, errp);
880
            }
881
            visit_end_struct(v, &err);
882
        }
883
        error_propagate(errp, err);
884 885
    }

886
    void visit_type_UserDefOneList(Visitor *v, UserDefOneList **obj, const char *name, Error **errp)
887
    {
888
        Error *err = NULL;
889
        GenericList *i, **prev;
890

891
        visit_start_list(v, name, &err);
892 893 894 895 896
        if (err) {
            goto out;
        }

        for (prev = (GenericList **)obj;
897
             !err && (i = visit_next_list(v, prev, &err)) != NULL;
898 899
             prev = &i) {
            UserDefOneList *native_i = (UserDefOneList *)i;
900
            visit_type_UserDefOne(v, &native_i->value, NULL, &err);
901
        }
902 903 904

        error_propagate(errp, err);
        err = NULL;
905
        visit_end_list(v, &err);
906 907
    out:
        error_propagate(errp, err);
908
    }
909
    $ cat qapi-generated/example-qapi-visit.h
910
[Uninteresting stuff omitted...]
911

912 913
    #ifndef EXAMPLE_QAPI_VISIT_H
    #define EXAMPLE_QAPI_VISIT_H
914

915
[Visitors for built-in types omitted...]
916

917 918
    void visit_type_UserDefOne(Visitor *v, UserDefOne **obj, const char *name, Error **errp);
    void visit_type_UserDefOneList(Visitor *v, UserDefOneList **obj, const char *name, Error **errp);
919 920 921 922 923 924 925 926 927 928 929

    #endif

=== scripts/qapi-commands.py ===

Used to generate the marshaling/dispatch functions for the commands defined
in the schema. The following files are generated:

$(prefix)qmp-marshal.c: command marshal/dispatch functions for each
                        QMP command defined in the schema. Functions
                        generated by qapi-visit.py are used to
930
                        convert QObjects received from the wire into
931 932 933 934 935 936 937 938 939 940
                        function parameters, and uses the same
                        visitor functions to convert native C return
                        values to QObjects from transmission back
                        over the wire.

$(prefix)qmp-commands.h: Function prototypes for the QMP commands
                         specified in the schema.

Example:

941
    $ python scripts/qapi-commands.py --output-dir="qapi-generated"
942
    --prefix="example-" example-schema.json
943
    $ cat qapi-generated/example-qmp-marshal.c
944
[Uninteresting stuff omitted...]
945

946
    static void qmp_marshal_output_UserDefOne(UserDefOne *ret_in, QObject **ret_out, Error **errp)
947
    {
948
        Error *err = NULL;
949 950
        QmpOutputVisitor *qov = qmp_output_visitor_new();
        QapiDeallocVisitor *qdv;
951 952
        Visitor *v;

953
        v = qmp_output_get_visitor(qov);
954 955
        visit_type_UserDefOne(v, &ret_in, "unused", &err);
        if (err) {
956
            goto out;
957
        }
958
        *ret_out = qmp_output_get_qobject(qov);
959 960

    out:
961
        error_propagate(errp, err);
962 963 964
        qmp_output_visitor_cleanup(qov);
        qdv = qapi_dealloc_visitor_new();
        v = qapi_dealloc_get_visitor(qdv);
965
        visit_type_UserDefOne(v, &ret_in, "unused", NULL);
966
        qapi_dealloc_visitor_cleanup(qdv);
967 968
    }

969
    static void qmp_marshal_my_command(QDict *args, QObject **ret, Error **errp)
970
    {
971
        Error *err = NULL;
972
        UserDefOne *retval;
973 974
        QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
        QapiDeallocVisitor *qdv;
975
        Visitor *v;
976
        UserDefOne *arg1 = NULL;
977

978
        v = qmp_input_get_visitor(qiv);
979 980
        visit_type_UserDefOne(v, &arg1, "arg1", &err);
        if (err) {
981 982
            goto out;
        }
983

984 985
        retval = qmp_my_command(arg1, &err);
        if (err) {
986
            goto out;
987
        }
988

989
        qmp_marshal_output_UserDefOne(retval, ret, &err);
990

991
    out:
992
        error_propagate(errp, err);
993 994 995
        qmp_input_visitor_cleanup(qiv);
        qdv = qapi_dealloc_visitor_new();
        v = qapi_dealloc_get_visitor(qdv);
996
        visit_type_UserDefOne(v, &arg1, "arg1", NULL);
997
        qapi_dealloc_visitor_cleanup(qdv);
998 999 1000 1001
    }

    static void qmp_init_marshal(void)
    {
1002
        qmp_register_command("my-command", qmp_marshal_my_command, QCO_NO_OPTIONS);
1003 1004 1005
    }

    qapi_init(qmp_init_marshal);
1006
    $ cat qapi-generated/example-qmp-commands.h
1007
[Uninteresting stuff omitted...]
1008

1009 1010
    #ifndef EXAMPLE_QMP_COMMANDS_H
    #define EXAMPLE_QMP_COMMANDS_H
1011 1012

    #include "example-qapi-types.h"
1013 1014
    #include "qapi/qmp/qdict.h"
    #include "qapi/error.h"
1015

1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
    UserDefOne *qmp_my_command(UserDefOne *arg1, Error **errp);

    #endif

=== scripts/qapi-event.py ===

Used to generate the event-related C code defined by a schema. The
following files are created:

$(prefix)qapi-event.h - Function prototypes for each event type, plus an
                        enumeration of all event names
$(prefix)qapi-event.c - Implementation of functions to send an event

Example:

    $ python scripts/qapi-event.py --output-dir="qapi-generated"
1032
    --prefix="example-" example-schema.json
1033 1034 1035 1036 1037 1038
    $ cat qapi-generated/example-qapi-event.c
[Uninteresting stuff omitted...]

    void qapi_event_send_my_event(Error **errp)
    {
        QDict *qmp;
1039
        Error *err = NULL;
1040 1041 1042 1043 1044 1045 1046 1047
        QMPEventFuncEmit emit;
        emit = qmp_event_get_func_emit();
        if (!emit) {
            return;
        }

        qmp = qmp_event_build_dict("MY_EVENT");

1048
        emit(EXAMPLE_QAPI_EVENT_MY_EVENT, qmp, &err);
1049

1050
        error_propagate(errp, err);
1051 1052 1053
        QDECREF(qmp);
    }

1054 1055 1056
    const char *const example_QAPIEvent_lookup[] = {
        [EXAMPLE_QAPI_EVENT_MY_EVENT] = "MY_EVENT",
        [EXAMPLE_QAPI_EVENT_MAX] = NULL,
1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
    };
    $ cat qapi-generated/example-qapi-event.h
[Uninteresting stuff omitted...]

    #ifndef EXAMPLE_QAPI_EVENT_H
    #define EXAMPLE_QAPI_EVENT_H

    #include "qapi/error.h"
    #include "qapi/qmp/qdict.h"
    #include "example-qapi-types.h"


    void qapi_event_send_my_event(Error **errp);

M
Markus Armbruster 已提交
1071
    typedef enum example_QAPIEvent {
1072 1073
        EXAMPLE_QAPI_EVENT_MY_EVENT = 0,
        EXAMPLE_QAPI_EVENT_MAX = 1,
1074
    } example_QAPIEvent;
1075

1076 1077
    extern const char *const example_QAPIEvent_lookup[];

1078
    #endif
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096

=== scripts/qapi-introspect.py ===

Used to generate the introspection C code for a schema. The following
files are created:

$(prefix)qmp-introspect.c - Defines a string holding a JSON
                            description of the schema.
$(prefix)qmp-introspect.h - Declares the above string.

Example:

    $ python scripts/qapi-introspect.py --output-dir="qapi-generated"
    --prefix="example-" example-schema.json
    $ cat qapi-generated/example-qmp-introspect.c
[Uninteresting stuff omitted...]

    const char example_qmp_schema_json[] = "["
1097 1098 1099 1100 1101
        "{\"arg-type\": \"0\", \"meta-type\": \"event\", \"name\": \"MY_EVENT\"}, "
        "{\"arg-type\": \"1\", \"meta-type\": \"command\", \"name\": \"my-command\", \"ret-type\": \"2\"}, "
        "{\"members\": [], \"meta-type\": \"object\", \"name\": \"0\"}, "
        "{\"members\": [{\"name\": \"arg1\", \"type\": \"2\"}], \"meta-type\": \"object\", \"name\": \"1\"}, "
        "{\"members\": [{\"name\": \"integer\", \"type\": \"int\"}, {\"name\": \"string\", \"type\": \"str\"}], \"meta-type\": \"object\", \"name\": \"2\"}, "
1102
        "{\"json-type\": \"int\", \"meta-type\": \"builtin\", \"name\": \"int\"}, "
1103
        "{\"json-type\": \"string\", \"meta-type\": \"builtin\", \"name\": \"str\"}]";
1104 1105 1106 1107 1108 1109 1110 1111 1112
    $ cat qapi-generated/example-qmp-introspect.h
[Uninteresting stuff omitted...]

    #ifndef EXAMPLE_QMP_INTROSPECT_H
    #define EXAMPLE_QMP_INTROSPECT_H

    extern const char example_qmp_schema_json[];

    #endif