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

"""Configuration options for various cbuildbot builders."""

from __future__ import print_function

import copy
import os

from chromite.cbuildbot import config_lib
from chromite.cbuildbot import constants


CONFIG_FILE = os.path.join(constants.CHROMITE_DIR, 'cbuildbot',
                           'config_dump.json')


# Enumeration of valid settings; any/all config settings must be in this.
# All settings must be documented.
_settings = dict(
    # The name of the config.
    name=None,

    # A list of boards to build.
    boards=None,

    # The profile of the variant to set up and build.
    profile=None,

    # This bot pushes changes to the overlays.
    master=False,

    # If False, this flag indicates that the CQ should not check whether
    # this bot passed or failed. Set this to False if you are setting up a
    # new bot. Once the bot is on the waterfall and is consistently green,
    # mark the builder as important=True.
    important=False,

    # An integer. If this builder fails this many times consecutively, send
    # an alert email to the recipients health_alert_recipients. This does
    # not apply to tryjobs. This feature is similar to the ERROR_WATERMARK
    # feature of upload_symbols, and it may make sense to merge the features
    # at some point.
    health_threshold=0,

    # List of email addresses to send health alerts to for this builder. It
    # supports automatic email address lookup for the following sheriff
    # types:
    #     'tree': tree sheriffs
    #     'chrome': chrome gardeners
    health_alert_recipients=[],

    # Whether this is an internal build config.
    internal=False,

    # Whether this is a branched build config. Used for pfq logic.
    branch=False,

    # The name of the manifest to use. E.g., to use the buildtools manifest,
    # specify 'buildtools'.
    manifest=constants.DEFAULT_MANIFEST,

    # The name of the manifest to use if we're building on a local trybot.
    # This should only require elevated access if it's really needed to
    # build this config.
    dev_manifest=constants.DEFAULT_MANIFEST,

    # Applies only to paladin builders. If true, Sync to the manifest
    # without applying any test patches, then do a fresh build in a new
    # chroot. Then, apply the patches and build in the existing chroot.
    build_before_patching=False,

    # Applies only to paladin builders. If True, Sync to the master manifest
    # without applying any of the test patches, rather than running
    # CommitQueueSync. This is basically ToT immediately prior to the
    # current commit queue run.
    do_not_apply_cq_patches=False,

    # Applies only to master builders. List of the names of slave builders
    # to be treated as sanity checkers. If only sanity check builders fail,
    # then the master will ignore the failures. In a CQ run, if any of the
    # sanity check builders fail and other builders fail as well, the master
    # will treat the build as failed, but will not reset the ready bit of
    # the tested patches.
    sanity_check_slaves=None,

    # emerge use flags to use while setting up the board, building packages,
    # making images, etc.
    useflags=[],

    # Set the variable CHROMEOS_OFFICIAL for the build. Known to affect
    # parallel_emerge, cros_set_lsb_release, and chromeos_version.sh. See
    # bug chromium-os:14649
    chromeos_official=False,

    # Use binary packages for building the toolchain. (emerge --getbinpkg)
    usepkg_toolchain=True,

    # Use binary packages for build_packages and setup_board.
    usepkg_build_packages=True,

    # If set, run BuildPackages in the background and allow subsequent
    # stages to run in parallel with this one.
    #
    # For each release group, the first builder should be set to run in the
    # foreground (to build binary packages), and the remainder of the
    # builders should be set to run in parallel (to install the binary
    # packages.)
    build_packages_in_background=False,

    # Only use binaries in build_packages for Chrome itself.
    chrome_binhost_only=False,

    # Does this profile need to sync chrome?  If None, we guess based on
    # other factors.  If True/False, we always do that.
    sync_chrome=None,

    # Use the newest ebuilds for all the toolchain packages.
    latest_toolchain=False,

    # This is only valid when latest_toolchain is True. If you set this to a
    # commit-ish, the gcc ebuild will use it to build the toolchain
    # compiler.
    gcc_githash=None,

    # Wipe and replace the board inside the chroot.
    board_replace=False,

    # Wipe and replace chroot, but not source.
    chroot_replace=False,

    # Uprevs the local ebuilds to build new changes since last stable.
    # build.  If master then also pushes these changes on success. Note that
    # we uprev on just about every bot config because it gives us a more
    # deterministic build system (the tradeoff being that some bots build
    # from source more frequently than if they never did an uprev). This way
    # the release/factory/etc... builders will pick up changes that devs
    # pushed before it runs, but after the correspoding PFQ bot ran (which
    # is what creates+uploads binpkgs).  The incremental bots are about the
    # only ones that don't uprev because they mimic the flow a developer
    # goes through on their own local systems.
    uprev=True,

    # Select what overlays to look at for revving and prebuilts. This can be
    # any constants.VALID_OVERLAYS.
    overlays=constants.PUBLIC_OVERLAYS,

    # Select what overlays to push at. This should be a subset of overlays
    # for the particular builder.  Must be None if not a master.  There
    # should only be one master bot pushing changes to each overlay per
    # branch.
    push_overlays=None,

    # Uprev Chrome, values of 'tot', 'stable_release', or None.
    chrome_rev=None,

    # Exit the builder right after checking compilation.
    # TODO(mtennant): Should be something like "compile_check_only".
    compilecheck=False,

    # Test CLs to verify they're ready for the commit queue.
    pre_cq=False,

    # Runs the tests that the signer would run. This should only be set if
    # 'recovery' is in images.
    signer_tests=False,

    # Runs unittests for packages.
    unittests=True,

    # If unittests is true, only run the unit tests for packages which have
    # changed since the previous build.
    quick_unit=False,

    # A list of the packages to blacklist from unittests.
    unittest_blacklist=[],

    # Builds autotest tests.  Must be True if vm_tests is set.
    build_tests=True,

    # Generates AFDO data. Will capture a profile of chrome using a hwtest
    # to run a predetermined set of benchmarks.
    afdo_generate=False,

    # Generates AFDO data, builds the minimum amount of artifacts and
    # assumes a non-distributed builder (i.e.: the whole process in a single
    # builder).
    afdo_generate_min=False,

    # Update the Chrome ebuild with the AFDO profile info.
    afdo_update_ebuild=False,

    # Uses AFDO data. The Chrome build will be optimized using the AFDO
    # profile information found in the chrome ebuild file.
    afdo_use=False,

    # A list of vm tests to run.
    vm_tests=[constants.SMOKE_SUITE_TEST_TYPE,
              constants.SIMPLE_AU_TEST_TYPE],

    # The number of times to run the VMTest stage. If this is >1, then we
    # will run the stage this many times, stopping if we encounter any
    # failures.
    vm_test_runs=1,

    # A list of HWTestConfig objects to run.
    hw_tests=[],

    # If true, uploads artifacts for hw testing. Upload payloads for test
    # image if the image is built. If not, dev image is used and then base
    # image.
    upload_hw_test_artifacts=True,

    # If true, uploads individual image tarballs.
    upload_standalone_images=True,

    # Google Storage path to offload files to.
    #   None - No upload
    #   GS_PATH_DEFAULT - 'gs://chromeos-image-archive/' + bot_id
    #   value - Upload to explicit path
    gs_path=config_lib.GS_PATH_DEFAULT,

    # TODO(sosa): Deprecate binary.
    # Type of builder.  Check constants.VALID_BUILD_TYPES.
    build_type=constants.PFQ_TYPE,

    # The class name used to build this config.  See the modules in
    # cbuildbot / builders/*_builders.py for possible values.  This should
    # be the name in string form -- e.g. "simple_builders.SimpleBuilder" to
    # get the SimpleBuilder class in the simple_builders module.  If not
    # specified, we'll fallback to legacy probing behavior until everyone
    # has been converted (see the scripts/cbuildbot.py file for details).
    builder_class_name=None,

    # Whether the tests for the board we are building can be run on the
    # builder. Normally, we wouldn't be able to run unit and VM tests form
    # non-x86 boards.
    tests_supported=True,

    # List of images we want to build -- see build_image for more details.
    images=['test'],

    # Image from which we will build update payloads.  Must either be None
    # or name one of the images in the 'images' list, above.
    payload_image=None,

    # Whether to build a netboot image.
    factory_install_netboot=True,

    # Whether to build the factory toolkit.
    factory_toolkit=True,

    # Whether to build factory packages in BuildPackages.
    factory=True,

    # Tuple of specific packages we want to build.  Most configs won't
    # specify anything here and instead let build_packages calculate.
    packages=[],

    # Do we push a final release image to chromeos-images.
    push_image=False,

    # Do we upload debug symbols.
    upload_symbols=False,

    # Whether we upload a hwqual tarball.
    hwqual=False,

    # Run a stage that generates release payloads for signed images.
    paygen=False,

    # If the paygen stage runs, generate tests, and schedule auto-tests for
    # them.
    paygen_skip_testing=False,

    # If the paygen stage runs, don't generate any delta payloads. This is
    # only done if deltas are broken for a given board.
    paygen_skip_delta_payloads=False,

    # Run a stage that generates and uploads package CPE information.
    cpe_export=True,

    # Run a stage that generates and uploads debug symbols.
    debug_symbols=True,

    # Do not package the debug symbols in the binary package. The debug
    # symbols will be in an archive with the name cpv.debug.tbz2 in
    # /build/${BOARD}/packages and uploaded with the prebuilt.
    separate_debug_symbols=True,

    # Include *.debug files for debugging core files with gdb in debug.tgz.
    # These are very large. This option only has an effect if debug_symbols
    # and archive are set.
    archive_build_debug=False,

    # Run a stage that archives build and test artifacts for developer
    # consumption.
    archive=True,

    # git repository URL for our manifests.
    #  https://chromium.googlesource.com/chromiumos/manifest
    #  https://chrome-internal.googlesource.com/chromeos/manifest-internal
    manifest_repo_url=constants.MANIFEST_URL,

    # Whether we are using the manifest_version repo that stores per-build
    # manifests.
    manifest_version=False,

    # Use the Last Known Good Manifest blessed by Paladin.
    use_lkgm=False,

    # If we use_lkgm -- What is the name of the manifest to look for?
    lkgm_manifest=constants.LKGM_MANIFEST,

    # LKGM for Chrome OS generated for Chrome builds that are blessed from
    # canary runs.
    use_chrome_lkgm=False,

    # True if this build config is critical for the chrome_lkgm decision.
    critical_for_chrome=False,

    # Upload prebuilts for this build. Valid values are PUBLIC, PRIVATE, or
    # False.
    prebuilts=False,

    # Use SDK as opposed to building the chroot from source.
    use_sdk=True,

    # List this config when user runs cbuildbot with --list option without
    # the --all flag.
    trybot_list=False,

    # The description string to print out for config when user runs --list.
    description=None,

    # Boolean that enables parameter --git-sync for upload_prebuilts.
    git_sync=False,

    # A list of the child config groups, if applicable. See the AddGroup
    # method.
    child_configs=[],

    # Set shared user password for "chronos" user in built images. Use
    # "None" (default) to remove the shared user password. Note that test
    # images will always set the password to "test0000".
    shared_user_password=None,

    # Whether this config belongs to a config group.
    grouped=False,

    # layout of build_image resulting image. See
    # scripts/build_library/legacy_disk_layout.json or
    # overlay-<board>/scripts/disk_layout.json for possible values.
    disk_layout=None,

    # If enabled, run the PatchChanges stage.  Enabled by default. Can be
    # overridden by the --nopatch flag.
    postsync_patch=True,

    # Reexec into the buildroot after syncing.  Enabled by default.
    postsync_reexec=True,

    # Create delta sysroot during ArchiveStage. Disabled by default.
    create_delta_sysroot=False,

    # Run the binhost_test stage. Only makes sense for builders that have no
    # boards.
    binhost_test=False,

    # TODO(sosa): Collapse to one option.
    # ========== Dev installer prebuilts options =======================

    # Upload prebuilts for this build to this bucket. If it equals None the
    # default buckets are used.
    binhost_bucket=None,

    # Parameter --key for upload_prebuilts. If it equals None, the default
    # values are used, which depend on the build type.
    binhost_key=None,

    # Parameter --binhost-base-url for upload_prebuilts. If it equals None,
    # the default value is used.
    binhost_base_url=None,

    # Upload dev installer prebuilts.
    dev_installer_prebuilts=False,

    # Enable rootfs verification on the image.
    rootfs_verification=True,

    # Build the Chrome SDK.
    chrome_sdk=False,

    # If chrome_sdk is set to True, this determines whether we attempt to
    # build Chrome itself with the generated SDK.
    chrome_sdk_build_chrome=True,

    # If chrome_sdk is set to True, this determines whether we use goma to
    # build chrome.
    chrome_sdk_goma=False,

    # Run image tests. This should only be set if 'base' is in our list of
    # images.
    image_test=False,

    # ==================================================================
    # The documentation associated with the config.
    doc=None,

    # ==================================================================
    # Hints to Buildbot master UI

    # If set, tells buildbot what name to give to the corresponding builder
    # on its waterfall.
    buildbot_waterfall_name=None,

    # If not None, the name (in constants.CIDB_KNOWN_WATERFALLS) of the
    # waterfall that this target should be active on.
    active_waterfall=None,
)


