def get_results_summary(): """ Get the status of the tests that were executed on the host and close the session where autotest was being executed. """ output = session.cmd_output("cat results/*/status") try: results = scan_results.parse_results(output) # Report test results logging.info("Results (test, status, duration, info):") for result in results: logging.info(str(result)) session.close() return results except Exception, e: logging.error("Error processing guest autotest results: %s", e) return None
def run_autotest(test, params, env): """ Run an autotest test inside a guest. @param test: kvm test object. @param params: Dictionary with test parameters. @param env: Dictionary with the test environment. """ # Helper functions def copy_if_size_differs(vm, local_path, remote_path): """ Copy a file to a guest if it doesn't exist or if its size differs. @param vm: VM object @param local_path: Local path @param remote_path: Remote path """ copy = False output = session.get_command_output("ls -l %s" % remote_path) if ("such file" in output or int(output.split()[4]) != os.path.getsize(local_path)): basename = os.path.basename(local_path) logging.info("Copying %s to guest (file is missing or has a " "different size)..." % basename) if not vm.copy_files_to(local_path, remote_path): raise error.TestFail("Could not copy %s to guest" % basename) def extract(vm, remote_path, dest_dir="."): """ Extract a .tar.bz2 file on the guest. @param vm: VM object @param remote_path: Remote file path @param dest_dir: Destination dir for the contents """ basename = os.path.basename(remote_path) logging.info("Extracting %s..." % basename) status = session.get_command_status("tar xfj %s -C %s" % (remote_path, dest_dir)) if status != 0: raise error.TestFail("Could not extract %s" % basename) vm = kvm_test_utils.get_living_vm(env, params.get("main_vm")) session = kvm_test_utils.wait_for_login(vm) # Collect test parameters test_name = params.get("test_name") test_timeout = int(params.get("test_timeout", 300)) test_control_file = params.get("test_control_file", "control") tarred_autotest_path = "/tmp/autotest.tar.bz2" tarred_test_path = "/tmp/%s.tar.bz2" % test_name # tar the contents of bindir/autotest cmd = "cd %s; tar cvjf %s autotest/*" cmd += " --exclude=autotest/tests" cmd += " --exclude=autotest/results" cmd += " --exclude=autotest/tmp" cmd += " --exclude=autotest/control" cmd += " --exclude=*.pyc" cmd += " --exclude=*.svn" cmd += " --exclude=*.git" kvm_subprocess.run_fg(cmd % (test.bindir, tarred_autotest_path), timeout=30) # tar the contents of bindir/autotest/tests/<test_name> cmd = "cd %s; tar cvjf %s %s/*" cmd += " --exclude=*.pyc" cmd += " --exclude=*.svn" cmd += " --exclude=*.git" kvm_subprocess.run_fg(cmd % (os.path.join(test.bindir, "autotest", "tests"), tarred_test_path, test_name), timeout=30) # Copy autotest.tar.bz2 copy_if_size_differs(vm, tarred_autotest_path, "autotest.tar.bz2") # Copy <test_name>.tar.bz2 copy_if_size_differs(vm, tarred_test_path, test_name + ".tar.bz2") # Extract autotest.tar.bz2 extract(vm, "autotest.tar.bz2") # mkdir autotest/tests session.sendline("mkdir autotest/tests") # Extract <test_name>.tar.bz2 into autotest/tests extract(vm, test_name + ".tar.bz2", "autotest/tests") # Copy the selected control file (located inside # test.bindir/autotest_control) to the autotest dir control_file_path = os.path.join(test.bindir, "autotest_control", test_control_file) if not vm.copy_files_to(control_file_path, "autotest/control"): raise error.TestFail("Could not copy the test control file to guest") # Run the test logging.info("Running test '%s'..." % test_name) session.sendline("cd autotest") session.sendline("rm -f control.state") session.sendline("rm -rf results/*") session.read_up_to_prompt() logging.info("---------------- Test output ----------------") status = session.get_command_status("bin/autotest control", timeout=test_timeout, print_func=logging.info) logging.info("---------------- End of test output ----------------") if status is None: raise error.TestFail("Timeout elapsed while waiting for test to " "complete") # Get the results generated by autotest output = session.get_command_output("cat results/*/status") results = scan_results.parse_results(output) session.close # Copy test results to the local bindir/guest_results logging.info("Copying results back from guest...") guest_results_dir = os.path.join(test.outputdir, "guest_results") if not os.path.exists(guest_results_dir): os.mkdir(guest_results_dir) if not vm.copy_files_from("autotest/results/default/*", guest_results_dir): logging.error("Could not copy results back from guest") # Report test results logging.info("Results (test, status, duration, info):") for result in results: logging.info(str(result)) # Make a list of FAIL/ERROR/ABORT results (make sure FAIL results appear # before ERROR results, and ERROR results appear before ABORT results) bad_results = [r for r in results if r[1] == "FAIL"] bad_results += [r for r in results if r[1] == "ERROR"] bad_results += [r for r in results if r[1] == "ABORT"] # Fail the test if necessary if not results: raise error.TestFail("Test '%s' did not produce any recognizable " "results" % test_name) if bad_results: result = bad_results[0] raise error.TestFail("Test '%s' ended with %s (reason: '%s')" % (result[0], result[1], result[3]))
def run_autotest(test, params, env): """ Run an autotest test inside a guest. @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("Logging into guest...") 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 some info test_name = params.get("test_name") test_timeout = int(params.get("test_timeout", 300)) test_control_file = params.get("test_control_file", "control") tarred_autotest_path = "/tmp/autotest.tar.bz2" tarred_test_path = "/tmp/%s.tar.bz2" % test_name # tar the contents of bindir/autotest cmd = "cd %s; tar cvjf %s autotest/*" cmd += " --exclude=autotest/tests" cmd += " --exclude=autotest/results" cmd += " --exclude=autotest/tmp" cmd += " --exclude=autotest/control" cmd += " --exclude=*.pyc" cmd += " --exclude=*.svn" cmd += " --exclude=*.git" kvm_subprocess.run_fg(cmd % (test.bindir, tarred_autotest_path), timeout=30) # tar the contents of bindir/autotest/tests/<test_name> cmd = "cd %s; tar cvjf %s %s/*" cmd += " --exclude=*.pyc" cmd += " --exclude=*.svn" cmd += " --exclude=*.git" kvm_subprocess.run_fg( cmd % (os.path.join(test.bindir, "autotest", "tests"), tarred_test_path, test_name), timeout=30 ) # Check if we need to copy autotest.tar.bz2 copy = False output = session.get_command_output("ls -l autotest.tar.bz2") if "such file" in output: copy = True else: size = int(output.split()[4]) if size != os.path.getsize(tarred_autotest_path): copy = True # Perform the copy if copy: logging.info("Copying autotest.tar.bz2 to guest" " (file is missing or has a different size)...") if not vm.scp_to_remote(tarred_autotest_path, ""): raise error.TestFail("Could not copy autotest.tar.bz2 to guest") # Check if we need to copy <test_name>.tar.bz2 copy = False output = session.get_command_output("ls -l %s.tar.bz2" % test_name) if "such file" in output: copy = True else: size = int(output.split()[4]) if size != os.path.getsize(tarred_test_path): copy = True # Perform the copy if copy: logging.info("Copying %s.tar.bz2 to guest (file is missing or has a" " different size)..." % test_name) if not vm.scp_to_remote(tarred_test_path, ""): raise error.TestFail("Could not copy %s.tar.bz2 to guest" % test_name) # Extract autotest.tar.bz2 logging.info("Extracting autotest.tar.bz2...") status = session.get_command_status("tar xvfj autotest.tar.bz2") if status != 0: raise error.TestFail("Could not extract autotest.tar.bz2") # mkdir autotest/tests session.sendline("mkdir autotest/tests") # Extract <test_name>.tar.bz2 into autotest/tests logging.info("Extracting %s.tar.bz2..." % test_name) status = session.get_command_status("tar xvfj %s.tar.bz2 -C " "autotest/tests" % test_name) if status != 0: raise error.TestFail("Could not extract %s.tar.bz2" % test_name) # Cleaning up old remaining results session.sendline("rm -rf autotest/results/*") # Copying the selected control file (located inside # test.bindir/autotest_control to the autotest dir control_file_path = os.path.join(test.bindir, "autotest_control", test_control_file) if not vm.scp_to_remote(control_file_path, "autotest/control"): raise error.TestFail("Could not copy the test control file to guest") # Run the test logging.info("Running test '%s'..." % test_name) session.sendline("cd autotest") session.sendline("rm -f control.state") session.read_up_to_prompt() session.sendline("bin/autotest control") logging.info("---------------- Test output ----------------") match = session.read_up_to_prompt(timeout=test_timeout, print_func=logging.info)[0] logging.info("---------------- End of test output ----------------") if not match: raise error.TestFail("Timeout elapsed while waiting for test to " "complete") # Get the results generated by autotest output = session.get_command_output("cat results/*/status") # Parse test results result_list = scan_results.parse_results(output) # Report test results and check for FAIL/ERROR status logging.info("Results (test, status, duration, info):") status_error = False status_fail = False if result_list == []: status_fail = True message_fail = "Test '%s' did not produce any recognizable " "results" % test_name for result in result_list: logging.info(str(result)) if result[1] == "FAIL": status_fail = True message_fail = "Test '%s' ended with FAIL " "(info: '%s')" % (result[0], result[3]) if result[1] == "ERROR": status_error = True message_error = "Test '%s' ended with ERROR " "(info: '%s')" % (result[0], result[3]) if result[1] == "ABORT": status_error = True message_error = "Test '%s' ended with ABORT " "(info: '%s')" % (result[0], result[3]) # Copy test results to the local bindir/guest_results logging.info("Copying results back from guest...") guest_results_dir = os.path.join(test.outputdir, "guest_results") if not os.path.exists(guest_results_dir): os.mkdir(guest_results_dir) if not vm.scp_from_remote("autotest/results/default/*", guest_results_dir): logging.error("Could not copy results back from guest") # Fail the test if necessary if status_fail: raise error.TestFail(message_fail) elif status_error: raise error.TestError(message_error)