1fa988e39SMarkus Armbruster# -*- Mode: Python -*- 2f7160f32SAndrea Bolognani# vim: filetype=python 3fa988e39SMarkus Armbruster# 4fa988e39SMarkus Armbruster 5fa988e39SMarkus Armbruster## 6fa988e39SMarkus Armbruster# = Transactions 7fa988e39SMarkus Armbruster## 8fa988e39SMarkus Armbruster 92af282ecSKevin Wolf{ 'include': 'block-core.json' } 10fa988e39SMarkus Armbruster 11fa988e39SMarkus Armbruster## 12fa988e39SMarkus Armbruster# @Abort: 13fa988e39SMarkus Armbruster# 14fa988e39SMarkus Armbruster# This action can be used to test transaction failure. 15fa988e39SMarkus Armbruster# 16fa988e39SMarkus Armbruster# Since: 1.6 17fa988e39SMarkus Armbruster## 18fa988e39SMarkus Armbruster{ 'struct': 'Abort', 19fa988e39SMarkus Armbruster 'data': { } } 20fa988e39SMarkus Armbruster 21fa988e39SMarkus Armbruster## 22fa988e39SMarkus Armbruster# @ActionCompletionMode: 23fa988e39SMarkus Armbruster# 24fa988e39SMarkus Armbruster# An enumeration of Transactional completion modes. 25fa988e39SMarkus Armbruster# 26a937b6aaSMarkus Armbruster# @individual: Do not attempt to cancel any other Actions if any 27a937b6aaSMarkus Armbruster# Actions fail after the Transaction request succeeds. All 28a937b6aaSMarkus Armbruster# Actions that can complete successfully will do so without 29a937b6aaSMarkus Armbruster# waiting on others. This is the default. 30fa988e39SMarkus Armbruster# 31a937b6aaSMarkus Armbruster# @grouped: If any Action fails after the Transaction succeeds, cancel 32a937b6aaSMarkus Armbruster# all Actions. Actions do not complete until all Actions are 33a937b6aaSMarkus Armbruster# ready to complete. May be rejected by Actions that do not 34a937b6aaSMarkus Armbruster# support this completion mode. 35fa988e39SMarkus Armbruster# 36fa988e39SMarkus Armbruster# Since: 2.5 37fa988e39SMarkus Armbruster## 38fa988e39SMarkus Armbruster{ 'enum': 'ActionCompletionMode', 39fa988e39SMarkus Armbruster 'data': [ 'individual', 'grouped' ] } 40fa988e39SMarkus Armbruster 41fa988e39SMarkus Armbruster## 42277b51fcSMarkus Armbruster# @TransactionActionKind: 43277b51fcSMarkus Armbruster# 44277b51fcSMarkus Armbruster# @abort: Since 1.6 45a937b6aaSMarkus Armbruster# 46277b51fcSMarkus Armbruster# @block-dirty-bitmap-add: Since 2.5 47a937b6aaSMarkus Armbruster# 48277b51fcSMarkus Armbruster# @block-dirty-bitmap-remove: Since 4.2 49a937b6aaSMarkus Armbruster# 50277b51fcSMarkus Armbruster# @block-dirty-bitmap-clear: Since 2.5 51a937b6aaSMarkus Armbruster# 52277b51fcSMarkus Armbruster# @block-dirty-bitmap-enable: Since 4.0 53a937b6aaSMarkus Armbruster# 54277b51fcSMarkus Armbruster# @block-dirty-bitmap-disable: Since 4.0 55a937b6aaSMarkus Armbruster# 56277b51fcSMarkus Armbruster# @block-dirty-bitmap-merge: Since 4.0 57a937b6aaSMarkus Armbruster# 58277b51fcSMarkus Armbruster# @blockdev-backup: Since 2.3 59a937b6aaSMarkus Armbruster# 60277b51fcSMarkus Armbruster# @blockdev-snapshot: Since 2.5 61a937b6aaSMarkus Armbruster# 62277b51fcSMarkus Armbruster# @blockdev-snapshot-internal-sync: Since 1.7 63a937b6aaSMarkus Armbruster# 64277b51fcSMarkus Armbruster# @blockdev-snapshot-sync: since 1.1 65a937b6aaSMarkus Armbruster# 66277b51fcSMarkus Armbruster# @drive-backup: Since 1.6 67277b51fcSMarkus Armbruster# 681084159bSVladimir Sementsov-Ogievskiy# Features: 69a937b6aaSMarkus Armbruster# 701084159bSVladimir Sementsov-Ogievskiy# @deprecated: Member @drive-backup is deprecated. Use member 711084159bSVladimir Sementsov-Ogievskiy# @blockdev-backup instead. 721084159bSVladimir Sementsov-Ogievskiy# 73277b51fcSMarkus Armbruster# Since: 1.1 74277b51fcSMarkus Armbruster## 75277b51fcSMarkus Armbruster{ 'enum': 'TransactionActionKind', 76277b51fcSMarkus Armbruster 'data': [ 'abort', 'block-dirty-bitmap-add', 'block-dirty-bitmap-remove', 77277b51fcSMarkus Armbruster 'block-dirty-bitmap-clear', 'block-dirty-bitmap-enable', 78277b51fcSMarkus Armbruster 'block-dirty-bitmap-disable', 'block-dirty-bitmap-merge', 79277b51fcSMarkus Armbruster 'blockdev-backup', 'blockdev-snapshot', 80277b51fcSMarkus Armbruster 'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync', 811084159bSVladimir Sementsov-Ogievskiy { 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] } 82277b51fcSMarkus Armbruster 83277b51fcSMarkus Armbruster## 84277b51fcSMarkus Armbruster# @AbortWrapper: 85277b51fcSMarkus Armbruster# 86277b51fcSMarkus Armbruster# Since: 1.6 87277b51fcSMarkus Armbruster## 88277b51fcSMarkus Armbruster{ 'struct': 'AbortWrapper', 89277b51fcSMarkus Armbruster 'data': { 'data': 'Abort' } } 90277b51fcSMarkus Armbruster 91277b51fcSMarkus Armbruster## 92277b51fcSMarkus Armbruster# @BlockDirtyBitmapAddWrapper: 93277b51fcSMarkus Armbruster# 94277b51fcSMarkus Armbruster# Since: 2.5 95277b51fcSMarkus Armbruster## 96277b51fcSMarkus Armbruster{ 'struct': 'BlockDirtyBitmapAddWrapper', 97277b51fcSMarkus Armbruster 'data': { 'data': 'BlockDirtyBitmapAdd' } } 98277b51fcSMarkus Armbruster 99277b51fcSMarkus Armbruster## 100277b51fcSMarkus Armbruster# @BlockDirtyBitmapWrapper: 101277b51fcSMarkus Armbruster# 102277b51fcSMarkus Armbruster# Since: 2.5 103277b51fcSMarkus Armbruster## 104277b51fcSMarkus Armbruster{ 'struct': 'BlockDirtyBitmapWrapper', 105277b51fcSMarkus Armbruster 'data': { 'data': 'BlockDirtyBitmap' } } 106277b51fcSMarkus Armbruster 107277b51fcSMarkus Armbruster## 108277b51fcSMarkus Armbruster# @BlockDirtyBitmapMergeWrapper: 109277b51fcSMarkus Armbruster# 110277b51fcSMarkus Armbruster# Since: 4.0 111277b51fcSMarkus Armbruster## 112277b51fcSMarkus Armbruster{ 'struct': 'BlockDirtyBitmapMergeWrapper', 113277b51fcSMarkus Armbruster 'data': { 'data': 'BlockDirtyBitmapMerge' } } 114277b51fcSMarkus Armbruster 115277b51fcSMarkus Armbruster## 116277b51fcSMarkus Armbruster# @BlockdevBackupWrapper: 117277b51fcSMarkus Armbruster# 118277b51fcSMarkus Armbruster# Since: 2.3 119277b51fcSMarkus Armbruster## 120277b51fcSMarkus Armbruster{ 'struct': 'BlockdevBackupWrapper', 121277b51fcSMarkus Armbruster 'data': { 'data': 'BlockdevBackup' } } 122277b51fcSMarkus Armbruster 123277b51fcSMarkus Armbruster## 124277b51fcSMarkus Armbruster# @BlockdevSnapshotWrapper: 125277b51fcSMarkus Armbruster# 126277b51fcSMarkus Armbruster# Since: 2.5 127277b51fcSMarkus Armbruster## 128277b51fcSMarkus Armbruster{ 'struct': 'BlockdevSnapshotWrapper', 129277b51fcSMarkus Armbruster 'data': { 'data': 'BlockdevSnapshot' } } 130277b51fcSMarkus Armbruster 131277b51fcSMarkus Armbruster## 132277b51fcSMarkus Armbruster# @BlockdevSnapshotInternalWrapper: 133277b51fcSMarkus Armbruster# 134277b51fcSMarkus Armbruster# Since: 1.7 135277b51fcSMarkus Armbruster## 136277b51fcSMarkus Armbruster{ 'struct': 'BlockdevSnapshotInternalWrapper', 137277b51fcSMarkus Armbruster 'data': { 'data': 'BlockdevSnapshotInternal' } } 138277b51fcSMarkus Armbruster 139277b51fcSMarkus Armbruster## 140277b51fcSMarkus Armbruster# @BlockdevSnapshotSyncWrapper: 141277b51fcSMarkus Armbruster# 142277b51fcSMarkus Armbruster# Since: 1.1 143277b51fcSMarkus Armbruster## 144277b51fcSMarkus Armbruster{ 'struct': 'BlockdevSnapshotSyncWrapper', 145277b51fcSMarkus Armbruster 'data': { 'data': 'BlockdevSnapshotSync' } } 146277b51fcSMarkus Armbruster 147277b51fcSMarkus Armbruster## 148277b51fcSMarkus Armbruster# @DriveBackupWrapper: 149277b51fcSMarkus Armbruster# 150277b51fcSMarkus Armbruster# Since: 1.6 151277b51fcSMarkus Armbruster## 152277b51fcSMarkus Armbruster{ 'struct': 'DriveBackupWrapper', 153277b51fcSMarkus Armbruster 'data': { 'data': 'DriveBackup' } } 154277b51fcSMarkus Armbruster 155277b51fcSMarkus Armbruster## 156fa988e39SMarkus Armbruster# @TransactionAction: 157fa988e39SMarkus Armbruster# 158fa988e39SMarkus Armbruster# A discriminated record of operations that can be performed with 159277b51fcSMarkus Armbruster# @transaction. 160fa988e39SMarkus Armbruster# 16189a2273bSMarkus Armbruster# @type: the operation to be performed 16289a2273bSMarkus Armbruster# 163fa988e39SMarkus Armbruster# Since: 1.1 164fa988e39SMarkus Armbruster## 165fa988e39SMarkus Armbruster{ 'union': 'TransactionAction', 166277b51fcSMarkus Armbruster 'base': { 'type': 'TransactionActionKind' }, 167277b51fcSMarkus Armbruster 'discriminator': 'type', 168fa988e39SMarkus Armbruster 'data': { 169277b51fcSMarkus Armbruster 'abort': 'AbortWrapper', 170277b51fcSMarkus Armbruster 'block-dirty-bitmap-add': 'BlockDirtyBitmapAddWrapper', 171277b51fcSMarkus Armbruster 'block-dirty-bitmap-remove': 'BlockDirtyBitmapWrapper', 172277b51fcSMarkus Armbruster 'block-dirty-bitmap-clear': 'BlockDirtyBitmapWrapper', 173277b51fcSMarkus Armbruster 'block-dirty-bitmap-enable': 'BlockDirtyBitmapWrapper', 174277b51fcSMarkus Armbruster 'block-dirty-bitmap-disable': 'BlockDirtyBitmapWrapper', 175277b51fcSMarkus Armbruster 'block-dirty-bitmap-merge': 'BlockDirtyBitmapMergeWrapper', 176277b51fcSMarkus Armbruster 'blockdev-backup': 'BlockdevBackupWrapper', 177277b51fcSMarkus Armbruster 'blockdev-snapshot': 'BlockdevSnapshotWrapper', 178277b51fcSMarkus Armbruster 'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternalWrapper', 179277b51fcSMarkus Armbruster 'blockdev-snapshot-sync': 'BlockdevSnapshotSyncWrapper', 180277b51fcSMarkus Armbruster 'drive-backup': 'DriveBackupWrapper' 181fa988e39SMarkus Armbruster } } 182fa988e39SMarkus Armbruster 183fa988e39SMarkus Armbruster## 184fa988e39SMarkus Armbruster# @TransactionProperties: 185fa988e39SMarkus Armbruster# 186fa988e39SMarkus Armbruster# Optional arguments to modify the behavior of a Transaction. 187fa988e39SMarkus Armbruster# 188fa988e39SMarkus Armbruster# @completion-mode: Controls how jobs launched asynchronously by 189a937b6aaSMarkus Armbruster# Actions will complete or fail as a group. See 190a937b6aaSMarkus Armbruster# @ActionCompletionMode for details. 191fa988e39SMarkus Armbruster# 192fa988e39SMarkus Armbruster# Since: 2.5 193fa988e39SMarkus Armbruster## 194fa988e39SMarkus Armbruster{ 'struct': 'TransactionProperties', 195fa988e39SMarkus Armbruster 'data': { 196fa988e39SMarkus Armbruster '*completion-mode': 'ActionCompletionMode' 197fa988e39SMarkus Armbruster } 198fa988e39SMarkus Armbruster} 199fa988e39SMarkus Armbruster 200fa988e39SMarkus Armbruster## 201fa988e39SMarkus Armbruster# @transaction: 202fa988e39SMarkus Armbruster# 203a937b6aaSMarkus Armbruster# Executes a number of transactionable QMP commands atomically. If 204a937b6aaSMarkus Armbruster# any operation fails, then the entire set of actions will be 205a937b6aaSMarkus Armbruster# abandoned and the appropriate error returned. 206fa988e39SMarkus Armbruster# 207a937b6aaSMarkus Armbruster# For external snapshots, the dictionary contains the device, the file 208a937b6aaSMarkus Armbruster# to use for the new snapshot, and the format. The default format, if 209a937b6aaSMarkus Armbruster# not specified, is qcow2. 210fa988e39SMarkus Armbruster# 211fa988e39SMarkus Armbruster# Each new snapshot defaults to being created by QEMU (wiping any 212a937b6aaSMarkus Armbruster# contents if the file already exists), but it is also possible to 213a937b6aaSMarkus Armbruster# reuse an externally-created file. In the latter case, you should 214a937b6aaSMarkus Armbruster# ensure that the new image file has the same contents as the current 215a937b6aaSMarkus Armbruster# one; QEMU cannot perform any meaningful check. Typically this is 216a937b6aaSMarkus Armbruster# achieved by using the current image file as the backing file for the 217a937b6aaSMarkus Armbruster# new image. 218fa988e39SMarkus Armbruster# 219fa988e39SMarkus Armbruster# On failure, the original disks pre-snapshot attempt will be used. 220fa988e39SMarkus Armbruster# 22109ec8517SMarkus Armbruster# For internal snapshots, the dictionary contains the device and the 222a937b6aaSMarkus Armbruster# snapshot's name. If an internal snapshot matching name already 223a937b6aaSMarkus Armbruster# exists, the request will be rejected. Only some image formats 224a937b6aaSMarkus Armbruster# support it, for example, qcow2, and rbd, 225fa988e39SMarkus Armbruster# 226a937b6aaSMarkus Armbruster# On failure, qemu will try delete the newly created internal snapshot 227a937b6aaSMarkus Armbruster# in the transaction. When an I/O error occurs during deletion, the 228a937b6aaSMarkus Armbruster# user needs to fix it later with qemu-img or other command. 229fa988e39SMarkus Armbruster# 230a937b6aaSMarkus Armbruster# @actions: List of @TransactionAction; information needed for the 231a937b6aaSMarkus Armbruster# respective operations. 232fa988e39SMarkus Armbruster# 233fa988e39SMarkus Armbruster# @properties: structure of additional options to control the 234a937b6aaSMarkus Armbruster# execution of the transaction. See @TransactionProperties for 235a937b6aaSMarkus Armbruster# additional detail. 236fa988e39SMarkus Armbruster# 2372746f060SMarkus Armbruster# Errors: 238b32a6b62SJohn Snow# - Any errors from commands in the transaction 239fa988e39SMarkus Armbruster# 240d461c279SJohn Snow# .. note:: The transaction aborts on the first failure. Therefore, 241*01bed0ffSMarkus Armbruster# there will be information on only one failed operation returned 242*01bed0ffSMarkus Armbruster# in an error condition, and subsequent actions will not have been 243a937b6aaSMarkus Armbruster# attempted. 244fa988e39SMarkus Armbruster# 245fa988e39SMarkus Armbruster# Since: 1.1 246fa988e39SMarkus Armbruster# 24714b48aaaSJohn Snow# .. qmp-example:: 248fa988e39SMarkus Armbruster# 249fa988e39SMarkus Armbruster# -> { "execute": "transaction", 250fa988e39SMarkus Armbruster# "arguments": { "actions": [ 251fa988e39SMarkus Armbruster# { "type": "blockdev-snapshot-sync", "data" : { "device": "ide-hd0", 252fa988e39SMarkus Armbruster# "snapshot-file": "/some/place/my-image", 253fa988e39SMarkus Armbruster# "format": "qcow2" } }, 254fa988e39SMarkus Armbruster# { "type": "blockdev-snapshot-sync", "data" : { "node-name": "myfile", 255fa988e39SMarkus Armbruster# "snapshot-file": "/some/place/my-image2", 256fa988e39SMarkus Armbruster# "snapshot-node-name": "node3432", 257fa988e39SMarkus Armbruster# "mode": "existing", 258fa988e39SMarkus Armbruster# "format": "qcow2" } }, 259fa988e39SMarkus Armbruster# { "type": "blockdev-snapshot-sync", "data" : { "device": "ide-hd1", 260fa988e39SMarkus Armbruster# "snapshot-file": "/some/place/my-image2", 261fa988e39SMarkus Armbruster# "mode": "existing", 262fa988e39SMarkus Armbruster# "format": "qcow2" } }, 263fa988e39SMarkus Armbruster# { "type": "blockdev-snapshot-internal-sync", "data" : { 264fa988e39SMarkus Armbruster# "device": "ide-hd2", 265fa988e39SMarkus Armbruster# "name": "snapshot0" } } ] } } 266fa988e39SMarkus Armbruster# <- { "return": {} } 267fa988e39SMarkus Armbruster## 268fa988e39SMarkus Armbruster{ 'command': 'transaction', 269fa988e39SMarkus Armbruster 'data': { 'actions': [ 'TransactionAction' ], 270fa988e39SMarkus Armbruster '*properties': 'TransactionProperties' 271fa988e39SMarkus Armbruster } 272fa988e39SMarkus Armbruster} 273