# Copyright (c) 2012 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 logging from autotest_lib.client.common_lib import global_config, error from autotest_lib.client.common_lib.cros.graphite import autotest_stats from autotest_lib.scheduler import drones, scheduler_config HOSTS_JOB_SUBDIR = 'hosts/' PARSE_LOG = '.parse.log' ENABLE_ARCHIVING = global_config.global_config.get_config_value( scheduler_config.CONFIG_SECTION, 'enable_archiving', type=bool) class SiteDroneManager(object): _timer = autotest_stats.Timer('drone_manager') def copy_to_results_repository(self, process, source_path, destination_path=None): """ Copy results from the given process at source_path to destination_path in the results repository. This site subclassed version will only copy the results back for Special Agent Tasks (Cleanup, Verify, Repair) that reside in the hosts/ subdirectory of results if the copy_task_results_back flag has been set to True inside global_config.ini It will also only copy .parse.log files back to the scheduler if the copy_parse_log_back flag in global_config.ini has been set to True. """ if not ENABLE_ARCHIVING: return copy_task_results_back = global_config.global_config.get_config_value( scheduler_config.CONFIG_SECTION, 'copy_task_results_back', type=bool) copy_parse_log_back = global_config.global_config.get_config_value( scheduler_config.CONFIG_SECTION, 'copy_parse_log_back', type=bool) special_task = source_path.startswith(HOSTS_JOB_SUBDIR) parse_log = source_path.endswith(PARSE_LOG) if (copy_task_results_back or not special_task) and ( copy_parse_log_back or not parse_log): super(SiteDroneManager, self).copy_to_results_repository(process, source_path, destination_path) def kill_process(self, process): """ Kill the given process. """ logging.info('killing %s', process) drone = self._get_drone_for_process(process) drone.queue_kill_process(process) def _add_drone(self, hostname): """ Forked from drone_manager.py Catches AutoservRunError if the drone fails initialization and does not add it to the list of usable drones. @param hostname: Hostname of the drone we are trying to add. """ logging.info('Adding drone %s' % hostname) drone = drones.get_drone(hostname) if drone: try: drone.call('initialize', self.absolute_path('')) except error.AutoservRunError as e: logging.error('Failed to initialize drone %s with error: %s', hostname, e) return self._drones[drone.hostname] = drone @_timer.decorate def refresh(self): super(SiteDroneManager, self).refresh() @_timer.decorate def execute_actions(self): super(SiteDroneManager, self).execute_actions()