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