yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-iotests-169-add-cases-for-source-vm-resuming.patch

ae23c9
From e56ee6a66cc5452a46426b11d642da792b7ee75d Mon Sep 17 00:00:00 2001
ae23c9
From: John Snow <jsnow@redhat.com>
ae23c9
Date: Tue, 20 Nov 2018 18:18:28 +0000
ae23c9
Subject: [PATCH 34/35] iotests: 169: add cases for source vm resuming
ae23c9
ae23c9
RH-Author: John Snow <jsnow@redhat.com>
ae23c9
Message-id: <20181120181828.15132-25-jsnow@redhat.com>
ae23c9
Patchwork-id: 83068
ae23c9
O-Subject: [RHEL8/rhel qemu-kvm PATCH 24/24] iotests: 169: add cases for source vm resuming
ae23c9
Bugzilla: 1518989
ae23c9
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
ae23c9
RH-Acked-by: Max Reitz <mreitz@redhat.com>
ae23c9
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
ae23c9
ae23c9
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
ae23c9
ae23c9
Test that we can resume source vm after [failed] migration, and bitmaps
ae23c9
are ok.
ae23c9
ae23c9
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
ae23c9
Signed-off-by: John Snow <jsnow@redhat.com>
ae23c9
(cherry picked from commit 3e6d88f280a53b5b399e73b1f80efe4c3db306f1)
ae23c9
Signed-off-by: John Snow <jsnow@redhat.com>
ae23c9
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ae23c9
---
ae23c9
 tests/qemu-iotests/169     | 60 +++++++++++++++++++++++++++++++++++++++++++++-
ae23c9
 tests/qemu-iotests/169.out |  4 ++--
ae23c9
 2 files changed, 61 insertions(+), 3 deletions(-)
ae23c9
ae23c9
diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
ae23c9
index 8b7947d..69850c4 100755
ae23c9
--- a/tests/qemu-iotests/169
ae23c9
+++ b/tests/qemu-iotests/169
ae23c9
@@ -77,6 +77,58 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
ae23c9
             self.assert_qmp(result, 'error/desc',
ae23c9
                             "Dirty bitmap 'bitmap0' not found");
ae23c9
 
ae23c9
+    def do_test_migration_resume_source(self, persistent, migrate_bitmaps):
ae23c9
+        granularity = 512
ae23c9
+
ae23c9
+        # regions = ((start, count), ...)
ae23c9
+        regions = ((0, 0x10000),
ae23c9
+                   (0xf0000, 0x10000),
ae23c9
+                   (0xa0201, 0x1000))
ae23c9
+
ae23c9
+        mig_caps = [{'capability': 'events', 'state': True}]
ae23c9
+        if migrate_bitmaps:
ae23c9
+            mig_caps.append({'capability': 'dirty-bitmaps', 'state': True})
ae23c9
+
ae23c9
+        result = self.vm_a.qmp('migrate-set-capabilities',
ae23c9
+                               capabilities=mig_caps)
ae23c9
+        self.assert_qmp(result, 'return', {})
ae23c9
+
ae23c9
+        self.add_bitmap(self.vm_a, granularity, persistent)
ae23c9
+        for r in regions:
ae23c9
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % r)
ae23c9
+        sha256 = self.get_bitmap_hash(self.vm_a)
ae23c9
+
ae23c9
+        result = self.vm_a.qmp('migrate', uri=mig_cmd)
ae23c9
+        while True:
ae23c9
+            event = self.vm_a.event_wait('MIGRATION')
ae23c9
+            if event['data']['status'] == 'completed':
ae23c9
+                break
ae23c9
+
ae23c9
+        # test that bitmap is still here
ae23c9
+        removed = (not migrate_bitmaps) and persistent
ae23c9
+        self.check_bitmap(self.vm_a, False if removed else sha256)
ae23c9
+
ae23c9
+        self.vm_a.qmp('cont')
ae23c9
+
ae23c9
+        # test that bitmap is still here after invalidation
ae23c9
+        self.check_bitmap(self.vm_a, sha256)
ae23c9
+
ae23c9
+        # shutdown and check that invalidation didn't fail
ae23c9
+        self.vm_a.shutdown()
ae23c9
+
ae23c9
+        # catch 'Could not reopen qcow2 layer: Bitmap already exists'
ae23c9
+        # possible error
ae23c9
+        log = self.vm_a.get_log()
ae23c9
+        log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log)
ae23c9
+        log = re.sub(r'^(wrote .* bytes at offset .*\n.*KiB.*ops.*sec.*\n){3}',
ae23c9
+                     '', log)
ae23c9
+        log = re.sub(r'\[I \+\d+\.\d+\] CLOSED\n?$', '', log)
ae23c9
+        self.assertEqual(log, '')
ae23c9
+
ae23c9
+        # test that bitmap is still persistent
ae23c9
+        self.vm_a.launch()
ae23c9
+        self.check_bitmap(self.vm_a, sha256 if persistent else False)
ae23c9
+
ae23c9
     def do_test_migration(self, persistent, migrate_bitmaps, online,
ae23c9
                           shared_storage):
ae23c9
         granularity = 512
ae23c9
@@ -152,7 +204,7 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
ae23c9
 
ae23c9
 def inject_test_case(klass, name, method, *args, **kwargs):
ae23c9
     mc = operator.methodcaller(method, *args, **kwargs)
ae23c9
-    setattr(klass, 'test_' + name, new.instancemethod(mc, None, klass))
ae23c9
+    setattr(klass, 'test_' + method + name, new.instancemethod(mc, None, klass))
ae23c9
 
ae23c9
 for cmb in list(itertools.product((True, False), repeat=4)):
ae23c9
     name = ('_' if cmb[0] else '_not_') + 'persistent_'
ae23c9
@@ -163,6 +215,12 @@ for cmb in list(itertools.product((True, False), repeat=4)):
ae23c9
     inject_test_case(TestDirtyBitmapMigration, name, 'do_test_migration',
ae23c9
                      *list(cmb))
ae23c9
 
ae23c9
+for cmb in list(itertools.product((True, False), repeat=2)):
ae23c9
+    name = ('_' if cmb[0] else '_not_') + 'persistent_'
ae23c9
+    name += ('_' if cmb[1] else '_not_') + 'migbitmap'
ae23c9
+
ae23c9
+    inject_test_case(TestDirtyBitmapMigration, name,
ae23c9
+                     'do_test_migration_resume_source', *list(cmb))
ae23c9
 
ae23c9
 if __name__ == '__main__':
ae23c9
     iotests.main(supported_fmts=['qcow2'])
ae23c9
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
ae23c9
index b6f2576..3a89159 100644
ae23c9
--- a/tests/qemu-iotests/169.out
ae23c9
+++ b/tests/qemu-iotests/169.out
ae23c9
@@ -1,5 +1,5 @@
ae23c9
-................
ae23c9
+....................
ae23c9
 ----------------------------------------------------------------------
ae23c9
-Ran 16 tests
ae23c9
+Ran 20 tests
ae23c9
 
ae23c9
 OK
ae23c9
-- 
ae23c9
1.8.3.1
ae23c9