# Set to 'True' if this is a release branch.
IS_RELEASE_BRANCH = False


_CONFIG = config_lib.SiteConfig(defaults=_settings)

def GetConfig():
  """Get the full build configuration."""
  return _CONFIG


def OverrideConfigForTrybot(build_config, options):
  """Apply trybot-specific configuration settings.

  Args:
    build_config: The build configuration dictionary to override.
      The dictionary is not modified.
    options: The options passed on the commandline.

  Returns:
    A build configuration dictionary with the overrides applied.
  """
  copy_config = copy.deepcopy(build_config)
  for my_config in [copy_config] + copy_config['child_configs']:
    # For all builds except PROJECT_SDK, force uprev. This is so patched in
    # changes are always built. PROEJCT_SDK_TYPE uses a minilayout, and uprev
    # doesn't work for minilayout (crbug.com/458661).
    if my_config['build_type'] != constants.PROJECT_SDK_TYPE:
      my_config['uprev'] = True
      if my_config['internal']:
        my_config['overlays'] = constants.BOTH_OVERLAYS

    # Most users don't have access to the internal repositories so disable
    # them so that we use the external chromium prebuilts.
    useflags = my_config['useflags']
    if not options.remote_trybot and useflags:
      for chrome_use in official_chrome['useflags']:
        if chrome_use in useflags:
          useflags.remove(chrome_use)

    # Use the local manifest which only requires elevated access if it's really
    # needed to build.
    if not options.remote_trybot:
      my_config['manifest'] = my_config['dev_manifest']

    my_config['push_image'] = False

    if my_config['build_type'] != constants.PAYLOADS_TYPE:
      my_config['paygen'] = False

    if options.hwtest:
      if not my_config['hw_tests']:
        my_config['hw_tests'] = HWTestList.DefaultList(
            num=constants.HWTEST_TRYBOT_NUM, pool=constants.HWTEST_TRYBOT_POOL,
            file_bugs=False)
      else:
        for hw_config in my_config['hw_tests']:
          hw_config.num = constants.HWTEST_TRYBOT_NUM
          hw_config.pool = constants.HWTEST_TRYBOT_POOL
          hw_config.file_bugs = False
          hw_config.priority = constants.HWTEST_DEFAULT_PRIORITY
      # TODO: Fix full_release_test.py/AUTest on trybots, crbug.com/390828.
      my_config['hw_tests'] = [hw_config for hw_config in my_config['hw_tests']
                               if hw_config.suite != constants.HWTEST_AU_SUITE]

    # Default to starting with a fresh chroot on remote trybot runs.
    if options.remote_trybot:
      my_config['chroot_replace'] = True

    # In trybots, we want to always run VM tests and all unit tests, so that
    # developers will get better testing for their changes.
    if (my_config['build_type'] == constants.PALADIN_TYPE and
        my_config['tests_supported'] and
        all(x not in _arm_boards for x in my_config['boards']) and
        all(x not in _brillo_boards for x in my_config['boards'])):
      my_config['vm_tests'] = [constants.SMOKE_SUITE_TEST_TYPE,
                               constants.SIMPLE_AU_TEST_TYPE,
                               constants.CROS_VM_TEST_TYPE]
      my_config['quick_unit'] = False

  return copy_config


def GetDefaultWaterfall(build_config):
  if not (build_config['important'] or build_config['master']):
    return None
  if build_config['branch']:
    return None
  b_type = build_config['build_type']

  if config_lib.IsCanaryType(b_type):
    # If this is a canary build, it may fall on different waterfalls:
    # - If we're building for a release branch, it belongs on a release
    #   waterfall.
    # - Otherwise, it belongs on the internal waterfall.
    if IS_RELEASE_BRANCH:
      return constants.WATERFALL_RELEASE
    else:
      return constants.WATERFALL_INTERNAL
  elif config_lib.IsCQType(b_type):
    # A Paladin can appear on the public or internal waterfall depending on its
    # 'internal' status.
    return (constants.WATERFALL_INTERNAL if build_config['internal'] else
            constants.WATERFALL_EXTERNAL)
  elif config_lib.IsPFQType(b_type) or b_type == constants.PRE_CQ_LAUNCHER_TYPE:
    # These builder types belong on the internal waterfall.
    return constants.WATERFALL_INTERNAL
  else:
    # No default active waterfall.
    return None


class HWTestList(object):
  """Container for methods to generate HWTest lists."""

  @classmethod
  def DefaultList(cls, **kwargs):
    """Returns a default list of HWTestConfig's for a build

    Args:
      *kwargs: overrides for the configs
    """
    # Number of tests running in parallel in the AU suite.
    AU_TESTS_NUM = 2
    # Number of tests running in parallel in the asynchronous canary
    # test suite
    ASYNC_TEST_NUM = 2

    # Set the number of machines for the au and qav suites. If we are
    # constrained in the number of duts in the lab, only give 1 dut to each.
    if (kwargs.get('num', constants.HWTEST_DEFAULT_NUM) >=
        constants.HWTEST_DEFAULT_NUM):
      au_dict = dict(num=AU_TESTS_NUM)
      async_dict = dict(num=ASYNC_TEST_NUM)
    else:
      au_dict = dict(num=1)
      async_dict = dict(num=1)

    au_kwargs = kwargs.copy()
    au_kwargs.update(au_dict)

    async_kwargs = kwargs.copy()
    async_kwargs.update(async_dict)
    async_kwargs['priority'] = constants.HWTEST_POST_BUILD_PRIORITY
    async_kwargs['retry'] = False
    async_kwargs['max_retries'] = None
    async_kwargs['async'] = True
    async_kwargs['suite_min_duts'] = 1

    # BVT + AU suite.
    return [config_lib.HWTestConfig(constants.HWTEST_BVT_SUITE,
                                    blocking=True, **kwargs),
            config_lib.HWTestConfig(constants.HWTEST_AU_SUITE,
                                    blocking=True, **au_kwargs),
            config_lib.HWTestConfig(constants.HWTEST_COMMIT_SUITE,
                                    **async_kwargs),
            config_lib.HWTestConfig(constants.HWTEST_CANARY_SUITE,
                                    **async_kwargs)]

  @classmethod
  def DefaultListCanary(cls, **kwargs):
    """Returns a default list of config_lib.HWTestConfig's for a canary build.

    Args:
      *kwargs: overrides for the configs
    """
    # Set minimum_duts default to 4, which means that lab will check the
    # number of available duts to meet the minimum requirement before creating
    # the suite job for canary builds.
    kwargs.setdefault('minimum_duts', 4)
    kwargs.setdefault('file_bugs', True)
    return HWTestList.DefaultList(**kwargs)

  @classmethod
  def AFDOList(cls, **kwargs):
    """Returns a default list of HWTestConfig's for a AFDO build.

    Args:
      *kwargs: overrides for the configs
    """
    afdo_dict = dict(pool=constants.HWTEST_SUITES_POOL,
                     timeout=120 * 60, num=1, async=True, retry=False,
                     max_retries=None)
    afdo_dict.update(kwargs)
    return [config_lib.HWTestConfig('perf_v2', **afdo_dict)]

  @classmethod
  def DefaultListNonCanary(cls, **kwargs):
    """Return a default list of HWTestConfig's for a non-canary build.

    Optional arguments may be overridden in `kwargs`, except that
    the `blocking` setting cannot be provided.
    """
    return [config_lib.HWTestConfig(constants.HWTEST_BVT_SUITE, **kwargs),
            config_lib.HWTestConfig(constants.HWTEST_COMMIT_SUITE, **kwargs)]

  @classmethod
  def DefaultListCQ(cls, **kwargs):
    """Return a default list of HWTestConfig's for a CQ build.

    Optional arguments may be overridden in `kwargs`, except that
    the `blocking` setting cannot be provided.
    """
    default_dict = dict(pool=constants.HWTEST_PALADIN_POOL, timeout=120 * 60,
                        file_bugs=False, priority=constants.HWTEST_CQ_PRIORITY,
                        minimum_duts=4)
    # Allows kwargs overrides to default_dict for cq.
    default_dict.update(kwargs)
    return HWTestList.DefaultListNonCanary(**default_dict)

  @classmethod
  def DefaultListPFQ(cls, **kwargs):
    """Return a default list of HWTestConfig's for a PFQ build.

    Optional arguments may be overridden in `kwargs`, except that
    the `blocking` setting cannot be provided.
    """
    default_dict = dict(pool=constants.HWTEST_PFQ_POOL, file_bugs=True,
                        priority=constants.HWTEST_PFQ_PRIORITY,
                        retry=False, max_retries=None, minimum_duts=4)
    # Allows kwargs overrides to default_dict for pfq.
    default_dict.update(kwargs)
    return HWTestList.DefaultListNonCanary(**default_dict)

  @classmethod
  def SharedPoolPFQ(cls, **kwargs):
    """Return a list of HWTestConfigs for PFQ which uses a shared pool.

    The returned suites will run in pool:critical by default, which is
    shared with other types of builders (canaries, cq). The first suite in the
    list is a blocking sanity suite that verifies the build will not break dut.
    """
    sanity_dict = dict(pool=constants.HWTEST_MACH_POOL,
                       file_bugs=True, priority=constants.HWTEST_PFQ_PRIORITY,
                       retry=False, max_retries=None)
    sanity_dict.update(kwargs)
    sanity_dict.update(dict(num=1, minimum_duts=1, suite_min_duts=1,
                            blocking=True))
    default_dict = dict(pool=constants.HWTEST_MACH_POOL,
                        suite_min_duts=3)
    default_dict.update(kwargs)
    suite_list = [config_lib.HWTestConfig(constants.HWTEST_SANITY_SUITE,
                                          **sanity_dict)]
    suite_list.extend(HWTestList.DefaultListPFQ(**default_dict))
    return suite_list

  @classmethod
  def SharedPoolCQ(cls, **kwargs):
    """Return a list of HWTestConfigs for CQ which uses a shared pool.

    The returned suites will run in pool:critical by default, which is
    shared with other types of builder (canaries, pfq). The first suite in the
    list is a blocking sanity suite that verifies the build will not break dut.
    """
    sanity_dict = dict(pool=constants.HWTEST_MACH_POOL, timeout=120 * 60,
                       file_bugs=False, priority=constants.HWTEST_CQ_PRIORITY)
    sanity_dict.update(kwargs)
    sanity_dict.update(dict(num=1, minimum_duts=1, suite_min_duts=1,
                            blocking=True))
    default_dict = dict(pool=constants.HWTEST_MACH_POOL,
                        suite_min_duts=10)
    default_dict.update(kwargs)
    suite_list = [config_lib.HWTestConfig(constants.HWTEST_SANITY_SUITE,
                                          **sanity_dict)]
    suite_list.extend(HWTestList.DefaultListCQ(**default_dict))
    return suite_list

  @classmethod
  def SharedPoolCanary(cls, **kwargs):
    """Return a list of HWTestConfigs for Canary which uses a shared pool.

    The returned suites will run in pool:critical by default, which is
    shared with CQs. The first suite in the list is a blocking sanity suite
    that verifies the build will not break dut.
    """
    sanity_dict = dict(pool=constants.HWTEST_MACH_POOL, file_bugs=True)
    sanity_dict.update(kwargs)
    sanity_dict.update(dict(num=1, minimum_duts=1, suite_min_duts=1,
                            blocking=True))
    default_dict = dict(pool=constants.HWTEST_MACH_POOL,
                        suite_min_duts=6)
    default_dict.update(kwargs)
    suite_list = [config_lib.HWTestConfig(constants.HWTEST_SANITY_SUITE,
                                          **sanity_dict)]
    suite_list.extend(HWTestList.DefaultListCanary(**default_dict))
    return suite_list

  @classmethod
  def AFDORecordTest(cls, **kwargs):
    default_dict = dict(pool=constants.HWTEST_SUITES_POOL,
                        warn_only=True, num=1, file_bugs=True,
                        timeout=constants.AFDO_GENERATE_TIMEOUT)
    # Allows kwargs overrides to default_dict for cq.
    default_dict.update(kwargs)
    return config_lib.HWTestConfig(constants.HWTEST_AFDO_SUITE, **default_dict)


