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