普通文本  |  79行  |  2.65 KB

# 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()