From patchwork Fri Jun 12 14:43:53 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Huff X-Patchwork-Id: 29874 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n5CEiTDr011100 for ; Fri, 12 Jun 2009 14:44:29 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758540AbZFLOoX (ORCPT ); Fri, 12 Jun 2009 10:44:23 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757318AbZFLOoX (ORCPT ); Fri, 12 Jun 2009 10:44:23 -0400 Received: from mx2.redhat.com ([66.187.237.31]:55081 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756914AbZFLOoW (ORCPT ); Fri, 12 Jun 2009 10:44:22 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n5CEiPsw010340 for ; Fri, 12 Jun 2009 10:44:25 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n5CEiOB7032349; Fri, 12 Jun 2009 10:44:24 -0400 Received: from localhost.localdomain (dhcp231-89.rdu.redhat.com [10.11.231.89]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n5CEiN1L017458; Fri, 12 Jun 2009 10:44:23 -0400 From: David Huff To: kvm@vger.kernel.org Cc: David Huff Subject: [KVM_AUTOTEST PATCH] Added functionality to the preprocessor to run scripts Date: Fri, 12 Jun 2009 10:43:53 -0400 Message-Id: <1244817833-26874-1-git-send-email-dhuff@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org This patch adds the processes_command function to the preprocessor which will run custom scripts before and after a test is executed. processes_command will export all test parameters as environmental variables for passing parameters to a custom script. processes_command uses parameters defined in the config file: pre_command, pre_command_timeout, pre_command_noncritical post_command, post_command_timeout, post_commmand_noncritical command - just defines the script to be run timeout - timeout to kill script if hung noncritical - if yes do not fail test if command fails, default no Currently it is still using the returned status from kvm_utils.run_bg If kvm_utils.run_bg is changed to throw an exception, process_command will have to be updated at that time. --- client/tests/kvm/kvm_preprocessing.py | 48 +++++++++++++++++++++++++++++++- 1 files changed, 46 insertions(+), 2 deletions(-) diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py index f60cfe8..c74d0d9 100644 --- a/client/tests/kvm/kvm_preprocessing.py +++ b/client/tests/kvm/kvm_preprocessing.py @@ -1,4 +1,4 @@ -import sys, os, time, commands, re, logging +import sys, os, time, commands, re, logging, signal from autotest_lib.client.bin import test from autotest_lib.client.common_lib import error import kvm_vm, kvm_utils @@ -133,6 +133,40 @@ def postprocess_vm(test, params, env, name): vm.destroy(gracefully = params.get("kill_vm_gracefully") == "yes") +def process_command(test, params, env, command, command_timeout, + command_noncritical): + """ + Pre- or post- custom commands to be executed before/after a test is run + + @param test: An Autotest test object. + @param params: A dict containing all VM and image parameters. + @param env: The environment (a dict-like object). + @param command: Script containing the command to be run. + @param commmand_timeout: Timeout for command execution. + @param command_noncritical: if 'yes' test will not fail if command fails. + """ + if command_timeout is None: + command_timeout = "600" + + if command_noncritical is None: + command_noncritical = "no" + + # export environment vars + for k in params.keys(): + logging.info("Adding KVM_TEST_%s to Environment" % (k)) + os.putenv("KVM_TEST_%s" % (k), str(params[k])) + # execute command + logging.info("Executing command '%s'..." % command) + timeout = int(command_timeout) + (status, pid, output) = kvm_utils.run_bg("cd %s; %s" % (test.bindir, command), + None, logging.debug, "(command) ", timeout = timeout) + if status != 0: + kvm_utils.safe_kill(pid, signal.SIGTERM) + logging.warn("Custom processing command failed: '%s'..." % command) + if command_noncritical != "yes": + raise error.TestError, "Custom processing command failed" + + def process(test, params, env, image_func, vm_func): """ Pre- or post-process VMs and images according to the instructions in params. @@ -190,6 +224,11 @@ def preprocess(test, params, env): vm.destroy() del env[key] + #execute any pre_commands + if params.get("pre_command"): + process_command(test, params, env, params.get("pre_command"), params.get("pre_command_timeout"), + params.get("pre_command_noncritical")) + # Preprocess all VMs and images process(test, params, env, preprocess_image, preprocess_vm) @@ -240,7 +279,12 @@ def postprocess(test, params, env): logging.debug("'keep_ppm_files' not specified; removing all PPM files" " from results dir...") kvm_utils.run_bg("rm -vf %s" % os.path.join(test.debugdir, "*.ppm"), - None, logging.debug, "(rm) ", timeout=5.0) + None, logging.debug, "(rm) ", timeout = 5.0) + + #execute any post_commands + if params.get("post_command"): + process_command(test, params, env, params.get("post_command"), params.get("post_command_timeout"), + params.get("post_command_noncritical")) def postprocess_on_error(test, params, env):