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