qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

qapi-schema.json (44829B)


      1 # *-*- Mode: Python -*-*
      2 # vim: filetype=python
      3 
      4 ##
      5 # = General note concerning the use of guest agent interfaces
      6 #
      7 # "unsupported" is a higher-level error than the errors that individual
      8 # commands might document. The caller should always be prepared to receive
      9 # QERR_UNSUPPORTED, even if the given command doesn't specify it, or doesn't
     10 # document any failure mode at all.
     11 ##
     12 
     13 ##
     14 # = QEMU guest agent protocol commands and structs
     15 ##
     16 
     17 { 'pragma': { 'doc-required': true } }
     18 
     19 # Lists with items allowed to permit QAPI rule violations; think twice
     20 # before you add to them!
     21 { 'pragma': {
     22     # Types whose member names may use '_'
     23     'member-name-exceptions': [
     24         'GuestAgentInfo'
     25     ],
     26     # Commands allowed to return a non-dictionary:
     27     'command-returns-exceptions': [
     28         'guest-file-open',
     29         'guest-fsfreeze-freeze',
     30         'guest-fsfreeze-freeze-list',
     31         'guest-fsfreeze-status',
     32         'guest-fsfreeze-thaw',
     33         'guest-get-time',
     34         'guest-set-vcpus',
     35         'guest-sync',
     36         'guest-sync-delimited' ] } }
     37 
     38 ##
     39 # @guest-sync-delimited:
     40 #
     41 # Echo back a unique integer value, and prepend to response a
     42 # leading sentinel byte (0xFF) the client can check scan for.
     43 #
     44 # This is used by clients talking to the guest agent over the
     45 # wire to ensure the stream is in sync and doesn't contain stale
     46 # data from previous client. It must be issued upon initial
     47 # connection, and after any client-side timeouts (including
     48 # timeouts on receiving a response to this command).
     49 #
     50 # After issuing this request, all guest agent responses should be
     51 # ignored until the response containing the unique integer value
     52 # the client passed in is returned. Receival of the 0xFF sentinel
     53 # byte must be handled as an indication that the client's
     54 # lexer/tokenizer/parser state should be flushed/reset in
     55 # preparation for reliably receiving the subsequent response. As
     56 # an optimization, clients may opt to ignore all data until a
     57 # sentinel value is receiving to avoid unnecessary processing of
     58 # stale data.
     59 #
     60 # Similarly, clients should also precede this *request*
     61 # with a 0xFF byte to make sure the guest agent flushes any
     62 # partially read JSON data from a previous client connection.
     63 #
     64 # @id: randomly generated 64-bit integer
     65 #
     66 # Returns: The unique integer id passed in by the client
     67 #
     68 # Since: 1.1
     69 ##
     70 { 'command': 'guest-sync-delimited',
     71   'data':    { 'id': 'int' },
     72   'returns': 'int' }
     73 
     74 ##
     75 # @guest-sync:
     76 #
     77 # Echo back a unique integer value
     78 #
     79 # This is used by clients talking to the guest agent over the
     80 # wire to ensure the stream is in sync and doesn't contain stale
     81 # data from previous client. All guest agent responses should be
     82 # ignored until the provided unique integer value is returned,
     83 # and it is up to the client to handle stale whole or
     84 # partially-delivered JSON text in such a way that this response
     85 # can be obtained.
     86 #
     87 # In cases where a partial stale response was previously
     88 # received by the client, this cannot always be done reliably.
     89 # One particular scenario being if qemu-ga responses are fed
     90 # character-by-character into a JSON parser. In these situations,
     91 # using guest-sync-delimited may be optimal.
     92 #
     93 # For clients that fetch responses line by line and convert them
     94 # to JSON objects, guest-sync should be sufficient, but note that
     95 # in cases where the channel is dirty some attempts at parsing the
     96 # response may result in a parser error.
     97 #
     98 # Such clients should also precede this command
     99 # with a 0xFF byte to make sure the guest agent flushes any
    100 # partially read JSON data from a previous session.
    101 #
    102 # @id: randomly generated 64-bit integer
    103 #
    104 # Returns: The unique integer id passed in by the client
    105 #
    106 # Since: 0.15.0
    107 ##
    108 { 'command': 'guest-sync',
    109   'data':    { 'id': 'int' },
    110   'returns': 'int' }
    111 
    112 ##
    113 # @guest-ping:
    114 #
    115 # Ping the guest agent, a non-error return implies success
    116 #
    117 # Since: 0.15.0
    118 ##
    119 { 'command': 'guest-ping' }
    120 
    121 ##
    122 # @guest-get-time:
    123 #
    124 # Get the information about guest's System Time relative to
    125 # the Epoch of 1970-01-01 in UTC.
    126 #
    127 # Returns: Time in nanoseconds.
    128 #
    129 # Since: 1.5
    130 ##
    131 { 'command': 'guest-get-time',
    132   'returns': 'int' }
    133 
    134 ##
    135 # @guest-set-time:
    136 #
    137 # Set guest time.
    138 #
    139 # When a guest is paused or migrated to a file then loaded
    140 # from that file, the guest OS has no idea that there
    141 # was a big gap in the time. Depending on how long the
    142 # gap was, NTP might not be able to resynchronize the
    143 # guest.
    144 #
    145 # This command tries to set guest's System Time to the
    146 # given value, then sets the Hardware Clock (RTC) to the
    147 # current System Time. This will make it easier for a guest
    148 # to resynchronize without waiting for NTP. If no @time is
    149 # specified, then the time to set is read from RTC. However,
    150 # this may not be supported on all platforms (i.e. Windows).
    151 # If that's the case users are advised to always pass a
    152 # value.
    153 #
    154 # @time: time of nanoseconds, relative to the Epoch
    155 #        of 1970-01-01 in UTC.
    156 #
    157 # Returns: Nothing on success.
    158 #
    159 # Since: 1.5
    160 ##
    161 { 'command': 'guest-set-time',
    162   'data': { '*time': 'int' } }
    163 
    164 ##
    165 # @GuestAgentCommandInfo:
    166 #
    167 # Information about guest agent commands.
    168 #
    169 # @name: name of the command
    170 #
    171 # @enabled: whether command is currently enabled by guest admin
    172 #
    173 # @success-response: whether command returns a response on success
    174 #                    (since 1.7)
    175 #
    176 # Since: 1.1.0
    177 ##
    178 { 'struct': 'GuestAgentCommandInfo',
    179   'data': { 'name': 'str', 'enabled': 'bool', 'success-response': 'bool' } }
    180 
    181 ##
    182 # @GuestAgentInfo:
    183 #
    184 # Information about guest agent.
    185 #
    186 # @version: guest agent version
    187 #
    188 # @supported_commands: Information about guest agent commands
    189 #
    190 # Since: 0.15.0
    191 ##
    192 { 'struct': 'GuestAgentInfo',
    193   'data': { 'version': 'str',
    194             'supported_commands': ['GuestAgentCommandInfo'] } }
    195 ##
    196 # @guest-info:
    197 #
    198 # Get some information about the guest agent.
    199 #
    200 # Returns: @GuestAgentInfo
    201 #
    202 # Since: 0.15.0
    203 ##
    204 { 'command': 'guest-info',
    205   'returns': 'GuestAgentInfo' }
    206 
    207 ##
    208 # @guest-shutdown:
    209 #
    210 # Initiate guest-activated shutdown. Note: this is an asynchronous
    211 # shutdown request, with no guarantee of successful shutdown.
    212 #
    213 # @mode: "halt", "powerdown" (default), or "reboot"
    214 #
    215 # This command does NOT return a response on success. Success condition
    216 # is indicated by the VM exiting with a zero exit status or, when
    217 # running with --no-shutdown, by issuing the query-status QMP command
    218 # to confirm the VM status is "shutdown".
    219 #
    220 # Since: 0.15.0
    221 ##
    222 { 'command': 'guest-shutdown', 'data': { '*mode': 'str' },
    223   'success-response': false }
    224 
    225 ##
    226 # @guest-file-open:
    227 #
    228 # Open a file in the guest and retrieve a file handle for it
    229 #
    230 # @path: Full path to the file in the guest to open.
    231 #
    232 # @mode: open mode, as per fopen(), "r" is the default.
    233 #
    234 # Returns: Guest file handle on success.
    235 #
    236 # Since: 0.15.0
    237 ##
    238 { 'command': 'guest-file-open',
    239   'data':    { 'path': 'str', '*mode': 'str' },
    240   'returns': 'int' }
    241 
    242 ##
    243 # @guest-file-close:
    244 #
    245 # Close an open file in the guest
    246 #
    247 # @handle: filehandle returned by guest-file-open
    248 #
    249 # Returns: Nothing on success.
    250 #
    251 # Since: 0.15.0
    252 ##
    253 { 'command': 'guest-file-close',
    254   'data': { 'handle': 'int' } }
    255 
    256 ##
    257 # @GuestFileRead:
    258 #
    259 # Result of guest agent file-read operation
    260 #
    261 # @count: number of bytes read (note: count is *before*
    262 #         base64-encoding is applied)
    263 #
    264 # @buf-b64: base64-encoded bytes read
    265 #
    266 # @eof: whether EOF was encountered during read operation.
    267 #
    268 # Since: 0.15.0
    269 ##
    270 { 'struct': 'GuestFileRead',
    271   'data': { 'count': 'int', 'buf-b64': 'str', 'eof': 'bool' } }
    272 
    273 ##
    274 # @guest-file-read:
    275 #
    276 # Read from an open file in the guest. Data will be base64-encoded.
    277 # As this command is just for limited, ad-hoc debugging, such as log
    278 # file access, the number of bytes to read is limited to 48 MB.
    279 #
    280 # @handle: filehandle returned by guest-file-open
    281 #
    282 # @count: maximum number of bytes to read (default is 4KB, maximum is 48MB)
    283 #
    284 # Returns: @GuestFileRead on success.
    285 #
    286 # Since: 0.15.0
    287 ##
    288 { 'command': 'guest-file-read',
    289   'data':    { 'handle': 'int', '*count': 'int' },
    290   'returns': 'GuestFileRead' }
    291 
    292 ##
    293 # @GuestFileWrite:
    294 #
    295 # Result of guest agent file-write operation
    296 #
    297 # @count: number of bytes written (note: count is actual bytes
    298 #         written, after base64-decoding of provided buffer)
    299 #
    300 # @eof: whether EOF was encountered during write operation.
    301 #
    302 # Since: 0.15.0
    303 ##
    304 { 'struct': 'GuestFileWrite',
    305   'data': { 'count': 'int', 'eof': 'bool' } }
    306 
    307 ##
    308 # @guest-file-write:
    309 #
    310 # Write to an open file in the guest.
    311 #
    312 # @handle: filehandle returned by guest-file-open
    313 #
    314 # @buf-b64: base64-encoded string representing data to be written
    315 #
    316 # @count: bytes to write (actual bytes, after base64-decode),
    317 #         default is all content in buf-b64 buffer after base64 decoding
    318 #
    319 # Returns: @GuestFileWrite on success.
    320 #
    321 # Since: 0.15.0
    322 ##
    323 { 'command': 'guest-file-write',
    324   'data':    { 'handle': 'int', 'buf-b64': 'str', '*count': 'int' },
    325   'returns': 'GuestFileWrite' }
    326 
    327 
    328 ##
    329 # @GuestFileSeek:
    330 #
    331 # Result of guest agent file-seek operation
    332 #
    333 # @position: current file position
    334 #
    335 # @eof: whether EOF was encountered during file seek
    336 #
    337 # Since: 0.15.0
    338 ##
    339 { 'struct': 'GuestFileSeek',
    340   'data': { 'position': 'int', 'eof': 'bool' } }
    341 
    342 ##
    343 # @QGASeek:
    344 #
    345 # Symbolic names for use in @guest-file-seek
    346 #
    347 # @set: Set to the specified offset (same effect as 'whence':0)
    348 # @cur: Add offset to the current location (same effect as 'whence':1)
    349 # @end: Add offset to the end of the file (same effect as 'whence':2)
    350 #
    351 # Since: 2.6
    352 ##
    353 { 'enum': 'QGASeek', 'data': [ 'set', 'cur', 'end' ] }
    354 
    355 ##
    356 # @GuestFileWhence:
    357 #
    358 # Controls the meaning of offset to @guest-file-seek.
    359 #
    360 # @value: Integral value (0 for set, 1 for cur, 2 for end), available
    361 #         for historical reasons, and might differ from the host's or
    362 #         guest's SEEK_* values (since: 0.15)
    363 # @name: Symbolic name, and preferred interface
    364 #
    365 # Since: 2.6
    366 ##
    367 { 'alternate': 'GuestFileWhence',
    368   'data': { 'value': 'int', 'name': 'QGASeek' } }
    369 
    370 ##
    371 # @guest-file-seek:
    372 #
    373 # Seek to a position in the file, as with fseek(), and return the
    374 # current file position afterward. Also encapsulates ftell()'s
    375 # functionality, with offset=0 and whence=1.
    376 #
    377 # @handle: filehandle returned by guest-file-open
    378 #
    379 # @offset: bytes to skip over in the file stream
    380 #
    381 # @whence: Symbolic or numeric code for interpreting offset
    382 #
    383 # Returns: @GuestFileSeek on success.
    384 #
    385 # Since: 0.15.0
    386 ##
    387 { 'command': 'guest-file-seek',
    388   'data':    { 'handle': 'int', 'offset': 'int',
    389                'whence': 'GuestFileWhence' },
    390   'returns': 'GuestFileSeek' }
    391 
    392 ##
    393 # @guest-file-flush:
    394 #
    395 # Write file changes buffered in userspace to disk/kernel buffers
    396 #
    397 # @handle: filehandle returned by guest-file-open
    398 #
    399 # Returns: Nothing on success.
    400 #
    401 # Since: 0.15.0
    402 ##
    403 { 'command': 'guest-file-flush',
    404   'data': { 'handle': 'int' } }
    405 
    406 ##
    407 # @GuestFsfreezeStatus:
    408 #
    409 # An enumeration of filesystem freeze states
    410 #
    411 # @thawed: filesystems thawed/unfrozen
    412 #
    413 # @frozen: all non-network guest filesystems frozen
    414 #
    415 # Since: 0.15.0
    416 ##
    417 { 'enum': 'GuestFsfreezeStatus',
    418   'data': [ 'thawed', 'frozen' ] }
    419 
    420 ##
    421 # @guest-fsfreeze-status:
    422 #
    423 # Get guest fsfreeze state. error state indicates
    424 #
    425 # Returns: GuestFsfreezeStatus ("thawed", "frozen", etc., as defined below)
    426 #
    427 # Note: This may fail to properly report the current state as a result of
    428 #       some other guest processes having issued an fs freeze/thaw.
    429 #
    430 # Since: 0.15.0
    431 ##
    432 { 'command': 'guest-fsfreeze-status',
    433   'returns': 'GuestFsfreezeStatus' }
    434 
    435 ##
    436 # @guest-fsfreeze-freeze:
    437 #
    438 # Sync and freeze all freezable, local guest filesystems. If this
    439 # command succeeded, you may call @guest-fsfreeze-thaw later to
    440 # unfreeze.
    441 #
    442 # Note: On Windows, the command is implemented with the help of a
    443 #       Volume Shadow-copy Service DLL helper. The frozen state is limited
    444 #       for up to 10 seconds by VSS.
    445 #
    446 # Returns: Number of file systems currently frozen. On error, all filesystems
    447 #          will be thawed. If no filesystems are frozen as a result of this call,
    448 #          then @guest-fsfreeze-status will remain "thawed" and calling
    449 #          @guest-fsfreeze-thaw is not necessary.
    450 #
    451 # Since: 0.15.0
    452 ##
    453 { 'command': 'guest-fsfreeze-freeze',
    454   'returns': 'int' }
    455 
    456 ##
    457 # @guest-fsfreeze-freeze-list:
    458 #
    459 # Sync and freeze specified guest filesystems.
    460 # See also @guest-fsfreeze-freeze.
    461 #
    462 # @mountpoints: an array of mountpoints of filesystems to be frozen.
    463 #               If omitted, every mounted filesystem is frozen.
    464 #               Invalid mount points are ignored.
    465 #
    466 # Returns: Number of file systems currently frozen. On error, all filesystems
    467 #          will be thawed.
    468 #
    469 # Since: 2.2
    470 ##
    471 { 'command': 'guest-fsfreeze-freeze-list',
    472   'data':    { '*mountpoints': ['str'] },
    473   'returns': 'int' }
    474 
    475 ##
    476 # @guest-fsfreeze-thaw:
    477 #
    478 # Unfreeze all frozen guest filesystems
    479 #
    480 # Returns: Number of file systems thawed by this call
    481 #
    482 # Note: if return value does not match the previous call to
    483 #       guest-fsfreeze-freeze, this likely means some freezable
    484 #       filesystems were unfrozen before this call, and that the
    485 #       filesystem state may have changed before issuing this
    486 #       command.
    487 #
    488 # Since: 0.15.0
    489 ##
    490 { 'command': 'guest-fsfreeze-thaw',
    491   'returns': 'int' }
    492 
    493 ##
    494 # @GuestFilesystemTrimResult:
    495 #
    496 # @path: path that was trimmed
    497 # @error: an error message when trim failed
    498 # @trimmed: bytes trimmed for this path
    499 # @minimum: reported effective minimum for this path
    500 #
    501 # Since: 2.4
    502 ##
    503 { 'struct': 'GuestFilesystemTrimResult',
    504   'data': {'path': 'str',
    505            '*trimmed': 'int', '*minimum': 'int', '*error': 'str'} }
    506 
    507 ##
    508 # @GuestFilesystemTrimResponse:
    509 #
    510 # @paths: list of @GuestFilesystemTrimResult per path that was trimmed
    511 #
    512 # Since: 2.4
    513 ##
    514 { 'struct': 'GuestFilesystemTrimResponse',
    515   'data': {'paths': ['GuestFilesystemTrimResult']} }
    516 
    517 ##
    518 # @guest-fstrim:
    519 #
    520 # Discard (or "trim") blocks which are not in use by the filesystem.
    521 #
    522 # @minimum: Minimum contiguous free range to discard, in bytes. Free ranges
    523 #           smaller than this may be ignored (this is a hint and the guest
    524 #           may not respect it).  By increasing this value, the fstrim
    525 #           operation will complete more quickly for filesystems with badly
    526 #           fragmented free space, although not all blocks will be discarded.
    527 #           The default value is zero, meaning "discard every free block".
    528 #
    529 # Returns: A @GuestFilesystemTrimResponse which contains the
    530 #          status of all trimmed paths. (since 2.4)
    531 #
    532 # Since: 1.2
    533 ##
    534 { 'command': 'guest-fstrim',
    535   'data': { '*minimum': 'int' },
    536   'returns': 'GuestFilesystemTrimResponse' }
    537 
    538 ##
    539 # @guest-suspend-disk:
    540 #
    541 # Suspend guest to disk.
    542 #
    543 # This command attempts to suspend the guest using three strategies, in this
    544 # order:
    545 #
    546 # - systemd hibernate
    547 # - pm-utils (via pm-hibernate)
    548 # - manual write into sysfs
    549 #
    550 # This command does NOT return a response on success. There is a high chance
    551 # the command succeeded if the VM exits with a zero exit status or, when
    552 # running with --no-shutdown, by issuing the query-status QMP command to
    553 # to confirm the VM status is "shutdown". However, the VM could also exit
    554 # (or set its status to "shutdown") due to other reasons.
    555 #
    556 # The following errors may be returned:
    557 #
    558 # - If suspend to disk is not supported, Unsupported
    559 #
    560 # Notes: It's strongly recommended to issue the guest-sync command before
    561 #        sending commands when the guest resumes
    562 #
    563 # Since: 1.1
    564 ##
    565 { 'command': 'guest-suspend-disk', 'success-response': false }
    566 
    567 ##
    568 # @guest-suspend-ram:
    569 #
    570 # Suspend guest to ram.
    571 #
    572 # This command attempts to suspend the guest using three strategies, in this
    573 # order:
    574 #
    575 # - systemd suspend
    576 # - pm-utils (via pm-suspend)
    577 # - manual write into sysfs
    578 #
    579 # IMPORTANT: guest-suspend-ram requires working wakeup support in
    580 # QEMU. You should check QMP command query-current-machine returns
    581 # wakeup-suspend-support: true before issuing this command. Failure in
    582 # doing so can result in a suspended guest that QEMU will not be able to
    583 # awaken, forcing the user to power cycle the guest to bring it back.
    584 #
    585 # This command does NOT return a response on success. There are two options
    586 # to check for success:
    587 #
    588 # 1. Wait for the SUSPEND QMP event from QEMU
    589 # 2. Issue the query-status QMP command to confirm the VM status is
    590 #    "suspended"
    591 #
    592 # The following errors may be returned:
    593 #
    594 # - If suspend to ram is not supported, Unsupported
    595 #
    596 # Notes: It's strongly recommended to issue the guest-sync command before
    597 #        sending commands when the guest resumes
    598 #
    599 # Since: 1.1
    600 ##
    601 { 'command': 'guest-suspend-ram', 'success-response': false }
    602 
    603 ##
    604 # @guest-suspend-hybrid:
    605 #
    606 # Save guest state to disk and suspend to ram.
    607 #
    608 # This command attempts to suspend the guest by executing, in this order:
    609 #
    610 # - systemd hybrid-sleep
    611 # - pm-utils (via pm-suspend-hybrid)
    612 #
    613 # IMPORTANT: guest-suspend-hybrid requires working wakeup support in
    614 # QEMU. You should check QMP command query-current-machine returns
    615 # wakeup-suspend-support: true before issuing this command. Failure in
    616 # doing so can result in a suspended guest that QEMU will not be able to
    617 # awaken, forcing the user to power cycle the guest to bring it back.
    618 #
    619 # This command does NOT return a response on success. There are two options
    620 # to check for success:
    621 #
    622 # 1. Wait for the SUSPEND QMP event from QEMU
    623 # 2. Issue the query-status QMP command to confirm the VM status is
    624 #    "suspended"
    625 #
    626 # The following errors may be returned:
    627 #
    628 # - If hybrid suspend is not supported, Unsupported
    629 #
    630 # Notes: It's strongly recommended to issue the guest-sync command before
    631 #        sending commands when the guest resumes
    632 #
    633 # Since: 1.1
    634 ##
    635 { 'command': 'guest-suspend-hybrid', 'success-response': false }
    636 
    637 ##
    638 # @GuestIpAddressType:
    639 #
    640 # An enumeration of supported IP address types
    641 #
    642 # @ipv4: IP version 4
    643 #
    644 # @ipv6: IP version 6
    645 #
    646 # Since: 1.1
    647 ##
    648 { 'enum': 'GuestIpAddressType',
    649   'data': [ 'ipv4', 'ipv6' ] }
    650 
    651 ##
    652 # @GuestIpAddress:
    653 #
    654 # @ip-address: IP address
    655 #
    656 # @ip-address-type: Type of @ip-address (e.g. ipv4, ipv6)
    657 #
    658 # @prefix: Network prefix length of @ip-address
    659 #
    660 # Since: 1.1
    661 ##
    662 { 'struct': 'GuestIpAddress',
    663   'data': {'ip-address': 'str',
    664            'ip-address-type': 'GuestIpAddressType',
    665            'prefix': 'int'} }
    666 
    667 ##
    668 # @GuestNetworkInterfaceStat:
    669 #
    670 # @rx-bytes: total bytes received
    671 #
    672 # @rx-packets: total packets received
    673 #
    674 # @rx-errs: bad packets received
    675 #
    676 # @rx-dropped: receiver dropped packets
    677 #
    678 # @tx-bytes: total bytes transmitted
    679 #
    680 # @tx-packets: total packets transmitted
    681 #
    682 # @tx-errs: packet transmit problems
    683 #
    684 # @tx-dropped: dropped packets transmitted
    685 #
    686 # Since: 2.11
    687 ##
    688 { 'struct': 'GuestNetworkInterfaceStat',
    689   'data': {'rx-bytes': 'uint64',
    690             'rx-packets': 'uint64',
    691             'rx-errs': 'uint64',
    692             'rx-dropped': 'uint64',
    693             'tx-bytes': 'uint64',
    694             'tx-packets': 'uint64',
    695             'tx-errs': 'uint64',
    696             'tx-dropped': 'uint64'
    697            } }
    698 
    699 ##
    700 # @GuestNetworkInterface:
    701 #
    702 # @name: The name of interface for which info are being delivered
    703 #
    704 # @hardware-address: Hardware address of @name
    705 #
    706 # @ip-addresses: List of addresses assigned to @name
    707 #
    708 # @statistics: various statistic counters related to @name
    709 #              (since 2.11)
    710 #
    711 # Since: 1.1
    712 ##
    713 { 'struct': 'GuestNetworkInterface',
    714   'data': {'name': 'str',
    715            '*hardware-address': 'str',
    716            '*ip-addresses': ['GuestIpAddress'],
    717            '*statistics': 'GuestNetworkInterfaceStat' } }
    718 
    719 ##
    720 # @guest-network-get-interfaces:
    721 #
    722 # Get list of guest IP addresses, MAC addresses
    723 # and netmasks.
    724 #
    725 # Returns: List of GuestNetworkInfo on success.
    726 #
    727 # Since: 1.1
    728 ##
    729 { 'command': 'guest-network-get-interfaces',
    730   'returns': ['GuestNetworkInterface'] }
    731 
    732 ##
    733 # @GuestLogicalProcessor:
    734 #
    735 # @logical-id: Arbitrary guest-specific unique identifier of the VCPU.
    736 #
    737 # @online: Whether the VCPU is enabled.
    738 #
    739 # @can-offline: Whether offlining the VCPU is possible. This member
    740 #               is always filled in by the guest agent when the structure is
    741 #               returned, and always ignored on input (hence it can be omitted
    742 #               then).
    743 #
    744 # Since: 1.5
    745 ##
    746 { 'struct': 'GuestLogicalProcessor',
    747   'data': {'logical-id': 'int',
    748            'online': 'bool',
    749            '*can-offline': 'bool'} }
    750 
    751 ##
    752 # @guest-get-vcpus:
    753 #
    754 # Retrieve the list of the guest's logical processors.
    755 #
    756 # This is a read-only operation.
    757 #
    758 # Returns: The list of all VCPUs the guest knows about. Each VCPU is put on the
    759 #          list exactly once, but their order is unspecified.
    760 #
    761 # Since: 1.5
    762 ##
    763 { 'command': 'guest-get-vcpus',
    764   'returns': ['GuestLogicalProcessor'] }
    765 
    766 ##
    767 # @guest-set-vcpus:
    768 #
    769 # Attempt to reconfigure (currently: enable/disable) logical processors inside
    770 # the guest.
    771 #
    772 # The input list is processed node by node in order. In each node @logical-id
    773 # is used to look up the guest VCPU, for which @online specifies the requested
    774 # state. The set of distinct @logical-id's is only required to be a subset of
    775 # the guest-supported identifiers. There's no restriction on list length or on
    776 # repeating the same @logical-id (with possibly different @online field).
    777 # Preferably the input list should describe a modified subset of
    778 # @guest-get-vcpus' return value.
    779 #
    780 # Returns: The length of the initial sublist that has been successfully
    781 #          processed. The guest agent maximizes this value. Possible cases:
    782 #
    783 #          - 0:
    784 #            if the @vcpus list was empty on input. Guest state
    785 #            has not been changed. Otherwise,
    786 #          - Error:
    787 #            processing the first node of @vcpus failed for the
    788 #            reason returned. Guest state has not been changed.
    789 #            Otherwise,
    790 #          - < length(@vcpus):
    791 #            more than zero initial nodes have been processed,
    792 #            but not the entire @vcpus list. Guest state has
    793 #            changed accordingly. To retrieve the error
    794 #            (assuming it persists), repeat the call with the
    795 #            successfully processed initial sublist removed.
    796 #            Otherwise,
    797 #          - length(@vcpus):
    798 #            call successful.
    799 #
    800 # Since: 1.5
    801 ##
    802 { 'command': 'guest-set-vcpus',
    803   'data':    {'vcpus': ['GuestLogicalProcessor'] },
    804   'returns': 'int' }
    805 
    806 ##
    807 # @GuestDiskBusType:
    808 #
    809 # An enumeration of bus type of disks
    810 #
    811 # @ide: IDE disks
    812 # @fdc: floppy disks
    813 # @scsi: SCSI disks
    814 # @virtio: virtio disks
    815 # @xen: Xen disks
    816 # @usb: USB disks
    817 # @uml: UML disks
    818 # @sata: SATA disks
    819 # @sd: SD cards
    820 # @unknown: Unknown bus type
    821 # @ieee1394: Win IEEE 1394 bus type
    822 # @ssa: Win SSA bus type
    823 # @fibre: Win fiber channel bus type
    824 # @raid: Win RAID bus type
    825 # @iscsi: Win iScsi bus type
    826 # @sas: Win serial-attaches SCSI bus type
    827 # @mmc: Win multimedia card (MMC) bus type
    828 # @virtual: Win virtual bus type
    829 # @file-backed-virtual: Win file-backed bus type
    830 # @nvme: NVMe disks (since 7.1)
    831 #
    832 # Since: 2.2; 'Unknown' and all entries below since 2.4
    833 ##
    834 { 'enum': 'GuestDiskBusType',
    835   'data': [ 'ide', 'fdc', 'scsi', 'virtio', 'xen', 'usb', 'uml', 'sata',
    836             'sd', 'unknown', 'ieee1394', 'ssa', 'fibre', 'raid', 'iscsi',
    837             'sas', 'mmc', 'virtual', 'file-backed-virtual', 'nvme' ] }
    838 
    839 
    840 ##
    841 # @GuestPCIAddress:
    842 #
    843 # @domain: domain id
    844 # @bus: bus id
    845 # @slot: slot id
    846 # @function: function id
    847 #
    848 # Since: 2.2
    849 ##
    850 { 'struct': 'GuestPCIAddress',
    851   'data': {'domain': 'int', 'bus': 'int',
    852            'slot': 'int', 'function': 'int'} }
    853 
    854 ##
    855 # @GuestCCWAddress:
    856 #
    857 # @cssid: channel subsystem image id
    858 # @ssid: subchannel set id
    859 # @subchno: subchannel number
    860 # @devno: device number
    861 #
    862 # Since: 6.0
    863 ##
    864 { 'struct': 'GuestCCWAddress',
    865   'data': {'cssid': 'int',
    866            'ssid': 'int',
    867            'subchno': 'int',
    868            'devno': 'int'} }
    869 
    870 ##
    871 # @GuestDiskAddress:
    872 #
    873 # @pci-controller: controller's PCI address (fields are set to -1 if invalid)
    874 # @bus-type: bus type
    875 # @bus: bus id
    876 # @target: target id
    877 # @unit: unit id
    878 # @serial: serial number (since: 3.1)
    879 # @dev: device node (POSIX) or device UNC (Windows) (since: 3.1)
    880 # @ccw-address: CCW address on s390x (since: 6.0)
    881 #
    882 # Since: 2.2
    883 ##
    884 { 'struct': 'GuestDiskAddress',
    885   'data': {'pci-controller': 'GuestPCIAddress',
    886            'bus-type': 'GuestDiskBusType',
    887            'bus': 'int', 'target': 'int', 'unit': 'int',
    888            '*serial': 'str', '*dev': 'str',
    889            '*ccw-address': 'GuestCCWAddress'} }
    890 
    891 ##
    892 # @GuestNVMeSmart:
    893 #
    894 # NVMe smart informations, based on NVMe specification,
    895 # section <SMART / Health Information (Log Identifier 02h)>
    896 #
    897 # Since: 7.1
    898 ##
    899 { 'struct': 'GuestNVMeSmart',
    900   'data': {'critical-warning': 'int',
    901            'temperature': 'int',
    902            'available-spare': 'int',
    903            'available-spare-threshold': 'int',
    904            'percentage-used': 'int',
    905            'data-units-read-lo': 'uint64',
    906            'data-units-read-hi': 'uint64',
    907            'data-units-written-lo': 'uint64',
    908            'data-units-written-hi': 'uint64',
    909            'host-read-commands-lo': 'uint64',
    910            'host-read-commands-hi': 'uint64',
    911            'host-write-commands-lo': 'uint64',
    912            'host-write-commands-hi': 'uint64',
    913            'controller-busy-time-lo': 'uint64',
    914            'controller-busy-time-hi': 'uint64',
    915            'power-cycles-lo': 'uint64',
    916            'power-cycles-hi': 'uint64',
    917            'power-on-hours-lo': 'uint64',
    918            'power-on-hours-hi': 'uint64',
    919            'unsafe-shutdowns-lo': 'uint64',
    920            'unsafe-shutdowns-hi': 'uint64',
    921            'media-errors-lo': 'uint64',
    922            'media-errors-hi': 'uint64',
    923            'number-of-error-log-entries-lo': 'uint64',
    924            'number-of-error-log-entries-hi': 'uint64' } }
    925 
    926 ##
    927 # @GuestDiskSmart:
    928 #
    929 # Disk type related smart information.
    930 #
    931 # - @nvme: NVMe disk smart
    932 #
    933 # Since: 7.1
    934 ##
    935 { 'union': 'GuestDiskSmart',
    936   'base': { 'type': 'GuestDiskBusType' },
    937   'discriminator': 'type',
    938   'data': { 'nvme': 'GuestNVMeSmart' } }
    939 
    940 ##
    941 # @GuestDiskInfo:
    942 #
    943 # @name: device node (Linux) or device UNC (Windows)
    944 # @partition: whether this is a partition or disk
    945 # @dependencies: list of device dependencies; e.g. for LVs of the LVM this will
    946 #                hold the list of PVs, for LUKS encrypted volume this will
    947 #                contain the disk where the volume is placed.     (Linux)
    948 # @address: disk address information (only for non-virtual devices)
    949 # @alias: optional alias assigned to the disk, on Linux this is a name assigned
    950 #         by device mapper
    951 # @smart: disk smart information (Since 7.1)
    952 #
    953 # Since: 5.2
    954 ##
    955 { 'struct': 'GuestDiskInfo',
    956   'data': {'name': 'str', 'partition': 'bool', '*dependencies': ['str'],
    957            '*address': 'GuestDiskAddress', '*alias': 'str',
    958            '*smart': 'GuestDiskSmart'} }
    959 
    960 ##
    961 # @guest-get-disks:
    962 #
    963 # Returns: The list of disks in the guest. For Windows these are only the
    964 #          physical disks. On Linux these are all root block devices of
    965 #          non-zero size including e.g. removable devices, loop devices,
    966 #          NBD, etc.
    967 #
    968 # Since: 5.2
    969 ##
    970 { 'command': 'guest-get-disks',
    971   'returns': ['GuestDiskInfo'] }
    972 
    973 ##
    974 # @GuestFilesystemInfo:
    975 #
    976 # @name: disk name
    977 # @mountpoint: mount point path
    978 # @type: file system type string
    979 # @used-bytes: file system used bytes (since 3.0)
    980 # @total-bytes: non-root file system total bytes (since 3.0)
    981 # @disk: an array of disk hardware information that the volume lies on,
    982 #        which may be empty if the disk type is not supported
    983 #
    984 # Since: 2.2
    985 ##
    986 { 'struct': 'GuestFilesystemInfo',
    987   'data': {'name': 'str', 'mountpoint': 'str', 'type': 'str',
    988            '*used-bytes': 'uint64', '*total-bytes': 'uint64',
    989            'disk': ['GuestDiskAddress']} }
    990 
    991 ##
    992 # @guest-get-fsinfo:
    993 #
    994 # Returns: The list of filesystems information mounted in the guest.
    995 #          The returned mountpoints may be specified to
    996 #          @guest-fsfreeze-freeze-list.
    997 #          Network filesystems (such as CIFS and NFS) are not listed.
    998 #
    999 # Since: 2.2
   1000 ##
   1001 { 'command': 'guest-get-fsinfo',
   1002   'returns': ['GuestFilesystemInfo'] }
   1003 
   1004 ##
   1005 # @guest-set-user-password:
   1006 #
   1007 # @username: the user account whose password to change
   1008 # @password: the new password entry string, base64 encoded
   1009 # @crypted: true if password is already crypt()d, false if raw
   1010 #
   1011 # If the @crypted flag is true, it is the caller's responsibility
   1012 # to ensure the correct crypt() encryption scheme is used. This
   1013 # command does not attempt to interpret or report on the encryption
   1014 # scheme. Refer to the documentation of the guest operating system
   1015 # in question to determine what is supported.
   1016 #
   1017 # Not all guest operating systems will support use of the
   1018 # @crypted flag, as they may require the clear-text password
   1019 #
   1020 # The @password parameter must always be base64 encoded before
   1021 # transmission, even if already crypt()d, to ensure it is 8-bit
   1022 # safe when passed as JSON.
   1023 #
   1024 # Returns: Nothing on success.
   1025 #
   1026 # Since: 2.3
   1027 ##
   1028 { 'command': 'guest-set-user-password',
   1029   'data': { 'username': 'str', 'password': 'str', 'crypted': 'bool' } }
   1030 
   1031 ##
   1032 # @GuestMemoryBlock:
   1033 #
   1034 # @phys-index: Arbitrary guest-specific unique identifier of the MEMORY BLOCK.
   1035 #
   1036 # @online: Whether the MEMORY BLOCK is enabled in guest.
   1037 #
   1038 # @can-offline: Whether offlining the MEMORY BLOCK is possible.
   1039 #               This member is always filled in by the guest agent when the
   1040 #               structure is returned, and always ignored on input (hence it
   1041 #               can be omitted then).
   1042 #
   1043 # Since: 2.3
   1044 ##
   1045 { 'struct': 'GuestMemoryBlock',
   1046   'data': {'phys-index': 'uint64',
   1047            'online': 'bool',
   1048            '*can-offline': 'bool'} }
   1049 
   1050 ##
   1051 # @guest-get-memory-blocks:
   1052 #
   1053 # Retrieve the list of the guest's memory blocks.
   1054 #
   1055 # This is a read-only operation.
   1056 #
   1057 # Returns: The list of all memory blocks the guest knows about.
   1058 #          Each memory block is put on the list exactly once, but their order
   1059 #          is unspecified.
   1060 #
   1061 # Since: 2.3
   1062 ##
   1063 { 'command': 'guest-get-memory-blocks',
   1064   'returns': ['GuestMemoryBlock'] }
   1065 
   1066 ##
   1067 # @GuestMemoryBlockResponseType:
   1068 #
   1069 # An enumeration of memory block operation result.
   1070 #
   1071 # @success: the operation of online/offline memory block is successful.
   1072 # @not-found: can't find the corresponding memoryXXX directory in sysfs.
   1073 # @operation-not-supported: for some old kernels, it does not support
   1074 #                           online or offline memory block.
   1075 # @operation-failed: the operation of online/offline memory block fails,
   1076 #                    because of some errors happen.
   1077 #
   1078 # Since: 2.3
   1079 ##
   1080 { 'enum': 'GuestMemoryBlockResponseType',
   1081   'data': ['success', 'not-found', 'operation-not-supported',
   1082            'operation-failed'] }
   1083 
   1084 ##
   1085 # @GuestMemoryBlockResponse:
   1086 #
   1087 # @phys-index: same with the 'phys-index' member of @GuestMemoryBlock.
   1088 #
   1089 # @response: the result of memory block operation.
   1090 #
   1091 # @error-code: the error number.
   1092 #              When memory block operation fails, we assign the value of
   1093 #              'errno' to this member, it indicates what goes wrong.
   1094 #              When the operation succeeds, it will be omitted.
   1095 #
   1096 # Since: 2.3
   1097 ##
   1098 { 'struct': 'GuestMemoryBlockResponse',
   1099   'data': { 'phys-index': 'uint64',
   1100             'response': 'GuestMemoryBlockResponseType',
   1101             '*error-code': 'int' }}
   1102 
   1103 ##
   1104 # @guest-set-memory-blocks:
   1105 #
   1106 # Attempt to reconfigure (currently: enable/disable) state of memory blocks
   1107 # inside the guest.
   1108 #
   1109 # The input list is processed node by node in order. In each node @phys-index
   1110 # is used to look up the guest MEMORY BLOCK, for which @online specifies the
   1111 # requested state. The set of distinct @phys-index's is only required to be a
   1112 # subset of the guest-supported identifiers. There's no restriction on list
   1113 # length or on repeating the same @phys-index (with possibly different @online
   1114 # field).
   1115 # Preferably the input list should describe a modified subset of
   1116 # @guest-get-memory-blocks' return value.
   1117 #
   1118 # Returns: The operation results, it is a list of @GuestMemoryBlockResponse,
   1119 #          which is corresponding to the input list.
   1120 #
   1121 #          Note: it will return NULL if the @mem-blks list was empty on input,
   1122 #          or there is an error, and in this case, guest state will not be
   1123 #          changed.
   1124 #
   1125 # Since: 2.3
   1126 ##
   1127 { 'command': 'guest-set-memory-blocks',
   1128   'data':    {'mem-blks': ['GuestMemoryBlock'] },
   1129   'returns': ['GuestMemoryBlockResponse'] }
   1130 
   1131 ##
   1132 # @GuestMemoryBlockInfo:
   1133 #
   1134 # @size: the size (in bytes) of the guest memory blocks,
   1135 #        which are the minimal units of memory block online/offline
   1136 #        operations (also called Logical Memory Hotplug).
   1137 #
   1138 # Since: 2.3
   1139 ##
   1140 { 'struct': 'GuestMemoryBlockInfo',
   1141   'data': {'size': 'uint64'} }
   1142 
   1143 ##
   1144 # @guest-get-memory-block-info:
   1145 #
   1146 # Get information relating to guest memory blocks.
   1147 #
   1148 # Returns: @GuestMemoryBlockInfo
   1149 #
   1150 # Since: 2.3
   1151 ##
   1152 { 'command': 'guest-get-memory-block-info',
   1153   'returns': 'GuestMemoryBlockInfo' }
   1154 
   1155 ##
   1156 # @GuestExecStatus:
   1157 #
   1158 # @exited: true if process has already terminated.
   1159 # @exitcode: process exit code if it was normally terminated.
   1160 # @signal: signal number (linux) or unhandled exception code
   1161 #          (windows) if the process was abnormally terminated.
   1162 # @out-data: base64-encoded stdout of the process
   1163 # @err-data: base64-encoded stderr of the process
   1164 #            Note: @out-data and @err-data are present only
   1165 #            if 'capture-output' was specified for 'guest-exec'
   1166 # @out-truncated: true if stdout was not fully captured
   1167 #                 due to size limitation.
   1168 # @err-truncated: true if stderr was not fully captured
   1169 #                 due to size limitation.
   1170 #
   1171 # Since: 2.5
   1172 ##
   1173 { 'struct': 'GuestExecStatus',
   1174   'data': { 'exited': 'bool', '*exitcode': 'int', '*signal': 'int',
   1175             '*out-data': 'str', '*err-data': 'str',
   1176             '*out-truncated': 'bool', '*err-truncated': 'bool' }}
   1177 ##
   1178 # @guest-exec-status:
   1179 #
   1180 # Check status of process associated with PID retrieved via guest-exec.
   1181 # Reap the process and associated metadata if it has exited.
   1182 #
   1183 # @pid: pid returned from guest-exec
   1184 #
   1185 # Returns: GuestExecStatus on success.
   1186 #
   1187 # Since: 2.5
   1188 ##
   1189 { 'command': 'guest-exec-status',
   1190   'data':    { 'pid': 'int' },
   1191   'returns': 'GuestExecStatus' }
   1192 
   1193 ##
   1194 # @GuestExec:
   1195 #
   1196 # @pid: pid of child process in guest OS
   1197 #
   1198 # Since: 2.5
   1199 ##
   1200 { 'struct': 'GuestExec',
   1201   'data': { 'pid': 'int'} }
   1202 
   1203 ##
   1204 # @guest-exec:
   1205 #
   1206 # Execute a command in the guest
   1207 #
   1208 # @path: path or executable name to execute
   1209 # @arg: argument list to pass to executable
   1210 # @env: environment variables to pass to executable
   1211 # @input-data: data to be passed to process stdin (base64 encoded)
   1212 # @capture-output: bool flag to enable capture of
   1213 #                  stdout/stderr of running process. defaults to false.
   1214 #
   1215 # Returns: PID on success.
   1216 #
   1217 # Since: 2.5
   1218 ##
   1219 { 'command': 'guest-exec',
   1220   'data':    { 'path': 'str', '*arg': ['str'], '*env': ['str'],
   1221                '*input-data': 'str', '*capture-output': 'bool' },
   1222   'returns': 'GuestExec' }
   1223 
   1224 
   1225 ##
   1226 # @GuestHostName:
   1227 #
   1228 # @host-name: Fully qualified domain name of the guest OS
   1229 #
   1230 # Since: 2.10
   1231 ##
   1232 { 'struct': 'GuestHostName',
   1233   'data':   { 'host-name': 'str' } }
   1234 
   1235 ##
   1236 # @guest-get-host-name:
   1237 #
   1238 # Return a name for the machine.
   1239 #
   1240 # The returned name is not necessarily a fully-qualified domain name, or even
   1241 # present in DNS or some other name service at all. It need not even be unique
   1242 # on your local network or site, but usually it is.
   1243 #
   1244 # Returns: the host name of the machine on success
   1245 #
   1246 # Since: 2.10
   1247 ##
   1248 { 'command': 'guest-get-host-name',
   1249   'returns': 'GuestHostName' }
   1250 
   1251 
   1252 ##
   1253 # @GuestUser:
   1254 #
   1255 # @user: Username
   1256 # @domain: Logon domain (windows only)
   1257 # @login-time: Time of login of this user on the computer. If multiple
   1258 #              instances of the user are logged in, the earliest login time is
   1259 #              reported. The value is in fractional seconds since epoch time.
   1260 #
   1261 # Since: 2.10
   1262 ##
   1263 { 'struct': 'GuestUser',
   1264   'data': { 'user': 'str', 'login-time': 'number', '*domain': 'str' } }
   1265 
   1266 ##
   1267 # @guest-get-users:
   1268 # Retrieves a list of currently active users on the VM.
   1269 #
   1270 # Returns: A unique list of users.
   1271 #
   1272 # Since: 2.10
   1273 ##
   1274 { 'command': 'guest-get-users',
   1275   'returns': ['GuestUser'] }
   1276 
   1277 ##
   1278 # @GuestTimezone:
   1279 #
   1280 # @zone: Timezone name. These values may differ depending on guest/OS and
   1281 #        should only be used for informational purposes.
   1282 # @offset: Offset to UTC in seconds, negative numbers for time zones west of
   1283 #          GMT, positive numbers for east
   1284 #
   1285 # Since: 2.10
   1286 ##
   1287 { 'struct': 'GuestTimezone',
   1288   'data':   { '*zone': 'str', 'offset': 'int' } }
   1289 
   1290 ##
   1291 # @guest-get-timezone:
   1292 #
   1293 # Retrieves the timezone information from the guest.
   1294 #
   1295 # Returns: A GuestTimezone dictionary.
   1296 #
   1297 # Since: 2.10
   1298 ##
   1299 { 'command': 'guest-get-timezone',
   1300   'returns': 'GuestTimezone' }
   1301 
   1302 ##
   1303 # @GuestOSInfo:
   1304 #
   1305 # @kernel-release:
   1306 # * POSIX: release field returned by uname(2)
   1307 # * Windows: build number of the OS
   1308 # @kernel-version:
   1309 # * POSIX: version field returned by uname(2)
   1310 # * Windows: version number of the OS
   1311 # @machine:
   1312 # * POSIX: machine field returned by uname(2)
   1313 # * Windows: one of x86, x86_64, arm, ia64
   1314 # @id:
   1315 # * POSIX: as defined by os-release(5)
   1316 # * Windows: contains string "mswindows"
   1317 # @name:
   1318 # * POSIX: as defined by os-release(5)
   1319 # * Windows: contains string "Microsoft Windows"
   1320 # @pretty-name:
   1321 # * POSIX: as defined by os-release(5)
   1322 # * Windows: product name, e.g. "Microsoft Windows 10 Enterprise"
   1323 # @version:
   1324 # * POSIX: as defined by os-release(5)
   1325 # * Windows: long version string, e.g. "Microsoft Windows Server 2008"
   1326 # @version-id:
   1327 # * POSIX: as defined by os-release(5)
   1328 # * Windows: short version identifier, e.g. "7" or "20012r2"
   1329 # @variant:
   1330 # * POSIX: as defined by os-release(5)
   1331 # * Windows: contains string "server" or "client"
   1332 # @variant-id:
   1333 # * POSIX: as defined by os-release(5)
   1334 # * Windows: contains string "server" or "client"
   1335 #
   1336 # Notes:
   1337 #
   1338 # On POSIX systems the fields @id, @name, @pretty-name, @version, @version-id,
   1339 # @variant and @variant-id follow the definition specified in os-release(5).
   1340 # Refer to the manual page for exact description of the fields. Their values
   1341 # are taken from the os-release file. If the file is not present in the system,
   1342 # or the values are not present in the file, the fields are not included.
   1343 #
   1344 # On Windows the values are filled from information gathered from the system.
   1345 #
   1346 # Since: 2.10
   1347 ##
   1348 { 'struct': 'GuestOSInfo',
   1349   'data': {
   1350       '*kernel-release': 'str', '*kernel-version': 'str',
   1351       '*machine': 'str', '*id': 'str', '*name': 'str',
   1352       '*pretty-name': 'str', '*version': 'str', '*version-id': 'str',
   1353       '*variant': 'str', '*variant-id': 'str' } }
   1354 
   1355 ##
   1356 # @guest-get-osinfo:
   1357 #
   1358 # Retrieve guest operating system information
   1359 #
   1360 # Returns: @GuestOSInfo
   1361 #
   1362 # Since: 2.10
   1363 ##
   1364 { 'command': 'guest-get-osinfo',
   1365   'returns': 'GuestOSInfo' }
   1366 
   1367 ##
   1368 # @GuestDeviceType:
   1369 ##
   1370 { 'enum': 'GuestDeviceType',
   1371   'data': [ 'pci' ] }
   1372 
   1373 ##
   1374 # @GuestDeviceIdPCI:
   1375 #
   1376 # @vendor-id: vendor ID
   1377 # @device-id: device ID
   1378 #
   1379 # Since: 5.2
   1380 ##
   1381 { 'struct': 'GuestDeviceIdPCI',
   1382   'data': { 'vendor-id': 'uint16', 'device-id': 'uint16' } }
   1383 
   1384 ##
   1385 # @GuestDeviceId:
   1386 #
   1387 # Id of the device
   1388 # - @pci: PCI ID, since: 5.2
   1389 #
   1390 # Since: 5.2
   1391 ##
   1392 { 'union': 'GuestDeviceId',
   1393   'base': { 'type': 'GuestDeviceType' },
   1394   'discriminator': 'type',
   1395   'data': { 'pci': 'GuestDeviceIdPCI' } }
   1396 
   1397 ##
   1398 # @GuestDeviceInfo:
   1399 #
   1400 # @driver-name: name of the associated driver
   1401 # @driver-date: driver release date, in nanoseconds since the epoch
   1402 # @driver-version: driver version
   1403 # @id: device ID
   1404 #
   1405 # Since: 5.2
   1406 ##
   1407 { 'struct': 'GuestDeviceInfo',
   1408   'data': {
   1409       'driver-name': 'str',
   1410       '*driver-date': 'int',
   1411       '*driver-version': 'str',
   1412       '*id': 'GuestDeviceId'
   1413   } }
   1414 
   1415 ##
   1416 # @guest-get-devices:
   1417 #
   1418 # Retrieve information about device drivers in Windows guest
   1419 #
   1420 # Returns: @GuestDeviceInfo
   1421 #
   1422 # Since: 5.2
   1423 ##
   1424 { 'command': 'guest-get-devices',
   1425   'returns': ['GuestDeviceInfo'] }
   1426 
   1427 ##
   1428 # @GuestAuthorizedKeys:
   1429 #
   1430 # @keys: public keys (in OpenSSH/sshd(8) authorized_keys format)
   1431 #
   1432 # Since: 5.2
   1433 ##
   1434 { 'struct': 'GuestAuthorizedKeys',
   1435   'data': {
   1436       'keys': ['str']
   1437   },
   1438   'if': 'CONFIG_POSIX' }
   1439 
   1440 
   1441 ##
   1442 # @guest-ssh-get-authorized-keys:
   1443 #
   1444 # @username: the user account to add the authorized keys
   1445 #
   1446 # Return the public keys from user .ssh/authorized_keys on Unix systems (not
   1447 # implemented for other systems).
   1448 #
   1449 # Returns: @GuestAuthorizedKeys
   1450 #
   1451 # Since: 5.2
   1452 ##
   1453 { 'command': 'guest-ssh-get-authorized-keys',
   1454   'data': { 'username': 'str' },
   1455   'returns': 'GuestAuthorizedKeys',
   1456   'if': 'CONFIG_POSIX' }
   1457 
   1458 ##
   1459 # @guest-ssh-add-authorized-keys:
   1460 #
   1461 # @username: the user account to add the authorized keys
   1462 # @keys: the public keys to add (in OpenSSH/sshd(8) authorized_keys format)
   1463 # @reset: ignore the existing content, set it with the given keys only
   1464 #
   1465 # Append public keys to user .ssh/authorized_keys on Unix systems (not
   1466 # implemented for other systems).
   1467 #
   1468 # Returns: Nothing on success.
   1469 #
   1470 # Since: 5.2
   1471 ##
   1472 { 'command': 'guest-ssh-add-authorized-keys',
   1473   'data': { 'username': 'str', 'keys': ['str'], '*reset': 'bool' },
   1474   'if': 'CONFIG_POSIX' }
   1475 
   1476 ##
   1477 # @guest-ssh-remove-authorized-keys:
   1478 #
   1479 # @username: the user account to remove the authorized keys
   1480 # @keys: the public keys to remove (in OpenSSH/sshd(8) authorized_keys format)
   1481 #
   1482 # Remove public keys from the user .ssh/authorized_keys on Unix systems (not
   1483 # implemented for other systems). It's not an error if the key is already
   1484 # missing.
   1485 #
   1486 # Returns: Nothing on success.
   1487 #
   1488 # Since: 5.2
   1489 ##
   1490 { 'command': 'guest-ssh-remove-authorized-keys',
   1491   'data': { 'username': 'str', 'keys': ['str'] },
   1492   'if': 'CONFIG_POSIX' }
   1493 
   1494 ##
   1495 # @GuestDiskStats:
   1496 #
   1497 # @read-sectors: sectors read
   1498 #
   1499 # @read-ios: reads completed successfully
   1500 #
   1501 # @read-merges: read requests merged
   1502 #
   1503 # @write-sectors: sectors written
   1504 #
   1505 # @write-ios: writes completed
   1506 #
   1507 # @write-merges: write requests merged
   1508 #
   1509 # @discard-sectors: sectors discarded
   1510 #
   1511 # @discard-ios: discards completed successfully
   1512 #
   1513 # @discard-merges: discard requests merged
   1514 #
   1515 # @flush-ios: flush requests completed successfully
   1516 #
   1517 # @read-ticks: time spent reading(ms)
   1518 #
   1519 # @write-ticks: time spent writing(ms)
   1520 #
   1521 # @discard-ticks: time spent discarding(ms)
   1522 #
   1523 # @flush-ticks: time spent flushing(ms)
   1524 #
   1525 # @ios-pgr: number of I/Os currently in flight
   1526 #
   1527 # @total-ticks: time spent doing I/Os (ms)
   1528 #
   1529 # @weight-ticks: weighted time spent doing I/Os since the last update of this field(ms)
   1530 #
   1531 # Since: 7.1
   1532 ##
   1533 { 'struct': 'GuestDiskStats',
   1534   'data': {'*read-sectors': 'uint64',
   1535            '*read-ios': 'uint64',
   1536            '*read-merges': 'uint64',
   1537            '*write-sectors': 'uint64',
   1538            '*write-ios': 'uint64',
   1539            '*write-merges': 'uint64',
   1540            '*discard-sectors': 'uint64',
   1541            '*discard-ios': 'uint64',
   1542            '*discard-merges': 'uint64',
   1543            '*flush-ios': 'uint64',
   1544            '*read-ticks': 'uint64',
   1545            '*write-ticks': 'uint64',
   1546            '*discard-ticks': 'uint64',
   1547            '*flush-ticks': 'uint64',
   1548            '*ios-pgr': 'uint64',
   1549            '*total-ticks': 'uint64',
   1550            '*weight-ticks': 'uint64'
   1551            } }
   1552 
   1553 ##
   1554 # @GuestDiskStatsInfo:
   1555 #
   1556 # @name disk name
   1557 #
   1558 # @major major device number of disk
   1559 #
   1560 # @minor minor device number of disk
   1561 ##
   1562 { 'struct': 'GuestDiskStatsInfo',
   1563   'data': {'name': 'str',
   1564            'major': 'uint64',
   1565            'minor': 'uint64',
   1566            'stats': 'GuestDiskStats' } }
   1567 
   1568 ##
   1569 # @guest-get-diskstats:
   1570 #
   1571 # Retrieve information about disk stats.
   1572 # Returns: List of disk stats of guest.
   1573 #
   1574 # Since: 7.1
   1575 ##
   1576 { 'command': 'guest-get-diskstats',
   1577   'returns': ['GuestDiskStatsInfo']
   1578 }
   1579 
   1580 ##
   1581 # @GuestCpuStatsType:
   1582 #
   1583 # An enumeration of OS type
   1584 #
   1585 # Since: 7.1
   1586 ##
   1587 { 'enum': 'GuestCpuStatsType',
   1588   'data': [ 'linux' ] }
   1589 
   1590 
   1591 ##
   1592 # @GuestLinuxCpuStats:
   1593 #
   1594 # CPU statistics of Linux
   1595 #
   1596 # @cpu: CPU index in guest OS
   1597 #
   1598 # @user: Time spent in user mode
   1599 #
   1600 # @nice: Time spent in user mode with low priority (nice)
   1601 #
   1602 # @system: Time spent in system mode
   1603 #
   1604 # @idle: Time spent in the idle task
   1605 #
   1606 # @iowait: Time waiting for I/O to complete (since Linux 2.5.41)
   1607 #
   1608 # @irq: Time servicing interrupts (since Linux 2.6.0-test4)
   1609 #
   1610 # @softirq: Time servicing softirqs (since Linux 2.6.0-test4)
   1611 #
   1612 # @steal: Stolen time by host (since Linux 2.6.11)
   1613 #
   1614 # @guest: ime spent running a virtual CPU for guest operating systems under
   1615 #         the  control of the Linux kernel (since Linux 2.6.24)
   1616 #
   1617 # @guestnice: Time spent running a niced guest (since Linux 2.6.33)
   1618 #
   1619 # Since: 7.1
   1620 ##
   1621 { 'struct': 'GuestLinuxCpuStats',
   1622   'data': {'cpu': 'int',
   1623            'user': 'uint64',
   1624            'nice': 'uint64',
   1625            'system': 'uint64',
   1626            'idle': 'uint64',
   1627            '*iowait': 'uint64',
   1628            '*irq': 'uint64',
   1629            '*softirq': 'uint64',
   1630            '*steal': 'uint64',
   1631            '*guest': 'uint64',
   1632            '*guestnice': 'uint64'
   1633            } }
   1634 
   1635 ##
   1636 # @GuestCpuStats:
   1637 #
   1638 # Get statistics of each CPU in millisecond.
   1639 #
   1640 # - @linux: Linux style CPU statistics
   1641 #
   1642 # Since: 7.1
   1643 ##
   1644 { 'union': 'GuestCpuStats',
   1645   'base': { 'type': 'GuestCpuStatsType' },
   1646   'discriminator': 'type',
   1647   'data': { 'linux': 'GuestLinuxCpuStats' } }
   1648 
   1649 ##
   1650 # @guest-get-cpustats:
   1651 #
   1652 # Retrieve information about CPU stats.
   1653 # Returns: List of CPU stats of guest.
   1654 #
   1655 # Since: 7.1
   1656 ##
   1657 { 'command': 'guest-get-cpustats',
   1658   'returns': ['GuestCpuStats']
   1659 }