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