#!/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)
