iotests: Add mirror tests for orphaned source
Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
7a25fcd056
commit
5694923ad1
|
@ -966,5 +966,51 @@ class TestRepairQuorum(iotests.QMPTestCase):
|
||||||
# to check that this file is really driven by quorum
|
# to check that this file is really driven by quorum
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
|
|
||||||
|
# Test mirroring with a source that does not have any parents (not even a
|
||||||
|
# BlockBackend)
|
||||||
|
class TestOrphanedSource(iotests.QMPTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
blk0 = { 'node-name': 'src',
|
||||||
|
'driver': 'null-co' }
|
||||||
|
|
||||||
|
blk1 = { 'node-name': 'dest',
|
||||||
|
'driver': 'null-co' }
|
||||||
|
|
||||||
|
blk2 = { 'node-name': 'dest-ro',
|
||||||
|
'driver': 'null-co',
|
||||||
|
'read-only': 'on' }
|
||||||
|
|
||||||
|
self.vm = iotests.VM()
|
||||||
|
self.vm.add_blockdev(self.qmp_to_opts(blk0))
|
||||||
|
self.vm.add_blockdev(self.qmp_to_opts(blk1))
|
||||||
|
self.vm.add_blockdev(self.qmp_to_opts(blk2))
|
||||||
|
self.vm.launch()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.vm.shutdown()
|
||||||
|
|
||||||
|
def test_no_job_id(self):
|
||||||
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
|
result = self.vm.qmp('blockdev-mirror', device='src', sync='full',
|
||||||
|
target='dest')
|
||||||
|
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||||
|
|
||||||
|
def test_success(self):
|
||||||
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
|
result = self.vm.qmp('blockdev-mirror', job_id='job', device='src',
|
||||||
|
sync='full', target='dest')
|
||||||
|
self.assert_qmp(result, 'return', {})
|
||||||
|
|
||||||
|
self.complete_and_wait('job')
|
||||||
|
|
||||||
|
def test_failing_permissions(self):
|
||||||
|
self.assert_no_active_block_jobs()
|
||||||
|
|
||||||
|
result = self.vm.qmp('blockdev-mirror', device='src', sync='full',
|
||||||
|
target='dest-ro')
|
||||||
|
self.assert_qmp(result, 'error/class', 'GenericError')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
iotests.main(supported_fmts=['qcow2', 'qed'])
|
iotests.main(supported_fmts=['qcow2', 'qed'])
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
............................................................................
|
...............................................................................
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
Ran 76 tests
|
Ran 79 tests
|
||||||
|
|
||||||
OK
|
OK
|
||||||
|
|
|
@ -177,6 +177,14 @@ class VM(qtest.QEMUQtestMachine):
|
||||||
self._num_drives += 1
|
self._num_drives += 1
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def add_blockdev(self, opts):
|
||||||
|
self._args.append('-blockdev')
|
||||||
|
if isinstance(opts, str):
|
||||||
|
self._args.append(opts)
|
||||||
|
else:
|
||||||
|
self._args.append(','.join(opts))
|
||||||
|
return self
|
||||||
|
|
||||||
def pause_drive(self, drive, event=None):
|
def pause_drive(self, drive, event=None):
|
||||||
'''Pause drive r/w operations'''
|
'''Pause drive r/w operations'''
|
||||||
if not event:
|
if not event:
|
||||||
|
@ -235,6 +243,13 @@ class QMPTestCase(unittest.TestCase):
|
||||||
output[basestr[:-1]] = obj # Strip trailing '.'
|
output[basestr[:-1]] = obj # Strip trailing '.'
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
def qmp_to_opts(self, obj):
|
||||||
|
obj = self.flatten_qmp_object(obj)
|
||||||
|
output_list = list()
|
||||||
|
for key in obj:
|
||||||
|
output_list += [key + '=' + obj[key]]
|
||||||
|
return ','.join(output_list)
|
||||||
|
|
||||||
def assert_qmp_absent(self, d, path):
|
def assert_qmp_absent(self, d, path):
|
||||||
try:
|
try:
|
||||||
result = self.dictpath(d, path)
|
result = self.dictpath(d, path)
|
||||||
|
|
Loading…
Reference in a new issue