blob: 9fefc43600fc9fffe0fa562cdf0e5ad376893c1f [file] [log] [blame]
Mike Frysingerd03e6b52019-08-03 12:49:01 -04001#!/usr/bin/python2
Aviv Keshet308e7362013-05-21 14:43:16 -07002# 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
Derek Beckett2976bb72020-12-14 11:12:47 -08007import sys
Aviv Keshet308e7362013-05-21 14:43:16 -07008
9import common
Derek Beckett2976bb72020-12-14 11:12:47 -080010
Aviv Keshet308e7362013-05-21 14:43:16 -070011from autotest_lib.client.common_lib import control_data
beeps5e2bb4a2013-10-28 11:26:45 -070012from autotest_lib.client.common_lib import global_config
beeps5e2bb4a2013-10-28 11:26:45 -070013
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
Aviv Keshet308e7362013-05-21 14:43:16 -070019
20def autoserv_run_job_command(autoserv_directory, machines,
21 results_directory=None, extra_args=[], job=None,
22 queue_entry=None, verbose=True,
Aviv Keshetc14951a2013-08-12 18:17:35 -070023 write_pidfile=True, fast_mode=False,
Aviv Keshete43bccf2013-08-14 14:11:59 -070024 ssh_verbosity=0,
Aviv Keshetc5947fa2013-09-04 14:06:29 -070025 no_console_prefix=False,
Dan Shib669cbd2013-09-13 11:17:17 -070026 ssh_options=None,
Simran Basi1bf60eb2015-12-01 16:39:29 -080027 use_packaging=True,
Simran Basi14622bb2015-11-25 13:23:40 -080028 in_lab=False,
Aviv Keshetd3e2c282017-03-20 16:56:18 -070029 host_attributes=None,
Prathmesh Prabhu2532d0d2020-01-03 15:47:52 -080030 use_virtualenv=False,
31 host_info_subdir=''):
Aviv Keshet308e7362013-05-21 14:43:16 -070032 """
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.
Christopher Wileyf6b5aae2013-07-09 10:14:02 -070051 @param fast_mode: bool to use fast mode (disables slow autotest features).
Aviv Keshetc14951a2013-08-12 18:17:35 -070052 @param ssh_verbosity: integer between 0 and 3 (inclusive) which sents the
53 verbosity level of ssh. Default: 0.
Aviv Keshete43bccf2013-08-14 14:11:59 -070054 @param no_console_prefix: If true, supress timestamps and other prefix info
55 in autoserv console logs.
Aviv Keshetc5947fa2013-09-04 14:06:29 -070056 @param ssh_options: A string giving extra arguments to be tacked on to
57 ssh commands.
Dan Shib669cbd2013-09-13 11:17:17 -070058 @param use_packaging Enable install modes that use the packaging system.
Simran Basi1bf60eb2015-12-01 16:39:29 -080059 @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.
Simran Basi14622bb2015-11-25 13:23:40 -080063 @param host_attributes: Dict of host attributes to pass into autoserv.
Aviv Keshetd3e2c282017-03-20 16:56:18 -070064 @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.
Prathmesh Prabhu2532d0d2020-01-03 15:47:52 -080069 @param host_info_subdir: When set, a sub-directory of the results directory
70 where host info file(s) are stored.
Dan Shib669cbd2013-09-13 11:17:17 -070071
Aviv Keshet308e7362013-05-21 14:43:16 -070072 @returns The autoserv command line as a list of executable + parameters.
Dan Shib669cbd2013-09-13 11:17:17 -070073
Aviv Keshet308e7362013-05-21 14:43:16 -070074 """
Aviv Keshetd3e2c282017-03-20 16:56:18 -070075 script_name = 'virtualenv_autoserv' if use_virtualenv else 'autoserv'
Derek Beckett2976bb72020-12-14 11:12:47 -080076
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]
Aviv Keshet308e7362013-05-21 14:43:16 -070086
87 if write_pidfile:
88 command.append('-p')
89
90 if results_directory:
91 command += ['-r', results_directory]
Prathmesh Prabhu2532d0d2020-01-03 15:47:52 -080092 if host_info_subdir:
Prathmesh Prabhu7fec0bf2020-01-07 14:23:04 -080093 command += ['--local-only-host-info', 'True']
Prathmesh Prabhu2532d0d2020-01-03 15:47:52 -080094 command += ['--host-info-subdir', host_info_subdir]
Aviv Keshet308e7362013-05-21 14:43:16 -070095
96 if machines:
97 command += ['-m', machines]
98
Aviv Keshetc14951a2013-08-12 18:17:35 -070099 if ssh_verbosity:
100 command += ['--ssh_verbosity', str(ssh_verbosity)]
101
Aviv Keshetc5947fa2013-09-04 14:06:29 -0700102 if ssh_options:
103 command += ['--ssh_options', ssh_options]
104
Aviv Keshete43bccf2013-08-14 14:11:59 -0700105 if no_console_prefix:
106 command += ['--no_console_prefix']
107
Aviv Keshet308e7362013-05-21 14:43:16 -0700108 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)
Aviv Keshet308e7362013-05-21 14:43:16 -0700114 control_type = getattr(job, 'control_type', None)
115
116
117 if owner:
118 command += ['-u', owner]
119 if name:
120 command += ['-l', name]
Aviv Keshet308e7362013-05-21 14:43:16 -0700121 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
Simran Basi14622bb2015-11-25 13:23:40 -0800129 if host_attributes:
130 command += ['--host_attributes', repr(host_attributes)]
131
Aviv Keshet308e7362013-05-21 14:43:16 -0700132 if verbose:
133 command.append('--verbose')
134
Christopher Wileyf6b5aae2013-07-09 10:14:02 -0700135 if fast_mode:
136 command.append('--disable_sysinfo')
137 command.append('--no_collect_crashinfo')
138
Dan Shib669cbd2013-09-13 11:17:17 -0700139 if not use_packaging:
140 command.append('--no_use_packaging')
141
Simran Basi1bf60eb2015-12-01 16:39:29 -0800142 if in_lab:
143 command.extend(['--lab', 'True'])
144
Aviv Keshet308e7362013-05-21 14:43:16 -0700145 return command + extra_args