# Lint as: python2, python3
#
# Copyright 2007 Google Inc. All Rights Reserved.

"""Runs profilers on a machine when no autotest job is running.

This is used to profile a task when the task is running on a machine that is not
running through autotest.
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

__author__ = 'cranger@google.com (Colby Ranger)'

import platform
import common
from autotest_lib.client.common_lib import barrier
import six

# Client control file snippet used to synchronize profiler start & stop.
_RUNTEST_PATTERN = ("job.run_test('profiler_sync', timeout_sync=%r,\n"
                    "             timeout_start=%r, timeout_stop=%r,\n"
                    "             hostid='%s', masterid='%s', all_ids=%r)")
_PROF_MAIN = platform.node()
_PORT = 11920


def _encode_args(profiler, args, dargs):
    parts = [repr(profiler)]
    parts += [repr(arg) for arg in args]
    parts += ["%s=%r" % darg for darg in six.iteritems(dargs)]
    return ", ".join(parts)


def generate_test(machines, hostname, profilers, timeout_start, timeout_stop,
                  timeout_sync=180):
    """
    Generate a control file that enables profilers and starts profiler_sync.

    @param machines: sequence of all the hostnames involved in the barrier
            synchronization
    @param hostname: hostname of the machine running the generated control file
    @param profilers: a sequence of 3 items tuples where the first item is a
            string (the profiler name), second argument is a tuple with the
            non keyword arguments to give to the profiler when being added
            with "job.profilers.add()" in the control file, third item is
            a dictionary of the keyword arguments to give it
    @param timeout_start: how many seconds to wait in profiler_sync for the
            profilers to start (None means no timeout)
    @param timeout_stop: how many seconds to wait in profiler_sync for the
            profilers to stop (None means no timeout)
    @param timeout_sync: how many seconds to wait in profiler_sync for other
            machines to reach the start of the profiler_sync (None means no
            timeout)
    """
    control_file = []
    for profiler in profilers:
        control_file.append("job.profilers.add(%s)"
                            % _encode_args(*profiler))

    profiler_sync_call = (_RUNTEST_PATTERN %
                          (timeout_sync, timeout_start, timeout_stop,
                           hostname, _PROF_MAIN, machines))
    control_file.append(profiler_sync_call)

    for profiler in reversed(profilers):
        control_file.append("job.profilers.delete('%s')" % profiler[0])

    return "\n".join(control_file)


def wait_for_profilers(machines, timeout=300):
    sb = barrier.barrier(_PROF_MAIN, "sync_profilers",
            timeout, port=_PORT)
    sb.rendezvous_servers(_PROF_MAIN, *machines)


def start_profilers(machines, timeout=120):
    sb = barrier.barrier(_PROF_MAIN, "start_profilers",
            timeout, port=_PORT)
    sb.rendezvous_servers(_PROF_MAIN, *machines)


def stop_profilers(machines, timeout=120):
    sb = barrier.barrier(_PROF_MAIN, "stop_profilers",
            timeout, port=_PORT)
    sb.rendezvous_servers(_PROF_MAIN, *machines)


def finish_profilers(machines, timeout=120):
    sb = barrier.barrier(_PROF_MAIN, "finish_profilers",
            timeout, port=_PORT)
    sb.rendezvous_servers(_PROF_MAIN, *machines)