def append_useflags(useflags):
  """Used to append a set of useflags to existing useflags.

  Useflags that shadow prior use flags will cause the prior flag to be removed.
  (e.g. appending '-foo' to 'foo' will cause 'foo' to be removed)

  Usage:
    new_config = base_config.derive(useflags=append_useflags(['foo', '-bar'])

  Args:
    useflags: List of string useflags to append.
  """
  assert isinstance(useflags, (list, set))
  shadowed_useflags = {'-' + flag for flag in useflags
                       if not flag.startswith('-')}
  shadowed_useflags.update({flag[1:] for flag in useflags
                            if flag.startswith('-')})
  def handler(old_useflags):
    new_useflags = set(old_useflags or [])
    new_useflags.update(useflags)
    new_useflags.difference_update(shadowed_useflags)
    return sorted(list(new_useflags))

  return handler


# pylint: disable=bad-continuation


# Arch-specific mixins.

# Config parameters for builders that do not run tests on the builder. Anything
# non-x86 tests will fall under this category.
non_testable_builder = config_lib.BuildConfig(
  tests_supported=False,
  unittests=False,
  vm_tests=[],
)


# Builder-specific mixins

binary = config_lib.BuildConfig(
  # Full builds that build fully from binaries.
  build_type=constants.BUILD_FROM_SOURCE_TYPE,
  archive_build_debug=True,
  images=['test', 'factory_install'],
  git_sync=True,
)

full = config_lib.BuildConfig(
  # Full builds are test builds to show that we can build from scratch,
  # so use settings to build from scratch, and archive the results.

  usepkg_build_packages=False,
  chrome_sdk=True,
  chroot_replace=True,

  build_type=constants.BUILD_FROM_SOURCE_TYPE,
  archive_build_debug=True,
  images=['base', 'recovery', 'test', 'factory_install'],
  git_sync=True,
  trybot_list=True,
  description='Full Builds',
  image_test=True,
  doc='http://www.chromium.org/chromium-os/build/builder-overview#'
      'TOC-Continuous',
)

# Full builders with prebuilts.
full_prebuilts = full.derive(
  prebuilts=constants.PUBLIC,
)

pfq = config_lib.BuildConfig(
  build_type=constants.PFQ_TYPE,
  important=True,
  uprev=True,
  overlays=constants.PUBLIC_OVERLAYS,
  manifest_version=True,
  trybot_list=True,
  doc='http://www.chromium.org/chromium-os/build/builder-overview#'
      'TOC-Chrome-PFQ',
)

paladin = config_lib.BuildConfig(
  important=True,
  build_type=constants.PALADIN_TYPE,
  overlays=constants.PUBLIC_OVERLAYS,
  prebuilts=constants.PUBLIC,
  manifest_version=True,
  trybot_list=True,
  description='Commit Queue',
  upload_standalone_images=False,
  images=['base', 'test'],
  image_test=True,
  chrome_sdk=True,
  chrome_sdk_build_chrome=False,
  doc='http://www.chromium.org/chromium-os/build/builder-overview#TOC-CQ',
)

# Incremental builders are intended to test the developer workflow.
# For that reason, they don't uprev.
incremental = config_lib.BuildConfig(
  build_type=constants.INCREMENTAL_TYPE,
  uprev=False,
  overlays=constants.PUBLIC_OVERLAYS,
  description='Incremental Builds',
  doc='http://www.chromium.org/chromium-os/build/builder-overview#'
      'TOC-Continuous',
)

# This builds with more source available.
internal = config_lib.BuildConfig(
  internal=True,
  overlays=constants.BOTH_OVERLAYS,
  manifest_repo_url=constants.MANIFEST_INT_URL,
)

brillo = config_lib.BuildConfig(
  sync_chrome=False,
  chrome_sdk=False,
  afdo_use=False,
  dev_installer_prebuilts=False,
  # TODO(gauravsh): crbug.com/356414 Start running tests on Brillo configs.
  vm_tests=[],
  hw_tests=[],
)

moblab = config_lib.BuildConfig(
  vm_tests=[],
)

# Builds for the Project SDK.
project_sdk = config_lib.BuildConfig(
  build_type=constants.PROJECT_SDK_TYPE,
  description='Produce Project SDK build artifacts.',

  # These are test builds, they shouldn't break anything (yet).
  important=False,

  usepkg_build_packages=False,
  sync_chrome=False,
  chrome_sdk=False,
  uprev=False,

  # Proper manifest for TOT builds. Not used, outside of tryjobs.
  manifest=constants.PROJECT_MANIFEST,

  # Use the SDK manifest published by the Canary master for most builds.
  lkgm_manifest=constants.LATEST_PROJECT_SDK_MANIFEST,
  use_lkgm=True,

  # Tests probably don't work yet.
  vm_tests=[],
  hw_tests=[],

  # Factory stuff not needed here.
  factory_install_netboot=False,
  factory_toolkit=False,
  factory=False,
)

_project_sdk_boards = frozenset([
    'panther_embedded',
    'gizmo',
])

beaglebone = brillo.derive(non_testable_builder, rootfs_verification=False)

# This adds Chrome branding.
official_chrome = config_lib.BuildConfig(
  useflags=[constants.USE_CHROME_INTERNAL],
)

# This sets chromeos_official.
official = official_chrome.derive(
  chromeos_official=True,
)

_cros_sdk = _CONFIG.AddConfig(full_prebuilts, 'chromiumos-sdk',
  # The amd64-host has to be last as that is when the toolchains
  # are bundled up for inclusion in the sdk.
  boards=['x86-generic', 'arm-generic', 'amd64-generic', 'mipsel-o32-generic'],
  build_type=constants.CHROOT_BUILDER_TYPE,
  builder_class_name='sdk_builders.ChrootSdkBuilder',
  use_sdk=False,
  trybot_list=True,
  description='Build the SDK and all the cross-compilers',
  doc='http://www.chromium.org/chromium-os/build/builder-overview#'
      'TOC-Continuous',
)

asan = config_lib.BuildConfig(
  chroot_replace=True,
  profile='asan',
  disk_layout='2gb-rootfs',
  # TODO(deymo): ASan builders generate bigger files, in particular a bigger
  # Chrome binary, that update_engine can't handle in delta payloads due to
  # memory limits. Remove the following line once crbug.com/329248 is fixed.
  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE],
  doc='http://www.chromium.org/chromium-os/build/builder-overview#'
      'TOC-ChromiumOS-SDK',
)

telemetry = config_lib.BuildConfig(
  build_type=constants.INCREMENTAL_TYPE,
  uprev=False,
  overlays=constants.PUBLIC_OVERLAYS,
  vm_tests=[constants.TELEMETRY_SUITE_TEST_TYPE],
  description='Telemetry Builds',
)

chromium_pfq = config_lib.BuildConfig(
  build_type=constants.CHROME_PFQ_TYPE,
  important=True,
  uprev=False,
  overlays=constants.PUBLIC_OVERLAYS,
  manifest_version=True,
  chrome_rev=constants.CHROME_REV_LATEST,
  chrome_sdk=True,
  chroot_replace=True,
  description='Preflight Chromium Uprev & Build (public)',
)

# TODO(davidjames): Convert this to an external config once the unified master
# logic is ready.
internal_chromium_pfq = internal.derive(
  chromium_pfq,
  description='Preflight Chromium Uprev & Build (internal)',
  overlays=constants.BOTH_OVERLAYS,
  prebuilts=constants.PUBLIC,
)

_CONFIG.AddConfig(internal_chromium_pfq, 'master-chromium-pfq',
  boards=[],
  master=True,
  binhost_test=True,
  push_overlays=constants.BOTH_OVERLAYS,
  afdo_update_ebuild=True,
  chrome_sdk=False,
)

chrome_pfq = internal_chromium_pfq.derive(
  official,
  important=True,
  overlays=constants.BOTH_OVERLAYS,
  description='Preflight Chrome Uprev & Build (internal)',
  prebuilts=constants.PRIVATE,
)

chrome_try = config_lib.BuildConfig(
  build_type=constants.CHROME_PFQ_TYPE,
  chrome_rev=constants.CHROME_REV_TOT,
  use_lkgm=True,
  important=False,
  manifest_version=False,
)

chromium_info = chromium_pfq.derive(
  chrome_try,
  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE],
  chrome_sdk=False,
  description='Informational Chromium Uprev & Build (public)',
)

telemetry_info = telemetry.derive(
  chrome_try,
)

chrome_info = chromium_info.derive(
  internal, official,
  description='Informational Chrome Uprev & Build (internal)',
)

chrome_perf = chrome_info.derive(
  description='Chrome Performance test bot',
  vm_tests=[],
  unittests=False,
  hw_tests=[config_lib.HWTestConfig(
      'perf_v2', pool=constants.HWTEST_CHROME_PERF_POOL,
      timeout=90 * 60, critical=True, num=1)],
  use_chrome_lkgm=True,
  use_lkgm=False,
  useflags=append_useflags(['-cros-debug']),
)

# Base per-board configuration.
# Every board must appear in exactly 1 of the following sets.

_arm_internal_release_boards = frozenset([
  'beaglebone',
  'beaglebone_servo',
  'cosmos',
  'daisy',
  'daisy_freon',
  'daisy_skate',
  'daisy_skate-freon',
  'daisy_spring',
  'daisy_spring-freon',
  'daisy_winter',
  'kayle',
  'nyan',
  'nyan_big',
  'nyan_blaze',
  'nyan_freon',
  'nyan_kitty',
  'oak',
  'peach_pi',
  'peach_pi-freon',
  'peach_pit',
  'peach_pit-freon',
  'purin',
  'smaug',
  'storm',
  'rush',
  'rush_ryu',
  'veyron_brain',
  'veyron_danger',
  'veyron_gus',
  'veyron_jaq',
  'veyron_jerry',
  'veyron_mickey',
  'veyron_mighty',
  'veyron_minnie',
  'veyron_pinky',
  'veyron_rialto',
  'veyron_romy',
  'veyron_speedy',
  'veyron_thea',
  'whirlwind',
])

