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

Side by Side Diff: client/tests/kvm/kvm_preprocessing.py

Issue 6883035: Merge remote branch 'autotest-upstream/master' into autotest-merge (Closed) Base URL: ssh://gitrw.chromium.org:9222/autotest.git@master
Patch Set: patch Created 9 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 import os, time, commands, re, logging, glob, threading, shutil 1 import os, time, commands, re, logging, glob, threading, shutil
2 from autotest_lib.client.bin import utils 2 from autotest_lib.client.bin import utils
3 from autotest_lib.client.common_lib import error 3 from autotest_lib.client.common_lib import error
4 import kvm_vm, kvm_utils, kvm_subprocess, kvm_monitor, ppm_utils, test_setup 4 import kvm_vm, kvm_utils, kvm_subprocess, kvm_monitor, ppm_utils, test_setup
5 try: 5 try:
6 import PIL.Image 6 import PIL.Image
7 except ImportError: 7 except ImportError:
8 logging.warning('No python imaging library installed. PPM image ' 8 logging.warning('No python imaging library installed. PPM image '
9 'conversion to JPEG disabled. In order to enable it, ' 9 'conversion to JPEG disabled. In order to enable it, '
10 'please install python-imaging or the equivalent for your ' 10 'please install python-imaging or the equivalent for your '
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 # Start the VM (or restart it if it's already up) 78 # Start the VM (or restart it if it's already up)
79 vm.create(name, params, test.bindir, 79 vm.create(name, params, test.bindir,
80 migration_mode=params.get("migration_mode")) 80 migration_mode=params.get("migration_mode"))
81 else: 81 else:
82 # Don't start the VM, just update its params 82 # Don't start the VM, just update its params
83 vm.params = params 83 vm.params = params
84 84
85 scrdump_filename = os.path.join(test.debugdir, "pre_%s.ppm" % name) 85 scrdump_filename = os.path.join(test.debugdir, "pre_%s.ppm" % name)
86 try: 86 try:
87 if vm.monitor: 87 if vm.monitor:
88 vm.monitor.screendump(scrdump_filename) 88 vm.monitor.screendump(scrdump_filename, debug=False)
89 except kvm_monitor.MonitorError, e: 89 except kvm_monitor.MonitorError, e:
90 logging.warn(e) 90 logging.warn(e)
91 91
92 92
93 def postprocess_image(test, params): 93 def postprocess_image(test, params):
94 """ 94 """
95 Postprocess a single QEMU image according to the instructions in params. 95 Postprocess a single QEMU image according to the instructions in params.
96 96
97 @param test: An Autotest test object. 97 @param test: An Autotest test object.
98 @param params: A dict containing image postprocessing parameters. 98 @param params: A dict containing image postprocessing parameters.
(...skipping 15 matching lines...) Expand all
114 @param name: The name of the VM object. 114 @param name: The name of the VM object.
115 """ 115 """
116 logging.debug("Postprocessing VM '%s'..." % name) 116 logging.debug("Postprocessing VM '%s'..." % name)
117 vm = env.get_vm(name) 117 vm = env.get_vm(name)
118 if not vm: 118 if not vm:
119 return 119 return
120 120
121 scrdump_filename = os.path.join(test.debugdir, "post_%s.ppm" % name) 121 scrdump_filename = os.path.join(test.debugdir, "post_%s.ppm" % name)
122 try: 122 try:
123 if vm.monitor: 123 if vm.monitor:
124 vm.monitor.screendump(scrdump_filename) 124 vm.monitor.screendump(scrdump_filename, debug=False)
125 except kvm_monitor.MonitorError, e: 125 except kvm_monitor.MonitorError, e:
126 logging.warn(e) 126 logging.warn(e)
127 127
128 if params.get("kill_vm") == "yes": 128 if params.get("kill_vm") == "yes":
129 kill_vm_timeout = float(params.get("kill_vm_timeout", 0)) 129 kill_vm_timeout = float(params.get("kill_vm_timeout", 0))
130 if kill_vm_timeout: 130 if kill_vm_timeout:
131 logging.debug("'kill_vm' specified; waiting for VM to shut down " 131 logging.debug("'kill_vm' specified; waiting for VM to shut down "
132 "before killing it...") 132 "before killing it...")
133 kvm_utils.wait_for(vm.is_dead, kill_vm_timeout, 0, 1) 133 kvm_utils.wait_for(vm.is_dead, kill_vm_timeout, 0, 1)
134 else: 134 else:
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 def preprocess(test, params, env): 187 def preprocess(test, params, env):
188 """ 188 """
189 Preprocess all VMs and images according to the instructions in params. 189 Preprocess all VMs and images according to the instructions in params.
190 Also, collect some host information, such as the KVM version. 190 Also, collect some host information, such as the KVM version.
191 191
192 @param test: An Autotest test object. 192 @param test: An Autotest test object.
193 @param params: A dict containing all VM and image parameters. 193 @param params: A dict containing all VM and image parameters.
194 @param env: The environment (a dict-like object). 194 @param env: The environment (a dict-like object).
195 """ 195 """
196 error.context("preprocessing") 196 error.context("preprocessing")
197
198 # Start tcpdump if it isn't already running 197 # Start tcpdump if it isn't already running
199 if "address_cache" not in env: 198 if "address_cache" not in env:
200 env["address_cache"] = {} 199 env["address_cache"] = {}
201 if "tcpdump" in env and not env["tcpdump"].is_alive(): 200 if "tcpdump" in env and not env["tcpdump"].is_alive():
202 env["tcpdump"].close() 201 env["tcpdump"].close()
203 del env["tcpdump"] 202 del env["tcpdump"]
204 if "tcpdump" not in env and params.get("run_tcpdump", "yes") == "yes": 203 if "tcpdump" not in env and params.get("run_tcpdump", "yes") == "yes":
205 cmd = "%s -npvi any 'dst port 68'" % kvm_utils.find_command("tcpdump") 204 cmd = "%s -npvi any 'dst port 68'" % kvm_utils.find_command("tcpdump")
206 logging.debug("Starting tcpdump (%s)...", cmd) 205 logging.debug("Starting tcpdump (%s)...", cmd)
207 env["tcpdump"] = kvm_subprocess.Tail( 206 env["tcpdump"] = kvm_subprocess.Tail(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 else: 250 else:
252 kvm_userspace_version = "Unknown" 251 kvm_userspace_version = "Unknown"
253 logging.debug("Could not fetch KVM userspace version") 252 logging.debug("Could not fetch KVM userspace version")
254 logging.debug("KVM userspace version: %s" % kvm_userspace_version) 253 logging.debug("KVM userspace version: %s" % kvm_userspace_version)
255 test.write_test_keyval({"kvm_userspace_version": kvm_userspace_version}) 254 test.write_test_keyval({"kvm_userspace_version": kvm_userspace_version})
256 255
257 if params.get("setup_hugepages") == "yes": 256 if params.get("setup_hugepages") == "yes":
258 h = test_setup.HugePageConfig(params) 257 h = test_setup.HugePageConfig(params)
259 h.setup() 258 h.setup()
260 259
261 if params.get("type") == "unattended_install":
262 u = test_setup.UnattendedInstallConfig(test, params)
263 u.setup()
264
265 if params.get("type") == "enospc":
266 e = test_setup.EnospcConfig(test, params)
267 e.setup()
268
269 # Execute any pre_commands 260 # Execute any pre_commands
270 if params.get("pre_command"): 261 if params.get("pre_command"):
271 process_command(test, params, env, params.get("pre_command"), 262 process_command(test, params, env, params.get("pre_command"),
272 int(params.get("pre_command_timeout", "600")), 263 int(params.get("pre_command_timeout", "600")),
273 params.get("pre_command_noncritical") == "yes") 264 params.get("pre_command_noncritical") == "yes")
274 265
275 # Preprocess all VMs and images 266 # Preprocess all VMs and images
276 process(test, params, env, preprocess_image, preprocess_vm) 267 process(test, params, env, preprocess_image, preprocess_vm)
277 268
278 # Start the screendump thread 269 # Start the screendump thread
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 # Terminate tcpdump if no VMs are alive 350 # Terminate tcpdump if no VMs are alive
360 living_vms = [vm for vm in env.get_all_vms() if vm.is_alive()] 351 living_vms = [vm for vm in env.get_all_vms() if vm.is_alive()]
361 if not living_vms and "tcpdump" in env: 352 if not living_vms and "tcpdump" in env:
362 env["tcpdump"].close() 353 env["tcpdump"].close()
363 del env["tcpdump"] 354 del env["tcpdump"]
364 355
365 if params.get("setup_hugepages") == "yes": 356 if params.get("setup_hugepages") == "yes":
366 h = test_setup.HugePageConfig(params) 357 h = test_setup.HugePageConfig(params)
367 h.cleanup() 358 h.cleanup()
368 359
369 if params.get("type") == "enospc":
370 e = test_setup.EnospcConfig(test, params)
371 e.cleanup()
372
373 # Execute any post_commands 360 # Execute any post_commands
374 if params.get("post_command"): 361 if params.get("post_command"):
375 process_command(test, params, env, params.get("post_command"), 362 process_command(test, params, env, params.get("post_command"),
376 int(params.get("post_command_timeout", "600")), 363 int(params.get("post_command_timeout", "600")),
377 params.get("post_command_noncritical") == "yes") 364 params.get("post_command_noncritical") == "yes")
378 365
379 366
380 def postprocess_on_error(test, params, env): 367 def postprocess_on_error(test, params, env):
381 """ 368 """
382 Perform postprocessing operations required only if the test failed. 369 Perform postprocessing operations required only if the test failed.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 delay = float(params.get("screendump_delay", 5)) 407 delay = float(params.get("screendump_delay", 5))
421 quality = int(params.get("screendump_quality", 30)) 408 quality = int(params.get("screendump_quality", 30))
422 409
423 cache = {} 410 cache = {}
424 411
425 while True: 412 while True:
426 for vm in env.get_all_vms(): 413 for vm in env.get_all_vms():
427 if not vm.is_alive(): 414 if not vm.is_alive():
428 continue 415 continue
429 try: 416 try:
430 vm.monitor.screendump(temp_filename) 417 vm.monitor.screendump(filename=temp_filename, debug=False)
431 except kvm_monitor.MonitorError, e: 418 except kvm_monitor.MonitorError, e:
432 logging.warn(e) 419 logging.warn(e)
433 continue 420 continue
434 if not os.path.exists(temp_filename): 421 if not os.path.exists(temp_filename):
435 logging.warn("VM '%s' failed to produce a screendump", vm.name) 422 logging.warn("VM '%s' failed to produce a screendump", vm.name)
436 continue 423 continue
437 if not ppm_utils.image_verify_ppm_file(temp_filename): 424 if not ppm_utils.image_verify_ppm_file(temp_filename):
438 logging.warn("VM '%s' produced an invalid screendump", vm.name) 425 logging.warn("VM '%s' produced an invalid screendump", vm.name)
439 os.unlink(temp_filename) 426 os.unlink(temp_filename)
440 continue 427 continue
(...skipping 17 matching lines...) Expand all
458 image = PIL.Image.open(temp_filename) 445 image = PIL.Image.open(temp_filename)
459 image.save(screendump_filename, format="JPEG", quality=quali ty) 446 image.save(screendump_filename, format="JPEG", quality=quali ty)
460 cache[hash] = screendump_filename 447 cache[hash] = screendump_filename
461 except NameError: 448 except NameError:
462 pass 449 pass
463 os.unlink(temp_filename) 450 os.unlink(temp_filename)
464 if _screendump_thread_termination_event.isSet(): 451 if _screendump_thread_termination_event.isSet():
465 _screendump_thread_termination_event = None 452 _screendump_thread_termination_event = None
466 break 453 break
467 _screendump_thread_termination_event.wait(delay) 454 _screendump_thread_termination_event.wait(delay)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698