# 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() for l in labels: matcher = re.match(r'(.*?)(?:-\d+)?$', l.name) if matcher is not None: label_names.add(matcher.group(1)) return map(lambda l: l.split(':', 1)[1], label_names)