blob: aca62ffec7e4fc45108aca9e092110d53b9ebd44 [file] [log] [blame]
Aviv Keshet308e7362013-05-21 14:43:16 -07001#!/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
beeps5e2bb4a2013-10-28 11:26:45 -070010from autotest_lib.client.common_lib import global_config
beeps5e2bb4a2013-10-28 11:26:45 -070011try:
12 # test that imports autoserv_utils for vm_tests
13 from autotest_lib.scheduler import drone_manager
14except ImportError as e:
15 drone_manager = None
16 pass
17
18AUTOTEST_INSTALL_DIR = global_config.global_config.get_config_value('SCHEDULER',
19 'drone_installation_directory')
20autoserv_directory = os.path.join(AUTOTEST_INSTALL_DIR, 'server')
21autoserv_path = os.path.join(autoserv_directory, 'autoserv')
22
Aviv Keshet308e7362013-05-21 14:43:16 -070023
24def autoserv_run_job_command(autoserv_directory, machines,
25 results_directory=None, extra_args=[], job=None,
26 queue_entry=None, verbose=True,
Aviv Keshetc14951a2013-08-12 18:17:35 -070027 write_pidfile=True, fast_mode=False,
Aviv Keshete43bccf2013-08-14 14:11:59 -070028 ssh_verbosity=0,
Aviv Keshetc5947fa2013-09-04 14:06:29 -070029 no_console_prefix=False,
Dan Shib669cbd2013-09-13 11:17:17 -070030 ssh_options=None,
Simran Basi1bf60eb2015-12-01 16:39:29 -080031 use_packaging=True,
Simran Basi14622bb2015-11-25 13:23:40 -080032 in_lab=False,
Aviv Keshetd3e2c282017-03-20 16:56:18 -070033 host_attributes=None,
34 use_virtualenv=False):
Aviv Keshet308e7362013-05-21 14:43:16 -070035 """
36 Construct an autoserv command from a job or host queue entry.
37
38 @param autoserv_directory: Absolute path to directory containing the
39 autoserv executable.
40 @param machines: A machine or comma separated list of machines to run
41 job on. Leave as None or empty string for hostless job
42 (String).
43 @param results_directory: Absolute path to directory in which to deposit
44 results.
45 @param extra_args: Additional arguments to pass to autoserv
46 (List of Strings).
47 @param job: Job object. If supplied, -u owner, -l name, and --test-retry,
48 and -c or -s (client or server) parameters will be added.
49 @param queue_entry: HostQueueEntry object. If supplied and no job
50 was supplied, this will be used to lookup the job.
51 @param verbose: Boolean (default: True) for autoserv verbosity.
52 @param write_pidfile: Boolean (default: True) for whether autoserv should
53 write a pidfile.
Christopher Wileyf6b5aae2013-07-09 10:14:02 -070054 @param fast_mode: bool to use fast mode (disables slow autotest features).
Aviv Keshetc14951a2013-08-12 18:17:35 -070055 @param ssh_verbosity: integer between 0 and 3 (inclusive) which sents the
56 verbosity level of ssh. Default: 0.
Aviv Keshete43bccf2013-08-14 14:11:59 -070057 @param no_console_prefix: If true, supress timestamps and other prefix info
58 in autoserv console logs.
Aviv Keshetc5947fa2013-09-04 14:06:29 -070059 @param ssh_options: A string giving extra arguments to be tacked on to
60 ssh commands.
Dan Shib669cbd2013-09-13 11:17:17 -070061 @param use_packaging Enable install modes that use the packaging system.
Simran Basi1bf60eb2015-12-01 16:39:29 -080062 @param in_lab: If true, informs autoserv it is running within a lab
63 environment. This information is useful as autoserv knows
64 the database is available and can make database calls such
65 as looking up host attributes at runtime.
Simran Basi14622bb2015-11-25 13:23:40 -080066 @param host_attributes: Dict of host attributes to pass into autoserv.
Aviv Keshetd3e2c282017-03-20 16:56:18 -070067 @param use_virtualenv: Whether to run autoserv inside of virtualenv. In
68 general this should be set to True in our production
69 lab, and probably False in most other use cases
70 (moblab, local testing) until we rollout virtualenv
71 support everywhere. Default: False.
Dan Shib669cbd2013-09-13 11:17:17 -070072
Aviv Keshet308e7362013-05-21 14:43:16 -070073 @returns The autoserv command line as a list of executable + parameters.
Dan Shib669cbd2013-09-13 11:17:17 -070074
Aviv Keshet308e7362013-05-21 14:43:16 -070075 """
Aviv Keshetd3e2c282017-03-20 16:56:18 -070076 script_name = 'virtualenv_autoserv' if use_virtualenv else 'autoserv'
77 command = [os.path.join(autoserv_directory, script_name)]
Aviv Keshet308e7362013-05-21 14:43:16 -070078
79 if write_pidfile:
80 command.append('-p')
81
82 if results_directory:
83 command += ['-r', results_directory]
84
85 if machines:
86 command += ['-m', machines]
87
Aviv Keshetc14951a2013-08-12 18:17:35 -070088 if ssh_verbosity:
89 command += ['--ssh_verbosity', str(ssh_verbosity)]
90
Aviv Keshetc5947fa2013-09-04 14:06:29 -070091 if ssh_options:
92 command += ['--ssh_options', ssh_options]
93
Aviv Keshete43bccf2013-08-14 14:11:59 -070094 if no_console_prefix:
95 command += ['--no_console_prefix']
96
Aviv Keshet308e7362013-05-21 14:43:16 -070097 if job or queue_entry:
98 if not job:
99 job = queue_entry.job
100
101 owner = getattr(job, 'owner', None)
102 name = getattr(job, 'name', None)
103 test_retry = getattr(job, 'test_retry', None)
104 control_type = getattr(job, 'control_type', None)
105
106
107 if owner:
108 command += ['-u', owner]
109 if name:
110 command += ['-l', name]
111 if test_retry:
112 command += ['--test-retry='+str(test_retry)]
113 if control_type is not None: # still want to enter if control_type==0
114 control_type_value = control_data.CONTROL_TYPE.get_value(
115 control_type)
116 if control_type_value == control_data.CONTROL_TYPE.CLIENT:
117 command.append('-c')
118 elif control_type_value == control_data.CONTROL_TYPE.SERVER:
119 command.append('-s')
120
Simran Basi14622bb2015-11-25 13:23:40 -0800121 if host_attributes:
122 command += ['--host_attributes', repr(host_attributes)]
123
Aviv Keshet308e7362013-05-21 14:43:16 -0700124 if verbose:
125 command.append('--verbose')
126
Christopher Wileyf6b5aae2013-07-09 10:14:02 -0700127 if fast_mode:
128 command.append('--disable_sysinfo')
129 command.append('--no_collect_crashinfo')
130
Dan Shib669cbd2013-09-13 11:17:17 -0700131 if not use_packaging:
132 command.append('--no_use_packaging')
133
Simran Basi1bf60eb2015-12-01 16:39:29 -0800134 if in_lab:
135 command.extend(['--lab', 'True'])
136
Aviv Keshet308e7362013-05-21 14:43:16 -0700137 return command + extra_args
beeps5e2bb4a2013-10-28 11:26:45 -0700138
139
140def _autoserv_command_line(machines, extra_args, job=None, queue_entry=None,
Aviv Keshetd3e2c282017-03-20 16:56:18 -0700141 verbose=True, in_lab=False, use_virtualenv=False):
beeps5e2bb4a2013-10-28 11:26:45 -0700142 """
143 @returns The autoserv command line as a list of executable + parameters.
144
145 @param machines - string - A machine or comma separated list of machines
146 for the (-m) flag.
147 @param extra_args - list - Additional arguments to pass to autoserv.
148 @param job - Job object - If supplied, -u owner, -l name, --test-retry,
149 and client -c or server -s parameters will be added.
150 @param queue_entry - A HostQueueEntry object - If supplied and no Job
151 object was supplied, this will be used to lookup the Job object.
Simran Basi8e6affb2015-12-16 11:54:11 -0800152 @param in_lab: If true, informs autoserv it is running within a lab
153 environment. This information is useful as autoserv knows
154 the database is available and can make database calls such
155 as looking up host attributes at runtime.
Aviv Keshetd3e2c282017-03-20 16:56:18 -0700156 @param use_virtualenv: See autoserv_run_job_command.
beeps5e2bb4a2013-10-28 11:26:45 -0700157 """
158 if drone_manager is None:
159 raise ImportError('Unable to import drone_manager in autoserv_utils')
160
161 return autoserv_run_job_command(autoserv_directory,
162 machines, results_directory=drone_manager.WORKING_DIRECTORY,
163 extra_args=extra_args, job=job, queue_entry=queue_entry,
Aviv Keshetd3e2c282017-03-20 16:56:18 -0700164 verbose=verbose, in_lab=in_lab, use_virtualenv=use_virtualenv)