_arm_external_boards = frozenset([
  'arm-generic',
  'arm-generic_freon',
  'arm64-generic',
])

_x86_internal_release_boards = frozenset([
  'auron',
  'auron_paine',
  'auron_yuna',
  'bayleybay',
  'banjo',
  'beltino',
  'bobcat',
  'butterfly',
  'butterfly_freon',
  'candy',
  'cid',
  'clapper',
  'cranky',
  'cyan',
  'enguarde',
  'expresso',
  'falco',
  'falco_li',
  'gandof',
  'glimmer',
  'gnawty',
  'guado',
  'jecht',
  'kip',
  'lakitu',
  'leon',
  'link',
  'lulu',
  'lumpy',
  'lumpy_freon',
  'mccloud',
  'monroe',
  'ninja',
  'orco',
  'panther',
  'panther_embedded',
  'panther_moblab',
  'parrot',
  'parrot_freon',
  'parrot_ivb',
  'parry',
  'peppy',
  'quawks',
  'quawks_freon',
  'rambi',
  'rikku',
  'samus',
  'slippy',
  'squawks',
  'stout',
  'stout_freon',
  'strago',
  'stumpy',
  'stumpy_freon',
  'stumpy_moblab',
  'sumo',
  'swanky',
  'tidus',
  'tricky',
  'winky',
  'wolf',
  'x86-alex',
  'x86-alex_freon',
  'x86-alex_he',
  'x86-alex_he-freon',
  'x86-mario',
  'x86-mario_freon',
  'x86-zgb',
  'x86-zgb_freon',
  'x86-zgb_he',
  'x86-zgb_he-freon',
  'zako',
])

_x86_external_boards = frozenset([
  'amd64-generic',
  'amd64-generic_freon',
  'gizmo',
  'x32-generic',
  'x86-generic',
])

_mips_internal_release_boards = frozenset([
])

_mips_external_boards = frozenset([
  'mipseb-n32-generic',
  'mipseb-n64-generic',
  'mipseb-o32-generic',
  'mipsel-n32-generic',
  'mipsel-n64-generic',
  'mipsel-o32-generic',
])

# Every board should be in only 1 of the above sets.
_distinct_board_sets = [
    _arm_internal_release_boards,
    _arm_external_boards,
    _x86_internal_release_boards,
    _x86_external_boards,
    _mips_internal_release_boards,
    _mips_external_boards,
]

_arm_full_boards = (_arm_internal_release_boards |
                    _arm_external_boards)
_x86_full_boards = (_x86_internal_release_boards |
                    _x86_external_boards)
_mips_full_boards = (_mips_internal_release_boards |
                     _mips_external_boards)

_arm_boards = _arm_full_boards
_x86_boards = _x86_full_boards
_mips_boards = _mips_full_boards

_all_release_boards = (
    _arm_internal_release_boards |
    _x86_internal_release_boards |
    _mips_internal_release_boards
)
_all_full_boards = (
    _arm_full_boards |
    _x86_full_boards |
    _mips_full_boards
)
_all_boards = (
    _x86_boards |
    _arm_boards |
    _mips_boards
)

# Every board should be in exactly one of the distinct board sets.
def _EnforceDistinctSets():
  for board in _all_boards:
    found = False
    for s in _distinct_board_sets:
      if board in s:
        if found:
          assert False, '%s in multiple board sets.' % board
        else:
          found = True
    if not found:
      assert False, '%s in no board sets' % board
  for s in _distinct_board_sets:
    for board in s - _all_boards:
      assert False, '%s in _distinct_board_sets but not in _all_boards' % board

_EnforceDistinctSets()

_arm_release_boards = _arm_internal_release_boards
_x86_release_boards = _x86_internal_release_boards
_mips_release_boards = _mips_internal_release_boards

_internal_boards = _all_release_boards

# Board can appear in 1 or more of the following sets.
_brillo_boards = frozenset([
  'cosmos',
  'gizmo',
  'kayle',
  'lakitu',
  'panther_embedded',
  'purin',
  'storm',
  'whirlwind',
])

_moblab_boards = frozenset([
  'stumpy_moblab',
  'panther_moblab',
])

_minimal_profile_boards = frozenset([
  'bobcat',
])

_nofactory_boards = frozenset([
  'daisy_winter',
  'smaug',
])

_toolchains_from_source = frozenset([
  'mipseb-n32-generic',
  'mipseb-n64-generic',
  'mipseb-o32-generic',
  'mipsel-n32-generic',
  'mipsel-n64-generic',
  'x32-generic',
])

_noimagetest_boards = frozenset([
    'lakitu',
])

_nohwqual_boards = frozenset([
    'lakitu',
])

_norootfs_verification_boards = frozenset([
])

_base_layout_boards = frozenset([
    'lakitu',
])

_testable_boards = _x86_boards | frozenset((
    'storm',
    'whirlwind',
))

# TODO(akeshet): Temporary workaround to vmtest failing on strage-pre-cq, to
# allow already-screened changes to work through the pipeline.
_no_vmtest_boards = frozenset((
    'strago',
))

# A base config for each board.
_base_configs = dict()

def _CreateBaseConfigs():
  for board in _all_boards:
    base = config_lib.BuildConfig()
    if board in _internal_boards:
      base.update(internal)
      base.update(official_chrome)
      base.update(manifest=constants.OFFICIAL_MANIFEST)
    if board not in _testable_boards:
      base.update(non_testable_builder)
    if board in _brillo_boards:
      base.update(brillo)
    if board in _moblab_boards:
      base.update(moblab)
    if board in _minimal_profile_boards:
      base.update(profile='minimal')
    if board in _nofactory_boards:
      base.update(factory=False)
      base.update(factory_toolkit=False)
      base.update(factory_install_netboot=False)
    if board in _toolchains_from_source:
      base.update(usepkg_toolchain=False)
    if board in _noimagetest_boards:
      base.update(image_test=False)
    if board in _nohwqual_boards:
      base.update(hwqual=False)
    if board in _norootfs_verification_boards:
      base.update(rootfs_verification=False)
    if board in _base_layout_boards:
      base.update(disk_layout='base')
    if board in _no_vmtest_boards:
      base.update(vm_tests=[])

    # TODO(akeshet) Eliminate or clean up this special case.
    # kayle board has a lot of kayle-specific config changes.
    if board == 'kayle':
      base.update(manifest='kayle.xml',
                  dev_manifest='kayle.xml',
                  factory_toolkit=False,
                  # TODO(namnguyen): Cannot build factory net install (no
                  # usbnet).
                  factory_install_netboot=False,
                  # TODO(namngyuyen) Cannot build dev or test images due to
                  # #436523.
                  images=['base'])

    board_config = base.derive(boards=[board])
    # Note: base configs should not specify a useflag list. Convert any useflags
    # that this base config has accrued (for instance, 'chrome_internal', via
    # official_chrome) into an append_useflags callable. This
    # is because the board base config is the last config to be derived from
    # when creating a board-specific config,
    if 'useflags' in board_config:
      board_config['useflags'] = append_useflags(board_config['useflags'])
    _base_configs[board] = board_config

_CreateBaseConfigs()

def _CreateConfigsForBoards(config_base, boards, name_suffix, **kwargs):
  """Create configs based on |config_base| for all boards in |boards|.

  Note: Existing configs will not be overwritten.

  Args:
    config_base: A BuildConfig instance to inherit from.
    boards: A set of boards to create configs for.
    name_suffix: A naming suffix. Configs will have names of the form
                 board-name_suffix.
    **kwargs: Additional keyword arguments to be used in AddConfig.
  """
  for board in boards:
    config_name = '%s-%s' % (board, name_suffix)
    if config_name not in _CONFIG:
      base = config_lib.BuildConfig()
      config = _CONFIG.AddConfig(config_base, config_name, base,
                                 _base_configs[board], **kwargs)
      if board in _nofactory_boards:
        try:
          config.get('images', []).remove('factory_install')
        except ValueError:
          pass


_chromium_pfq_important_boards = frozenset([
  'arm-generic_freon',
  'arm-generic',
  'daisy',
  'mipsel-o32-generic',
  'x86-generic',
  ])

def _AddFullConfigs():
  """Add x86 and arm full configs."""
  external_overrides = config_lib.BuildConfig.delete_keys(internal)
  external_overrides.update(manifest=config_lib.BuildConfig.delete_key())
  external_overrides.update(
    useflags=append_useflags(['-%s' % constants.USE_CHROME_INTERNAL]))
  _CreateConfigsForBoards(full_prebuilts, _all_full_boards,
                          config_lib.CONFIG_TYPE_FULL,
                          **external_overrides)
  _CreateConfigsForBoards(chromium_info, _all_full_boards,
                          'tot-chromium-pfq-informational', important=False,
                          **external_overrides)
  # Create important configs, then non-important configs.
  _CreateConfigsForBoards(internal_chromium_pfq, _chromium_pfq_important_boards,
                          'chromium-pfq', **external_overrides)
  _CreateConfigsForBoards(internal_chromium_pfq, _all_full_boards,
                          'chromium-pfq', important=False,
                          **external_overrides)

_AddFullConfigs()


# These remaining chromium pfq configs have eccentricities that are easier to
# create manually.

_CONFIG.AddConfig(internal_chromium_pfq, 'amd64-generic-chromium-pfq',
  _base_configs['amd64-generic'],
  disk_layout='2gb-rootfs',
)

_CONFIG.AddConfig(internal_chromium_pfq, 'amd64-generic_freon-chromium-pfq',
  _base_configs['amd64-generic_freon'],
  disk_layout='2gb-rootfs',
  vm_tests=[],
)

_chrome_pfq_important_boards = frozenset([
  'daisy_freon',
  'peppy',
  'rush_ryu',
  'veyron_pinky',
  'x86-alex_freon',
  ])


# TODO(akeshet): Replace this with a config named x86-alex-chrome-pfq.
_CONFIG.AddConfig(chrome_pfq, 'alex-chrome-pfq',
  _base_configs['x86-alex'],
)

_CONFIG.AddConfig(chrome_pfq, 'lumpy-chrome-pfq',
  _base_configs['lumpy'],
  afdo_generate=True,
  hw_tests=[HWTestList.AFDORecordTest()] + HWTestList.SharedPoolPFQ(),
)

_CONFIG.AddConfig(chrome_pfq, 'daisy_skate-chrome-pfq',
  _base_configs['daisy_skate'],
  hw_tests=HWTestList.SharedPoolPFQ(),
)

_CONFIG.AddConfig(chrome_pfq, 'falco-chrome-pfq',
  _base_configs['falco'],
  hw_tests=HWTestList.SharedPoolPFQ(),
)

_CONFIG.AddConfig(chrome_pfq, 'peach_pit-chrome-pfq',
  _base_configs['peach_pit'],
  hw_tests=HWTestList.SharedPoolPFQ(),
  important=False,
)

_CONFIG.AddConfig(chrome_pfq, 'tricky-chrome-pfq',
  _base_configs['tricky'],
  hw_tests=HWTestList.SharedPoolPFQ(),
  important=False,
)

_telemetry_boards = frozenset([
    'amd64-generic',
    'arm-generic',
    'x86-generic',
])

_CreateConfigsForBoards(telemetry, _telemetry_boards, 'telemetry')

