@@ -49,7 +49,7 @@ def transaction_bitmap_clear(node, name, **kwargs):
def transaction_drive_backup(device, target, **kwargs):
- return transaction_action('drive-backup', job_id=device, device=device,
+ return transaction_action('blockdev-backup', job_id=device, device=device,
target=target, **kwargs)
@@ -146,10 +146,22 @@ class TestIncrementalBackupBase(iotests.QMPTestCase):
def do_qmp_backup(self, error='Input/output error', **kwargs):
- res = self.vm.qmp('drive-backup', **kwargs)
+ res = self.vm.qmp('blockdev-backup', **kwargs)
self.assert_qmp(res, 'return', {})
return self.wait_qmp_backup(kwargs['device'], error)
+ def _FIXME_new_target(self, name, fmt, filename):
+ result = self.vm.qmp('blockdev-add',
+ node_name=name,
+ driver=fmt,
+ file={"driver": "file",
+ "filename": filename})
+ self.assert_qmp(result, 'return', {})
+
+ def _FIXME_del_target(self, name):
+ result = self.vm.qmp('blockdev-del',
+ node_name=name)
+ self.assert_qmp(result, 'return', {})
def ignore_job_status_change_events(self):
while True:
@@ -185,11 +197,13 @@ class TestIncrementalBackupBase(iotests.QMPTestCase):
def create_anchor_backup(self, drive=None):
if drive is None:
drive = self.drives[-1]
+ self.img_create(drive['backup'], drive['fmt'])
+ self._FIXME_new_target('target', drive['fmt'], drive['backup'])
res = self.do_qmp_backup(job_id=drive['id'],
device=drive['id'], sync='full',
- format=drive['fmt'], target=drive['backup'])
+ target='target')
+ self._FIXME_del_target('target')
self.assertTrue(res)
- self.files.append(drive['backup'])
return drive['backup']
@@ -197,9 +211,12 @@ class TestIncrementalBackupBase(iotests.QMPTestCase):
if bitmap is None:
bitmap = self.bitmaps[-1]
_, reference = bitmap.last_target()
+ self.img_create(reference, bitmap.drive['fmt'])
+ self._FIXME_new_target('target', bitmap.drive['fmt'], reference)
res = self.do_qmp_backup(job_id=bitmap.drive['id'],
device=bitmap.drive['id'], sync='full',
- format=bitmap.drive['fmt'], target=reference)
+ target='target')
+ self._FIXME_del_target('target')
self.assertTrue(res)
@@ -223,19 +240,19 @@ class TestIncrementalBackupBase(iotests.QMPTestCase):
return target
- def create_incremental(self, bitmap=None, parent=None,
- parentFormat=None, validate=True):
+ def create_incremental(self, bitmap=None, parent=None, validate=True):
if bitmap is None:
bitmap = self.bitmaps[-1]
if parent is None:
parent, _ = bitmap.last_target()
target = self.prepare_backup(bitmap, parent)
+ self._FIXME_new_target('target', bitmap.drive['fmt'], target)
res = self.do_qmp_backup(job_id=bitmap.drive['id'],
device=bitmap.drive['id'],
sync='incremental', bitmap=bitmap.name,
- format=bitmap.drive['fmt'], target=target,
- mode='existing')
+ target='target')
+ self._FIXME_del_target('target')
if not res:
bitmap.del_target();
self.assertFalse(validate)
@@ -331,10 +348,11 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
# Create a cluster_size=128k full backup / "anchor" backup
self.img_create(drive0['backup'], cluster_size='128k')
+ self.img_create(drive0['backup'], drive0['fmt'])
+ self._FIXME_new_target('target', drive0['fmt'], drive0['backup'])
self.assertTrue(self.do_qmp_backup(device=drive0['id'], sync='full',
- format=drive0['fmt'],
- target=drive0['backup'],
- mode='existing'))
+ target='target'))
+ self._FIXME_del_target('target')
# Create bitmap and dirty it with some new writes.
# overwrite [32736, 32799] which will dirty bitmap clusters at
@@ -356,12 +374,12 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
self.img_create(target, bitmap0.drive['fmt'], cluster_size='128k')
# Perform Incremental Backup
+ self._FIXME_new_target('target', bitmap0.drive['fmt'], target)
self.assertTrue(self.do_qmp_backup(device=bitmap0.drive['id'],
sync='incremental',
bitmap=bitmap0.name,
- format=bitmap0.drive['fmt'],
- target=target,
- mode='existing'))
+ target='target'))
+ self._FIXME_del_target('target')
self.make_reference_backup(bitmap0)
# Add the backing file, then compare and exit.
@@ -388,15 +406,18 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
('0x64', '32736k', '64k')))
bitmap1 = self.add_bitmap('bitmap1', drive0)
+ # Create and mount image
+ self.img_create(drive0['backup'], drive0['fmt'])
+ self._FIXME_new_target('target', drive0['fmt'], drive0['backup'])
+
result = self.vm.qmp('transaction', actions=[
transaction_bitmap_clear(bitmap0.drive['id'], bitmap0.name),
transaction_bitmap_clear(bitmap1.drive['id'], bitmap1.name),
- transaction_drive_backup(drive0['id'], drive0['backup'],
- sync='full', format=drive0['fmt'])
+ transaction_drive_backup(drive0['id'], 'target', sync='full')
])
self.assert_qmp(result, 'return', {})
self.wait_until_completed(drive0['id'])
- self.files.append(drive0['backup'])
+ self._FIXME_del_target('target')
self.hmp_io_writes(drive0['id'], (('0x9a', 0, 512),
('0x55', '8M', '352k'),
@@ -464,16 +485,18 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
target0 = self.prepare_backup(dr0bm0)
target1 = self.prepare_backup(dr1bm0)
+ # Mount targets
+ self._FIXME_new_target('target0', drive0['fmt'], target0)
+ self._FIXME_new_target('target1', drive1['fmt'], target1)
+
# Ask for a new incremental backup per-each drive,
# expecting drive1's backup to fail. In the 'race' test,
# we expect drive1 to attempt to cancel the empty drive0 job.
transaction = [
- transaction_drive_backup(drive0['id'], target0, sync='incremental',
- format=drive0['fmt'], mode='existing',
- bitmap=dr0bm0.name),
- transaction_drive_backup(drive1['id'], target1, sync='incremental',
- format=drive1['fmt'], mode='existing',
- bitmap=dr1bm0.name)
+ transaction_drive_backup(drive0['id'], 'target0',
+ sync='incremental', bitmap=dr0bm0.name),
+ transaction_drive_backup(drive1['id'], 'target1',
+ sync='incremental', bitmap=dr1bm0.name)
]
result = self.vm.qmp('transaction', actions=transaction,
properties={'completion-mode': 'grouped'} )
@@ -490,6 +513,10 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
self.assertFalse(self.vm.get_qmp_events(wait=False))
self.assert_no_active_block_jobs()
+ # Unmount targets
+ self._FIXME_del_target('target0')
+ self._FIXME_del_target('target1')
+
# Delete drive0's successful target and eliminate our record of the
# unsuccessful drive1 target.
dr0bm0.del_target()
@@ -499,9 +526,11 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
self.vm.shutdown()
return
- # Re-run the same transaction:
+ # Re-run the same transaction; create and mount images
target0 = self.prepare_backup(dr0bm0)
target1 = self.prepare_backup(dr1bm0)
+ self._FIXME_new_target('target0', drive0['fmt'], target0)
+ self._FIXME_new_target('target1', drive1['fmt'], target1)
# Re-run the exact same transaction.
result = self.vm.qmp('transaction', actions=transaction,
@@ -516,6 +545,9 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
self.assertFalse(self.vm.get_qmp_events(wait=False))
self.assert_no_active_block_jobs()
+ self._FIXME_del_target('target0')
+ self._FIXME_del_target('target1')
+
# And the images should of course validate.
self.vm.shutdown()
self.check_backups()
@@ -544,19 +576,22 @@ class TestIncrementalBackup(TestIncrementalBackupBase):
def test_sync_dirty_bitmap_missing(self):
self.assert_no_active_block_jobs()
- self.files.append(self.err_img)
- result = self.vm.qmp('drive-backup', device=self.drives[0]['id'],
- sync='incremental', format=self.drives[0]['fmt'],
- target=self.err_img)
+ self.img_create(self.err_img, iotests.imgfmt)
+ self._FIXME_new_target('err0', iotests.imgfmt, self.err_img)
+ result = self.vm.qmp('blockdev-backup', device=self.drives[0]['id'],
+ sync='incremental', target='err0')
+ self._FIXME_del_target('err0')
self.assert_qmp(result, 'error/class', 'GenericError')
def test_sync_dirty_bitmap_not_found(self):
self.assert_no_active_block_jobs()
- self.files.append(self.err_img)
- result = self.vm.qmp('drive-backup', device=self.drives[0]['id'],
+ self.img_create(self.err_img, iotests.imgfmt)
+ self._FIXME_new_target('err0', iotests.imgfmt, self.err_img)
+ result = self.vm.qmp('blockdev-backup', device=self.drives[0]['id'],
sync='incremental', bitmap='unknown',
- format=self.drives[0]['fmt'], target=self.err_img)
+ target='err0')
+ self._FIXME_del_target('err0')
self.assert_qmp(result, 'error/class', 'GenericError')
This is just a real chainsaw job on 124 to prove that we can indeed use blockdev-backup interchangeably with drive-backup for incremental backups. A nicer test will follow once I refactor this a bit to look a little less like the Texas Chainsaw Massacre. Signed-off-by: John Snow <jsnow@redhat.com> --- tests/qemu-iotests/124 | 99 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 32 deletions(-)