# -*- coding: utf-8 -*-
# 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.

"""Setting files for global, benchmark and labels."""

from __future__ import print_function

from field import BooleanField
from field import EnumField
from field import FloatField
from field import IntegerField
from field import ListField
from field import TextField
from settings import Settings


class BenchmarkSettings(Settings):
  """Settings used to configure individual benchmarks."""

  def __init__(self, name):
    super(BenchmarkSettings, self).__init__(name, 'benchmark')
    self.AddField(
        TextField(
            'test_name',
            description='The name of the test to run. '
            'Defaults to the name of the benchmark.'))
    self.AddField(
        TextField(
            'test_args', description='Arguments to be passed to the '
            'test.'))
    self.AddField(
        IntegerField(
            'iterations',
            required=False,
            default=0,
            description='Number of iterations to run the test. '
            'If not set, will run each benchmark test the optimum number of '
            'times to get a stable result.'))
    self.AddField(
        TextField(
            'suite',
            default='test_that',
            description='The type of the benchmark.'))
    self.AddField(
        IntegerField(
            'retries',
            default=0,
            description='Number of times to retry a '
            'benchmark run.'))
    self.AddField(
        BooleanField(
            'run_local',
            description='Run benchmark harness on the DUT. '
            'Currently only compatible with the suite: '
            'telemetry_Crosperf.',
            required=False,
            default=True))
    self.AddField(
        FloatField(
            'weight',
            default=0.0,
            description='Weight of the benchmark for CWP approximation'))


class LabelSettings(Settings):
  """Settings for each label."""

  def __init__(self, name):
    super(LabelSettings, self).__init__(name, 'label')
    self.AddField(
        TextField(
            'chromeos_image',
            required=False,
            description='The path to the image to run tests '
            'on, for local/custom-built images. See the '
            "'build' option for official or trybot images."))
    self.AddField(
        TextField(
            'autotest_path',
            required=False,
            description='Autotest directory path relative to chroot which '
            'has autotest files for the image to run tests requiring autotest '
            'files.'))
    self.AddField(
        TextField(
            'debug_path',
            required=False,
            description='Debug info directory relative to chroot which has '
            'symbols and vmlinux that can be used by perf tool.'))
    self.AddField(
        TextField(
            'chromeos_root',
            description='The path to a chromeos checkout which '
            'contains a src/scripts directory. Defaults to '
            'the chromeos checkout which contains the '
            'chromeos_image.'))
    self.AddField(
        ListField(
            'remote',
            description='A comma-separated list of IPs of chromeos'
            'devices to run experiments on.'))
    self.AddField(
        TextField(
            'image_args',
            required=False,
            default='',
            description='Extra arguments to pass to '
            'image_chromeos.py.'))
    self.AddField(
        TextField(
            'cache_dir',
            default='',
            description='The cache dir for this image.'))
    self.AddField(
        TextField(
            'compiler',
            default='gcc',
            description='The compiler used to build the '
            'ChromeOS image (gcc or llvm).'))
    self.AddField(
        TextField(
            'chrome_src',
            description='The path to the source of chrome. '
            'This is used to run telemetry benchmarks. '
            'The default one is the src inside chroot.',
            required=False,
            default=''))
    self.AddField(
        TextField(
            'build',
            description='The xbuddy specification for an '
            'official or trybot image to use for tests. '
            "'/remote' is assumed, and the board is given "
            "elsewhere, so omit the '/remote/<board>/' xbuddy "
            'prefix.',
            required=False,
            default=''))


