xref: /qemu/qapi/transaction.json (revision 53d5c36d)
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:
2382746f060SMarkus Armbruster#     Any errors from commands in the transaction
239fa988e39SMarkus Armbruster#
240a937b6aaSMarkus Armbruster# Note: The transaction aborts on the first failure.  Therefore, there
241a937b6aaSMarkus Armbruster#     will be information on only one failed operation returned in an
242a937b6aaSMarkus Armbruster#     error condition, and subsequent actions will not have been
243a937b6aaSMarkus Armbruster#     attempted.
244fa988e39SMarkus Armbruster#
245fa988e39SMarkus Armbruster# Since: 1.1
246fa988e39SMarkus Armbruster#
247fa988e39SMarkus Armbruster# 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