import common
from autotest_lib.client.common_lib import global_config

CONFIG_SECTION = 'SCHEDULER'

class SchedulerConfig(object):
    """
    Contains configuration that can be changed during scheduler execution.
    """
    FIELDS = [
                ('max_processes_per_drone', int),
                ('max_processes_warning_threshold', float),
                ('max_processes_started_per_cycle', int),
                ('clean_interval_minutes', int),
                ('max_parse_processes', int),
                ('tick_pause_sec', float),
                ('max_transfer_processes', int),
                ('secs_to_wait_for_atomic_group_hosts', int),
                ('reverify_period_minutes', int),
                ('reverify_max_hosts_at_once', int),
                ('max_repair_limit', int),
                ('max_provision_retries', int),
             ]


    def __init__(self):
        self.read_config()


    def read_config(self):
        config = global_config.global_config
        config.parse_config_file()
        for field, data_type in self.FIELDS:
            setattr(self, field, config.get_config_value(CONFIG_SECTION,
                                                         field,
                                                         type=data_type))


config = SchedulerConfig()