class GlobalSettings(Settings):
  """Settings that apply per-experiment."""

  def __init__(self, name):
    super(GlobalSettings, self).__init__(name, 'global')
    self.AddField(
        TextField(
            'name',
            description='The name of the experiment. Just an '
            'identifier.'))
    self.AddField(
        TextField(
            'board',
            description='The target board for running '
            'experiments on, e.g. x86-alex.'))
    self.AddField(
        BooleanField(
            'skylab',
            description='Whether to run experiments via skylab.',
            default=False))
    self.AddField(
        ListField(
            'remote',
            description='A comma-separated list of IPs of '
            'chromeos devices to run experiments on.'))
    self.AddField(
        BooleanField(
            'rerun_if_failed',
            description='Whether to re-run failed test runs '
            'or not.',
            default=False))
    self.AddField(
        BooleanField(
            'rm_chroot_tmp',
            default=False,
            description='Whether to remove the test_that '
            'result in the chroot.'))
    self.AddField(
        ListField(
            'email',
            description='Space-separated list of email '
            'addresses to send email to.'))
    self.AddField(
        BooleanField(
            'rerun',
            description='Whether to ignore the cache and '
            'for tests to be re-run.',
            default=False))
    self.AddField(
        BooleanField(
            'same_specs',
            default=True,
            description='Ensure cached runs are run on the '
            'same kind of devices which are specified as a '
            'remote.'))
    self.AddField(
        BooleanField(
            'same_machine',
            default=False,
            description='Ensure cached runs are run on the '
            'same remote.'))
    self.AddField(
        BooleanField(
            'use_file_locks',
            default=False,
            description='DEPRECATED: Whether to use the file locks '
            'or AFE server lock mechanism.'))
    self.AddField(
        IntegerField(
            'iterations',
            required=False,
            default=0,
            description='Number of iterations to run all tests. '
            'If not set, will run each benchmark test the optimum number of '
            'times to get a stable result.'))
    self.AddField(
        TextField(
            'chromeos_root',
            description='The path to a chromeos checkout which '
            'contains a src/scripts directory. Defaults to '
            'the chromeos checkout which contains the '
            'chromeos_image.'))
    self.AddField(
        TextField(
            'logging_level',
            default='average',
            description='The level of logging desired. '
            "Options are 'quiet', 'average', and 'verbose'."))
    self.AddField(
        IntegerField(
            'acquire_timeout',
            default=0,
            description='Number of seconds to wait for '
            'machine before exit if all the machines in '
            'the experiment file are busy. Default is 0.'))
    self.AddField(
        TextField(
            'perf_args',
            default='',
            description='The optional profile command. It '
            'enables perf commands to record perforamance '
            'related counters. It must start with perf '
            'command record or stat followed by arguments.'))
    self.AddField(
        BooleanField(
            'download_debug',
            default=True,
            description='Download compressed debug symbols alongwith '
            'image. This can provide more info matching symbols for'
            'profiles, but takes larger space. By default, download'
            'it only when perf_args is specified.'))
    self.AddField(
        TextField(
            'cache_dir',
            default='',
            description='The abs path of cache dir. '
            'Default is /home/$(whoami)/cros_scratch.'))
    self.AddField(
        BooleanField(
            'cache_only',
            default=False,
            description='Whether to use only cached '
            'results (do not rerun failed tests).'))
    self.AddField(
        BooleanField(
            'no_email',
            default=False,
            description='Whether to disable the email to '
            'user after crosperf finishes.'))
    self.AddField(
        BooleanField(
            'json_report',
            default=False,
            description='Whether to generate a json version '
            'of the report, for archiving.'))
    self.AddField(
        BooleanField(
            'show_all_results',
            default=False,
            description='When running Telemetry tests, '
            'whether to all the results, instead of just '
            'the default (summary) results.'))
    self.AddField(
        TextField(
            'share_cache',
            default='',
            description='Path to alternate cache whose data '
            'you want to use. It accepts multiple directories '
            'separated by a ",".'))
    self.AddField(
        TextField('results_dir', default='', description='The results dir.'))
    self.AddField(
        TextField(
            'locks_dir',
            default='',
            description='An alternate directory to use for '
            'storing/checking machine file locks for local machines. '
            'By default the file locks directory is '
            '/google/data/rw/users/mo/mobiletc-prebuild/locks.\n'
            'WARNING: If you use your own locks directory, '
            'there is no guarantee that someone else might not '
            'hold a lock on the same machine in a different '
            'locks directory.'))
    self.AddField(
        TextField(
            'chrome_src',
            description='The path to the source of chrome. '
            'This is used to run telemetry benchmarks. '
            'The default one is the src inside chroot.',
            required=False,
            default=''))
    self.AddField(
        IntegerField(
            'retries',
            default=0,
            description='Number of times to retry a '
            'benchmark run.'))
    self.AddField(
        TextField(
            'cwp_dso',
            description='The DSO type that we want to use for '
            'CWP approximation. This is used to run telemetry '
            'benchmarks. Valid DSO types can be found from dso_list '
            'in experiment_factory.py. The default value is set to '
            'be empty.',
            required=False,
            default=''))
    self.AddField(
        BooleanField(
            'enable_aslr',
            description='Enable ASLR on the machine to run the '
            'benchmarks. ASLR is disabled by default',
            required=False,
            default=False))
    self.AddField(
        BooleanField(
            'ignore_min_max',
            description='When doing math for the raw results, '
            'ignore min and max values to reduce noise.',
            required=False,
            default=False))
    self.AddField(
        TextField(
            'intel_pstate',
            description='Intel Pstate mode.\n'
            'Supported modes: "active", "passive", "no_hwp".\n'
            'Default is "no_hwp" which disables hardware pstates to avoid '
            'noise in benchmarks.',
            required=False,
            default='no_hwp'))
    self.AddField(
        BooleanField(
            'turbostat',
            description='Run turbostat process in the background'
            ' of a benchmark. Enabled by default.',
            required=False,
            default=True))
    self.AddField(
        FloatField(
            'top_interval',
            description='Run top command in the background of a benchmark with'
            ' interval of sampling specified in seconds.\n'
            'Recommended values 1-5. Lower number provides more accurate'
            ' data.\n'
            'With 0 - do not run top.\n'
            'NOTE: Running top with interval 1-5 sec has insignificant'
            ' performance impact (performance degradation does not exceed'
            ' 0.3%%, measured on x86_64, ARM32, and ARM64). '
            'The default value is 1.',
            required=False,
            default=1))
    self.AddField(
        IntegerField(
            'cooldown_temp',
            required=False,
            default=40,
            description='Wait until CPU temperature goes down below'
            ' specified temperature in Celsius'
            ' prior starting a benchmark. '
            'By default the value is set to 40 degrees.'))
    self.AddField(
        IntegerField(
            'cooldown_time',
            required=False,
            default=10,
            description='Wait specified time in minutes allowing'
            ' CPU to cool down. Zero value disables cooldown. '
            'The default value is 10 minutes.'))
    self.AddField(
        EnumField(
            'governor',
            options=[
                'performance',
                'powersave',
                'userspace',
                'ondemand',
                'conservative',
                'schedutils',
                'sched',
                'interactive',
            ],
            default='performance',
            required=False,
            description='Setup CPU governor for all cores.\n'
            'For more details refer to:\n'
            'https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt. '
            'Default is "performance" governor.'))
    self.AddField(
        EnumField(
            'cpu_usage',
            options=[
                'all',
                'big_only',
                'little_only',
                'exclusive_cores',
            ],
            default='all',
            required=False,
            description='Restrict usage of CPUs to decrease CPU interference.\n'
            '"all" - no restrictions;\n'
            '"big-only", "little-only" - enable only big/little cores,'
            ' applicable only on ARM;\n'
            '"exclusive-cores" - (for future use)'
            ' isolate cores for exclusive use of benchmark processes. '
            'By default use all CPUs.'))
    self.AddField(
        IntegerField(
            'cpu_freq_pct',
            required=False,
            default=95,
            description='Setup CPU frequency to a supported value less than'
            ' or equal to a percent of max_freq. '
            'CPU frequency is reduced to 95%% by default to reduce thermal '
            'throttling.'))


class SettingsFactory(object):
  """Factory class for building different types of Settings objects.

  This factory is currently hardcoded to produce settings for ChromeOS
  experiment files. The idea is that in the future, other types
  of settings could be produced.
  """

  def GetSettings(self, name, settings_type):
    if settings_type == 'label' or not settings_type:
      return LabelSettings(name)
    if settings_type == 'global':
      return GlobalSettings(name)
    if settings_type == 'benchmark':
      return BenchmarkSettings(name)

    raise TypeError("Invalid settings type: '%s'." % settings_type)
