|
@@ -600,6 +600,99 @@ class TestCrossAliasMigration(TestDirtyBitmapMigration):
|
|
self.verify_dest_has_all_bitmaps()
|
|
self.verify_dest_has_all_bitmaps()
|
|
self.verify_dest_error(None)
|
|
self.verify_dest_error(None)
|
|
|
|
|
|
|
|
+class TestAliasTransformMigration(TestDirtyBitmapMigration):
|
|
|
|
+ """
|
|
|
|
+ Tests the 'transform' option which modifies bitmap persistence on migration.
|
|
|
|
+ """
|
|
|
|
+
|
|
|
|
+ src_node_name = 'node-a'
|
|
|
|
+ dst_node_name = 'node-b'
|
|
|
|
+ src_bmap_name = 'bmap-a'
|
|
|
|
+ dst_bmap_name = 'bmap-b'
|
|
|
|
+
|
|
|
|
+ def setUp(self) -> None:
|
|
|
|
+ TestDirtyBitmapMigration.setUp(self)
|
|
|
|
+
|
|
|
|
+ # Now create another block device and let both have two bitmaps each
|
|
|
|
+ result = self.vm_a.qmp('blockdev-add',
|
|
|
|
+ node_name='node-b', driver='null-co',
|
|
|
|
+ read_zeroes=False)
|
|
|
|
+ self.assert_qmp(result, 'return', {})
|
|
|
|
+
|
|
|
|
+ result = self.vm_b.qmp('blockdev-add',
|
|
|
|
+ node_name='node-a', driver='null-co',
|
|
|
|
+ read_zeroes=False)
|
|
|
|
+ self.assert_qmp(result, 'return', {})
|
|
|
|
+
|
|
|
|
+ bmaps_to_add = (('node-a', 'bmap-b'),
|
|
|
|
+ ('node-b', 'bmap-a'),
|
|
|
|
+ ('node-b', 'bmap-b'))
|
|
|
|
+
|
|
|
|
+ for (node, bmap) in bmaps_to_add:
|
|
|
|
+ result = self.vm_a.qmp('block-dirty-bitmap-add',
|
|
|
|
+ node=node, name=bmap)
|
|
|
|
+ self.assert_qmp(result, 'return', {})
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def transform_mapping() -> BlockBitmapMapping:
|
|
|
|
+ return [
|
|
|
|
+ {
|
|
|
|
+ 'node-name': 'node-a',
|
|
|
|
+ 'alias': 'node-a',
|
|
|
|
+ 'bitmaps': [
|
|
|
|
+ {
|
|
|
|
+ 'name': 'bmap-a',
|
|
|
|
+ 'alias': 'bmap-a',
|
|
|
|
+ 'transform':
|
|
|
|
+ {
|
|
|
|
+ 'persistent': True
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 'name': 'bmap-b',
|
|
|
|
+ 'alias': 'bmap-b'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 'node-name': 'node-b',
|
|
|
|
+ 'alias': 'node-b',
|
|
|
|
+ 'bitmaps': [
|
|
|
|
+ {
|
|
|
|
+ 'name': 'bmap-a',
|
|
|
|
+ 'alias': 'bmap-a'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ 'name': 'bmap-b',
|
|
|
|
+ 'alias': 'bmap-b'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ def verify_dest_bitmap_state(self) -> None:
|
|
|
|
+ bitmaps = self.vm_b.query_bitmaps()
|
|
|
|
+
|
|
|
|
+ for node in bitmaps:
|
|
|
|
+ bitmaps[node] = sorted(((bmap['name'], bmap['persistent']) for bmap in bitmaps[node]))
|
|
|
|
+
|
|
|
|
+ self.assertEqual(bitmaps,
|
|
|
|
+ {'node-a': [('bmap-a', True), ('bmap-b', False)],
|
|
|
|
+ 'node-b': [('bmap-a', False), ('bmap-b', False)]})
|
|
|
|
+
|
|
|
|
+ def test_transform_on_src(self) -> None:
|
|
|
|
+ self.set_mapping(self.vm_a, self.transform_mapping())
|
|
|
|
+
|
|
|
|
+ self.migrate()
|
|
|
|
+ self.verify_dest_bitmap_state()
|
|
|
|
+ self.verify_dest_error(None)
|
|
|
|
+
|
|
|
|
+ def test_transform_on_dst(self) -> None:
|
|
|
|
+ self.set_mapping(self.vm_b, self.transform_mapping())
|
|
|
|
+
|
|
|
|
+ self.migrate()
|
|
|
|
+ self.verify_dest_bitmap_state()
|
|
|
|
+ self.verify_dest_error(None)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
iotests.main(supported_protocols=['file'])
|
|
iotests.main(supported_protocols=['file'])
|