[KVM-AUTOTEST PATCH 3/7] KVM test: new test timedrift_with_migration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds a new test that checks the timedrift introduced by migrations.
It uses the same parameters used by the timedrift test to get the guest time.
In addition, the number of migrations the test performs is controlled by the
parameter 'migration_iterations'.

Signed-off-by: Michael Goldish <mgoldish@xxxxxxxxxx>
---
 client/tests/kvm/kvm_tests.cfg.sample              |   33 ++++---
 client/tests/kvm/tests/timedrift_with_migration.py |   95 ++++++++++++++++++++
 2 files changed, 115 insertions(+), 13 deletions(-)
 create mode 100644 client/tests/kvm/tests/timedrift_with_migration.py

diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index 540d0a2..618c21e 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -100,19 +100,26 @@ variants:
         type = linux_s3
 
     - timedrift:    install setup
-        type = timedrift
         extra_params += " -rtc-td-hack"
-        # Pin the VM and host load to CPU #0
-        cpu_mask = 0x1
-        # Set the load and rest durations
-        load_duration = 20
-        rest_duration = 20
-        # Fail if the drift after load is higher than 50%
-        drift_threshold = 50
-        # Fail if the drift after the rest period is higher than 10%
-        drift_threshold_after_rest = 10
-        # For now, make sure this test is executed alone
-        used_cpus = 100
+        variants:
+            - with_load:
+                type = timedrift
+                # Pin the VM and host load to CPU #0
+                cpu_mask = 0x1
+                # Set the load and rest durations
+                load_duration = 20
+                rest_duration = 20
+                # Fail if the drift after load is higher than 50%
+                drift_threshold = 50
+                # Fail if the drift after the rest period is higher than 10%
+                drift_threshold_after_rest = 10
+                # For now, make sure this test is executed alone
+                used_cpus = 100
+            - with_migration:
+                type = timedrift_with_migration
+                migration_iterations = 3
+                drift_threshold = 10
+                drift_threshold_single = 3
 
     - stress_boot:  install setup
         type = stress_boot
@@ -581,7 +588,7 @@ variants:
         extra_params += " -smp 2"
         used_cpus = 2
         stress_boot: used_cpus = 10
-        timedrift: used_cpus = 100
+        timedrift.with_load: used_cpus = 100
 
 
 variants:
diff --git a/client/tests/kvm/tests/timedrift_with_migration.py b/client/tests/kvm/tests/timedrift_with_migration.py
new file mode 100644
index 0000000..139b663
--- /dev/null
+++ b/client/tests/kvm/tests/timedrift_with_migration.py
@@ -0,0 +1,95 @@
+import logging, time, commands, re
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils
+
+
+def run_timedrift_with_migration(test, params, env):
+    """
+    Time drift test with migration:
+
+    1) Log into a guest.
+    2) Take a time reading from the guest and host.
+    3) Migrate the guest.
+    4) Take a second time reading.
+    5) If the drift (in seconds) is higher than a user specified value, fail.
+
+    @param test: KVM test object.
+    @param params: Dictionary with test parameters.
+    @param env: Dictionary with the test environment.
+    """
+    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+    session = kvm_test_utils.wait_for_login(vm)
+
+    # Collect test parameters:
+    # Command to run to get the current time
+    time_command = params.get("time_command")
+    # Filter which should match a string to be passed to time.strptime()
+    time_filter_re = params.get("time_filter_re")
+    # Time format for time.strptime()
+    time_format = params.get("time_format")
+    drift_threshold = float(params.get("drift_threshold", "10"))
+    drift_threshold_single = float(params.get("drift_threshold_single", "3"))
+    migration_iterations = int(params.get("migration_iterations", 1))
+
+    try:
+        # Get initial time
+        # (ht stands for host time, gt stands for guest time)
+        (ht0, gt0) = kvm_test_utils.get_time(session, time_command,
+                                             time_filter_re, time_format)
+
+        # Migrate
+        for i in range(migration_iterations):
+            # Get time before current iteration
+            (ht0_, gt0_) = kvm_test_utils.get_time(session, time_command,
+                                                   time_filter_re, time_format)
+            session.close()
+            # Run current iteration
+            logging.info("Migrating: iteration %d of %d..." %
+                         (i + 1, migration_iterations))
+            vm = kvm_test_utils.migrate(vm, env)
+            # Log in
+            logging.info("Logging in after migration...")
+            session = vm.remote_login()
+            if not session:
+                raise error.TestFail("Could not log in after migration")
+            logging.info("Logged in after migration")
+            # Get time after current iteration
+            (ht1_, gt1_) = kvm_test_utils.get_time(session, time_command,
+                                                   time_filter_re, time_format)
+            # Report iteration results
+            host_delta = ht1_ - ht0_
+            guest_delta = gt1_ - gt0_
+            drift = abs(host_delta - guest_delta)
+            logging.info("Host duration (iteration %d): %.2f" %
+                         (i + 1, host_delta))
+            logging.info("Guest duration (iteration %d): %.2f" %
+                         (i + 1, guest_delta))
+            logging.info("Drift at iteration %d: %.2f seconds" %
+                         (i + 1, drift))
+            # Fail if necessary
+            if drift > drift_threshold_single:
+                raise error.TestFail("Time drift too large at iteration %d: "
+                                     "%.2f seconds" % (i + 1, drift))
+
+        # Get final time
+        (ht1, gt1) = kvm_test_utils.get_time(session, time_command,
+                                             time_filter_re, time_format)
+
+    finally:
+        session.close()
+
+    # Report results
+    host_delta = ht1 - ht0
+    guest_delta = gt1 - gt0
+    drift = abs(host_delta - guest_delta)
+    logging.info("Host duration (%d migrations): %.2f" %
+                 (migration_iterations, host_delta))
+    logging.info("Guest duration (%d migrations): %.2f" %
+                 (migration_iterations, guest_delta))
+    logging.info("Drift after %d migrations: %.2f seconds" %
+                 (migration_iterations, drift))
+
+    # Fail if necessary
+    if drift > drift_threshold:
+        raise error.TestFail("Time drift too large after %d migrations: "
+                             "%.2f seconds" % (migration_iterations, drift))
-- 
1.5.4.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux