1e5ca8fddSStefan Hajnoczi#!/usr/bin/env python 2e5ca8fddSStefan Hajnoczi# 37c6a4ab8SFam Zheng# Tests for drive-backup and blockdev-backup 4e5ca8fddSStefan Hajnoczi# 57c6a4ab8SFam Zheng# Copyright (C) 2013, 2014 Red Hat, Inc. 6e5ca8fddSStefan Hajnoczi# 7e5ca8fddSStefan Hajnoczi# Based on 041. 8e5ca8fddSStefan Hajnoczi# 9e5ca8fddSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify 10e5ca8fddSStefan Hajnoczi# it under the terms of the GNU General Public License as published by 11e5ca8fddSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or 12e5ca8fddSStefan Hajnoczi# (at your option) any later version. 13e5ca8fddSStefan Hajnoczi# 14e5ca8fddSStefan Hajnoczi# This program is distributed in the hope that it will be useful, 15e5ca8fddSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of 16e5ca8fddSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e5ca8fddSStefan Hajnoczi# GNU General Public License for more details. 18e5ca8fddSStefan Hajnoczi# 19e5ca8fddSStefan Hajnoczi# You should have received a copy of the GNU General Public License 20e5ca8fddSStefan Hajnoczi# along with this program. If not, see <http://www.gnu.org/licenses/>. 21e5ca8fddSStefan Hajnoczi# 22e5ca8fddSStefan Hajnoczi 23e5ca8fddSStefan Hajnocziimport time 24e5ca8fddSStefan Hajnocziimport os 25e5ca8fddSStefan Hajnocziimport iotests 26e5ca8fddSStefan Hajnoczifrom iotests import qemu_img, qemu_io 27e5ca8fddSStefan Hajnoczi 28e5ca8fddSStefan Hajnoczitest_img = os.path.join(iotests.test_dir, 'test.img') 29e5ca8fddSStefan Hajnoczitarget_img = os.path.join(iotests.test_dir, 'target.img') 307c6a4ab8SFam Zhengblockdev_target_img = os.path.join(iotests.test_dir, 'blockdev-target.img') 31e5ca8fddSStefan Hajnoczi 32e5ca8fddSStefan Hajnocziclass TestSingleDrive(iotests.QMPTestCase): 33e5ca8fddSStefan Hajnoczi image_len = 64 * 1024 * 1024 # MB 34e5ca8fddSStefan Hajnoczi 35e5ca8fddSStefan Hajnoczi def setUp(self): 36e5ca8fddSStefan Hajnoczi # Write data to the image so we can compare later 37e5ca8fddSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSingleDrive.image_len)) 3890c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0x5d 0 64k', test_img) 3990c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img) 4090c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img) 4190c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img) 427c6a4ab8SFam Zheng qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len)) 43e5ca8fddSStefan Hajnoczi 447c6a4ab8SFam Zheng self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img) 450ed82f7aSMax Reitz if iotests.qemu_default_machine == 'pc': 460ed82f7aSMax Reitz self.vm.add_drive(None, 'media=cdrom', 'ide') 47e5ca8fddSStefan Hajnoczi self.vm.launch() 48e5ca8fddSStefan Hajnoczi 49e5ca8fddSStefan Hajnoczi def tearDown(self): 50e5ca8fddSStefan Hajnoczi self.vm.shutdown() 51e5ca8fddSStefan Hajnoczi os.remove(test_img) 527c6a4ab8SFam Zheng os.remove(blockdev_target_img) 53e5ca8fddSStefan Hajnoczi try: 54e5ca8fddSStefan Hajnoczi os.remove(target_img) 55e5ca8fddSStefan Hajnoczi except OSError: 56e5ca8fddSStefan Hajnoczi pass 57e5ca8fddSStefan Hajnoczi 587c6a4ab8SFam Zheng def do_test_cancel(self, cmd, target): 59e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 60e5ca8fddSStefan Hajnoczi 617c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', target=target, sync='full') 62e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 63e5ca8fddSStefan Hajnoczi 64e5ca8fddSStefan Hajnoczi event = self.cancel_and_wait() 65e5ca8fddSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'backup') 66e5ca8fddSStefan Hajnoczi 677c6a4ab8SFam Zheng def test_cancel_drive_backup(self): 687c6a4ab8SFam Zheng self.do_test_cancel('drive-backup', target_img) 697c6a4ab8SFam Zheng 707c6a4ab8SFam Zheng def test_cancel_blockdev_backup(self): 717c6a4ab8SFam Zheng self.do_test_cancel('blockdev-backup', 'drive1') 727c6a4ab8SFam Zheng 737c6a4ab8SFam Zheng def do_test_pause(self, cmd, target, image): 74e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 75e5ca8fddSStefan Hajnoczi 76b59b3d57SFam Zheng self.vm.pause_drive('drive0') 777c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', 787c6a4ab8SFam Zheng target=target, sync='full') 79e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 80e5ca8fddSStefan Hajnoczi 81e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-pause', device='drive0') 82e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 83e5ca8fddSStefan Hajnoczi 84b59b3d57SFam Zheng self.vm.resume_drive('drive0') 85e5ca8fddSStefan Hajnoczi time.sleep(1) 86e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 87e5ca8fddSStefan Hajnoczi offset = self.dictpath(result, 'return[0]/offset') 88e5ca8fddSStefan Hajnoczi 89e5ca8fddSStefan Hajnoczi time.sleep(1) 90e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 91e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/offset', offset) 92e5ca8fddSStefan Hajnoczi 93e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-resume', device='drive0') 94e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 95e5ca8fddSStefan Hajnoczi 96e5ca8fddSStefan Hajnoczi self.wait_until_completed() 97e5ca8fddSStefan Hajnoczi 98e5ca8fddSStefan Hajnoczi self.vm.shutdown() 997c6a4ab8SFam Zheng self.assertTrue(iotests.compare_images(test_img, image), 100e5ca8fddSStefan Hajnoczi 'target image does not match source after backup') 101e5ca8fddSStefan Hajnoczi 1027c6a4ab8SFam Zheng def test_pause_drive_backup(self): 1037c6a4ab8SFam Zheng self.do_test_pause('drive-backup', target_img, target_img) 1047c6a4ab8SFam Zheng 1057c6a4ab8SFam Zheng def test_pause_blockdev_backup(self): 1067c6a4ab8SFam Zheng self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img) 1077c6a4ab8SFam Zheng 108e5ca8fddSStefan Hajnoczi def test_medium_not_found(self): 109d8683155SBo Tu if iotests.qemu_default_machine != 'pc': 110d8683155SBo Tu return 111d8683155SBo Tu 1120ed82f7aSMax Reitz result = self.vm.qmp('drive-backup', device='drive2', # CD-ROM 113b53169eaSStefan Hajnoczi target=target_img, sync='full') 114e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 115e5ca8fddSStefan Hajnoczi 1167c6a4ab8SFam Zheng def test_medium_not_found_blockdev_backup(self): 117d8683155SBo Tu if iotests.qemu_default_machine != 'pc': 118d8683155SBo Tu return 119d8683155SBo Tu 1200ed82f7aSMax Reitz result = self.vm.qmp('blockdev-backup', device='drive2', # CD-ROM 1217c6a4ab8SFam Zheng target='drive1', sync='full') 1227c6a4ab8SFam Zheng self.assert_qmp(result, 'error/class', 'GenericError') 1237c6a4ab8SFam Zheng 124e5ca8fddSStefan Hajnoczi def test_image_not_found(self): 125e5ca8fddSStefan Hajnoczi result = self.vm.qmp('drive-backup', device='drive0', 126b53169eaSStefan Hajnoczi target=target_img, sync='full', mode='existing') 127e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 128e5ca8fddSStefan Hajnoczi 129e3409362SIan Main def test_invalid_format(self): 130e3409362SIan Main result = self.vm.qmp('drive-backup', device='drive0', 131e3409362SIan Main target=target_img, sync='full', 132e3409362SIan Main format='spaghetti-noodles') 133e3409362SIan Main self.assert_qmp(result, 'error/class', 'GenericError') 134e3409362SIan Main 1357c6a4ab8SFam Zheng def do_test_device_not_found(self, cmd, **args): 1367c6a4ab8SFam Zheng result = self.vm.qmp(cmd, **args) 1375b347c54SMarkus Armbruster self.assert_qmp(result, 'error/class', 'GenericError') 138e5ca8fddSStefan Hajnoczi 1397c6a4ab8SFam Zheng def test_device_not_found(self): 1407c6a4ab8SFam Zheng self.do_test_device_not_found('drive-backup', device='nonexistent', 1417c6a4ab8SFam Zheng target=target_img, sync='full') 1427c6a4ab8SFam Zheng 1437c6a4ab8SFam Zheng self.do_test_device_not_found('blockdev-backup', device='nonexistent', 1447c6a4ab8SFam Zheng target='drive0', sync='full') 1457c6a4ab8SFam Zheng 1467c6a4ab8SFam Zheng self.do_test_device_not_found('blockdev-backup', device='drive0', 1477c6a4ab8SFam Zheng target='nonexistent', sync='full') 1487c6a4ab8SFam Zheng 1497c6a4ab8SFam Zheng self.do_test_device_not_found('blockdev-backup', device='nonexistent', 1507c6a4ab8SFam Zheng target='nonexistent', sync='full') 1517c6a4ab8SFam Zheng 1527c6a4ab8SFam Zheng def test_target_is_source(self): 1537c6a4ab8SFam Zheng result = self.vm.qmp('blockdev-backup', device='drive0', 1547c6a4ab8SFam Zheng target='drive0', sync='full') 1557c6a4ab8SFam Zheng self.assert_qmp(result, 'error/class', 'GenericError') 1567c6a4ab8SFam Zheng 157e5ca8fddSStefan Hajnocziclass TestSetSpeed(iotests.QMPTestCase): 158e5ca8fddSStefan Hajnoczi image_len = 80 * 1024 * 1024 # MB 159e5ca8fddSStefan Hajnoczi 160e5ca8fddSStefan Hajnoczi def setUp(self): 161e5ca8fddSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSetSpeed.image_len)) 16290c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P1 0 512', test_img) 1637c6a4ab8SFam Zheng qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len)) 1647c6a4ab8SFam Zheng 1657c6a4ab8SFam Zheng self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img) 166e5ca8fddSStefan Hajnoczi self.vm.launch() 167e5ca8fddSStefan Hajnoczi 168e5ca8fddSStefan Hajnoczi def tearDown(self): 169e5ca8fddSStefan Hajnoczi self.vm.shutdown() 170e5ca8fddSStefan Hajnoczi os.remove(test_img) 1717c6a4ab8SFam Zheng os.remove(blockdev_target_img) 1727c6a4ab8SFam Zheng try: 173e5ca8fddSStefan Hajnoczi os.remove(target_img) 1747c6a4ab8SFam Zheng except OSError: 1757c6a4ab8SFam Zheng pass 176e5ca8fddSStefan Hajnoczi 1777c6a4ab8SFam Zheng def do_test_set_speed(self, cmd, target): 178e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 179e5ca8fddSStefan Hajnoczi 180b59b3d57SFam Zheng self.vm.pause_drive('drive0') 1817c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', target=target, sync='full') 182e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 183e5ca8fddSStefan Hajnoczi 184e5ca8fddSStefan Hajnoczi # Default speed is 0 185e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 186e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/device', 'drive0') 187e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/speed', 0) 188e5ca8fddSStefan Hajnoczi 189e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024) 190e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 191e5ca8fddSStefan Hajnoczi 192e5ca8fddSStefan Hajnoczi # Ensure the speed we set was accepted 193e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 194e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/device', 'drive0') 195e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/speed', 8 * 1024 * 1024) 196e5ca8fddSStefan Hajnoczi 197b59b3d57SFam Zheng event = self.cancel_and_wait(resume=True) 198e5ca8fddSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'backup') 199e5ca8fddSStefan Hajnoczi 2007c6a4ab8SFam Zheng # Check setting speed option works 201b59b3d57SFam Zheng self.vm.pause_drive('drive0') 2027c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', 2037c6a4ab8SFam Zheng target=target, sync='full', speed=4*1024*1024) 204e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 205e5ca8fddSStefan Hajnoczi 206e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 207e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/device', 'drive0') 208e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/speed', 4 * 1024 * 1024) 209e5ca8fddSStefan Hajnoczi 210b59b3d57SFam Zheng event = self.cancel_and_wait(resume=True) 211e5ca8fddSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'backup') 212e5ca8fddSStefan Hajnoczi 2137c6a4ab8SFam Zheng def test_set_speed_drive_backup(self): 2147c6a4ab8SFam Zheng self.do_test_set_speed('drive-backup', target_img) 2157c6a4ab8SFam Zheng 2167c6a4ab8SFam Zheng def test_set_speed_blockdev_backup(self): 2177c6a4ab8SFam Zheng self.do_test_set_speed('blockdev-backup', 'drive1') 2187c6a4ab8SFam Zheng 2197c6a4ab8SFam Zheng def do_test_set_speed_invalid(self, cmd, target): 220e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 221e5ca8fddSStefan Hajnoczi 2227c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', 2237c6a4ab8SFam Zheng target=target, sync='full', speed=-1) 224e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 225e5ca8fddSStefan Hajnoczi 226e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 227e5ca8fddSStefan Hajnoczi 228b59b3d57SFam Zheng self.vm.pause_drive('drive0') 2297c6a4ab8SFam Zheng result = self.vm.qmp(cmd, device='drive0', 2307c6a4ab8SFam Zheng target=target, sync='full') 231e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 232e5ca8fddSStefan Hajnoczi 233e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-set-speed', device='drive0', speed=-1) 234e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 235e5ca8fddSStefan Hajnoczi 236b59b3d57SFam Zheng event = self.cancel_and_wait(resume=True) 237e5ca8fddSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'backup') 238e5ca8fddSStefan Hajnoczi 2397c6a4ab8SFam Zheng def test_set_speed_invalid_drive_backup(self): 2407c6a4ab8SFam Zheng self.do_test_set_speed_invalid('drive-backup', target_img) 2417c6a4ab8SFam Zheng 2427c6a4ab8SFam Zheng def test_set_speed_invalid_blockdev_backup(self): 2437c6a4ab8SFam Zheng self.do_test_set_speed_invalid('blockdev-backup', 'drive1') 2447c6a4ab8SFam Zheng 245e5ca8fddSStefan Hajnocziclass TestSingleTransaction(iotests.QMPTestCase): 246e5ca8fddSStefan Hajnoczi image_len = 64 * 1024 * 1024 # MB 247e5ca8fddSStefan Hajnoczi 248e5ca8fddSStefan Hajnoczi def setUp(self): 249e5ca8fddSStefan Hajnoczi qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSingleTransaction.image_len)) 25090c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0x5d 0 64k', test_img) 25190c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xd5 1M 32k', test_img) 25290c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 32M 124k', test_img) 25390c9b167SKevin Wolf qemu_io('-f', iotests.imgfmt, '-c', 'write -P0xdc 67043328 64k', test_img) 2547c6a4ab8SFam Zheng qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(TestSingleDrive.image_len)) 255e5ca8fddSStefan Hajnoczi 2567c6a4ab8SFam Zheng self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img) 2570ed82f7aSMax Reitz if iotests.qemu_default_machine == 'pc': 2580ed82f7aSMax Reitz self.vm.add_drive(None, 'media=cdrom', 'ide') 259e5ca8fddSStefan Hajnoczi self.vm.launch() 260e5ca8fddSStefan Hajnoczi 261e5ca8fddSStefan Hajnoczi def tearDown(self): 262e5ca8fddSStefan Hajnoczi self.vm.shutdown() 263e5ca8fddSStefan Hajnoczi os.remove(test_img) 2647c6a4ab8SFam Zheng os.remove(blockdev_target_img) 265e5ca8fddSStefan Hajnoczi try: 266e5ca8fddSStefan Hajnoczi os.remove(target_img) 267e5ca8fddSStefan Hajnoczi except OSError: 268e5ca8fddSStefan Hajnoczi pass 269e5ca8fddSStefan Hajnoczi 2707c6a4ab8SFam Zheng def do_test_cancel(self, cmd, target): 271e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 272e5ca8fddSStefan Hajnoczi 273e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 2747c6a4ab8SFam Zheng 'type': cmd, 275e5ca8fddSStefan Hajnoczi 'data': { 'device': 'drive0', 2767c6a4ab8SFam Zheng 'target': target, 277b53169eaSStefan Hajnoczi 'sync': 'full' }, 278e5ca8fddSStefan Hajnoczi } 279e5ca8fddSStefan Hajnoczi ]) 2807c6a4ab8SFam Zheng 281e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 282e5ca8fddSStefan Hajnoczi 283e5ca8fddSStefan Hajnoczi event = self.cancel_and_wait() 284e5ca8fddSStefan Hajnoczi self.assert_qmp(event, 'data/type', 'backup') 285e5ca8fddSStefan Hajnoczi 2867c6a4ab8SFam Zheng def test_cancel_drive_backup(self): 2877c6a4ab8SFam Zheng self.do_test_cancel('drive-backup', target_img) 2887c6a4ab8SFam Zheng 2897c6a4ab8SFam Zheng def test_cancel_blockdev_backup(self): 2907c6a4ab8SFam Zheng self.do_test_cancel('blockdev-backup', 'drive1') 2917c6a4ab8SFam Zheng 2927c6a4ab8SFam Zheng def do_test_pause(self, cmd, target, image): 293e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 294e5ca8fddSStefan Hajnoczi 295b59b3d57SFam Zheng self.vm.pause_drive('drive0') 296e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 2977c6a4ab8SFam Zheng 'type': cmd, 298e5ca8fddSStefan Hajnoczi 'data': { 'device': 'drive0', 2997c6a4ab8SFam Zheng 'target': target, 300b53169eaSStefan Hajnoczi 'sync': 'full' }, 301e5ca8fddSStefan Hajnoczi } 302e5ca8fddSStefan Hajnoczi ]) 303e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 304e5ca8fddSStefan Hajnoczi 305e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-pause', device='drive0') 306e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 307e5ca8fddSStefan Hajnoczi 308b59b3d57SFam Zheng self.vm.resume_drive('drive0') 309e5ca8fddSStefan Hajnoczi time.sleep(1) 310e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 311e5ca8fddSStefan Hajnoczi offset = self.dictpath(result, 'return[0]/offset') 312e5ca8fddSStefan Hajnoczi 313e5ca8fddSStefan Hajnoczi time.sleep(1) 314e5ca8fddSStefan Hajnoczi result = self.vm.qmp('query-block-jobs') 315e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return[0]/offset', offset) 316e5ca8fddSStefan Hajnoczi 317e5ca8fddSStefan Hajnoczi result = self.vm.qmp('block-job-resume', device='drive0') 318e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'return', {}) 319e5ca8fddSStefan Hajnoczi 320e5ca8fddSStefan Hajnoczi self.wait_until_completed() 321e5ca8fddSStefan Hajnoczi 322e5ca8fddSStefan Hajnoczi self.vm.shutdown() 3237c6a4ab8SFam Zheng self.assertTrue(iotests.compare_images(test_img, image), 324e5ca8fddSStefan Hajnoczi 'target image does not match source after backup') 325e5ca8fddSStefan Hajnoczi 3267c6a4ab8SFam Zheng def test_pause_drive_backup(self): 3277c6a4ab8SFam Zheng self.do_test_pause('drive-backup', target_img, target_img) 3287c6a4ab8SFam Zheng 3297c6a4ab8SFam Zheng def test_pause_blockdev_backup(self): 3307c6a4ab8SFam Zheng self.do_test_pause('blockdev-backup', 'drive1', blockdev_target_img) 3317c6a4ab8SFam Zheng 3327c6a4ab8SFam Zheng def do_test_medium_not_found(self, cmd, target): 333d8683155SBo Tu if iotests.qemu_default_machine != 'pc': 334d8683155SBo Tu return 335d8683155SBo Tu 336e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 3377c6a4ab8SFam Zheng 'type': cmd, 3380ed82f7aSMax Reitz 'data': { 'device': 'drive2', # CD-ROM 3397c6a4ab8SFam Zheng 'target': target, 340b53169eaSStefan Hajnoczi 'sync': 'full' }, 341e5ca8fddSStefan Hajnoczi } 342e5ca8fddSStefan Hajnoczi ]) 343e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 344e5ca8fddSStefan Hajnoczi 3457c6a4ab8SFam Zheng def test_medium_not_found_drive_backup(self): 3467c6a4ab8SFam Zheng self.do_test_medium_not_found('drive-backup', target_img) 3477c6a4ab8SFam Zheng 3487c6a4ab8SFam Zheng def test_medium_not_found_blockdev_backup(self): 3497c6a4ab8SFam Zheng self.do_test_medium_not_found('blockdev-backup', 'drive1') 3507c6a4ab8SFam Zheng 351e5ca8fddSStefan Hajnoczi def test_image_not_found(self): 352e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 353e5ca8fddSStefan Hajnoczi 'type': 'drive-backup', 354e5ca8fddSStefan Hajnoczi 'data': { 'device': 'drive0', 355e5ca8fddSStefan Hajnoczi 'mode': 'existing', 356b53169eaSStefan Hajnoczi 'target': target_img, 357b53169eaSStefan Hajnoczi 'sync': 'full' }, 358e5ca8fddSStefan Hajnoczi } 359e5ca8fddSStefan Hajnoczi ]) 360e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 361e5ca8fddSStefan Hajnoczi 362e5ca8fddSStefan Hajnoczi def test_device_not_found(self): 363e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 364e5ca8fddSStefan Hajnoczi 'type': 'drive-backup', 365e5ca8fddSStefan Hajnoczi 'data': { 'device': 'nonexistent', 366e5ca8fddSStefan Hajnoczi 'mode': 'existing', 367b53169eaSStefan Hajnoczi 'target': target_img, 368b53169eaSStefan Hajnoczi 'sync': 'full' }, 369e5ca8fddSStefan Hajnoczi } 370e5ca8fddSStefan Hajnoczi ]) 371*b7e4fa22SKevin Wolf self.assert_qmp(result, 'error/class', 'GenericError') 372e5ca8fddSStefan Hajnoczi 3737c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 3747c6a4ab8SFam Zheng 'type': 'blockdev-backup', 3757c6a4ab8SFam Zheng 'data': { 'device': 'nonexistent', 3767c6a4ab8SFam Zheng 'target': 'drive1', 3777c6a4ab8SFam Zheng 'sync': 'full' }, 3787c6a4ab8SFam Zheng } 3797c6a4ab8SFam Zheng ]) 3805b347c54SMarkus Armbruster self.assert_qmp(result, 'error/class', 'GenericError') 3817c6a4ab8SFam Zheng 3827c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 3837c6a4ab8SFam Zheng 'type': 'blockdev-backup', 3847c6a4ab8SFam Zheng 'data': { 'device': 'drive0', 3857c6a4ab8SFam Zheng 'target': 'nonexistent', 3867c6a4ab8SFam Zheng 'sync': 'full' }, 3877c6a4ab8SFam Zheng } 3887c6a4ab8SFam Zheng ]) 3895b347c54SMarkus Armbruster self.assert_qmp(result, 'error/class', 'GenericError') 3907c6a4ab8SFam Zheng 3917c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 3927c6a4ab8SFam Zheng 'type': 'blockdev-backup', 3937c6a4ab8SFam Zheng 'data': { 'device': 'nonexistent', 3947c6a4ab8SFam Zheng 'target': 'nonexistent', 3957c6a4ab8SFam Zheng 'sync': 'full' }, 3967c6a4ab8SFam Zheng } 3977c6a4ab8SFam Zheng ]) 3985b347c54SMarkus Armbruster self.assert_qmp(result, 'error/class', 'GenericError') 3997c6a4ab8SFam Zheng 4007c6a4ab8SFam Zheng def test_target_is_source(self): 4017c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 4027c6a4ab8SFam Zheng 'type': 'blockdev-backup', 4037c6a4ab8SFam Zheng 'data': { 'device': 'drive0', 4047c6a4ab8SFam Zheng 'target': 'drive0', 4057c6a4ab8SFam Zheng 'sync': 'full' }, 4067c6a4ab8SFam Zheng } 4077c6a4ab8SFam Zheng ]) 4087c6a4ab8SFam Zheng self.assert_qmp(result, 'error/class', 'GenericError') 4097c6a4ab8SFam Zheng 410e5ca8fddSStefan Hajnoczi def test_abort(self): 411e5ca8fddSStefan Hajnoczi result = self.vm.qmp('transaction', actions=[{ 412e5ca8fddSStefan Hajnoczi 'type': 'drive-backup', 413e5ca8fddSStefan Hajnoczi 'data': { 'device': 'nonexistent', 414e5ca8fddSStefan Hajnoczi 'mode': 'existing', 415b53169eaSStefan Hajnoczi 'target': target_img, 416b53169eaSStefan Hajnoczi 'sync': 'full' }, 417e5ca8fddSStefan Hajnoczi }, { 418e5ca8fddSStefan Hajnoczi 'type': 'Abort', 419e5ca8fddSStefan Hajnoczi 'data': {}, 420e5ca8fddSStefan Hajnoczi } 421e5ca8fddSStefan Hajnoczi ]) 422e5ca8fddSStefan Hajnoczi self.assert_qmp(result, 'error/class', 'GenericError') 423e5ca8fddSStefan Hajnoczi self.assert_no_active_block_jobs() 424e5ca8fddSStefan Hajnoczi 4257c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 4267c6a4ab8SFam Zheng 'type': 'blockdev-backup', 4277c6a4ab8SFam Zheng 'data': { 'device': 'nonexistent', 4287c6a4ab8SFam Zheng 'target': 'drive1', 4297c6a4ab8SFam Zheng 'sync': 'full' }, 4307c6a4ab8SFam Zheng }, { 4317c6a4ab8SFam Zheng 'type': 'Abort', 4327c6a4ab8SFam Zheng 'data': {}, 4337c6a4ab8SFam Zheng } 4347c6a4ab8SFam Zheng ]) 4357c6a4ab8SFam Zheng self.assert_qmp(result, 'error/class', 'GenericError') 4367c6a4ab8SFam Zheng self.assert_no_active_block_jobs() 4377c6a4ab8SFam Zheng 4387c6a4ab8SFam Zheng result = self.vm.qmp('transaction', actions=[{ 4397c6a4ab8SFam Zheng 'type': 'blockdev-backup', 4407c6a4ab8SFam Zheng 'data': { 'device': 'drive0', 4417c6a4ab8SFam Zheng 'target': 'nonexistent', 4427c6a4ab8SFam Zheng 'sync': 'full' }, 4437c6a4ab8SFam Zheng }, { 4447c6a4ab8SFam Zheng 'type': 'Abort', 4457c6a4ab8SFam Zheng 'data': {}, 4467c6a4ab8SFam Zheng } 4477c6a4ab8SFam Zheng ]) 4487c6a4ab8SFam Zheng self.assert_qmp(result, 'error/class', 'GenericError') 4497c6a4ab8SFam Zheng self.assert_no_active_block_jobs() 4507c6a4ab8SFam Zheng 451e5ca8fddSStefan Hajnocziif __name__ == '__main__': 452e5ca8fddSStefan Hajnoczi iotests.main(supported_fmts=['raw', 'qcow2']) 453