# Copyright 2015 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.
class DroneTaskQueueException(Exception):
"""Generic task queue exception."""
pass
class DroneTaskQueue(object):
"""A manager to run queued tasks in drones and gather results from them."""
def __init__(self):
self.results = dict()
def get_results(self):
"""Get a results dictionary keyed on drones.
@return: A dictionary of return values from drones.
"""
results_copy = self.results.copy()
self.results.clear()
return results_copy
def execute(self, drones, wait=True):
"""Invoke methods via SSH to a drone.
@param drones: A list of drones with calls to execute.
@param wait: If True, this method will only return when all the drones
have returned the result of their respective invocations of
drone_utility. The `results` map will be cleared.
If False, the caller must clear the map before the next invocation
of `execute`, by calling `get_results`.
@return: A dictionary keyed on the drones, containing a list of return
values from the execution of drone_utility.
@raises DroneTaskQueueException: If the results map isn't empty at the
time of invocation.
"""
if self.results:
raise DroneTaskQueueException(
'Cannot clobber results map: %s, it should be cleared '
'through get_results.' % self.results)
for drone in drones:
if not drone.get_calls():
continue
drone_results = drone.execute_queued_calls()
if drone in self.results:
raise DroneTaskQueueException(
'Task queue has recorded results for drone %s: %s' %
(drone, self.results))
self.results[drone] = drone_results
return self.get_results() if wait else None