79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
# 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()
|