146 lines
5.9 KiB
Python
146 lines
5.9 KiB
Python
#!/usr/bin/python2
|
|
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import os
|
|
import sys
|
|
|
|
import common
|
|
|
|
from autotest_lib.client.common_lib import control_data
|
|
from autotest_lib.client.common_lib import global_config
|
|
|
|
AUTOTEST_INSTALL_DIR = global_config.global_config.get_config_value('SCHEDULER',
|
|
'drone_installation_directory')
|
|
autoserv_directory = os.path.join(AUTOTEST_INSTALL_DIR, 'server')
|
|
autoserv_path = os.path.join(autoserv_directory, 'autoserv')
|
|
|
|
|
|
def autoserv_run_job_command(autoserv_directory, machines,
|
|
results_directory=None, extra_args=[], job=None,
|
|
queue_entry=None, verbose=True,
|
|
write_pidfile=True, fast_mode=False,
|
|
ssh_verbosity=0,
|
|
no_console_prefix=False,
|
|
ssh_options=None,
|
|
use_packaging=True,
|
|
in_lab=False,
|
|
host_attributes=None,
|
|
use_virtualenv=False,
|
|
host_info_subdir=''):
|
|
"""
|
|
Construct an autoserv command from a job or host queue entry.
|
|
|
|
@param autoserv_directory: Absolute path to directory containing the
|
|
autoserv executable.
|
|
@param machines: A machine or comma separated list of machines to run
|
|
job on. Leave as None or empty string for hostless job
|
|
(String).
|
|
@param results_directory: Absolute path to directory in which to deposit
|
|
results.
|
|
@param extra_args: Additional arguments to pass to autoserv
|
|
(List of Strings).
|
|
@param job: Job object. If supplied, -u owner, -l name, and --test-retry,
|
|
and -c or -s (client or server) parameters will be added.
|
|
@param queue_entry: HostQueueEntry object. If supplied and no job
|
|
was supplied, this will be used to lookup the job.
|
|
@param verbose: Boolean (default: True) for autoserv verbosity.
|
|
@param write_pidfile: Boolean (default: True) for whether autoserv should
|
|
write a pidfile.
|
|
@param fast_mode: bool to use fast mode (disables slow autotest features).
|
|
@param ssh_verbosity: integer between 0 and 3 (inclusive) which sents the
|
|
verbosity level of ssh. Default: 0.
|
|
@param no_console_prefix: If true, supress timestamps and other prefix info
|
|
in autoserv console logs.
|
|
@param ssh_options: A string giving extra arguments to be tacked on to
|
|
ssh commands.
|
|
@param use_packaging Enable install modes that use the packaging system.
|
|
@param in_lab: If true, informs autoserv it is running within a lab
|
|
environment. This information is useful as autoserv knows
|
|
the database is available and can make database calls such
|
|
as looking up host attributes at runtime.
|
|
@param host_attributes: Dict of host attributes to pass into autoserv.
|
|
@param use_virtualenv: Whether to run autoserv inside of virtualenv. In
|
|
general this should be set to True in our production
|
|
lab, and probably False in most other use cases
|
|
(moblab, local testing) until we rollout virtualenv
|
|
support everywhere. Default: False.
|
|
@param host_info_subdir: When set, a sub-directory of the results directory
|
|
where host info file(s) are stored.
|
|
|
|
@returns The autoserv command line as a list of executable + parameters.
|
|
|
|
"""
|
|
script_name = 'virtualenv_autoserv' if use_virtualenv else 'autoserv'
|
|
|
|
full_script_path = os.path.join(autoserv_directory, script_name)
|
|
|
|
# virtualenv_autoserv is a `POSIX shell script, ASCII text executable`.
|
|
# Calling with `sys.executable` would fail because python doesn't
|
|
# interpret shebangs itself.
|
|
if use_virtualenv:
|
|
command = [full_script_path]
|
|
else:
|
|
command = [sys.executable, full_script_path]
|
|
|
|
if write_pidfile:
|
|
command.append('-p')
|
|
|
|
if results_directory:
|
|
command += ['-r', results_directory]
|
|
if host_info_subdir:
|
|
command += ['--local-only-host-info', 'True']
|
|
command += ['--host-info-subdir', host_info_subdir]
|
|
|
|
if machines:
|
|
command += ['-m', machines]
|
|
|
|
if ssh_verbosity:
|
|
command += ['--ssh_verbosity', str(ssh_verbosity)]
|
|
|
|
if ssh_options:
|
|
command += ['--ssh_options', ssh_options]
|
|
|
|
if no_console_prefix:
|
|
command += ['--no_console_prefix']
|
|
|
|
if job or queue_entry:
|
|
if not job:
|
|
job = queue_entry.job
|
|
|
|
owner = getattr(job, 'owner', None)
|
|
name = getattr(job, 'name', None)
|
|
control_type = getattr(job, 'control_type', None)
|
|
|
|
|
|
if owner:
|
|
command += ['-u', owner]
|
|
if name:
|
|
command += ['-l', name]
|
|
if control_type is not None: # still want to enter if control_type==0
|
|
control_type_value = control_data.CONTROL_TYPE.get_value(
|
|
control_type)
|
|
if control_type_value == control_data.CONTROL_TYPE.CLIENT:
|
|
command.append('-c')
|
|
elif control_type_value == control_data.CONTROL_TYPE.SERVER:
|
|
command.append('-s')
|
|
|
|
if host_attributes:
|
|
command += ['--host_attributes', repr(host_attributes)]
|
|
|
|
if verbose:
|
|
command.append('--verbose')
|
|
|
|
if fast_mode:
|
|
command.append('--disable_sysinfo')
|
|
command.append('--no_collect_crashinfo')
|
|
|
|
if not use_packaging:
|
|
command.append('--no_use_packaging')
|
|
|
|
if in_lab:
|
|
command.extend(['--lab', 'True'])
|
|
|
|
return command + extra_args
|