Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: client/tests/kvm/kvm_preprocessing.py

Issue 6246035: Merge remote branch 'cros/upstream' into master (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/autotest.git@master
Patch Set: patch Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: client/tests/kvm/kvm_preprocessing.py
diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
index 1ddf99b90c121d7f86dd2c322741b681ee7b20ba..9c53f02d34cbc476ab442b7fa0a909c8457cd1ee 100644
--- a/client/tests/kvm/kvm_preprocessing.py
+++ b/client/tests/kvm/kvm_preprocessing.py
@@ -1,7 +1,7 @@
-import sys, os, time, commands, re, logging, signal, glob, threading, shutil
-from autotest_lib.client.bin import test, utils
+import os, time, commands, re, logging, glob, threading, shutil
+from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
-import kvm_vm, kvm_utils, kvm_subprocess, kvm_monitor, ppm_utils
+import kvm_vm, kvm_utils, kvm_subprocess, kvm_monitor, ppm_utils, test_setup
try:
import PIL.Image
except ImportError:
@@ -50,19 +50,20 @@ def preprocess_vm(test, params, env, name):
@param name: The name of the VM object.
"""
logging.debug("Preprocessing VM '%s'..." % name)
- vm = kvm_utils.env_get_vm(env, name)
- if vm:
- logging.debug("VM object found in environment")
- else:
+ vm = env.get_vm(name)
+ if not vm:
logging.debug("VM object does not exist; creating it")
vm = kvm_vm.VM(name, params, test.bindir, env.get("address_cache"))
- kvm_utils.env_register_vm(env, name, vm)
+ env.register_vm(name, vm)
start_vm = False
if params.get("restart_vm") == "yes":
logging.debug("'restart_vm' specified; (re)starting VM...")
start_vm = True
+ elif params.get("migration_mode"):
+ logging.debug("Starting VM in incoming migration mode...")
+ start_vm = True
elif params.get("start_vm") == "yes":
if not vm.is_alive():
logging.debug("VM is not alive; starting it...")
@@ -75,8 +76,8 @@ def preprocess_vm(test, params, env, name):
if start_vm:
# Start the VM (or restart it if it's already up)
- if not vm.create(name, params, test.bindir):
- raise error.TestError("Could not start VM")
+ vm.create(name, params, test.bindir,
+ migration_mode=params.get("migration_mode"))
else:
# Don't start the VM, just update its params
vm.params = params
@@ -92,11 +93,12 @@ def preprocess_vm(test, params, env, name):
def postprocess_image(test, params):
"""
Postprocess a single QEMU image according to the instructions in params.
- Currently this function just removes an image if requested.
@param test: An Autotest test object.
@param params: A dict containing image postprocessing parameters.
"""
+ if params.get("check_image") == "yes":
+ kvm_vm.check_image(params, test.bindir)
if params.get("remove_image") == "yes":
kvm_vm.remove_image(params, test.bindir)
@@ -112,11 +114,8 @@ def postprocess_vm(test, params, env, name):
@param name: The name of the VM object.
"""
logging.debug("Postprocessing VM '%s'..." % name)
- vm = kvm_utils.env_get_vm(env, name)
- if vm:
- logging.debug("VM object found in environment")
- else:
- logging.debug("VM object does not exist in environment")
+ vm = env.get_vm(name)
+ if not vm:
return
scrdump_filename = os.path.join(test.debugdir, "post_%s.ppm" % name)
@@ -173,19 +172,18 @@ def process(test, params, env, image_func, vm_func):
@param vm_func: A function to call for each VM.
"""
# Get list of VMs specified for this test
- vm_names = kvm_utils.get_sub_dict_names(params, "vms")
- for vm_name in vm_names:
- vm_params = kvm_utils.get_sub_dict(params, vm_name)
+ for vm_name in params.objects("vms"):
+ vm_params = params.object_params(vm_name)
# Get list of images specified for this VM
- image_names = kvm_utils.get_sub_dict_names(vm_params, "images")
- for image_name in image_names:
- image_params = kvm_utils.get_sub_dict(vm_params, image_name)
+ for image_name in vm_params.objects("images"):
+ image_params = vm_params.object_params(image_name)
# Call image_func for each image
image_func(test, image_params)
# Call vm_func for each vm
vm_func(test, vm_params, env, vm_name)
+@error.context_aware
def preprocess(test, params, env):
"""
Preprocess all VMs and images according to the instructions in params.
@@ -195,6 +193,8 @@ def preprocess(test, params, env):
@param params: A dict containing all VM and image parameters.
@param env: The environment (a dict-like object).
"""
+ error.context("preprocessing")
+
# Start tcpdump if it isn't already running
if "address_cache" not in env:
env["address_cache"] = {}
@@ -204,7 +204,7 @@ def preprocess(test, params, env):
if "tcpdump" not in env and params.get("run_tcpdump", "yes") == "yes":
cmd = "%s -npvi any 'dst port 68'" % kvm_utils.find_command("tcpdump")
logging.debug("Starting tcpdump (%s)...", cmd)
- env["tcpdump"] = kvm_subprocess.kvm_tail(
+ env["tcpdump"] = kvm_subprocess.Tail(
command=cmd,
output_func=_update_address_cache,
output_params=(env["address_cache"],))
@@ -216,7 +216,7 @@ def preprocess(test, params, env):
env["tcpdump"].get_output()))
# Destroy and remove VMs that are no longer needed in the environment
- requested_vms = kvm_utils.get_sub_dict_names(params, "vms")
+ requested_vms = params.objects("vms")
for key in env.keys():
vm = env[key]
if not kvm_utils.is_vm(vm):
@@ -254,6 +254,18 @@ def preprocess(test, params, env):
logging.debug("KVM userspace version: %s" % kvm_userspace_version)
test.write_test_keyval({"kvm_userspace_version": kvm_userspace_version})
+ if params.get("setup_hugepages") == "yes":
+ h = test_setup.HugePageConfig(params)
+ h.setup()
+
+ if params.get("type") == "unattended_install":
+ u = test_setup.UnattendedInstallConfig(test, params)
+ u.setup()
+
+ if params.get("type") == "enospc":
+ e = test_setup.EnospcConfig(test, params)
+ e.setup()
+
# Execute any pre_commands
if params.get("pre_command"):
process_command(test, params, env, params.get("pre_command"),
@@ -273,6 +285,7 @@ def preprocess(test, params, env):
_screendump_thread.start()
+@error.context_aware
def postprocess(test, params, env):
"""
Postprocess all VMs and images according to the instructions in params.
@@ -281,6 +294,8 @@ def postprocess(test, params, env):
@param params: Dict containing all VM and image parameters.
@param env: The environment (a dict-like object).
"""
+ error.context("postprocessing")
+
# Postprocess all VMs and images
process(test, params, env, postprocess_image, postprocess_vm)
@@ -291,7 +306,6 @@ def postprocess(test, params, env):
_screendump_thread_termination_event.set()
_screendump_thread.join(10)
_screendump_thread = None
- _screendump_thread_termination_event = None
# Warn about corrupt PPM files
for f in glob.glob(os.path.join(test.debugdir, "*.ppm")):
@@ -330,23 +344,32 @@ def postprocess(test, params, env):
if params.get("kill_unresponsive_vms") == "yes":
logging.debug("'kill_unresponsive_vms' specified; killing all VMs "
"that fail to respond to a remote login request...")
- for vm in kvm_utils.env_get_all_vms(env):
+ for vm in env.get_all_vms():
if vm.is_alive():
- session = vm.remote_login()
- if session:
+ try:
+ session = vm.login()
session.close()
- else:
+ except (kvm_utils.LoginError, kvm_vm.VMError), e:
+ logging.warn(e)
vm.destroy(gracefully=False)
# Kill all kvm_subprocess tail threads
kvm_subprocess.kill_tail_threads()
# Terminate tcpdump if no VMs are alive
- living_vms = [vm for vm in kvm_utils.env_get_all_vms(env) if vm.is_alive()]
+ living_vms = [vm for vm in env.get_all_vms() if vm.is_alive()]
if not living_vms and "tcpdump" in env:
env["tcpdump"].close()
del env["tcpdump"]
+ if params.get("setup_hugepages") == "yes":
+ h = kvm_utils.HugePageConfig(params)
+ h.cleanup()
+
+ if params.get("type") == "enospc":
+ e = test_setup.EnospcConfig(test, params)
+ e.cleanup()
+
# Execute any post_commands
if params.get("post_command"):
process_command(test, params, env, params.get("post_command"),
@@ -362,7 +385,7 @@ def postprocess_on_error(test, params, env):
@param params: A dict containing all VM and image parameters.
@param env: The environment (a dict-like object).
"""
- params.update(kvm_utils.get_sub_dict(params, "on_error"))
+ params.update(params.object_params("on_error"))
def _update_address_cache(address_cache, line):
@@ -374,9 +397,11 @@ def _update_address_cache(address_cache, line):
matches = re.findall(r"\w*:\w*:\w*:\w*:\w*:\w*", line)
if matches and address_cache.get("last_seen"):
mac_address = matches[0].lower()
- logging.debug("(address cache) Adding cache entry: %s ---> %s",
- mac_address, address_cache.get("last_seen"))
+ if time.time() - address_cache.get("time_%s" % mac_address, 0) > 5:
+ logging.debug("(address cache) Adding cache entry: %s ---> %s",
+ mac_address, address_cache.get("last_seen"))
address_cache[mac_address] = address_cache.get("last_seen")
+ address_cache["time_%s" % mac_address] = time.time()
del address_cache["last_seen"]
@@ -398,7 +423,7 @@ def _take_screendumps(test, params, env):
cache = {}
while True:
- for vm in kvm_utils.env_get_all_vms(env):
+ for vm in env.get_all_vms():
if not vm.is_alive():
continue
try:
@@ -437,5 +462,6 @@ def _take_screendumps(test, params, env):
pass
os.unlink(temp_filename)
if _screendump_thread_termination_event.isSet():
+ _screendump_thread_termination_event = None
break
_screendump_thread_termination_event.wait(delay)

Powered by Google App Engine
This is Rietveld 408576698