123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716 |
- ======================
- The Sphinx QAPI Domain
- ======================
- An extension to the `rST syntax
- <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_
- in Sphinx is provided by the QAPI Domain, located in
- ``docs/sphinx/qapi_domain.py``. This extension is analogous to the
- `Python Domain
- <https://www.sphinx-doc.org/en/master/usage/domains/python.html>`_
- included with Sphinx, but provides special directives and roles
- speciically for annotating and documenting QAPI definitions
- specifically.
- A `Domain
- <https://www.sphinx-doc.org/en/master/usage/domains/index.html>`_
- provides a set of special rST directives and cross-referencing roles to
- Sphinx for understanding rST markup written to document a specific
- language. By itself, this QAPI extension is only sufficient to parse rST
- markup written by hand; the `autodoc
- <https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html>`_
- functionality is provided elsewhere, in ``docs/sphinx/qapidoc.py``, by
- the "Transmogrifier".
- It is not expected that any developer nor documentation writer would
- never need to write *nor* read these special rST forms. However, in the
- event that something needs to be debugged, knowing the syntax of the
- domain is quite handy. This reference may also be useful as a guide for
- understanding the QAPI Domain extension code itself. Although most of
- these forms will not be needed for documentation writing purposes,
- understanding the cross-referencing syntax *will* be helpful when
- writing rST documentation elsewhere, or for enriching the body of
- QAPIDoc blocks themselves.
- Concepts
- ========
- The QAPI Domain itself provides no mechanisms for reading the QAPI
- Schema or generating documentation from code that exists. It is merely
- the rST syntax used to describe things. For instance, the Sphinx Python
- domain adds syntax like ``:py:func:`` for describing Python functions in
- documentation, but it's the autodoc module that is responsible for
- reading Python code and generating such syntax. QAPI is analogous here:
- qapidoc.py is responsible for reading the QAPI Schema and generating rST
- syntax, and qapi_domain.py is responsible for translating that special
- syntax and providing APIs for Sphinx internals.
- In other words:
- qapi_domain.py adds syntax like ``.. qapi:command::`` to Sphinx, and
- qapidoc.py transforms the documentation in ``qapi/*.json`` into rST
- using directives defined by the domain.
- Or even shorter:
- ``:py:`` is to ``:qapi:`` as *autodoc* is to *qapidoc*.
- Info Field Lists
- ================
- `Field lists
- <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#field-lists>`_
- are a standard syntax in reStructuredText. Sphinx `extends that syntax
- <https://www.sphinx-doc.org/en/master/usage/domains/python.html#info-field-lists>`_
- to give certain field list entries special meaning and parsing to, for
- example, add cross-references. The QAPI Domain takes advantage of this
- field list extension to document things like Arguments, Members, Values,
- and so on.
- The special parsing and handling of info field lists in Sphinx is provided by
- three main classes; Field, GroupedField, and TypedField. The behavior
- and formatting for each configured field list entry in the domain
- changes depending on which class is used.
- Field:
- * Creates an ungrouped field: i.e., each entry will create its own
- section and they will not be combined.
- * May *optionally* support an argument.
- * May apply cross-reference roles to *either* the argument *or* the
- content body, both, or neither.
- This is used primarily for entries which are not expected to be
- repeated, i.e., items that may only show up at most once. The QAPI
- domain uses this class for "Errors" section.
- GroupedField:
- * Creates a grouped field: i.e. multiple adjacent entries will be
- merged into one section, and the content will form a bulleted list.
- * *Must* take an argument.
- * May optionally apply a cross-reference role to the argument, but not
- the body.
- * Can be configured to remove the bulleted list if there is only a
- single entry.
- * All items will be generated with the form: "argument -- body"
- This is used for entries which are expected to be repeated, but aren't
- expected to have two arguments, i.e. types without names, or names
- without types. The QAPI domain uses this class for features, returns,
- and enum values.
- TypedField:
- * Creates a grouped, typed field. Multiple adjacent entres will be
- merged into one section, and the content will form a bulleted list.
- * *Must* take at least one argument, but supports up to two -
- nominally, a name and a type.
- * May optionally apply a cross-reference role to the type or the name
- argument, but not the body.
- * Can be configured to remove the bulleted list if there is only a
- single entry.
- * All items will be generated with the form "name (type) -- body"
- This is used for entries that are expected to be repeated and will have
- a name, a type, and a description. The QAPI domain uses this class for
- arguments, alternatives, and members. Wherever type names are referenced
- below, They must be a valid, documented type that will be
- cross-referenced in the HTML output; or one of the built-in JSON types
- (string, number, int, boolean, null, value, q_empty).
- ``:feat:``
- ----------
- Document a feature attached to a QAPI definition.
- :availability: This field list is available in the body of Command,
- Event, Enum, Object and Alternate directives.
- :syntax: ``:feat name: Lorem ipsum, dolor sit amet...``
- :type: `sphinx.util.docfields.GroupedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
- Example::
- .. qapi:object:: BlockdevOptionsVirtioBlkVhostVdpa
- :since: 7.2
- :ifcond: CONFIG_BLKIO
- Driver specific block device options for the virtio-blk-vhost-vdpa
- backend.
- :memb string path: path to the vhost-vdpa character device.
- :feat fdset: Member ``path`` supports the special "/dev/fdset/N" path
- (since 8.1)
- ``:arg:``
- ---------
- Document an argument to a QAPI command.
- :availability: This field list is only available in the body of the
- Command directive.
- :syntax: ``:arg type name: description``
- :type: `sphinx.util.docfields.TypedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
- Example::
- .. qapi:command:: job-pause
- :since: 3.0
- Pause an active job.
- This command returns immediately after marking the active job for
- pausing. Pausing an already paused job is an error.
- The job will pause as soon as possible, which means transitioning
- into the PAUSED state if it was RUNNING, or into STANDBY if it was
- READY. The corresponding JOB_STATUS_CHANGE event will be emitted.
- Cancelling a paused job automatically resumes it.
- :arg string id: The job identifier.
- ``:error:``
- -----------
- Document the error condition(s) of a QAPI command.
- :availability: This field list is only available in the body of the
- Command directive.
- :syntax: ``:error: Lorem ipsum dolor sit amet ...``
- :type: `sphinx.util.docfields.Field
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.Field.html?private=1>`_
- The format of the :errors: field list description is free-form rST. The
- alternative spelling ":errors:" is also permitted, but strictly
- analogous.
- Example::
- .. qapi:command:: block-job-set-speed
- :since: 1.1
- Set maximum speed for a background block operation.
- This command can only be issued when there is an active block job.
- Throttling can be disabled by setting the speed to 0.
- :arg string device: The job identifier. This used to be a device
- name (hence the name of the parameter), but since QEMU 2.7 it
- can have other values.
- :arg int speed: the maximum speed, in bytes per second, or 0 for
- unlimited. Defaults to 0.
- :error:
- - If no background operation is active on this device,
- DeviceNotActive
- ``:return:``
- -------------
- Document the return type(s) and value(s) of a QAPI command.
- :availability: This field list is only available in the body of the
- Command directive.
- :syntax: ``:return type: Lorem ipsum dolor sit amet ...``
- :type: `sphinx.util.docfields.GroupedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
- Example::
- .. qapi:command:: query-replay
- :since: 5.2
- Retrieve the record/replay information. It includes current
- instruction count which may be used for ``replay-break`` and
- ``replay-seek`` commands.
- :return ReplayInfo: record/replay information.
- .. qmp-example::
- -> { "execute": "query-replay" }
- <- { "return": {
- "mode": "play", "filename": "log.rr", "icount": 220414 }
- }
- ``:value:``
- -----------
- Document a possible value for a QAPI enum.
- :availability: This field list is only available in the body of the Enum
- directive.
- :syntax: ``:value name: Lorem ipsum, dolor sit amet ...``
- :type: `sphinx.util.docfields.GroupedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
- Example::
- .. qapi:enum:: QapiErrorClass
- :since: 1.2
- QEMU error classes
- :value GenericError: this is used for errors that don't require a specific
- error class. This should be the default case for most errors
- :value CommandNotFound: the requested command has not been found
- :value DeviceNotActive: a device has failed to be become active
- :value DeviceNotFound: the requested device has not been found
- :value KVMMissingCap: the requested operation can't be fulfilled because a
- required KVM capability is missing
- ``:alt:``
- ------------
- Document a possible branch for a QAPI alternate.
- :availability: This field list is only available in the body of the
- Alternate directive.
- :syntax: ``:alt type name: Lorem ipsum, dolor sit amet ...``
- :type: `sphinx.util.docfields.TypedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
- As a limitation of Sphinx, we must document the "name" of the branch in
- addition to the type, even though this information is not visible on the
- wire in the QMP protocol format. This limitation *may* be lifted at a
- future date.
- Example::
- .. qapi:alternate:: StrOrNull
- :since: 2.10
- This is a string value or the explicit lack of a string (null
- pointer in C). Intended for cases when 'optional absent' already
- has a different meaning.
- :alt string s: the string value
- :alt null n: no string value
- ``:memb:``
- ----------
- Document a member of an Event or Object.
- :availability: This field list is available in the body of Event or
- Object directives.
- :syntax: ``:memb type name: Lorem ipsum, dolor sit amet ...``
- :type: `sphinx.util.docfields.TypedField
- <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
- This is fundamentally the same as ``:arg:`` and ``:alt:``, but uses the
- "Members" phrasing for Events and Objects (Structs and Unions).
- Example::
- .. qapi:event:: JOB_STATUS_CHANGE
- :since: 3.0
- Emitted when a job transitions to a different status.
- :memb string id: The job identifier
- :memb JobStatus status: The new job status
- Arbitrary field lists
- ---------------------
- Other field list names, while valid rST syntax, are prohibited inside of
- QAPI directives to help prevent accidental misspellings of info field
- list names. If you want to add a new arbitrary "non-value-added" field
- list to QAPI documentation, you must add the field name to the allow
- list in ``docs/conf.py``
- For example::
- qapi_allowed_fields = {
- "see also",
- }
- Will allow you to add arbitrary field lists in QAPI directives::
- .. qapi:command:: x-fake-command
- :see also: Lorem ipsum, dolor sit amet ...
- Cross-references
- ================
- Cross-reference `roles
- <https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html>`_
- in the QAPI domain are modeled closely after the `Python
- cross-referencing syntax
- <https://www.sphinx-doc.org/en/master/usage/domains/python.html#cross-referencing-python-objects>`_.
- QAPI definitions can be referenced using the standard `any
- <https://www.sphinx-doc.org/en/master/usage/referencing.html#role-any>`_
- role cross-reference syntax, such as with ```query-blockstats```. In
- the event that disambiguation is needed, cross-references can also be
- written using a number of explicit cross-reference roles:
- * ``:qapi:mod:`block-core``` -- Reference a QAPI module. The link will
- take you to the beginning of that section in the documentation.
- * ``:qapi:cmd:`query-block``` -- Reference a QAPI command.
- * ``:qapi:event:`JOB_STATUS_CHANGE``` -- Reference a QAPI event.
- * ``:qapi:enum:`QapiErrorClass``` -- Reference a QAPI enum.
- * ``:qapi:obj:`BlockdevOptionsVirtioBlkVhostVdpa`` -- Reference a QAPI
- object (struct or union)
- * ``:qapi:alt:`StrOrNull``` -- Reference a QAPI alternate.
- * ``:qapi:type:`BlockDirtyInfo``` -- Reference *any* QAPI type; this
- excludes modules, commands, and events.
- * ``:qapi:any:`block-job-set-speed``` -- Reference absolutely any QAPI entity.
- Type arguments in info field lists are converted into references as if
- you had used the ``:qapi:type:`` role. All of the special syntax below
- applies to both info field lists and standalone explicit
- cross-references.
- Type decorations
- ----------------
- Type names in references can be surrounded by brackets, like
- ``[typename]``, to indicate an array of that type. The cross-reference
- will apply only to the type name between the brackets. For example;
- ``:qapi:type:`[Qcow2BitmapInfoFlags]``` renders to:
- :qapi:type:`[QMP:Qcow2BitmapInfoFlags]`
- To indicate an optional argument/member in a field list, the type name
- can be suffixed with ``?``. The cross-reference will be transformed to
- "type, Optional" with the link applying only to the type name. For
- example; ``:qapi:type:`BitmapSyncMode?``` renders to:
- :qapi:type:`QMP:BitmapSyncMode?`
- Namespaces
- ----------
- Mimicking the `Python domain target specification syntax
- <https://www.sphinx-doc.org/en/master/usage/domains/python.html#target-specification>`_,
- QAPI allows you to specify the fully qualified path for a data
- type.
- * A namespace can be explicitly provided;
- e.g. ``:qapi:type:`QMP:BitmapSyncMode``
- * A module can be explicitly provided;
- ``:qapi:type:`QMP:block-core.BitmapSyncMode``` will render to:
- :qapi:type:`QMP:block-core.BitmapSyncMode`
- * If you don't want to display the "fully qualified" name, it can be
- prefixed with a tilde; ``:qapi:type:`~QMP:block-core.BitmapSyncMode```
- will render to: :qapi:type:`~QMP:block-core.BitmapSyncMode`
- Target resolution
- -----------------
- Any cross-reference to a QAPI type, whether using the ```any``` style of
- reference or the more explicit ```:qapi:any:`target``` syntax, allows
- for the presence or absence of either the namespace or module
- information.
- When absent, their value will be inferred from context by the presence
- of any ``qapi:namespace`` or ``qapi:module`` directives preceding the
- cross-reference.
- If no results are found when using the inferred values, other
- namespaces/modules will be searched as a last resort; but any explicitly
- provided values must always match in order to succeed.
- This allows for efficient cross-referencing with a minimum of syntax in
- the large majority of cases, but additional context or namespace markup
- may be required outside of the QAPI reference documents when linking to
- items that share a name across multiple documented QAPI schema.
- Custom link text
- ----------------
- The name of a cross-reference link can be explicitly overridden like
- `most stock Sphinx references
- <https://www.sphinx-doc.org/en/master/usage/referencing.html#syntax>`_
- using the ``custom text <target>`` syntax.
- For example, ``:qapi:cmd:`Merge dirty bitmaps
- <block-dirty-bitmap-merge>``` will render as: :qapi:cmd:`Merge dirty
- bitmaps <QMP:block-dirty-bitmap-merge>`
- Directives
- ==========
- The QAPI domain adds a number of custom directives for documenting
- various QAPI/QMP entities. The syntax is plain rST, and follows this
- general format::
- .. qapi:directive:: argument
- :option:
- :another-option: with an argument
- Content body, arbitrary rST is allowed here.
- Sphinx standard options
- -----------------------
- All QAPI directives inherit a number of `standard options
- <https://www.sphinx-doc.org/en/master/usage/domains/index.html#basic-markup>`_
- from Sphinx's ObjectDescription class.
- The dashed spellings of the below options were added in Sphinx 7.2, the
- undashed spellings are currently retained as aliases, but will be
- removed in a future version.
- * ``:no-index:`` and ``:noindex:`` -- Do not add this item into the
- Index, and do not make it available for cross-referencing.
- * ``no-index-entry:`` and ``:noindexentry:`` -- Do not add this item
- into the Index, but allow it to be cross-referenced.
- * ``no-contents-entry`` and ``:nocontentsentry:`` -- Exclude this item
- from the Table of Contents.
- * ``no-typesetting`` -- Create TOC, Index and cross-referencing
- entities, but don't actually display the content.
- QAPI standard options
- ---------------------
- All QAPI directives -- *except* for namespace and module -- support
- these common options.
- * ``:namespace: name`` -- This option allows you to override the
- namespace association of a given definition.
- * ``:module: modname`` -- Borrowed from the Python domain, this option allows
- you to override the module association of a given definition.
- * ``:since: x.y`` -- Allows the documenting of "Since" information, which is
- displayed in the signature bar.
- * ``:ifcond: CONDITION`` -- Allows the documenting of conditional availability
- information, which is displayed in an eyecatch just below the
- signature bar.
- * ``:deprecated:`` -- Adds an eyecatch just below the signature bar that
- advertises that this definition is deprecated and should be avoided.
- * ``:unstable:`` -- Adds an eyecatch just below the signature bar that
- advertises that this definition is unstable and should not be used in
- production code.
- qapi:namespace
- --------------
- The ``qapi:namespace`` directive marks the start of a QAPI namespace. It
- does not take a content body, nor any options. All subsequent QAPI
- directives are associated with the most recent namespace. This affects
- the definition's "fully qualified name", allowing two different
- namespaces to create an otherwise identically named definition.
- This directive also influences how reference resolution works for any
- references that do not explicitly specify a namespace, so this directive
- can be used to nudge references into preferring targets from within that
- namespace.
- Example::
- .. qapi:namespace:: QMP
- This directive has no visible effect.
- qapi:module
- -----------
- The ``qapi:module`` directive marks the start of a QAPI module. It may have
- a content body, but it can be omitted. All subsequent QAPI directives
- are associated with the most recent module; this effects their "fully
- qualified" name, but has no other effect.
- Example::
- .. qapi:module:: block-core
- Welcome to the block-core module!
- Will be rendered as:
- .. qapi:module:: block-core
- :noindex:
- Welcome to the block-core module!
- qapi:command
- ------------
- This directive documents a QMP command. It may use any of the standard
- Sphinx or QAPI options, and the documentation body may contain
- ``:arg:``, ``:feat:``, ``:error:``, or ``:return:`` info field list
- entries.
- Example::
- .. qapi:command:: x-fake-command
- :since: 42.0
- :unstable:
- This command is fake, so it can't hurt you!
- :arg int foo: Your favorite number.
- :arg string? bar: Your favorite season.
- :return [string]: A lovely computer-written poem for you.
- Will be rendered as:
- .. qapi:command:: x-fake-command
- :noindex:
- :since: 42.0
- :unstable:
- This command is fake, so it can't hurt you!
- :arg int foo: Your favorite number.
- :arg string? bar: Your favorite season.
- :return [string]: A lovely computer-written poem for you.
- qapi:event
- ----------
- This directive documents a QMP event. It may use any of the standard
- Sphinx or QAPI options, and the documentation body may contain
- ``:memb:`` or ``:feat:`` info field list entries.
- Example::
- .. qapi:event:: COMPUTER_IS_RUINED
- :since: 0.1
- :deprecated:
- This event is emitted when your computer is *extremely* ruined.
- :memb string reason: Diagnostics as to what caused your computer to
- be ruined.
- :feat sadness: When present, the diagnostic message will also
- explain how sad the computer is as a result of your wrongdoings.
- Will be rendered as:
- .. qapi:event:: COMPUTER_IS_RUINED
- :noindex:
- :since: 0.1
- :deprecated:
- This event is emitted when your computer is *extremely* ruined.
- :memb string reason: Diagnostics as to what caused your computer to
- be ruined.
- :feat sadness: When present, the diagnostic message will also explain
- how sad the computer is as a result of your wrongdoings.
- qapi:enum
- ---------
- This directive documents a QAPI enum. It may use any of the standard
- Sphinx or QAPI options, and the documentation body may contain
- ``:value:`` or ``:feat:`` info field list entries.
- Example::
- .. qapi:enum:: Mood
- :ifcond: LIB_PERSONALITY
- This enum represents your virtual machine's current mood!
- :value Happy: Your VM is content and well-fed.
- :value Hungry: Your VM needs food.
- :value Melancholic: Your VM is experiencing existential angst.
- :value Petulant: Your VM is throwing a temper tantrum.
- Will be rendered as:
- .. qapi:enum:: Mood
- :noindex:
- :ifcond: LIB_PERSONALITY
- This enum represents your virtual machine's current mood!
- :value Happy: Your VM is content and well-fed.
- :value Hungry: Your VM needs food.
- :value Melancholic: Your VM is experiencing existential angst.
- :value Petulant: Your VM is throwing a temper tantrum.
- qapi:object
- -----------
- This directive documents a QAPI structure or union and represents a QMP
- object. It may use any of the standard Sphinx or QAPI options, and the
- documentation body may contain ``:memb:`` or ``:feat:`` info field list
- entries.
- Example::
- .. qapi:object:: BigBlobOfStuff
- This object has a bunch of disparate and unrelated things in it.
- :memb int Birthday: Your birthday, represented in seconds since the
- UNIX epoch.
- :memb [string] Fav-Foods: A list of your favorite foods.
- :memb boolean? Bizarre-Docs: True if the documentation reference
- should be strange.
- Will be rendered as:
- .. qapi:object:: BigBlobOfStuff
- :noindex:
- This object has a bunch of disparate and unrelated things in it.
- :memb int Birthday: Your birthday, represented in seconds since the
- UNIX epoch.
- :memb [string] Fav-Foods: A list of your favorite foods.
- :memb boolean? Bizarre-Docs: True if the documentation reference
- should be strange.
- qapi:alternate
- --------------
- This directive documents a QAPI alternate. It may use any of the
- standard Sphinx or QAPI options, and the documentation body may contain
- ``:alt:`` or ``:feat:`` info field list entries.
- Example::
- .. qapi:alternate:: ErrorCode
- This alternate represents an Error Code from the VM.
- :alt int ec: An error code, like the type you're used to.
- :alt string em: An expletive-laced error message, if your
- computer is feeling particularly cranky and tired of your
- antics.
- Will be rendered as:
- .. qapi:alternate:: ErrorCode
- :noindex:
- This alternate represents an Error Code from the VM.
- :alt int ec: An error code, like the type you're used to.
- :alt string em: An expletive-laced error message, if your
- computer is feeling particularly cranky and tired of your
- antics.
|