_toolchain_major = _CONFIG.AddConfig(_cros_sdk, 'toolchain-major',
  latest_toolchain=True,
  prebuilts=False,
  trybot_list=False,
  gcc_githash='svn-mirror/google/main',
  description='Test next major toolchain revision',
)

_toolchain_minor = _CONFIG.AddConfig(_cros_sdk, 'toolchain-minor',
  latest_toolchain=True,
  prebuilts=False,
  trybot_list=False,
  gcc_githash='svn-mirror/google/gcc-4_9',
  description='Test next minor toolchain revision',
)

_CONFIG.AddConfig(incremental, 'x86-generic-asan',
  asan,
  boards=['x86-generic'],
  description='Build with Address Sanitizer (Clang)',
  trybot_list=True,
)

_CONFIG.AddConfig(chromium_info, 'x86-generic-tot-asan-informational',
  asan,
  boards=['x86-generic'],
  description='Full build with Address Sanitizer (Clang) on TOT',
)

_CONFIG.AddConfig(incremental, 'amd64-generic-asan',
  asan,
  boards=['amd64-generic'],
  description='Build with Address Sanitizer (Clang)',
  trybot_list=True,
)

_CONFIG.AddConfig(chromium_info, 'amd64-generic-tot-asan-informational',
  asan,
  boards=['amd64-generic'],
  description='Build with Address Sanitizer (Clang) on TOT',
)

incremental_beaglebone = incremental.derive(beaglebone)
_CONFIG.AddConfig(incremental_beaglebone, 'beaglebone-incremental',
  boards=['beaglebone'],
  trybot_list=True,
  description='Incremental Beaglebone Builder',
)

_CONFIG.AddRawConfig('refresh-packages',
  boards=['x86-generic', 'arm-generic'],
  builder_class_name='misc_builders.RefreshPackagesBuilder',
  description='Check upstream Gentoo for package updates',
)

_CONFIG.AddConfig(incremental, 'x86-generic-incremental',
  _base_configs['x86-generic'],
)

_CONFIG.AddConfig(incremental, 'daisy-incremental',
  _base_configs['daisy'],
  config_lib.BuildConfig.delete_keys(internal),
  manifest=config_lib.BuildConfig.delete_key(),
  useflags=append_useflags(['-chrome_internal']),
)

_CONFIG.AddConfig(incremental, 'amd64-generic-incremental',
  _base_configs['amd64-generic'],
  # This builder runs on a VM, so it can't run VM tests.
  vm_tests=[],
)

_CONFIG.AddConfig(incremental, 'x32-generic-incremental',
  _base_configs['x32-generic'],
  # This builder runs on a VM, so it can't run VM tests.
  vm_tests=[],
)

_CONFIG.AddConfig(paladin, 'x86-generic-asan-paladin',
  _base_configs['x86-generic'],
  asan,
  description='Paladin build with Address Sanitizer (Clang)',
  important=False,
)

_CONFIG.AddConfig(incremental, 'amd64-generic-asan-paladin',
  _base_configs['amd64-generic'],
  asan,
  description='Paladin build with Address Sanitizer (Clang)',
  important=False,
)

_chrome_perf_boards = frozenset([
  'daisy',
  'lumpy',
  'parrot',
])

_CreateConfigsForBoards(chrome_perf, _chrome_perf_boards, 'chrome-perf',
                        trybot_list=True)

chromium_info_x86 = \
_CONFIG.AddConfig(chromium_info, 'x86-generic-tot-chrome-pfq-informational',
  boards=['x86-generic'],
)

chromium_info_daisy = \
_CONFIG.AddConfig(chromium_info, 'daisy-tot-chrome-pfq-informational',
  non_testable_builder,
  boards=['daisy'],
)

chromium_info_amd64 = \
_CONFIG.AddConfig(chromium_info, 'amd64-generic-tot-chrome-pfq-informational',
  boards=['amd64-generic'],
)

_CONFIG.AddConfig(chromium_info, 'x32-generic-tot-chrome-pfq-informational',
  boards=['x32-generic'],
)

_CreateConfigsForBoards(telemetry_info, ['x86-generic', 'amd64-generic'],
                        'telem-chrome-pfq-informational')

_CONFIG.AddConfig(chrome_info, 'alex-tot-chrome-pfq-informational',
  boards=['x86-alex'],
)

_CONFIG.AddConfig(chrome_info, 'lumpy-tot-chrome-pfq-informational',
  boards=['lumpy'],
)


#
# Internal Builds
#

internal_pfq = internal.derive(official_chrome, pfq,
  overlays=constants.BOTH_OVERLAYS,
  prebuilts=constants.PRIVATE,
)

# Because branch directories may be shared amongst builders on multiple
# branches, they must delete the chroot every time they run.
# They also potentially need to build [new] Chrome.
internal_pfq_branch = internal_pfq.derive(
    branch=True,
    chroot_replace=True,
    trybot_list=False,
    sync_chrome=True,
    active_waterfall=constants.WATERFALL_RELEASE)

internal_paladin = internal.derive(official_chrome, paladin,
  manifest=constants.OFFICIAL_MANIFEST,
  overlays=constants.BOTH_OVERLAYS,
  prebuilts=constants.PRIVATE,
  vm_tests=[],
  description=paladin['description'] + ' (internal)',
)

# Used for paladin builders with nowithdebug flag (a.k.a -cros-debug)
internal_nowithdebug_paladin = internal_paladin.derive(
  useflags=append_useflags(['-cros-debug']),
  description=paladin['description'] + ' (internal, nowithdebug)',
  prebuilts=False,
)

_CreateConfigsForBoards(internal_nowithdebug_paladin,
  ['x86-generic', 'amd64-generic'],
  'nowithdebug-paladin',
  important=False,
)

_CONFIG.AddConfig(internal_nowithdebug_paladin,
                   'x86-mario-nowithdebug-paladin',
                   boards=['x86-mario'])

# Used for builders which build completely from source except Chrome.
full_compile_paladin = paladin.derive(
  board_replace=True,
  chrome_binhost_only=True,
  chrome_sdk=False,
  cpe_export=False,
  debug_symbols=False,
  prebuilts=False,
  unittests=False,
  upload_hw_test_artifacts=False,
  vm_tests=[],
)

_CreateConfigsForBoards(full_compile_paladin,
  ['falco', 'nyan'],
  'full-compile-paladin',
)

pre_cq = paladin.derive(
  build_type=constants.INCREMENTAL_TYPE,
  build_packages_in_background=True,
  pre_cq=True,
  archive=False,
  chrome_sdk=False,
  chroot_replace=True,
  debug_symbols=False,
  prebuilts=False,
  cpe_export=False,
  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE],
  description='Verifies compilation, building an image, and vm/unit tests '
              'if supported.',
  doc='http://www.chromium.org/chromium-os/build/builder-overview#TOC-Pre-CQ',
  health_alert_recipients=['chromeos-infra-eng@grotations.appspotmail.com'],
  health_threshold=3,
)

# Pre-CQ targets that only check compilation and unit tests.
unittest_only_pre_cq = pre_cq.derive(
  description='Verifies compilation and unit tests only',
  compilecheck=True,
  vm_tests=[],
)

# Pre-CQ targets that don't run VMTests.
no_vmtest_pre_cq = pre_cq.derive(
  description='Verifies compilation, building an image, and unit tests '
              'if supported.',
  vm_tests=[],
)

# Pre-CQ targets that only check compilation.
compile_only_pre_cq = unittest_only_pre_cq.derive(
  description='Verifies compilation only',
  unittests=False,
)

_CONFIG.AddConfig(internal_paladin, constants.BRANCH_UTIL_CONFIG,
  boards=[],
  # Disable postsync_patch to prevent conflicting patches from being applied -
  # e.g., patches from 'master' branch being applied to a branch.
  postsync_patch=False,
  # Disable postsync_reexec to continue running the 'master' branch chromite
  # for all stages, rather than the chromite in the branch buildroot.
  postsync_reexec=False,
  # Need to reset the paladin build_type we inherited.
  build_type=None,
  builder_class_name='release_builders.CreateBranchBuilder',
  description='Used for creating/deleting branches (TPMs only)',
)

# Internal incremental builders don't use official chrome because we want
# to test the developer workflow.
internal_incremental = internal.derive(
  incremental,
  overlays=constants.BOTH_OVERLAYS,
  description='Incremental Builds (internal)',
)

_CONFIG.AddConfig(internal_pfq_branch, 'lumpy-pre-flight-branch',
  master=True,
  push_overlays=constants.BOTH_OVERLAYS,
  boards=['lumpy'],
  afdo_generate=True,
  afdo_update_ebuild=True,
  hw_tests=[HWTestList.AFDORecordTest()],
)

# A test-ap image is just a test image with a special profile enabled.
# Note that each board enabled for test-ap use has to have the testbed-ap
# profile linked to from its private overlay.
_test_ap = internal.derive(
  description='WiFi AP images used in testing',
  profile='testbed-ap',
  vm_tests=[],
)

_CONFIG.AddGroup('test-ap-group',
  _CONFIG.AddConfig(_test_ap, 'stumpy-test-ap', boards=['stumpy']),
  _CONFIG.AddConfig(_test_ap, 'panther-test-ap', boards=['panther']),
)

### Master paladin (CQ builder).

_CONFIG.AddConfig(internal_paladin, 'master-paladin',
  boards=[],
  master=True,
  binhost_test=True,
  push_overlays=constants.BOTH_OVERLAYS,
  description='Commit Queue master (all others are slaves)',

  # This name should remain synced with with the name used in
  # build_internals/masters/master.chromeos/board_config.py.
  # TODO(mtennant): Fix this.  There should be some amount of auto-
  # configuration in the board_config.py code.
  health_threshold=3,
  health_alert_recipients=['chromeos-infra-eng@grotations.appspotmail.com',
                           'tree'],
  sanity_check_slaves=['wolf-tot-paladin'],
  trybot_list=False,
)

### Other paladins (CQ builders).
# These are slaves of the master paladin by virtue of matching
# in a few config values (e.g. 'build_type', 'branch', etc).  If
# they are not 'important' then they are ignored slaves.
# TODO(mtennant): This master-slave relationship should be specified
# here in the configuration, rather than GetSlavesForMaster().
# Something like the following:
# master_paladin = _CONFIG.AddConfig(internal_paladin, ...)
# master_paladin.AddSlave(_CONFIG.AddConfig(internal_paladin, ...))

# Old sanity check builder. This has been replaced by wolf-tot-paladin.
# TODO(dnj): Remove this once wolf-tot-paladin is removed from the waterfall.
_CONFIG.AddConfig(internal_paladin, 'link-tot-paladin',
  boards=['link'],
  do_not_apply_cq_patches=True,
  prebuilts=False,
  important=False,
)

# Sanity check builder, part of the CQ but builds without the patches
# under test.
_CONFIG.AddConfig(internal_paladin, 'wolf-tot-paladin',
  boards=['wolf'],
  do_not_apply_cq_patches=True,
  prebuilts=False,
  hw_tests=HWTestList.SharedPoolCQ(),
)

_paladin_boards = _all_boards

# List of paladin boards where the regular paladin config is important.
_paladin_important_boards = frozenset([
  'amd64-generic',
  'arm-generic',
  'auron',
  'beaglebone',
  'butterfly',
  'daisy',
  'daisy_skate',
  'daisy_spring',
  'falco',
  'gizmo',
  'kayle',
  'leon',
  'link',
  'lumpy',
  'mipsel-o32-generic',
  'monroe',
  'nyan',
  'oak',
  'panther',
  'panther_moblab',
  'parrot',
  'peach_pit',
  'peppy',
  'rambi',
  'rush_ryu',
  'samus',
  'storm',
  'stout',
  'stumpy',
  'stumpy_moblab',
  'veyron_pinky',
  'wolf',
  'x86-alex',
  'x86-generic',
  'x86-mario',
  'x86-zgb',
])

_paladin_simple_vmtest_boards = frozenset([
  'rambi',
  'x86-mario',
])

_paladin_devmode_vmtest_boards = frozenset([
  'parrot',
])

_paladin_cros_vmtest_boards = frozenset([
  'stout',
])

_paladin_smoke_vmtest_boards = frozenset([
  'amd64-generic',
  'x86-generic',
])

_paladin_default_vmtest_boards = frozenset([
  'x32-generic',
])

_paladin_hwtest_boards = frozenset([
  'daisy_skate',
  'link',
  'lumpy',
  'peach_pit',
  'peppy',
  'stumpy',
  'wolf',
  'x86-alex',
  'x86-zgb',
])

_paladin_moblab_hwtest_boards = frozenset([
  'stumpy_moblab',
])

_paladin_chroot_replace_boards = frozenset([
  'butterfly',
  'daisy_spring',
])

_paladin_separate_symbols = frozenset([
  'amd64-generic',
  'gizmo',
])

def _CreatePaladinConfigs():
  for board in _paladin_boards:
    assert board in _base_configs, '%s not in _base_configs' % board
    config_name = '%s-%s' % (board, constants.PALADIN_TYPE)
    customizations = config_lib.BuildConfig()
    base_config = _base_configs[board]
    if board in _paladin_hwtest_boards:
      customizations.update(hw_tests=HWTestList.DefaultListCQ())
    if board in _paladin_moblab_hwtest_boards:
      customizations.update(
          hw_tests=[config_lib.HWTestConfig(
                        constants.HWTEST_MOBLAB_QUICK_SUITE,
                        blocking=True, num=1, timeout=120*60,
                        pool=constants.HWTEST_PALADIN_POOL)])
    if board not in _paladin_important_boards:
      customizations.update(important=False)
    if board in _paladin_chroot_replace_boards:
      customizations.update(chroot_replace=True)
    if board in _internal_boards:
      customizations = customizations.derive(
          internal, official_chrome,
          manifest=constants.OFFICIAL_MANIFEST)
    if board in _paladin_separate_symbols:
      customizations.update(separate_debug_symbols=True)

    if board not in _paladin_default_vmtest_boards:
      vm_tests = []
      if board in _paladin_simple_vmtest_boards:
        vm_tests.append(constants.SIMPLE_AU_TEST_TYPE)
      if board in _paladin_cros_vmtest_boards:
        vm_tests.append(constants.CROS_VM_TEST_TYPE)
      if board in _paladin_devmode_vmtest_boards:
        vm_tests.append(constants.DEV_MODE_TEST_TYPE)
      if board in _paladin_smoke_vmtest_boards:
        vm_tests.append(constants.SMOKE_SUITE_TEST_TYPE)
      customizations.update(vm_tests=vm_tests)

    if base_config.get('internal'):
      customizations.update(prebuilts=constants.PRIVATE,
                            description=paladin['description'] + ' (internal)')
    else:
      customizations.update(prebuilts=constants.PUBLIC)
    _CONFIG.AddConfig(paladin, config_name,
                      customizations,
                      base_config)

_CreatePaladinConfigs()


_CONFIG.AddConfig(internal_paladin, 'lumpy-incremental-paladin',
  boards=['lumpy'],
  build_before_patching=True,
  chroot_replace=False,
  prebuilts=False,
  compilecheck=True,
  unittests=False,
)

### Paladins (CQ builders) which do not run VM or Unit tests on the builder
### itself.
external_brillo_paladin = paladin.derive(brillo)

_CONFIG.AddConfig(external_brillo_paladin, 'panther_embedded-minimal-paladin',
  boards=['panther_embedded'],
  profile='minimal',
  trybot_list=True,
)

internal_beaglebone_paladin = internal_paladin.derive(beaglebone)

_CONFIG.AddConfig(internal_beaglebone_paladin, 'beaglebone-paladin',
  boards=['beaglebone'],
  trybot_list=True,
)

_CONFIG.AddConfig(internal_beaglebone_paladin, 'beaglebone_servo-paladin',
  boards=['beaglebone_servo'],
  important=False,
)


def ShardHWTestsBetweenBuilders(*args):
  """Divide up the hardware tests between the given list of config names.

  Each of the config names must have the same hardware test suites, and the
  number of suites must be equal to the number of config names.

  Args:
    *args: A list of config names.
  """
  # List of config names.
  names = args
  # Verify sanity before sharding the HWTests.
  for name in names:
    assert len(_CONFIG[name].hw_tests) == len(names), \
      '%s should have %d tests, but found %d' % (
          name, len(names), len(_CONFIG[name].hw_tests))
  for name in names[1:]:
    for test1, test2 in zip(_CONFIG[name].hw_tests, _CONFIG[names[0]].hw_tests):
      assert test1.__dict__ == test2.__dict__, \
          '%s and %s have different hw_tests configured' % (names[0], name)

  # Assign each config the Nth HWTest.
  for i, name in enumerate(names):
    _CONFIG[name]['hw_tests'] = [_CONFIG[name].hw_tests[i]]

# Shard the bvt-inline and bvt-cq hw tests between similar builders.
# The first builder gets bvt-inline, and the second builder gets bvt-cq.
# bvt-cq takes longer, so it usually makes sense to give it the faster board.
ShardHWTestsBetweenBuilders('x86-zgb-paladin', 'x86-alex-paladin')
ShardHWTestsBetweenBuilders('wolf-paladin', 'peppy-paladin')
ShardHWTestsBetweenBuilders('daisy_skate-paladin', 'peach_pit-paladin')
ShardHWTestsBetweenBuilders('lumpy-paladin', 'stumpy-paladin')

# Add a pre-cq config for every board.
_CreateConfigsForBoards(pre_cq, _all_boards, 'pre-cq')
_CreateConfigsForBoards(no_vmtest_pre_cq, _all_boards, 'no-vmtest-pre-cq')
_CreateConfigsForBoards(compile_only_pre_cq, _all_boards, 'compile-only-pre-cq')

_CONFIG.AddConfig(no_vmtest_pre_cq, constants.BINHOST_PRE_CQ,
  internal,
  boards=[],
  binhost_test=True,
)

# TODO(davidjames): Add peach_pit, nyan, and beaglebone to pre-cq.
# TODO(davidjames): Update daisy_spring to build images again.
_CONFIG.AddGroup('mixed-a-pre-cq',
  # daisy_spring w/kernel 3.8.
  _CONFIG['daisy_spring-compile-only-pre-cq'],
  # lumpy w/kernel 3.8.
  _CONFIG['lumpy-compile-only-pre-cq'],
)

_CONFIG.AddGroup('mixed-b-pre-cq',
  # arm64 w/kernel 3.14.
  _CONFIG['rush_ryu-compile-only-pre-cq'],
  # samus w/kernel 3.14.
  _CONFIG['samus-compile-only-pre-cq'],
)

_CONFIG.AddGroup('mixed-c-pre-cq',
  # brillo
  _CONFIG['storm-compile-only-pre-cq'],
)

_CONFIG.AddGroup('external-mixed-pre-cq',
  _CONFIG['x86-generic-no-vmtest-pre-cq'],
  _CONFIG['amd64-generic-no-vmtest-pre-cq'],
)

_CONFIG.AddGroup('kernel-3_14-a-pre-cq',
  _CONFIG['x86-generic-no-vmtest-pre-cq'],
  _CONFIG['arm-generic-no-vmtest-pre-cq']
)

_CONFIG.AddGroup('kernel-3_14-b-pre-cq',
  _CONFIG['storm-no-vmtest-pre-cq'],
)

_CONFIG.AddGroup('kernel-3_14-c-pre-cq',
  _CONFIG['veyron_pinky-no-vmtest-pre-cq'],
  _CONFIG['rush_ryu-no-vmtest-pre-cq']
)

# TODO (crbug.com/438839): pre-cq-group has been replaced by multiple
# configs. Remove this config when no active CL has been screened
# with this config.
_CONFIG.AddGroup(constants.PRE_CQ_GROUP_CONFIG,
  # amd64 w/kernel 3.10. This builder runs VMTest so it's going to be
  # the slowest one.
  _CONFIG['rambi-pre-cq'],

  # daisy_spring w/kernel 3.8.
  _CONFIG['daisy_spring-compile-only-pre-cq'],

  # brillo config. We set build_packages_in_background=False here, so
  # that subsequent boards (samus, lumpy, parrot) don't get launched until
  # after duck finishes BuildPackages.
  _CONFIG.AddConfig(unittest_only_pre_cq, 'storm-pre-cq',
                    _base_configs['storm'],
                    build_packages_in_background=False),

  # samus w/kernel 3.14.
  _CONFIG['samus-compile-only-pre-cq'],

  # lumpy w/kernel 3.8.
  _CONFIG['lumpy-compile-only-pre-cq'],

  # arm64 w/kernel 3.4.
  _CONFIG['rush_ryu-compile-only-pre-cq'],
)

_CONFIG.AddConfig(internal_paladin, 'pre-cq-launcher',
  boards=[],
  build_type=constants.PRE_CQ_LAUNCHER_TYPE,
  description='Launcher for Pre-CQ builders',
  trybot_list=False,
  manifest_version=False,
  # Every Pre-CQ launch failure should send out an alert.
  health_threshold=1,
  health_alert_recipients=['chromeos-infra-eng@grotations.appspotmail.com',
                           'tree'],
  doc='http://www.chromium.org/chromium-os/build/builder-overview#TOC-Pre-CQ',
)


_CONFIG.AddConfig(internal_incremental, 'mario-incremental',
  boards=['x86-mario'],
)

_CONFIG.AddConfig(internal_incremental, 'lakitu-incremental',
  _base_configs['lakitu'],
  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE],
)

_CONFIG.AddConfig(
  _toolchain_major, 'internal-toolchain-major', internal, official,
  boards=['x86-alex', 'stumpy', 'daisy'],
  build_tests=True,
  description=_toolchain_major['description'] + ' (internal)',
)

_CONFIG.AddConfig(
  _toolchain_minor, 'internal-toolchain-minor', internal, official,
  boards=['x86-alex', 'stumpy', 'daisy'],
  build_tests=True,
  description=_toolchain_minor['description'] + ' (internal)',
)

_release = full.derive(official, internal,
  build_type=constants.CANARY_TYPE,
  useflags=append_useflags(['-cros-debug']),
  build_tests=True,
  afdo_use=True,
  manifest=constants.OFFICIAL_MANIFEST,
  manifest_version=True,
  images=['base', 'recovery', 'test', 'factory_install'],
  push_image=True,
  upload_symbols=True,
  binhost_bucket='gs://chromeos-dev-installer',
  binhost_key='RELEASE_BINHOST',
  binhost_base_url=
    'https://commondatastorage.googleapis.com/chromeos-dev-installer',
  dev_installer_prebuilts=True,
  git_sync=False,
  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE, constants.DEV_MODE_TEST_TYPE,
            constants.CROS_VM_TEST_TYPE],
  hw_tests=HWTestList.SharedPoolCanary(),
  paygen=True,
  signer_tests=True,
  trybot_list=True,
  hwqual=True,
  description="Release Builds (canary) (internal)",
  chrome_sdk=True,
  image_test=True,
  doc='http://www.chromium.org/chromium-os/build/builder-overview#TOC-Canaries',
)

_grouped_config = config_lib.BuildConfig(
  build_packages_in_background=True,
  chrome_sdk_build_chrome=False,
  unittests=None,
  vm_tests=[],
)

_grouped_variant_config = _grouped_config.derive(
  chrome_sdk=False,
)

_grouped_variant_release = _release.derive(_grouped_variant_config)

