1fc905d3aSVladimir Sementsov-Ogievskiy#!/usr/bin/env python 2fc905d3aSVladimir Sementsov-Ogievskiy# 3fc905d3aSVladimir Sementsov-Ogievskiy# Tests for persistent dirty bitmaps. 4fc905d3aSVladimir Sementsov-Ogievskiy# 5fc905d3aSVladimir Sementsov-Ogievskiy# Copyright: Vladimir Sementsov-Ogievskiy 2015-2017 6fc905d3aSVladimir Sementsov-Ogievskiy# 7fc905d3aSVladimir Sementsov-Ogievskiy# This program is free software; you can redistribute it and/or modify 8fc905d3aSVladimir Sementsov-Ogievskiy# it under the terms of the GNU General Public License as published by 9fc905d3aSVladimir Sementsov-Ogievskiy# the Free Software Foundation; either version 2 of the License, or 10fc905d3aSVladimir Sementsov-Ogievskiy# (at your option) any later version. 11fc905d3aSVladimir Sementsov-Ogievskiy# 12fc905d3aSVladimir Sementsov-Ogievskiy# This program is distributed in the hope that it will be useful, 13fc905d3aSVladimir Sementsov-Ogievskiy# but WITHOUT ANY WARRANTY; without even the implied warranty of 14fc905d3aSVladimir Sementsov-Ogievskiy# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15fc905d3aSVladimir Sementsov-Ogievskiy# GNU General Public License for more details. 16fc905d3aSVladimir Sementsov-Ogievskiy# 17fc905d3aSVladimir Sementsov-Ogievskiy# You should have received a copy of the GNU General Public License 18fc905d3aSVladimir Sementsov-Ogievskiy# along with this program. If not, see <http://www.gnu.org/licenses/>. 19fc905d3aSVladimir Sementsov-Ogievskiy# 20fc905d3aSVladimir Sementsov-Ogievskiy 21fc905d3aSVladimir Sementsov-Ogievskiyimport os 22fc905d3aSVladimir Sementsov-Ogievskiyimport re 23fc905d3aSVladimir Sementsov-Ogievskiyimport iotests 24fc905d3aSVladimir Sementsov-Ogievskiyfrom iotests import qemu_img 25fc905d3aSVladimir Sementsov-Ogievskiy 26fc905d3aSVladimir Sementsov-Ogievskiydisk = os.path.join(iotests.test_dir, 'disk') 27fc905d3aSVladimir Sementsov-Ogievskiydisk_size = 0x40000000 # 1G 28fc905d3aSVladimir Sementsov-Ogievskiy 29fc905d3aSVladimir Sementsov-Ogievskiy# regions for qemu_io: (start, count) in bytes 3049d741b5SEric Blakeregions1 = ((0x0fff00, 0x10000), 31fc905d3aSVladimir Sementsov-Ogievskiy (0x200000, 0x100000)) 32fc905d3aSVladimir Sementsov-Ogievskiy 33fc905d3aSVladimir Sementsov-Ogievskiyregions2 = ((0x10000000, 0x20000), 34fc905d3aSVladimir Sementsov-Ogievskiy (0x3fff0000, 0x10000)) 35fc905d3aSVladimir Sementsov-Ogievskiy 36fc905d3aSVladimir Sementsov-Ogievskiyclass TestPersistentDirtyBitmap(iotests.QMPTestCase): 37fc905d3aSVladimir Sementsov-Ogievskiy 38fc905d3aSVladimir Sementsov-Ogievskiy def setUp(self): 39fc905d3aSVladimir Sementsov-Ogievskiy qemu_img('create', '-f', iotests.imgfmt, disk, str(disk_size)) 40fc905d3aSVladimir Sementsov-Ogievskiy 41fc905d3aSVladimir Sementsov-Ogievskiy def tearDown(self): 42fc905d3aSVladimir Sementsov-Ogievskiy os.remove(disk) 43fc905d3aSVladimir Sementsov-Ogievskiy 44fc905d3aSVladimir Sementsov-Ogievskiy def mkVm(self): 45fc905d3aSVladimir Sementsov-Ogievskiy return iotests.VM().add_drive(disk) 46fc905d3aSVladimir Sementsov-Ogievskiy 47fc905d3aSVladimir Sementsov-Ogievskiy def mkVmRo(self): 48fc905d3aSVladimir Sementsov-Ogievskiy return iotests.VM().add_drive(disk, opts='readonly=on') 49fc905d3aSVladimir Sementsov-Ogievskiy 50fc905d3aSVladimir Sementsov-Ogievskiy def getSha256(self): 51fc905d3aSVladimir Sementsov-Ogievskiy result = self.vm.qmp('x-debug-block-dirty-bitmap-sha256', 52fc905d3aSVladimir Sementsov-Ogievskiy node='drive0', name='bitmap0') 53fc905d3aSVladimir Sementsov-Ogievskiy return result['return']['sha256'] 54fc905d3aSVladimir Sementsov-Ogievskiy 55fc905d3aSVladimir Sementsov-Ogievskiy def checkBitmap(self, sha256): 56fc905d3aSVladimir Sementsov-Ogievskiy result = self.vm.qmp('x-debug-block-dirty-bitmap-sha256', 57fc905d3aSVladimir Sementsov-Ogievskiy node='drive0', name='bitmap0') 58fc905d3aSVladimir Sementsov-Ogievskiy self.assert_qmp(result, 'return/sha256', sha256); 59fc905d3aSVladimir Sementsov-Ogievskiy 60fc905d3aSVladimir Sementsov-Ogievskiy def writeRegions(self, regions): 61fc905d3aSVladimir Sementsov-Ogievskiy for r in regions: 62fc905d3aSVladimir Sementsov-Ogievskiy self.vm.hmp_qemu_io('drive0', 63fc905d3aSVladimir Sementsov-Ogievskiy 'write %d %d' % r) 64fc905d3aSVladimir Sementsov-Ogievskiy 65fc905d3aSVladimir Sementsov-Ogievskiy def qmpAddBitmap(self): 66fc905d3aSVladimir Sementsov-Ogievskiy self.vm.qmp('block-dirty-bitmap-add', node='drive0', 67*3e99da5eSVladimir Sementsov-Ogievskiy name='bitmap0', persistent=True) 68fc905d3aSVladimir Sementsov-Ogievskiy 69fc905d3aSVladimir Sementsov-Ogievskiy def test_persistent(self): 70fc905d3aSVladimir Sementsov-Ogievskiy self.vm = self.mkVm() 71fc905d3aSVladimir Sementsov-Ogievskiy self.vm.launch() 72fc905d3aSVladimir Sementsov-Ogievskiy self.qmpAddBitmap() 73fc905d3aSVladimir Sementsov-Ogievskiy 74fc905d3aSVladimir Sementsov-Ogievskiy self.writeRegions(regions1) 75fc905d3aSVladimir Sementsov-Ogievskiy sha256 = self.getSha256() 76fc905d3aSVladimir Sementsov-Ogievskiy 77fc905d3aSVladimir Sementsov-Ogievskiy self.vm.shutdown() 78fc905d3aSVladimir Sementsov-Ogievskiy 79fc905d3aSVladimir Sementsov-Ogievskiy self.vm = self.mkVmRo() 80fc905d3aSVladimir Sementsov-Ogievskiy self.vm.launch() 81fc905d3aSVladimir Sementsov-Ogievskiy self.vm.shutdown() 82fc905d3aSVladimir Sementsov-Ogievskiy 83fc905d3aSVladimir Sementsov-Ogievskiy #catch 'Persistent bitmaps are lost' possible error 84fc905d3aSVladimir Sementsov-Ogievskiy log = self.vm.get_log() 85fc905d3aSVladimir Sementsov-Ogievskiy log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log) 86fc905d3aSVladimir Sementsov-Ogievskiy log = re.sub(r'\[I \+\d+\.\d+\] CLOSED\n?$', '', log) 87fc905d3aSVladimir Sementsov-Ogievskiy if log: 88fc905d3aSVladimir Sementsov-Ogievskiy print log 89fc905d3aSVladimir Sementsov-Ogievskiy 90fc905d3aSVladimir Sementsov-Ogievskiy self.vm = self.mkVm() 91fc905d3aSVladimir Sementsov-Ogievskiy self.vm.launch() 92fc905d3aSVladimir Sementsov-Ogievskiy 93fc905d3aSVladimir Sementsov-Ogievskiy self.checkBitmap(sha256) 94fc905d3aSVladimir Sementsov-Ogievskiy self.writeRegions(regions2) 95fc905d3aSVladimir Sementsov-Ogievskiy sha256 = self.getSha256() 96fc905d3aSVladimir Sementsov-Ogievskiy 97fc905d3aSVladimir Sementsov-Ogievskiy self.vm.shutdown() 98fc905d3aSVladimir Sementsov-Ogievskiy self.vm.launch() 99fc905d3aSVladimir Sementsov-Ogievskiy 100fc905d3aSVladimir Sementsov-Ogievskiy self.checkBitmap(sha256) 101fc905d3aSVladimir Sementsov-Ogievskiy 102fc905d3aSVladimir Sementsov-Ogievskiy self.vm.shutdown() 103fc905d3aSVladimir Sementsov-Ogievskiy 104fc905d3aSVladimir Sementsov-Ogievskiyif __name__ == '__main__': 105fc905d3aSVladimir Sementsov-Ogievskiy iotests.main(supported_fmts=['qcow2']) 106