| #!/usr/bin/python |
| # 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 common |
| from autotest_lib.client.common_lib import control_data |
| from autotest_lib.client.common_lib import global_config |
| try: |
| # test that imports autoserv_utils for vm_tests |
| from autotest_lib.scheduler import drone_manager |
| except ImportError as e: |
| drone_manager = None |
| pass |
| |
| 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): |
| """ |
| 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. |
| |
| @returns The autoserv command line as a list of executable + parameters. |
| |
| """ |
| script_name = 'virtualenv_autoserv' if use_virtualenv else 'autoserv' |
| command = [os.path.join(autoserv_directory, script_name)] |
| |
| if write_pidfile: |
| command.append('-p') |
| |
| if results_directory: |
| command += ['-r', results_directory] |
| |
| 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) |
| test_retry = getattr(job, 'test_retry', None) |
| control_type = getattr(job, 'control_type', None) |
| |
| |
| if owner: |
| command += ['-u', owner] |
| if name: |
| command += ['-l', name] |
| if test_retry: |
| command += ['--test-retry='+str(test_retry)] |
| 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 |
| |
| |
| def _autoserv_command_line(machines, extra_args, job=None, queue_entry=None, |
| verbose=True, in_lab=False, use_virtualenv=False): |
| """ |
| @returns The autoserv command line as a list of executable + parameters. |
| |
| @param machines - string - A machine or comma separated list of machines |
| for the (-m) flag. |
| @param extra_args - list - Additional arguments to pass to autoserv. |
| @param job - Job object - If supplied, -u owner, -l name, --test-retry, |
| and client -c or server -s parameters will be added. |
| @param queue_entry - A HostQueueEntry object - If supplied and no Job |
| object was supplied, this will be used to lookup the Job object. |
| @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 use_virtualenv: See autoserv_run_job_command. |
| """ |
| if drone_manager is None: |
| raise ImportError('Unable to import drone_manager in autoserv_utils') |
| |
| return autoserv_run_job_command(autoserv_directory, |
| machines, results_directory=drone_manager.WORKING_DIRECTORY, |
| extra_args=extra_args, job=job, queue_entry=queue_entry, |
| verbose=verbose, in_lab=in_lab, use_virtualenv=use_virtualenv) |