qemu-iotests: Test blockdev-backup in 055

This applies cases on drive-backup on blockdev-backup, except cases with
target format and mode.

Also add a case to check source == target.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-id: 1418899027-8445-5-git-send-email-famz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Fam Zheng 2014-12-18 18:37:07 +08:00 committed by Stefan Hajnoczi
parent bd8baecddc
commit 7c6a4ab871
2 changed files with 176 additions and 39 deletions

View file

@ -1,8 +1,8 @@
#!/usr/bin/env python
#
# Tests for drive-backup
# Tests for drive-backup and blockdev-backup
#
# Copyright (C) 2013 Red Hat, Inc.
# Copyright (C) 2013, 2014 Red Hat, Inc.
#
# Based on 041.
#
@ -27,6 +27,7 @@ from iotests import qemu_img, qemu_io
test_img = os.path.join(iotests.test_dir, 'test.img')
target_img = os.path.join(iotests.test_dir, 'target.img')
blockdev_target_img = os.path.join(iotests.test_dir, 'blockdev-target.img')
class TestSingleDrive(iotests.QMPTestCase):
image_len = 64 * 1024 * 1024 # MB
@ -38,34 +39,41 @@ class TestSingleDrive(iotests.QMPTestCase):
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))
self.vm = iotests.VM().add_drive(test_img)
self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()
def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass
def test_cancel(self):
def do_test_cancel(self, cmd, target):
self.assert_no_active_block_jobs()
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0', target=target, sync='full')
self.assert_qmp(result, 'return', {})
event = self.cancel_and_wait()
self.assert_qmp(event, 'data/type', 'backup')
def test_pause(self):
def test_cancel_drive_backup(self):
self.do_test_cancel('drive-backup', target_img)
def test_cancel_blockdev_backup(self):
self.do_test_cancel('blockdev-backup', 'drive1')
def do_test_pause(self, cmd, target, image):
self.assert_no_active_block_jobs()
self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full')
self.assert_qmp(result, 'return', {})
result = self.vm.qmp('block-job-pause', device='drive0')
@ -86,14 +94,25 @@ class TestSingleDrive(iotests.QMPTestCase):
self.wait_until_completed()
self.vm.shutdown()
self.assertTrue(iotests.compare_images(test_img, target_img),
self.assertTrue(iotests.compare_images(test_img, image),
'target image does not match source after backup')
def test_pause_drive_backup(self):
self.do_test_pause('drive-backup', target_img, target_img)
def test_pause_blockdev_backup(self):
self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img)
def test_medium_not_found(self):
result = self.vm.qmp('drive-backup', device='ide1-cd0',
target=target_img, sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')
def test_medium_not_found_blockdev_backup(self):
result = self.vm.qmp('blockdev-backup', device='ide1-cd0',
target='drive1', sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')
def test_image_not_found(self):
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', mode='existing')
@ -105,31 +124,53 @@ class TestSingleDrive(iotests.QMPTestCase):
format='spaghetti-noodles')
self.assert_qmp(result, 'error/class', 'GenericError')
def test_device_not_found(self):
result = self.vm.qmp('drive-backup', device='nonexistent',
target=target_img, sync='full')
def do_test_device_not_found(self, cmd, **args):
result = self.vm.qmp(cmd, **args)
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
def test_device_not_found(self):
self.do_test_device_not_found('drive-backup', device='nonexistent',
target=target_img, sync='full')
self.do_test_device_not_found('blockdev-backup', device='nonexistent',
target='drive0', sync='full')
self.do_test_device_not_found('blockdev-backup', device='drive0',
target='nonexistent', sync='full')
self.do_test_device_not_found('blockdev-backup', device='nonexistent',
target='nonexistent', sync='full')
def test_target_is_source(self):
result = self.vm.qmp('blockdev-backup', device='drive0',
target='drive0', sync='full')
self.assert_qmp(result, 'error/class', 'GenericError')
class TestSetSpeed(iotests.QMPTestCase):
image_len = 80 * 1024 * 1024 # MB
def setUp(self):
qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSetSpeed.image_len))
qemu_io('-f', iotests.imgfmt, '-c', 'write -P1 0 512', test_img)
self.vm = iotests.VM().add_drive(test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))
self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()
def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(target_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass
def test_set_speed(self):
def do_test_set_speed(self, cmd, target):
self.assert_no_active_block_jobs()
self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0', target=target, sync='full')
self.assert_qmp(result, 'return', {})
# Default speed is 0
@ -148,10 +189,10 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')
# Check setting speed in drive-backup works
# Check setting speed option works
self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', speed=4*1024*1024)
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full', speed=4*1024*1024)
self.assert_qmp(result, 'return', {})
result = self.vm.qmp('query-block-jobs')
@ -161,18 +202,24 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')
def test_set_speed_invalid(self):
def test_set_speed_drive_backup(self):
self.do_test_set_speed('drive-backup', target_img)
def test_set_speed_blockdev_backup(self):
self.do_test_set_speed('blockdev-backup', 'drive1')
def do_test_set_speed_invalid(self, cmd, target):
self.assert_no_active_block_jobs()
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full', speed=-1)
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full', speed=-1)
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()
self.vm.pause_drive('drive0')
result = self.vm.qmp('drive-backup', device='drive0',
target=target_img, sync='full')
result = self.vm.qmp(cmd, device='drive0',
target=target, sync='full')
self.assert_qmp(result, 'return', {})
result = self.vm.qmp('block-job-set-speed', device='drive0', speed=-1)
@ -181,6 +228,12 @@ class TestSetSpeed(iotests.QMPTestCase):
event = self.cancel_and_wait(resume=True)
self.assert_qmp(event, 'data/type', 'backup')
def test_set_speed_invalid_drive_backup(self):
self.do_test_set_speed_invalid('drive-backup', target_img)
def test_set_speed_invalid_blockdev_backup(self):
self.do_test_set_speed_invalid('blockdev-backup', 'drive1')
class TestSingleTransaction(iotests.QMPTestCase):
image_len = 64 * 1024 * 1024 # MB
@ -190,41 +243,50 @@ class TestSingleTransaction(iotests.QMPTestCase):
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img)
qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img)
qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len))
self.vm = iotests.VM().add_drive(test_img)
self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
self.vm.launch()
def tearDown(self):
self.vm.shutdown()
os.remove(test_img)
os.remove(blockdev_target_img)
try:
os.remove(target_img)
except OSError:
pass
def test_cancel(self):
def do_test_cancel(self, cmd, target):
self.assert_no_active_block_jobs()
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'drive0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])
self.assert_qmp(result, 'return', {})
event = self.cancel_and_wait()
self.assert_qmp(event, 'data/type', 'backup')
def test_pause(self):
def test_cancel_drive_backup(self):
self.do_test_cancel('drive-backup', target_img)
def test_cancel_blockdev_backup(self):
self.do_test_cancel('blockdev-backup', 'drive1')
def do_test_pause(self, cmd, target, image):
self.assert_no_active_block_jobs()
self.vm.pause_drive('drive0')
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'drive0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])
@ -248,19 +310,31 @@ class TestSingleTransaction(iotests.QMPTestCase):
self.wait_until_completed()
self.vm.shutdown()
self.assertTrue(iotests.compare_images(test_img, target_img),
self.assertTrue(iotests.compare_images(test_img, image),
'target image does not match source after backup')
def test_medium_not_found(self):
def test_pause_drive_backup(self):
self.do_test_pause('drive-backup', target_img, target_img)
def test_pause_blockdev_backup(self):
self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img)
def do_test_medium_not_found(self, cmd, target):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
'type': cmd,
'data': { 'device': 'ide1-cd0',
'target': target_img,
'target': target,
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
def test_medium_not_found_drive_backup(self):
self.do_test_medium_not_found('drive-backup', target_img)
def test_medium_not_found_blockdev_backup(self):
self.do_test_medium_not_found('blockdev-backup', 'drive1')
def test_image_not_found(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
@ -283,6 +357,43 @@ class TestSingleTransaction(iotests.QMPTestCase):
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'drive1',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'nonexistent',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'nonexistent',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
def test_target_is_source(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'drive0',
'sync': 'full' },
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
def test_abort(self):
result = self.vm.qmp('transaction', actions=[{
'type': 'drive-backup',
@ -298,5 +409,31 @@ class TestSingleTransaction(iotests.QMPTestCase):
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'nonexistent',
'target': 'drive1',
'sync': 'full' },
}, {
'type': 'Abort',
'data': {},
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()
result = self.vm.qmp('transaction', actions=[{
'type': 'blockdev-backup',
'data': { 'device': 'drive0',
'target': 'nonexistent',
'sync': 'full' },
}, {
'type': 'Abort',
'data': {},
}
])
self.assert_qmp(result, 'error/class', 'GenericError')
self.assert_no_active_block_jobs()
if __name__ == '__main__':
iotests.main(supported_fmts=['raw', 'qcow2'])

View file

@ -1,5 +1,5 @@
..............
........................
----------------------------------------------------------------------
Ran 14 tests
Ran 24 tests
OK