# Copyright (c) 2012 The Chromium 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 import Queue import time import traceback from autotest_lib.client.common_lib.cros.network import ap_constants from autotest_lib.server.cros.ap_configurators import ap_configurator from threading import Thread # Maximum configurators to run at once THREAD_MAX = 15 class APCartridge(object): """Class to run multiple configurators in parallel.""" def __init__(self): self.cartridge = Queue.Queue() def push_configurators(self, configurators): """Adds multiple configurators to the cartridge. @param configurators: a list of configurator objects. """ for configurator in configurators: self.cartridge.put(configurator) def push_configurator(self, configurator): """Adds a configurator to the cartridge. @param configurator: a configurator object. """ self.cartridge.put(configurator) def _apply_settings(self, broken_pdus): while True: configurator = self.cartridge.get() try: # Don't run this thread if the PDU in question was found to be # down by any previous thread. if configurator.pdu in broken_pdus: configurator.configuration_success = ap_constants.PDU_FAIL raise ap_configurator.PduNotResponding(configurator.pdu) configurator.apply_settings() except ap_configurator.PduNotResponding as e: if configurator.pdu not in broken_pdus: broken_pdus.append(configurator.pdu) except Exception: configurator.configuration_success = ap_constants.CONFIG_FAIL trace = ''.join(traceback.format_exc()) configurator.store_config_failure(trace) logging.error('Configuration failed for AP: %s\n%s', configurator.name, trace) finally: configurator.reset_command_list() logging.info('Configuration of AP %s complete.', configurator.name) self.cartridge.task_done() def run_configurators(self, broken_pdus): """Runs apply_settings for all configurators in the cartridge. @param broken_pdus: List of all the PDUs that are down. """ for i in range(THREAD_MAX): t = Thread(target=self._apply_settings,args=(broken_pdus,)) t.daemon = True t.start() self.cartridge.join()