xref: /qemu/tests/qemu-iotests/264 (revision 23ee0ec2360b51619cae452c4faa8590dea74a6e)
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