### Master release config.

_CONFIG.AddConfig(_release, 'master-release',
  boards=[],
  master=True,
  sync_chrome=False,
  chrome_sdk=False,
  health_alert_recipients=['chromeos-infra-eng@grotations.appspotmail.com',
                           'tree'],
  afdo_use=False,
)

### Release config groups.

_CONFIG.AddGroup('x86-alex-release-group',
  _CONFIG.AddConfig(_release, 'x86-alex-release',
    boards=['x86-alex'],
  ),
  _CONFIG.AddConfig(_grouped_variant_release, 'x86-alex_he-release',
    boards=['x86-alex_he'],
    hw_tests=[],
    upload_hw_test_artifacts=False,
    paygen_skip_testing=True,
  ),
)

_CONFIG.AddGroup('x86-zgb-release-group',
  _CONFIG.AddConfig(_release, 'x86-zgb-release',
    boards=['x86-zgb'],
  ),
  _CONFIG.AddConfig(_grouped_variant_release, 'x86-zgb_he-release',
    boards=['x86-zgb_he'],
    hw_tests=[],
    upload_hw_test_artifacts=False,
    paygen_skip_testing=True,
  ),
)

### Release AFDO configs.

release_afdo = _release.derive(
  trybot_list=False,
  hw_tests=HWTestList.DefaultList(pool=constants.HWTEST_SUITES_POOL,
                                    num=4) +
           HWTestList.AFDOList(),
  push_image=False,
  paygen=False,
  dev_installer_prebuilts=False,
)

# Now generate generic release-afdo configs if we haven't created anything more
# specific above already. release-afdo configs are builders that do AFDO profile
# collection and optimization in the same builder. Used by developers that
# want to measure performance changes caused by their changes.
def _AddAFDOConfigs():
  for board in _all_release_boards:
    if board in _x86_release_boards:
      base = {}
    else:
      base = non_testable_builder
    generate_config = config_lib.BuildConfig(
        base,
        boards=[board],
        afdo_generate_min=True,
        afdo_use=False,
        afdo_update_ebuild=True,
    )
    use_config = config_lib.BuildConfig(
        base,
        boards=[board],
        afdo_use=True,
    )

    config_name = '%s-%s' % (board, config_lib.CONFIG_TYPE_RELEASE_AFDO)
    if config_name not in _CONFIG:
      generate_config_name = '%s-%s-%s' % (board,
                                           config_lib.CONFIG_TYPE_RELEASE_AFDO,
                                           'generate')
      use_config_name = '%s-%s-%s' % (board,
                                      config_lib.CONFIG_TYPE_RELEASE_AFDO,
                                      'use')
      _CONFIG.AddGroup(
          config_name,
          _CONFIG.AddConfig(release_afdo, generate_config_name,
                            generate_config),
          _CONFIG.AddConfig(release_afdo, use_config_name, use_config))

_AddAFDOConfigs()

### Release configs.

_critical_for_chrome_boards = frozenset([
    'daisy',
    'lumpy',
    'parrot',
])

# bayleybay-release does not enable vm_tests or unittests due to the compiler
# flags enabled for baytrail.
_CONFIG.AddConfig(_release, 'bayleybay-release',
  boards=['bayleybay'],
  hw_tests=[],
  vm_tests=[],
  unittests=False,
)

_CONFIG.AddConfig(_release, 'beltino-release',
  boards=['beltino'],
  hw_tests=[],
  vm_tests=[],
)

# bayleybay-release does not enable vm_tests or unittests due to the compiler
# flags enabled for baytrail.
_CONFIG.AddConfig(_release, 'bobcat-release',
  boards=['bobcat'],
  hw_tests=[],
  profile='minimal',
  # This build doesn't generate signed images, so don't try to release them.
  paygen=False,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'gizmo-release',
  _base_configs['gizmo'],
  important=True,
  paygen=False,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'samus-release',
  _base_configs['samus'],
  important=True,
)

# Builder for non-freon 'stout' for test coverage (crbug.com/474713).
_CONFIG.AddConfig(_release, 'stout-release',
  _base_configs['stout'],
  important=True,
)

# Builder for non-freon 'quawks' for test coverage.
_CONFIG.AddConfig(_release, 'quawks-release',
  _base_configs['quawks'],
  important=True,
)

### Arm release configs.

_CONFIG.AddConfig(_release, 'veyron_rialto-release',
  _base_configs['veyron_rialto'],
  # rialto does not use Chrome.
  sync_chrome=False,
  chrome_sdk=False,
)


# Now generate generic release configs if we haven't created anything more
# specific above already.
def _AddReleaseConfigs():
  # We have to mark all autogenerated PFQs as not important so the master
  # does not wait for them.  http://crbug.com/386214
  # If you want an important PFQ, you'll have to declare it yourself.
  _CreateConfigsForBoards(
    chrome_info, _all_release_boards, 'tot-chrome-pfq-informational',
    important=False)
  _CreateConfigsForBoards(
    chrome_pfq, _chrome_pfq_important_boards, 'chrome-pfq')
  _CreateConfigsForBoards(
    chrome_pfq, _all_release_boards, 'chrome-pfq', important=False)
  _CreateConfigsForBoards(
    _release, _critical_for_chrome_boards, config_lib.CONFIG_TYPE_RELEASE,
    critical_for_chrome=True)
  _CreateConfigsForBoards(_release, _all_release_boards,
                          config_lib.CONFIG_TYPE_RELEASE)


_AddReleaseConfigs()

_CONFIG.AddConfig(_release, 'panther_embedded-minimal-release',
  _base_configs['panther_embedded'],
  profile='minimal',
  important=True,
  paygen=False,
  signer_tests=False,
)

# beaglebone build doesn't generate signed images, so don't try to release them.
_beaglebone_release = _release.derive(beaglebone, paygen=False,
                                      signer_tests=False,
                                      images=['base', 'test'])

_CONFIG.AddGroup('beaglebone-release-group',
  _CONFIG.AddConfig(_beaglebone_release, 'beaglebone-release',
    boards=['beaglebone'],
  ),
  _CONFIG.AddConfig(_beaglebone_release, 'beaglebone_servo-release',
    boards=['beaglebone_servo'],
    payload_image='base'
  ).derive(_grouped_variant_config),
  important=True,
)

_CONFIG.AddConfig(_release, 'kayle-release',
  _base_configs['kayle'],
  paygen=False,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'cosmos-release',
  _base_configs['cosmos'],

  paygen_skip_testing=True,
  important=False,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'storm-release',
  _base_configs['storm'],

  # Hw Lab can't test storm, yet.
  paygen_skip_testing=True,
  important=True,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'mipsel-o32-generic-release',
  _base_configs['mipsel-o32-generic'],
  paygen_skip_delta_payloads=True,
  afdo_use=False,
  hw_tests=[],
)

_CONFIG.AddConfig(_release, 'stumpy_moblab-release',
  _base_configs['stumpy_moblab'],
  images=['base', 'recovery', 'test'],
  paygen_skip_delta_payloads=True,
  # TODO: re-enable paygen testing when crbug.com/386473 is fixed.
  paygen_skip_testing=True,
  important=True,
  afdo_use=False,
  signer_tests=False,
  hw_tests=[
      config_lib.HWTestConfig(constants.HWTEST_MOBLAB_SUITE, blocking=True,
                              num=1, timeout=120*60),
      config_lib.HWTestConfig(constants.HWTEST_BVT_SUITE, blocking=True,
                              warn_only=True, num=1),
      config_lib.HWTestConfig(constants.HWTEST_AU_SUITE, blocking=True,
                              warn_only=True, num=1)],
)

_CONFIG.AddConfig(_release, 'panther_moblab-release',
  _base_configs['panther_moblab'],
  images=['base', 'recovery', 'test'],
  paygen_skip_delta_payloads=True,
  # TODO: re-enable paygen testing when crbug.com/386473 is fixed.
  paygen_skip_testing=True,
  important=False,
  afdo_use=False,
  signer_tests=False,
  hw_tests=[config_lib.HWTestConfig(constants.HWTEST_BVT_SUITE, blocking=True,
                                    warn_only=True, num=1),
            config_lib.HWTestConfig(constants.HWTEST_AU_SUITE, blocking=True,
                                    warn_only=True, num=1)],
)

_CONFIG.AddConfig(_release, 'rush-release',
  _base_configs['rush'],
  hw_tests=[],
  # This build doesn't generate signed images, so don't try to release them.
  paygen=False,
  signer_tests=False,
)

_CONFIG.AddConfig(_release, 'rush_ryu-release',
  _base_configs['rush_ryu'],
  images=['base', 'test', 'factory_install'],
  dev_installer_prebuilts=False,
  paygen=False,
  signer_tests=False,
  push_image=False,
  hw_tests=[],
)

_CONFIG.AddConfig(_release, 'veyron_mickey-release',
  _base_configs['veyron_mickey'],
  hw_tests=[],
  vm_tests=[],
)

_CONFIG.AddConfig(_release, 'veyron_romy-release',
  _base_configs['veyron_romy'],
  hw_tests=[],
  vm_tests=[],
)

_CONFIG.AddConfig(_release, 'whirlwind-release',
  _base_configs['whirlwind'],
  important=True,
  afdo_use=True,
  dev_installer_prebuilts=True,
)

_CONFIG.AddConfig(_release, 'lakitu-release',
                  _base_configs['lakitu'],
                  vm_tests=[constants.SMOKE_SUITE_TEST_TYPE])

### Per-chipset release groups

def _AddGroupConfig(name, base_board, group_boards=None,
                    group_variant_boards=None, **kwargs):
  """Generate full & release group configs."""
  def _boards_list(x):
    # Make sure _boards_list is a valid list (not None or tuple)
    return [] if x is None else list(x)

  group_boards = _boards_list(group_boards)
  group_variant_boards = _boards_list(group_variant_boards)

  for group in ('release', 'full'):
    configs = []

    all_boards = [base_board] + group_boards + group_variant_boards
    desc = '%s; Group config (boards: %s)' % (
        _CONFIG['%s-%s' % (base_board, group)].description,
        ', '.join(all_boards))

    for board in all_boards:
      if board in group_boards:
        subconfig = _grouped_config
      elif board in group_variant_boards:
        subconfig = _grouped_variant_config
      else:
        subconfig = {}
      board_config = '%s-%s' % (board, group)
      configs.append(_CONFIG[board_config].derive(subconfig, **kwargs))

      config_name = '%s-%s-group' % (name, group)
      important = group == 'release' and kwargs.get('important', True)
    _CONFIG.AddGroup(config_name, *configs, description=desc,
                     important=important)

# pineview chipset boards
_AddGroupConfig('pineview', 'x86-mario', (
    'x86-alex',
    'x86-zgb',
), (
    'x86-alex_he',
    'x86-zgb_he',
))

# pineview chipset boards (freon variant)
_AddGroupConfig('pineview-freon', 'x86-mario_freon', (
    'x86-alex_freon',
    'x86-zgb_freon',
), (
    'x86-alex_he-freon',
    'x86-zgb_he-freon',
),
    important=False
)

# sandybridge chipset boards
_AddGroupConfig('sandybridge', 'parrot', (
    'lumpy',
    'butterfly',
    'stumpy',
))

# sandybridge chipset boards (freon variant)
_AddGroupConfig('sandybridge-freon', 'parrot_freon', (
    'lumpy_freon',
    'butterfly_freon',
    'stumpy_freon',
))

# ivybridge chipset boards
_AddGroupConfig('ivybridge-freon', 'stout_freon', (
  'link',
), (
    'parrot_ivb',
))

