| # Copyright (c) 2012 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. |
| |
| import re |
| |
| import common |
| from constants import Labels |
| |
| |
| class EnumeratorException(Exception): |
| """Base class for exceptions from this module.""" |
| pass |
| |
| |
| class EnumerateException(EnumeratorException): |
| """Raised when an error is returned from the AFE during enumeration.""" |
| pass |
| |
| |
| class NoBoardException(EnumeratorException): |
| """Raised when an error is returned from the AFE during enumeration.""" |
| |
| |
| def __init__(self): |
| super(NoBoardException, self).__init__('No supported boards.') |
| |
| |
| class BoardEnumerator(object): |
| """Talks to the AFE and enumerates the boards it knows about. |
| |
| @var _afe: a frontend.AFE instance used to talk to autotest. |
| """ |
| |
| |
| def __init__(self, afe=None): |
| """Constructor |
| |
| @param afe: an instance of AFE as defined in server/frontend.py. |
| """ |
| self._afe = afe |
| |
| |
| def Enumerate(self): |
| """Enumerate currently supported boards. |
| |
| Lists all labels known to the AFE that start with self._LABEL_PREFIX, |
| as this is the way that we define 'boards' in the AFE today. |
| |
| @return list of board names, e.g. 'x86-mario' |
| """ |
| try: |
| labels = self._afe.get_labels(name__startswith=Labels.BOARD_PREFIX) |
| except Exception as e: |
| raise EnumerateException(e) |
| |
| if not labels: |
| raise NoBoardException() |
| |
| # Filter out all board labels tailing with -number, which is used for |
| # testbed only. |
| label_names = set([re.match(r'(.*?)(?:-\d+)?$', l.name).group(1) |
| for l in labels]) |
| return map(lambda l: l.split(':', 1)[1], label_names) |