1*23ee0ec2SVladimir Sementsov-Ogievskiy#!/usr/bin/env python 2*23ee0ec2SVladimir Sementsov-Ogievskiy# 3*23ee0ec2SVladimir Sementsov-Ogievskiy# Test nbd reconnect 4*23ee0ec2SVladimir Sementsov-Ogievskiy# 5*23ee0ec2SVladimir Sementsov-Ogievskiy# Copyright (c) 2019 Virtuozzo International GmbH. 6*23ee0ec2SVladimir Sementsov-Ogievskiy# 7*23ee0ec2SVladimir Sementsov-Ogievskiy# This program is free software; you can redistribute it and/or modify 8*23ee0ec2SVladimir Sementsov-Ogievskiy# it under the terms of the GNU General Public License as published by 9*23ee0ec2SVladimir Sementsov-Ogievskiy# the Free Software Foundation; either version 2 of the License, or 10*23ee0ec2SVladimir Sementsov-Ogievskiy# (at your option) any later version. 11*23ee0ec2SVladimir Sementsov-Ogievskiy# 12*23ee0ec2SVladimir Sementsov-Ogievskiy# This program is distributed in the hope that it will be useful, 13*23ee0ec2SVladimir Sementsov-Ogievskiy# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*23ee0ec2SVladimir Sementsov-Ogievskiy# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*23ee0ec2SVladimir Sementsov-Ogievskiy# GNU General Public License for more details. 16*23ee0ec2SVladimir Sementsov-Ogievskiy# 17*23ee0ec2SVladimir Sementsov-Ogievskiy# You should have received a copy of the GNU General Public License 18*23ee0ec2SVladimir Sementsov-Ogievskiy# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*23ee0ec2SVladimir Sementsov-Ogievskiy# 20*23ee0ec2SVladimir Sementsov-Ogievskiy 21*23ee0ec2SVladimir Sementsov-Ogievskiyimport time 22*23ee0ec2SVladimir Sementsov-Ogievskiy 23*23ee0ec2SVladimir Sementsov-Ogievskiyimport iotests 24*23ee0ec2SVladimir Sementsov-Ogievskiyfrom iotests import qemu_img_create, qemu_io_silent_check, file_path, \ 25*23ee0ec2SVladimir Sementsov-Ogievskiy qemu_nbd_popen, log 26*23ee0ec2SVladimir Sementsov-Ogievskiy 27*23ee0ec2SVladimir Sementsov-Ogievskiydisk_a, disk_b, nbd_sock = file_path('disk_a', 'disk_b', 'nbd-sock') 28*23ee0ec2SVladimir Sementsov-Ogievskiynbd_uri = 'nbd+unix:///?socket=' + nbd_sock 29*23ee0ec2SVladimir Sementsov-Ogievskiysize = 5 * 1024 * 1024 30*23ee0ec2SVladimir Sementsov-Ogievskiywait_limit = 3 31*23ee0ec2SVladimir Sementsov-Ogievskiywait_step = 0.2 32*23ee0ec2SVladimir Sementsov-Ogievskiy 33*23ee0ec2SVladimir Sementsov-Ogievskiyqemu_img_create('-f', iotests.imgfmt, disk_a, str(size)) 34*23ee0ec2SVladimir Sementsov-Ogievskiyqemu_img_create('-f', iotests.imgfmt, disk_b, str(size)) 35*23ee0ec2SVladimir Sementsov-Ogievskiysrv = qemu_nbd_popen('-k', nbd_sock, '-f', iotests.imgfmt, disk_b) 36*23ee0ec2SVladimir Sementsov-Ogievskiy 37*23ee0ec2SVladimir Sementsov-Ogievskiy# Wait for NBD server availability 38*23ee0ec2SVladimir Sementsov-Ogievskiyt = 0 39*23ee0ec2SVladimir Sementsov-Ogievskiyok = False 40*23ee0ec2SVladimir Sementsov-Ogievskiywhile t < wait_limit: 41*23ee0ec2SVladimir Sementsov-Ogievskiy ok = qemu_io_silent_check('-f', 'raw', '-c', 'read 0 512', nbd_uri) 42*23ee0ec2SVladimir Sementsov-Ogievskiy if ok: 43*23ee0ec2SVladimir Sementsov-Ogievskiy break 44*23ee0ec2SVladimir Sementsov-Ogievskiy time.sleep(wait_step) 45*23ee0ec2SVladimir Sementsov-Ogievskiy t += wait_step 46*23ee0ec2SVladimir Sementsov-Ogievskiy 47*23ee0ec2SVladimir Sementsov-Ogievskiyassert ok 48*23ee0ec2SVladimir Sementsov-Ogievskiy 49*23ee0ec2SVladimir Sementsov-Ogievskiyvm = iotests.VM().add_drive(disk_a) 50*23ee0ec2SVladimir Sementsov-Ogievskiyvm.launch() 51*23ee0ec2SVladimir Sementsov-Ogievskiyvm.hmp_qemu_io('drive0', 'write 0 {}'.format(size)) 52*23ee0ec2SVladimir Sementsov-Ogievskiy 53*23ee0ec2SVladimir Sementsov-Ogievskiyvm.qmp_log('blockdev-add', filters=[iotests.filter_qmp_testfiles], 54*23ee0ec2SVladimir Sementsov-Ogievskiy **{'node_name': 'backup0', 55*23ee0ec2SVladimir Sementsov-Ogievskiy 'driver': 'raw', 56*23ee0ec2SVladimir Sementsov-Ogievskiy 'file': {'driver': 'nbd', 57*23ee0ec2SVladimir Sementsov-Ogievskiy 'server': {'type': 'unix', 'path': nbd_sock}, 58*23ee0ec2SVladimir Sementsov-Ogievskiy 'reconnect-delay': 10}}) 59*23ee0ec2SVladimir Sementsov-Ogievskiyvm.qmp_log('blockdev-backup', device='drive0', sync='full', target='backup0', 60*23ee0ec2SVladimir Sementsov-Ogievskiy speed=(1 * 1024 * 1024)) 61*23ee0ec2SVladimir Sementsov-Ogievskiy 62*23ee0ec2SVladimir Sementsov-Ogievskiy# Wait for some progress 63*23ee0ec2SVladimir Sementsov-Ogievskiyt = 0 64*23ee0ec2SVladimir Sementsov-Ogievskiywhile t < wait_limit: 65*23ee0ec2SVladimir Sementsov-Ogievskiy jobs = vm.qmp('query-block-jobs')['return'] 66*23ee0ec2SVladimir Sementsov-Ogievskiy if jobs and jobs[0]['offset'] > 0: 67*23ee0ec2SVladimir Sementsov-Ogievskiy break 68*23ee0ec2SVladimir Sementsov-Ogievskiy time.sleep(wait_step) 69*23ee0ec2SVladimir Sementsov-Ogievskiy t += wait_step 70*23ee0ec2SVladimir Sementsov-Ogievskiy 71*23ee0ec2SVladimir Sementsov-Ogievskiyif jobs and jobs[0]['offset'] > 0: 72*23ee0ec2SVladimir Sementsov-Ogievskiy log('Backup job is started') 73*23ee0ec2SVladimir Sementsov-Ogievskiy 74*23ee0ec2SVladimir Sementsov-Ogievskiylog('Kill NBD server') 75*23ee0ec2SVladimir Sementsov-Ogievskiysrv.kill() 76*23ee0ec2SVladimir Sementsov-Ogievskiysrv.wait() 77*23ee0ec2SVladimir Sementsov-Ogievskiy 78*23ee0ec2SVladimir Sementsov-Ogievskiyjobs = vm.qmp('query-block-jobs')['return'] 79*23ee0ec2SVladimir Sementsov-Ogievskiyif jobs and jobs[0]['offset'] < jobs[0]['len']: 80*23ee0ec2SVladimir Sementsov-Ogievskiy log('Backup job is still in progress') 81*23ee0ec2SVladimir Sementsov-Ogievskiy 82*23ee0ec2SVladimir Sementsov-Ogievskiyvm.qmp_log('block-job-set-speed', device='drive0', speed=0) 83*23ee0ec2SVladimir Sementsov-Ogievskiy 84*23ee0ec2SVladimir Sementsov-Ogievskiy# Emulate server down time for 1 second 85*23ee0ec2SVladimir Sementsov-Ogievskiytime.sleep(1) 86*23ee0ec2SVladimir Sementsov-Ogievskiy 87*23ee0ec2SVladimir Sementsov-Ogievskiylog('Start NBD server') 88*23ee0ec2SVladimir Sementsov-Ogievskiysrv = qemu_nbd_popen('-k', nbd_sock, '-f', iotests.imgfmt, disk_b) 89*23ee0ec2SVladimir Sementsov-Ogievskiy 90*23ee0ec2SVladimir Sementsov-Ogievskiye = vm.event_wait('BLOCK_JOB_COMPLETED') 91*23ee0ec2SVladimir Sementsov-Ogievskiylog('Backup completed: {}'.format(e['data']['offset'])) 92*23ee0ec2SVladimir Sementsov-Ogievskiy 93*23ee0ec2SVladimir Sementsov-Ogievskiyvm.qmp_log('blockdev-del', node_name='backup0') 94*23ee0ec2SVladimir Sementsov-Ogievskiysrv.kill() 95*23ee0ec2SVladimir Sementsov-Ogievskiyvm.shutdown() 96