On 07/20/2009 06:07 PM, Michael Goldish wrote:
1) Log into a guest.
2) Take a time reading from the guest and host.
3) Run load on the guest and host.
4) Take a second time reading.
5) Stop the load and rest for a while.
6) Take a third time reading.
7) If the drift immediately after load is higher than a user-
specified value (in %), fail.
If the drift after the rest period is higher than a user-specified
value,
fail.
Signed-off-by: Michael Goldish<mgoldish@xxxxxxxxxx>
---
client/tests/kvm/kvm.py | 1 +
client/tests/kvm/kvm_tests.py | 161
++++++++++++++++++++++++++++++++++++++++-
2 files changed, 160 insertions(+), 2 deletions(-)
diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
index b18b643..070e463 100644
--- a/client/tests/kvm/kvm.py
+++ b/client/tests/kvm/kvm.py
@@ -55,6 +55,7 @@ class kvm(test.test):
"kvm_install": test_routine("kvm_install",
"run_kvm_install"),
"linux_s3": test_routine("kvm_tests",
"run_linux_s3"),
"stress_boot": test_routine("kvm_tests",
"run_stress_boot"),
+ "timedrift": test_routine("kvm_tests",
"run_timedrift"),
}
# Make it possible to import modules from the test's
bindir
diff --git a/client/tests/kvm/kvm_tests.py
b/client/tests/kvm/kvm_tests.py
index 5991aed..ca0b8c0 100644
--- a/client/tests/kvm/kvm_tests.py
+++ b/client/tests/kvm/kvm_tests.py
@@ -1,4 +1,4 @@
-import time, os, logging
+import time, os, logging, re, commands
from autotest_lib.client.common_lib import utils, error
import kvm_utils, kvm_subprocess, ppm_utils, scan_results
@@ -529,7 +529,6 @@ def run_stress_boot(tests, params, env):
"""
# boot the first vm
vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
-
if not vm:
raise error.TestError("VM object not found in
environment")
if not vm.is_alive():
@@ -586,3 +585,161 @@ def run_stress_boot(tests, params, env):
for se in sessions:
se.close()
logging.info("Total number booted: %d" % (num -1))
+
+
+def run_timedrift(test, params, env):
+ """
+ Time drift test (mainly for Windows guests):
+
+ 1) Log into a guest.
+ 2) Take a time reading from the guest and host.
+ 3) Run load on the guest and host.
+ 4) Take a second time reading.
+ 5) Stop the load and rest for a while.
+ 6) Take a third time reading.
+ 7) If the drift immediately after load is higher than a user-
+ specified value (in %), fail.
+ If the drift after the rest period 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_utils.env_get_vm(env, params.get("main_vm"))
+ if not vm:
+ raise error.TestError("VM object not found in
environment")
+ if not vm.is_alive():
+ raise error.TestError("VM seems to be dead; Test requires a
living VM")
+
+ logging.info("Waiting for guest to be up...")
+
+ session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+ if not session:
+ raise error.TestFail("Could not log into guest")
+
+ logging.info("Logged in")
+
+ # 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")
+ guest_load_command = params.get("guest_load_command")
+ guest_load_stop_command =
params.get("guest_load_stop_command")
+ host_load_command = params.get("host_load_command")
+ guest_load_instances = int(params.get("guest_load_instances",
"1"))
+ host_load_instances = int(params.get("host_load_instances",
"0"))
+ # CPU affinity mask for taskset
+ cpu_mask = params.get("cpu_mask", "0xFF")
+ load_duration = float(params.get("load_duration", "30"))
+ rest_duration = float(params.get("rest_duration", "10"))
+ drift_threshold = float(params.get("drift_threshold", "200"))
+ drift_threshold_after_rest =
float(params.get("drift_threshold_after_rest",
+ "200"))
+
+ guest_load_sessions = []
+ host_load_sessions = []
+
+ # Remember the VM's previous CPU affinity
+ prev_cpu_mask = commands.getoutput("taskset -p %s" %
vm.get_pid())
+ prev_cpu_mask = prev_cpu_mask.split()[-1]
+ # Set the VM's CPU affinity
+ commands.getoutput("taskset -p %s %s" % (cpu_mask,
vm.get_pid()))
Need to handle guest smp case where we want to pin the guest to
several
cpus.
Cheers for the test!