def __init__(self, sw_product, request_id, **options_dict): self.sw_product = sw_product self.request_id = request_id self.options_dict = options_dict self.process_handler = ProcessHandler() self.hubs_params = [] self.process_queues = []
class RequestHandler(object): """ Handles OTS requests and splits them to several parallel testruns if needed. """ def __init__(self, sw_product, request_id, **options_dict): self.sw_product = sw_product self.request_id = request_id self.options_dict = options_dict self.process_handler = ProcessHandler() self.hubs_params = [] self.process_queues = [] def run(self): """ Start testruns in separate processes and collect results """ try: self._init_hub_params() for params in self.hubs_params: self.process_handler.add_process(_run_hub, params) # Check that we have tasks to run if not self.process_handler.child_processes: return REQUEST_ERROR # Start processes ... self.process_handler.start_processes() # Read process queues results = self._read_queues() # Join processes self.process_handler.join_processes() # Check return values from test runs return _check_testruns_result_values(results.values()) except ValueError: return REQUEST_ERROR ######################### # HELPERS ######################### def _init_hub_params(self): """ Initialize parameters for each testrun """ if self.options_dict.get('device'): device_specs = self.options_dict['device'].split(';') for spec in device_specs: options, queue = self._prepare_params(spec) self.process_queues.append(queue) self.hubs_params.append((queue, self.sw_product, self.request_id, options)) else: options, queue = self._prepare_params() self.process_queues.append(queue) self.hubs_params.append((queue, self.sw_product, self.request_id, options)) def _prepare_params(self, device_spec=None): """ Set device specifications and return copy of parameters and a new queue """ options = copy.deepcopy(self.options_dict) if device_spec: options['device'] = device_spec return options, Queue() def _read_queues(self): """ Returns testrun_id and result pairs @rtype: C{dict} @return: Dictionary that contains testrun_id and result pairs """ queue_results = {} for process_queue in self.process_queues: queue_results.update(process_queue.get()) return queue_results