1#!/usr/bin/python2 2# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import os 7import sys 8 9import common 10 11from autotest_lib.client.common_lib import control_data 12from autotest_lib.client.common_lib import global_config 13 14AUTOTEST_INSTALL_DIR = global_config.global_config.get_config_value('SCHEDULER', 15 'drone_installation_directory') 16autoserv_directory = os.path.join(AUTOTEST_INSTALL_DIR, 'server') 17autoserv_path = os.path.join(autoserv_directory, 'autoserv') 18 19 20def autoserv_run_job_command(autoserv_directory, machines, 21 results_directory=None, extra_args=[], job=None, 22 queue_entry=None, verbose=True, 23 write_pidfile=True, fast_mode=False, 24 ssh_verbosity=0, 25 no_console_prefix=False, 26 ssh_options=None, 27 use_packaging=True, 28 in_lab=False, 29 host_attributes=None, 30 use_virtualenv=False, 31 host_info_subdir=''): 32 """ 33 Construct an autoserv command from a job or host queue entry. 34 35 @param autoserv_directory: Absolute path to directory containing the 36 autoserv executable. 37 @param machines: A machine or comma separated list of machines to run 38 job on. Leave as None or empty string for hostless job 39 (String). 40 @param results_directory: Absolute path to directory in which to deposit 41 results. 42 @param extra_args: Additional arguments to pass to autoserv 43 (List of Strings). 44 @param job: Job object. If supplied, -u owner, -l name, and --test-retry, 45 and -c or -s (client or server) parameters will be added. 46 @param queue_entry: HostQueueEntry object. If supplied and no job 47 was supplied, this will be used to lookup the job. 48 @param verbose: Boolean (default: True) for autoserv verbosity. 49 @param write_pidfile: Boolean (default: True) for whether autoserv should 50 write a pidfile. 51 @param fast_mode: bool to use fast mode (disables slow autotest features). 52 @param ssh_verbosity: integer between 0 and 3 (inclusive) which sents the 53 verbosity level of ssh. Default: 0. 54 @param no_console_prefix: If true, supress timestamps and other prefix info 55 in autoserv console logs. 56 @param ssh_options: A string giving extra arguments to be tacked on to 57 ssh commands. 58 @param use_packaging Enable install modes that use the packaging system. 59 @param in_lab: If true, informs autoserv it is running within a lab 60 environment. This information is useful as autoserv knows 61 the database is available and can make database calls such 62 as looking up host attributes at runtime. 63 @param host_attributes: Dict of host attributes to pass into autoserv. 64 @param use_virtualenv: Whether to run autoserv inside of virtualenv. In 65 general this should be set to True in our production 66 lab, and probably False in most other use cases 67 (moblab, local testing) until we rollout virtualenv 68 support everywhere. Default: False. 69 @param host_info_subdir: When set, a sub-directory of the results directory 70 where host info file(s) are stored. 71 72 @returns The autoserv command line as a list of executable + parameters. 73 74 """ 75 script_name = 'virtualenv_autoserv' if use_virtualenv else 'autoserv' 76 77 full_script_path = os.path.join(autoserv_directory, script_name) 78 79 # virtualenv_autoserv is a `POSIX shell script, ASCII text executable`. 80 # Calling with `sys.executable` would fail because python doesn't 81 # interpret shebangs itself. 82 if use_virtualenv: 83 command = [full_script_path] 84 else: 85 command = [sys.executable, full_script_path] 86 87 if write_pidfile: 88 command.append('-p') 89 90 if results_directory: 91 command += ['-r', results_directory] 92 if host_info_subdir: 93 command += ['--local-only-host-info', 'True'] 94 command += ['--host-info-subdir', host_info_subdir] 95 96 if machines: 97 command += ['-m', machines] 98 99 if ssh_verbosity: 100 command += ['--ssh_verbosity', str(ssh_verbosity)] 101 102 if ssh_options: 103 command += ['--ssh_options', ssh_options] 104 105 if no_console_prefix: 106 command += ['--no_console_prefix'] 107 108 if job or queue_entry: 109 if not job: 110 job = queue_entry.job 111 112 owner = getattr(job, 'owner', None) 113 name = getattr(job, 'name', None) 114 control_type = getattr(job, 'control_type', None) 115 116 117 if owner: 118 command += ['-u', owner] 119 if name: 120 command += ['-l', name] 121 if control_type is not None: # still want to enter if control_type==0 122 control_type_value = control_data.CONTROL_TYPE.get_value( 123 control_type) 124 if control_type_value == control_data.CONTROL_TYPE.CLIENT: 125 command.append('-c') 126 elif control_type_value == control_data.CONTROL_TYPE.SERVER: 127 command.append('-s') 128 129 if host_attributes: 130 command += ['--host_attributes', repr(host_attributes)] 131 132 if verbose: 133 command.append('--verbose') 134 135 if fast_mode: 136 command.append('--disable_sysinfo') 137 command.append('--no_collect_crashinfo') 138 139 if not use_packaging: 140 command.append('--no_use_packaging') 141 142 if in_lab: 143 command.extend(['--lab', 'True']) 144 145 return command + extra_args 146