Peter Maydell <peter.mayd...@linaro.org> writes: > Convert the qmp-spec.txt document to restructuredText. > Notable points about the conversion: > * numbers at the start of section headings are removed, to match > the style of the rest of the manual > * cross-references to other sections or documents are hyperlinked
You also add new references to QMP and QGA reference manuals. Thoughtful! > * various formatting tweaks (notably the examples, which need the > -> and <- prefixed so the QMP code-block lexer will accept them) You could add * English prose fixed in a few places. Appreciated! > Reviewed-by: Eric Blake <ebl...@redhat.com> > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> > --- > v1->v2: minor tweaks per Eric's review > * consistently use '.' at end of sentences in Where: lists > * s/the same of the/the same as for the/ > --- > docs/interop/index.rst | 1 + > docs/interop/{qmp-spec.txt => qmp-spec.rst} | 337 +++++++++++--------- > 2 files changed, 186 insertions(+), 152 deletions(-) > rename docs/interop/{qmp-spec.txt => qmp-spec.rst} (55%) Leaves a few dangling references: $ git-grep -F qmp-spec.txt docs/devel/qapi-code-gen.rst:See qmp-spec.txt for out-of-band execution syntax and semantics. python/qemu/qmp/models.py: Defined in qmp-spec.txt, section 2.2, "Server Greeting". python/qemu/qmp/models.py: Defined in qmp-spec.txt, section 2.2, "Server Greeting". python/qemu/qmp/models.py: Defined in qmp-spec.txt, section 2.4.2, "error". python/qemu/qmp/models.py: Defined in qmp-spec.txt, section 2.4.2, "error". python/qemu/qmp/qmp_client.py: # See "NOTE" in qmp-spec.txt, section 2.4.2 python/qemu/qmp/qmp_client.py: # qmp-spec.txt, section 2.4: qapi/control.json:# docs/interop/qmp-spec.txt) qapi/control.json:# qmp-spec.txt for more information on OOB) qapi/qapi-schema.json:# Please, refer to the QMP specification (docs/interop/qmp-spec.txt) qobject/json-lexer.c: * state; see docs/interop/qmp-spec.txt. Easy enough to fix up. > diff --git a/docs/interop/index.rst b/docs/interop/index.rst > index 6351ff9ba6e..ed65395bfb2 100644 > --- a/docs/interop/index.rst > +++ b/docs/interop/index.rst > @@ -15,6 +15,7 @@ are useful for making QEMU interoperate with other software. > dbus-display > live-block-operations > pr-helper > + qmp-spec > qemu-ga > qemu-ga-ref > qemu-qmp-ref > diff --git a/docs/interop/qmp-spec.txt b/docs/interop/qmp-spec.rst > similarity index 55% > rename from docs/interop/qmp-spec.txt > rename to docs/interop/qmp-spec.rst > index b0e8351d5b2..bfad570a160 100644 > --- a/docs/interop/qmp-spec.txt > +++ b/docs/interop/qmp-spec.rst > @@ -1,24 +1,26 @@ > - QEMU Machine Protocol Specification > +.. > + Copyright (C) 2009-2016 Red Hat, Inc. > > -0. About This Document > -====================== > + This work is licensed under the terms of the GNU GPL, version 2 or > + later. See the COPYING file in the top-level directory. > > -Copyright (C) 2009-2016 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. > +=================================== > +QEMU Machine Protocol Specification > +=================================== > > -1. Introduction > -=============== > - > -This document specifies the QEMU Machine Protocol (QMP), a JSON-based > +The QEMU Machine Protocol (QMP) is a JSON-based > protocol which is available for applications to operate QEMU at the > machine-level. It is also in use by the QEMU Guest Agent (QGA), which > is available for host applications to interact with the guest > -operating system. > +operating system. This page specifies the general format of > +the protocol; details of the commands and data structures can > +be found in the :doc:`qemu-qmp-ref` and the :doc:`qemu-ga-ref`. > > -2. Protocol Specification > -========================= > +.. contents:: > + > +Protocol Specification > +====================== > > This section details the protocol format. For the purpose of this > document, "Server" is either QEMU or the QEMU Guest Agent, and > @@ -30,9 +32,7 @@ following format: > json-DATA-STRUCTURE-NAME > > Where DATA-STRUCTURE-NAME is any valid JSON data structure, as defined > -by the JSON standard: > - > -http://www.ietf.org/rfc/rfc8259.txt > +by the `JSON standard <http://www.ietf.org/rfc/rfc8259.txt>`_. > > The server expects its input to be encoded in UTF-8, and sends its > output encoded in ASCII. > @@ -45,83 +45,89 @@ important unless specifically documented otherwise. > Repeating a key > within a json-object gives unpredictable results. > > Also for convenience, the server will accept an extension of > -'single-quoted' strings in place of the usual "double-quoted" > +``'single-quoted'`` strings in place of the usual ``"double-quoted"`` > json-string, and both input forms of strings understand an additional > -escape sequence of "\'" for a single quote. The server will only use > +escape sequence of ``\'`` for a single quote. The server will only use Pre-patch plain text "\'" becomes just \' in HTML output, but rendered as code, i.e. in a fixed-width font. I'd prefer to retain the quotation marks, like ``"\'"``, just like in JSON RFC 8259, but then plain text output becomes ""\'"". Likewise, ``'single-quoted'`` and ``"double-quoted"`` produce "'single-quoted'" and ""double-quoted"" in plain text output. Can't win. git-grep '``"' docs/ shows preexisting instances. More of the same below, not flagging again. No use fighting the tool. > double quoting on output. > > -2.1 General Definitions > ------------------------ > - > -2.1.1 All interactions transmitted by the Server are json-objects, always > - terminating with CRLF > - > -2.1.2 All json-objects members are mandatory when not specified otherwise > - > -2.2 Server Greeting > +General Definitions > ------------------- > > +All interactions transmitted by the Server are json-objects, always > +terminating with CRLF. > + > +All json-objects members are mandatory when not specified otherwise. > + > +Server Greeting > +--------------- > + > Right when connected the Server will issue a greeting message, which signals > that the connection has been successfully established and that the Server is > ready for capabilities negotiation (for more information refer to section > -'4. Capabilities Negotiation'). > +`Capabilities Negotiation`_). > > The greeting message format is: > > -{ "QMP": { "version": json-object, "capabilities": json-array } } > +.. code-block:: > > - Where, > + { "QMP": { "version": json-object, "capabilities": json-array } } > > -- The "version" member contains the Server's version information (the format > > - is the same of the query-version command) > -- The "capabilities" member specify the availability of features beyond the > +Where: > + > +- The ``version`` member contains the Server's version information (the > format > + is the same as for the query-version command). > +- The ``capabilities`` member specifies the availability of features beyond > the > baseline specification; the order of elements in this array has no > particular significance. > > -2.2.1 Capabilities > ------------------- > +Capabilities > +------------ > > Currently supported capabilities are: > > -- "oob": the QMP server supports "out-of-band" (OOB) command > - execution, as described in section "2.3.1 Out-of-band execution". > +``oob`` > + the QMP server supports "out-of-band" (OOB) command > + execution, as described in section `Out-of-band execution`_. > > -2.3 Issuing Commands > --------------------- > +Issuing Commands > +---------------- > > The format for command execution is: > > -{ "execute": json-string, "arguments": json-object, "id": json-value } > +.. code-block:: > + > + { "execute": json-string, "arguments": json-object, "id": json-value } > > or > > -{ "exec-oob": json-string, "arguments": json-object, "id": json-value } > +.. code-block:: > > - Where, > + { "exec-oob": json-string, "arguments": json-object, "id": json-value } > > -- The "execute" or "exec-oob" member identifies the command to be > +Where: > + > +- The ``execute`` or ``exec-oob`` member identifies the command to be > executed by the server. The latter requests out-of-band execution. > -- The "arguments" member is used to pass any arguments required for the > +- The ``arguments`` member is used to pass any arguments required for the > execution of the command, it is optional when no arguments are > required. Each command documents what contents will be considered > - valid when handling the json-argument > -- The "id" member is a transaction identification associated with the > + valid when handling the json-argument. > +- The ``id`` member is a transaction identification associated with the > command execution, it is optional and will be part of the response > - if provided. The "id" member can be any json-value. A json-number > + if provided. The ``id`` member can be any json-value. A json-number > incremented for each successive command works fine. > > -The actual commands are documented in the QEMU QMP reference manual > -docs/interop/qemu-qmp-ref.{7,html,info,pdf,txt}. > +The actual commands are documented in the :doc:`qemu-qmp-ref`. > > -2.3.1 Out-of-band execution > ---------------------------- > +Out-of-band execution > +--------------------- > > The server normally reads, executes and responds to one command after > the other. The client therefore receives command responses in issue > order. > > -With out-of-band execution enabled via capability negotiation (section > -4.), the server reads and queues commands as they arrive. It executes > +With out-of-band execution enabled via `capabilities negotiation`_, > +the server reads and queues commands as they arrive. It executes > commands from the queue one after the other. Commands executed > out-of-band jump the queue: the command get executed right away, > possibly overtaking prior in-band commands. The client may therefore > @@ -129,8 +135,8 @@ receive such a command's response before responses from > prior in-band > commands. > > To be able to match responses back to their commands, the client needs > -to pass "id" with out-of-band commands. Passing it with all commands > -is recommended for clients that accept capability "oob". > +to pass ``id`` with out-of-band commands. Passing it with all commands > +is recommended for clients that accept capability ``oob``. > > If the client sends in-band commands faster than the server can > execute them, the server will stop reading requests until the request > @@ -140,57 +146,61 @@ To ensure commands to be executed out-of-band get read > and executed, > the client should have at most eight in-band commands in flight. > > Only a few commands support out-of-band execution. The ones that do > -have "allow-oob": true in output of query-qmp-schema. > +have ``"allow-oob": true`` in the output of ``query-qmp-schema``. > > -2.4 Commands Responses > ----------------------- > +Commands Responses > +------------------ > > There are two possible responses which the Server will issue as the result > of a command execution: success or error. > > -As long as the commands were issued with a proper "id" field, then the > -same "id" field will be attached in the corresponding response message > +As long as the commands were issued with a proper ``id`` field, then the > +same ``id`` field will be attached in the corresponding response message > so that requests and responses can match. Clients should drop all the > -responses that have an unknown "id" field. > +responses that have an unknown ``id`` field. > > -2.4.1 success > -------------- > +Success > +------- > > The format of a success response is: > > -{ "return": json-value, "id": json-value } > +.. code-block:: > > - Where, > + { "return": json-value, "id": json-value } > > -- The "return" member contains the data returned by the command, which > +Where: > + > +- The ``return`` member contains the data returned by the command, which > is defined on a per-command basis (usually a json-object or > json-array of json-objects, but sometimes a json-number, json-string, > or json-array of json-strings); it is an empty json-object if the > - command does not return data > -- The "id" member contains the transaction identification associated > - with the command execution if issued by the Client > + command does not return data. > +- The ``id`` member contains the transaction identification associated > + with the command execution if issued by the Client. > > -2.4.2 error > ------------ > +Error > +----- > > The format of an error response is: > > -{ "error": { "class": json-string, "desc": json-string }, "id": json-value } > +.. code-block:: > > - Where, > + { "error": { "class": json-string, "desc": json-string }, "id": json-value > } > > -- The "class" member contains the error class name (eg. "GenericError") > -- The "desc" member is a human-readable error message. Clients should > +Where: > + > +- The ``class`` member contains the error class name (eg. > ``"GenericError"``). > +- The ``desc`` member is a human-readable error message. Clients should > not attempt to parse this message. > -- The "id" member contains the transaction identification associated with > - the command execution if issued by the Client > +- The ``id`` member contains the transaction identification associated with > + the command execution if issued by the Client. > > -NOTE: Some errors can occur before the Server is able to read the "id" > member, > -in these cases the "id" member will not be part of the error response, even > +NOTE: Some errors can occur before the Server is able to read the ``id`` > member; > +in these cases the ``id`` member will not be part of the error response, even > if provided by the client. > > -2.5 Asynchronous events > ------------------------ > +Asynchronous events > +------------------- > > As a result of state changes, the Server may send messages unilaterally > to the Client at any time, when not in the middle of any other > @@ -198,44 +208,45 @@ response. They are called "asynchronous events". > > The format of asynchronous events is: > > -{ "event": json-string, "data": json-object, > - "timestamp": { "seconds": json-number, "microseconds": json-number } } > +.. code-block:: > > - Where, > + { "event": json-string, "data": json-object, > + "timestamp": { "seconds": json-number, "microseconds": json-number } } > > -- The "event" member contains the event's name > -- The "data" member contains event specific data, which is defined in a > - per-event basis, it is optional > -- The "timestamp" member contains the exact time of when the event > +Where: > + > +- The ``event`` member contains the event's name. > +- The ``data`` member contains event specific data, which is defined in a > + per-event basis. It is optional. > +- The ``timestamp`` member contains the exact time of when the event > occurred in the Server. It is a fixed json-object with time in > seconds and microseconds relative to the Unix Epoch (1 Jan 1970); if > there is a failure to retrieve host time, both members of the > timestamp will be set to -1. > > -The actual asynchronous events are documented in the QEMU QMP > -reference manual docs/interop/qemu-qmp-ref.{7,html,info,pdf,txt}. > +The actual asynchronous events are documented in the :doc:`qemu-qmp-ref`. > > Some events are rate-limited to at most one per second. If additional > "similar" events arrive within one second, all but the last one are > dropped, and the last one is delayed. "Similar" normally means same > event type. > > -2.6 Forcing the JSON parser into known-good state > -------------------------------------------------- > +Forcing the JSON parser into known-good state > +--------------------------------------------- > > Incomplete or invalid input can leave the server's JSON parser in a > state where it can't parse additional commands. To get it back into > known-good state, the client should provoke a lexical error. > > The cleanest way to do that is sending an ASCII control character > -other than '\t' (horizontal tab), '\r' (carriage return), or '\n' (new > -line). > +other than ``\t`` (horizontal tab), ``\r`` (carriage return), or > +``\n`` (new line). > > Sadly, older versions of QEMU can fail to flag this as an error. If a > client needs to deal with them, it should send a 0xFF byte. > > -2.7 QGA Synchronization > ------------------------ > +QGA Synchronization > +------------------- > > When a client connects to QGA over a transport lacking proper > connection semantics such as virtio-serial, QGA may have read partial > @@ -243,86 +254,106 @@ input from a previous client. The client needs to > force QGA's parser > into known-good state using the previous section's technique. > Moreover, the client may receive output a previous client didn't read. > To help with skipping that output, QGA provides the > -'guest-sync-delimited' command. Refer to its documentation for > +``guest-sync-delimited`` command. Refer to its documentation for > details. > > > -3. QMP Examples > -=============== > +QMP Examples > +============ > > This section provides some examples of real QMP usage, in all of them > -"C" stands for "Client" and "S" stands for "Server". > +``->`` marks text sent by the Client and ``<-`` marks replies by the Server. > > -3.1 Server greeting > -------------------- > +.. admonition:: Example > > -S: { "QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 3}, > - "package": "v3.0.0"}, "capabilities": ["oob"] } } > + Server greeting > > -3.2 Capabilities negotiation > ----------------------------- > + .. code-block:: QMP > > -C: { "execute": "qmp_capabilities", "arguments": { "enable": ["oob"] } } > -S: { "return": {}} > + <- { "QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 3}, > + "package": "v3.0.0"}, "capabilities": ["oob"] } } Opportunity to adjust the spacing to match what the server actually sends: <- {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 3}, "package": "v3.0.0"}, "capabilities": ["oob"]}} May want to adjust spacing in input as well for a more consistent look. Suggestion, not demand. > > -3.3 Simple 'stop' execution > ---------------------------- > +.. admonition:: Example > > -C: { "execute": "stop" } > -S: { "return": {} } > + Capabilities negotiation > > -3.4 KVM information > -------------------- > + .. code-block:: QMP > > -C: { "execute": "query-kvm", "id": "example" } > -S: { "return": { "enabled": true, "present": true }, "id": "example"} > + -> { "execute": "qmp_capabilities", "arguments": { "enable": ["oob"] } } > + <- { "return": {}} Actual response is {"return": {}} > > -3.5 Parsing error > ------------------- > +.. admonition:: Example > > -C: { "execute": } > -S: { "error": { "class": "GenericError", "desc": "Invalid JSON syntax" } } > + Simple 'stop' execution > > -3.6 Powerdown event > -------------------- > + .. code-block:: QMP > > -S: { "timestamp": { "seconds": 1258551470, "microseconds": 802384 }, > - "event": "POWERDOWN" } > + -> { "execute": "stop" } > + <- { "return": {} } Likewise. > > -3.7 Out-of-band execution > -------------------------- > +.. admonition:: Example > > -C: { "exec-oob": "migrate-pause", "id": 42 } > -S: { "id": 42, > - "error": { "class": "GenericError", > - "desc": "migrate-pause is currently only supported during > postcopy-active state" } } > + KVM information > + > + .. code-block:: QMP > + > + -> { "execute": "query-kvm", "id": "example" } > + <- { "return": { "enabled": true, "present": true }, "id": "example"} Actual response is {"return": {"enabled": true, "present": true}, "id": "example"} > + > +.. admonition:: Example > + > + Parsing error > + > + .. code-block:: QMP > + > + -> { "execute": } > + <- { "error": { "class": "GenericError", "desc": "Invalid JSON syntax" } > } This error changed long ago (I believe). Actual response is {"error": {"class": "GenericError", "desc": "JSON parse error, expecting value"}} Please update this one even if you decide to leave the spacing as is. > + > +.. admonition:: Example > + > + Powerdown event > + > + .. code-block:: QMP > + > + <- { "timestamp": { "seconds": 1258551470, "microseconds": 802384 }, > + "event": "POWERDOWN" } Actual event looks like {"timestamp": {"seconds": 1258551470, "microseconds": 802384}, "event": "POWERDOWN"} > + > +.. admonition:: Example > + > + Out-of-band execution > + > + .. code-block:: QMP > + > + -> { "exec-oob": "migrate-pause", "id": 42 } > + <- { "id": 42, > + "error": { "class": "GenericError", > + "desc": "migrate-pause is currently only supported during > postcopy-active state" } } Actual response is {"id": 42, "error": {"class": "GenericError", "desc": "migrate-pause is currently only supported during postcopy-active state"}} [...]