# slippy-based haswell boards
# TODO(davidjames): Combine slippy and beltino into haswell canary, once we've
# optimized our builders more.
# slippy itself is deprecated in favor of the below boards, so we don't bother
# building it.
# TODO(dnj): Re-add peppy canary once builders are allocated.
_AddGroupConfig('slippy', 'peppy', (
    'falco',
    'leon',
    'wolf',
), (
    'falco_li',
))

# beltino-based haswell boards
# beltino itself is deprecated in favor of the below boards, so we don't bother
# building it.

_AddGroupConfig('beltino-a', 'panther', (
    'mccloud',
))

_AddGroupConfig('beltino-b', 'monroe', (
    'tricky',
    'zako',
))

# rambi-based boards
_AddGroupConfig('rambi-a', 'rambi', (
    'clapper',
    'enguarde',
    'expresso',
))

_AddGroupConfig('rambi-b', 'glimmer', (
    'gnawty',
    'kip',
    'quawks_freon',
))

_AddGroupConfig('rambi-c', 'squawks', (
    'swanky',
    'winky',
    'candy',
))

_AddGroupConfig('rambi-d', 'banjo', (
    'cranky',
    'ninja',
    'sumo',
),
    important=False
)

_AddGroupConfig('rambi-e', 'orco', (
),
    important=False
)

# daisy-based boards
_AddGroupConfig('daisy', 'daisy', (
    'daisy_spring',
    'daisy_skate',
))

# daisy-based boards (Freon)
_AddGroupConfig('daisy-freon', 'daisy_freon', (
    'daisy_spring-freon',
    'daisy_skate-freon',
),
    important=False
)

# peach-based boards
_AddGroupConfig('peach', 'peach_pit', (
    'peach_pi',
))

# peach-based boards (Freon)
_AddGroupConfig('peach-freon', 'peach_pit-freon', (
    'peach_pi-freon',
),
    important=False
)


# nyan-based boards
_AddGroupConfig('nyan', 'nyan', (
    'nyan_big',
    'nyan_blaze',
    'nyan_kitty',
))

# auron-based boards
_AddGroupConfig('auron', 'auron', (
    'auron_yuna',
    'auron_paine',
))

_AddGroupConfig('auron-b', 'lulu', (
    'cid',
    'gandof',
))

# veyron-based boards
_AddGroupConfig('veyron', 'veyron_pinky', (
    'veyron_jerry',
    'veyron_mighty',
    'veyron_speedy'
    ),
)

_AddGroupConfig('veyron-b', 'veyron_gus', (
    'veyron_jaq',
    'veyron_minnie',
    'veyron_rialto',
    ),
    important=False,
)

_AddGroupConfig('veyron-c', 'veyron_brain', (
    'veyron_danger',
    'veyron_thea',
    ),
    important=False,
)

_AddGroupConfig('veyron-d', 'veyron_mickey', (
    'veyron_romy',
    ),
    important=False,
)

# jecht-based boards
_AddGroupConfig('jecht', 'jecht', (
    'guado',
    'tidus',
    'rikku',
))

# strago-based boards
_AddGroupConfig('strago', 'strago', (
    'cyan',
    ),
    important=False,
    vm_tests=[],
)

# oak-based boards
_AddGroupConfig('oak', 'oak', (
))

# Factory and Firmware releases much inherit from these classes.  Modifications
# for these release builders should go here.

# Naming conventions also must be followed.  Factory and firmware branches must
# end in -factory or -firmware suffixes.

_factory_release = _release.derive(
  upload_hw_test_artifacts=False,
  upload_symbols=False,
  hw_tests=[],
  chrome_sdk=False,
  description='Factory Builds',
  paygen=False,
  afdo_use=False,
)

_firmware = config_lib.BuildConfig(
  images=[],
  factory_toolkit=False,
  packages=['virtual/chromeos-firmware'],
  usepkg_build_packages=True,
  sync_chrome=False,
  build_tests=False,
  chrome_sdk=False,
  unittests=False,
  vm_tests=[],
  hw_tests=[],
  dev_installer_prebuilts=False,
  upload_hw_test_artifacts=False,
  upload_symbols=False,
  signer_tests=False,
  trybot_list=False,
  paygen=False,
  image_test=False,
)

_firmware_release = _release.derive(_firmware,
  description='Firmware Canary',
  manifest=constants.DEFAULT_MANIFEST,
  afdo_use=False,
)

_depthcharge_release = _firmware_release.derive(
  useflags=append_useflags(['depthcharge']))

_depthcharge_full_internal = full.derive(
  internal,
  _firmware,
  useflags=append_useflags(['depthcharge']),
  description='Firmware Informational',
)

_firmware_boards = frozenset([
  'auron',
  'banjo',
  'bayleybay',
  'beltino',
  'butterfly',
  'candy',
  'clapper',
  'cyan',
  'daisy',
  'daisy_skate',
  'daisy_spring',
  'enguarde',
  'expresso',
  'falco',
  'glimmer',
  'gnawty',
  'jecht',
  'kip',
  'leon',
  'link',
  'lumpy',
  'monroe',
  'ninja',
  'orco',
  'panther',
  'parrot',
  'parry',
  'peach_pi',
  'peach_pit',
  'peppy',
  'quawks',
  'rambi',
  'rikku',
  'samus',
  'slippy',
  'smaug',
  'squawks',
  'storm',
  'stout',
  'strago',
  'stumpy',
  'sumo',
  'swanky',
  'winky',
  'wolf',
  'x86-mario',
  'zako',
])

_x86_depthcharge_firmware_boards = frozenset([
  'auron',
  'banjo',
  'bayleybay',
  'candy',
  'clapper',
  'cyan',
  'enguarde',
  'expresso',
  'glimmer',
  'gnawty',
  'jecht',
  'kip',
  'leon',
  'link',
  'ninja',
  'orco',
  'parry',
  'quawks',
  'rambi',
  'rikku',
  'samus',
  'squawks',
  'strago',
  'sumo',
  'swanky',
  'winky',
  'zako',
])


def _AddFirmwareConfigs():
  """Add x86 and arm firmware configs."""
  for board in _firmware_boards:
    _CONFIG.AddConfig(_firmware_release,
        '%s-%s' % (board, config_lib.CONFIG_TYPE_FIRMWARE),
        _base_configs[board],
    )

  for board in _x86_depthcharge_firmware_boards:
    _CONFIG.AddConfig(_depthcharge_release,
        '%s-%s-%s' % (board, 'depthcharge', config_lib.CONFIG_TYPE_FIRMWARE),
        _base_configs[board],
    )
    _CONFIG.AddConfig(_depthcharge_full_internal,
        '%s-%s-%s-%s' % (board, 'depthcharge', config_lib.CONFIG_TYPE_FULL,
                         config_lib.CONFIG_TYPE_FIRMWARE),
        _base_configs[board],
    )

_AddFirmwareConfigs()


# This is an example factory branch configuration for x86.
# Modify it to match your factory branch.
_CONFIG.AddConfig(_factory_release, 'x86-mario-factory',
  boards=['x86-mario'],
)

# This is an example factory branch configuration for arm.
# Modify it to match your factory branch.
_CONFIG.AddConfig(_factory_release, 'daisy-factory',
  non_testable_builder,
  boards=['daisy'],
)

_payloads = internal.derive(
  build_type=constants.PAYLOADS_TYPE,
  builder_class_name='release_builders.GeneratePayloadsBuilder',
  description='Regenerate release payloads.',
  vm_tests=[],

  # Sync to the code used to do the build the first time.
  manifest_version=True,

  # This is the actual work we want to do.
  paygen=True,

  upload_hw_test_artifacts=False,
)

def _AddPayloadConfigs():
  """Create <board>-payloads configs for all payload generating boards.

  We create a config named 'board-payloads' for every board which has a
  config with 'paygen' True. The idea is that we have a build that generates
  payloads, we need to have a tryjob to re-attempt them on failure.
  """
  payload_boards = set()

  def _search_config_and_children(search_config):
    # If paygen is enabled, add it's boards to our list of payload boards.
    if search_config['paygen']:
      for board in search_config['boards']:
        payload_boards.add(board)

    # Recurse on any child configs.
    for child in search_config['child_configs']:
      _search_config_and_children(child)

  # Search all configs for boards that generate payloads.
  for _, search_config in _CONFIG.iteritems():
    _search_config_and_children(search_config)

  # Generate a payloads trybot config for every board that generates payloads.
  for board in payload_boards:
    name = '%s-payloads' % board
    _CONFIG.AddConfig(_payloads, name, boards=[board])

_AddPayloadConfigs()

def _AddProjectSdkConfigs():
  for board in _project_sdk_boards:
    name = '%s-project-sdk' % board
    _CONFIG.AddConfig(project_sdk, name, boards=[board])

_AddProjectSdkConfigs()

# LKGM builds don't work for tryjobs. Add this as a workaround, for now.
_CONFIG.AddConfig(project_sdk,
  'trybot-project-sdk',
  boards=['panther_embedded'],

  # Don't use LKGM
  use_lkgm=False,
)

# On release branches, x86-mario is the release master.
#
# TODO(dnj): This should go away once the boardless release master is complete
# (crbug.com/458675)
if IS_RELEASE_BRANCH:
  _CONFIG['x86-mario-release']['master'] = True


# This is a list of configs that should be included on the main waterfall, but
# aren't included by default (see IsDefaultMainWaterfall). This loosely
# corresponds to the set of experimental or self-standing configs.
_waterfall_config_map = {
    constants.WATERFALL_EXTERNAL: frozenset([
      # Experimental Paladins
      'amd64-generic_freon-paladin',

      # Incremental
      'amd64-generic-incremental',
      'daisy-incremental',
      'x86-generic-incremental',

      # Full
      'amd64-generic-full',
      'arm-generic-full',
      'daisy-full',
      'mipsel-o32-generic-full',
      'oak-full',
      'x86-generic-full',

      # ASAN
      'amd64-generic-asan',
      'x86-generic-asan',

      # Utility
      'chromiumos-sdk',
      'refresh-packages',
    ]),

    constants.WATERFALL_INTERNAL: frozenset([
      # Experimental Paladins
      'daisy_freon-paladin',
      'nyan_freon-paladin',
      'smaug-paladin',
      'strago-paladin',
      'tricky-paladin',
      'whirlwind-paladin',
      'x86-alex_freon-paladin',

      # Experimental Canaries (Group)
      'daisy-freon-release-group',
      'peach-freon-release-group',
      'pineview-freon-release-group',
      'rambi-d-release-group',
      'rambi-e-release-group',
      'strago-release-group',
      'veyron-b-release-group',
      'veyron-c-release-group',
      'veyron-d-release-group',

      # Experimental Canaries
      'bobcat-release',
      'cosmos-release',
      'daisy_winter-release',
      'kayle-release',
      'nyan_freon-release',
      'panther_moblab-release',
      'rush_ryu-release',
      'smaug-release',
      'lakitu-release',

      # Experimental PFQs.
      'peach_pit-chrome-pfq',
      'tricky-chrome-pfq',

      # Incremental Builders.
      'mario-incremental',
      'lakitu-incremental',

      # Firmware Builders.
      'link-depthcharge-full-firmware',

      # SDK Builders.
      'panther_embedded-project-sdk',
      'gizmo-project-sdk',

      # Toolchain Builders.
      'internal-toolchain-major',
      'internal-toolchain-minor',
    ]),
}

def _SetupWaterfalls():
  for name, c in _CONFIG.iteritems():
    if not c.get('active_waterfall'):
      c['active_waterfall'] = GetDefaultWaterfall(c)

  # Apply manual configs.
  for waterfall, names in _waterfall_config_map.iteritems():
    for name in names:
      _CONFIG[name]['active_waterfall'] = waterfall

_SetupWaterfalls()
