# -*- coding: utf-8 -*-
# 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 re

from chromite.lib import config_lib
from chromite.lib import constants
from chromite.utils import memoize

from chromite.config import chromeos_config_boards as chromeos_boards
from chromite.config import chromeos_test_config as chromeos_test

# TODO(yshaul): Restrict the import when we're done splitting
from chromite.config.chromeos_test_config import HWTestList
from chromite.config.chromeos_test_config import TRADITIONAL_VM_TESTS_SUPPORTED
from chromite.config.chromeos_test_config import getInfoVMTest


def remove_images(unsupported_images):
  """Remove unsupported images when applying changes to a BuildConfig.

  Used similarly to append_useflags.

  Args:
    unsupported_images: A list of image names that should not be present
                        in the final build config.

  Returns:
    A callable suitable for use with BuildConfig.apply.
  """
  unsupported = set(unsupported_images)

  def handler(old_images):
    if not old_images:
      old_images = []
    return [i for i in old_images if i not in unsupported]

  return handler


def GetBoardTypeToBoardsDict(ge_build_config):
  """Get board type to board names dict.

  Args:
    ge_build_config: Dictionary containing the decoded GE configuration file.

  Returns:
    A dict mapping board types to board name collections.
    The dict contains board types including distinct_board_sets,
    all_release_boards, all_full_boards, all_boards, internal_boards,
    and no_vmtest_boards.
  """
  ge_arch_board_dict = config_lib.GetArchBoardDict(ge_build_config)

  boards_dict = {}

  arm_internal_release_boards = (
      chromeos_boards.arm_internal_release_boards |
      ge_arch_board_dict.get(config_lib.CONFIG_ARM_INTERNAL, set())
  )
  arm_external_boards = (
      chromeos_boards.arm_external_boards |
      ge_arch_board_dict.get(config_lib.CONFIG_ARM_EXTERNAL, set())
  )

  x86_internal_release_boards = (
      chromeos_boards.x86_internal_release_boards |
      ge_arch_board_dict.get(config_lib.CONFIG_X86_INTERNAL, set())
  )
  x86_external_boards = (
      chromeos_boards.x86_external_boards |
      ge_arch_board_dict.get(config_lib.CONFIG_X86_EXTERNAL, set())
  )

  # Every board should be in only 1 of the above sets.
  boards_dict['distinct_board_sets'] = [
      arm_internal_release_boards,
      arm_external_boards,
      x86_internal_release_boards,
      x86_external_boards,
  ]

  arm_full_boards = (
      arm_internal_release_boards |
      arm_external_boards)
  x86_full_boards = (
      x86_internal_release_boards |
      x86_external_boards)

  arm_boards = arm_full_boards
  x86_boards = x86_full_boards

  boards_dict['all_release_boards'] = (
      arm_internal_release_boards |
      x86_internal_release_boards
  )
  boards_dict['all_full_boards'] = (
      arm_full_boards |
      x86_full_boards
  )
  all_boards = x86_boards | arm_boards
  boards_dict['all_boards'] = (
      all_boards
  )

  boards_dict['internal_boards'] = boards_dict['all_release_boards']

  # This set controls the final vmtest override. It allows us to specify
  # vm_tests for each class of builders, but only execute on vmtest_boards.
  boards_dict['no_vmtest_boards'] = (
      all_boards - chromeos_test.vmtest_boards
  )

  boards_dict['generic_kernel_boards'] = frozenset([
      'amd64-generic',
      'arm-generic',
      'arm64-generic'
  ])

  return boards_dict


def DefaultSettings():
  """Create the default build config values for this site.

  Returns:
    dict: of default config_lib.BuildConfig values to use for this site.
  """
  # Site specific adjustments for default BuildConfig values.
  defaults = config_lib.DefaultSettings()

  # Git repository URL for our manifests.
  #  https://chromium.googlesource.com/chromiumos/manifest
  #  https://chrome-internal.googlesource.com/chromeos/manifest-internal
  defaults['manifest_repo_url'] = config_lib.GetSiteParams().MANIFEST_URL

  return defaults


def GeneralTemplates(site_config):
  """Defines templates that are shared between categories of builders.

  Args:
    site_config: A SiteConfig object to add the templates too.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  # Config parameters for builders that do not run tests on the builder.
  site_config.AddTemplate(
      'no_unittest_builder',
      unittests=False,
  )

  # Builder type templates.

  site_config.AddTemplate(
      'full',
      # 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,
      build_timeout=12 * 60 * 60,
      display_label=config_lib.DISPLAY_LABEL_FULL,
      build_type=constants.FULL_TYPE,
      luci_builder=config_lib.LUCI_BUILDER_FULL,
      archive_build_debug=True,
      images=['base', 'recovery', 'test', 'factory_install'],
      git_sync=True,
      description='Full Builds',
      image_test=True,
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-Continuous',
  )

  # Incremental builders are intended to test the developer workflow.
  # For that reason, they don't uprev.
  site_config.AddTemplate(
      'incremental',
      display_label=config_lib.DISPLAY_LABEL_INCREMENATAL,
      build_type=constants.INCREMENTAL_TYPE,
      luci_builder=config_lib.LUCI_BUILDER_INCREMENTAL,
      chroot_replace=False,
      uprev=False,
      overlays=constants.PUBLIC_OVERLAYS,
      description='Incremental Builds',
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-Continuous',
  )

  site_config.AddTemplate(
      'informational',
      display_label=config_lib.DISPLAY_LABEL_INFORMATIONAL,
      description='Informational Builds',
      manifest_branch='main',
      luci_builder=config_lib.LUCI_BUILDER_INFORMATIONAL,
  )

  site_config.AddTemplate(
      'external',
      internal=False,
      overlays=constants.PUBLIC_OVERLAYS,
      manifest_repo_url=config_lib.GetSiteParams().MANIFEST_URL,
      manifest_branch='main',
      manifest=constants.DEFAULT_MANIFEST,
  )

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

  site_config.AddTemplate(
      'infra_builder',
      luci_builder=config_lib.LUCI_BUILDER_INFRA,
  )

  site_config.AddTemplate(
      'accelerator',
      sync_chrome=False,
      chrome_sdk=False,
  )

  site_config.AddTemplate(
      'brillo',
      sync_chrome=False,
      chrome_sdk=False,
      dev_installer_prebuilts=False,
  )

  site_config.AddTemplate(
      'lakitu',
      sync_chrome=False,
      chrome_sdk=False,
      dev_installer_prebuilts=False,
      paygen_skip_testing=True,
  )

  site_config.AddTemplate(
      'lassen',
      sync_chrome=False,
      chrome_sdk=False,
      image_test=False,
  )

  site_config.AddTemplate(
      'x30evb',
      sync_chrome=False,
      chrome_sdk=False,
      signer_tests=False,
      paygen=False,
      upload_hw_test_artifacts=False,
      image_test=False,
      images=['base', 'test'],
      packages=['virtual/target-os',
                'virtual/target-os-dev',
                'virtual/target-os-test'],
  )

  site_config.AddTemplate(
      'termina',
      sync_chrome=False,
      chrome_sdk=False,
      dev_installer_prebuilts=False,
      signer_tests=False,
      sign_types=None,
      paygen=False,
      upload_hw_test_artifacts=False,
      upload_stripped_packages=['sys-kernel/*kernel*'],
      image_test=False,
      guest_vm_image=True,
      images=['base', 'test'],
      packages=['virtual/target-os',
                'virtual/target-os-dev',
                'virtual/target-os-test'],
  )

  site_config.AddTemplate(
      'loonix',
      factory=False,
      factory_install_netboot=False,
      factory_toolkit=False,
      sync_chrome=False,
      chrome_sdk=False,
      dev_installer_prebuilts=False,
      # TODO(harshmodi): Re-enable this when we start using vboot
      signer_tests=False,
      paygen=False,
      upload_hw_test_artifacts=False,
      image_test=False,
      images=remove_images(['recovery', 'factory_install'])
  )

  site_config.AddTemplate(
      'wshwos',
      site_config.templates.loonix
  )

  site_config.AddTemplate(
      'dustbuster',
      # TODO(ehislen): Starting with loonix but will diverge later.
      site_config.templates.loonix,
      # Disable rootfs_verification until Dustbuster is ready.
      rootfs_verification=False,
  )

  # An anchor of Laktiu' test customizations.
  # TODO: renable SIMPLE_AU_TEST_TYPE once b/67510964 is fixed.
  site_config.AddTemplate(
      'lakitu_test_customizations',
      vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                        test_suite='smoke')],
      vm_tests_override=None,
      gce_tests=[config_lib.GCETestConfig(constants.GCE_SUITE_TEST_TYPE,
                                          test_suite='gce-sanity'),
                 config_lib.GCETestConfig(constants.GCE_SUITE_TEST_TYPE,
                                          test_suite='gce-smoke')],
  )

  # Test customizations for lakitu boards' paladin builders.
  site_config.AddTemplate(
      'lakitu_paladin_test_customizations',
      vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                        test_suite='smoke')],
      vm_tests_override=None,
      gce_tests=[config_lib.GCETestConfig(constants.GCE_SUITE_TEST_TYPE,
                                          test_suite='gce-sanity')],
  )

  # An anchor of Laktiu' notification email settings.
  site_config.AddTemplate(
      'lakitu_notification_emails',
  )

  site_config.AddTemplate(
      'beaglebone',
      site_config.templates.brillo,
      image_test=False,
      rootfs_verification=False,
      paygen=False,
      signer_tests=False,
      images=remove_images(['dev', 'test', 'recovery', 'factory_install']),
  )

  # This adds Chrome branding.
  site_config.AddTemplate(
      'official_chrome',
      useflags=config_lib.append_useflags([constants.USE_CHROME_INTERNAL]),
  )

  # This sets chromeos_official.
  site_config.AddTemplate(
      'official',
      site_config.templates.official_chrome,
      chromeos_official=True,
  )

  site_config.AddTemplate(
      'asan',
      site_config.templates.full,
      profile='asan',
      # TODO(crbug.com/1080416): Investigate why rootfs verification fails and
      # re-enable it. It used to work till late 2019.
      rootfs_verification=False,
      # THESE IMAGES CAN DAMAGE THE LAB and cannot be used for hardware testing.
      disk_layout='16gb-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 lines once crbug.com/329248 is
      # fixed.
      images=['base', 'test'],
      chrome_sdk=False,
      vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                        test_suite='smoke')],
      vm_tests_override=None,
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-ASAN',
  )

  site_config.AddTemplate(
      'ubsan',
      profile='ubsan',
      # Need larger rootfs for ubsan builds.
      disk_layout='16gb-rootfs',
      images=['base', 'test'],
      chrome_sdk=False,
      vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                        test_suite='smoke')],
      vm_tests_override=None,
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-ASAN',
  )

  site_config.AddTemplate(
      'fuzzer',
      site_config.templates.full,
      site_config.templates.informational,
      profile='fuzzer',
      chrome_sdk=False,
      sync_chrome=True,
      # Run fuzzer builder specific stages.
      builder_class_name='fuzzer_builders.FuzzerBuilder',
      # Need larger rootfs since fuzzing also enables asan.
      disk_layout='2gb-rootfs',
      gs_path='gs://chromeos-fuzzing-artifacts/libfuzzer-asan',
      images=[],
      image_test=None,
      packages=['virtual/target-fuzzers'],
  )

  site_config.AddTemplate(
      'pre_flight_branch',
      site_config.templates.internal,
      site_config.templates.official_chrome,
      build_type=constants.PFQ_TYPE,
      luci_builder=config_lib.LUCI_BUILDER_PFQ,
      build_timeout=20 * 60,
      manifest_version=True,
      branch=True,
      master=True,
      slave_configs=[],
      vm_tests=[],
      vm_tests_override=TRADITIONAL_VM_TESTS_SUPPORTED,
      hw_tests=[],
      hw_tests_override=[],
      unittests=False,
      uprev=True,
      overlays=constants.BOTH_OVERLAYS,
      push_overlays=constants.BOTH_OVERLAYS,
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-Chrome-PFQ')

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

  # 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.
  site_config.AddTemplate(
      'test_ap',
      site_config.templates.internal,
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      build_type=constants.INCREMENTAL_TYPE,
      description='WiFi AP images used in testing',
      profile='testbed-ap',
  )

  # Create tryjob build configs to help with stress testing.
  site_config.AddTemplate(
      'unittest_stress',
      display_label=config_lib.DISPLAY_LABEL_TRYJOB,
      build_type=constants.TRYJOB_TYPE,
      description='Run Unittests repeatedly to look for flake.',

      builder_class_name='test_builders.UnittestStressBuilder',

      # Make this available, so we can stress a previous build.
      manifest_version=True,
  )

  site_config.AddTemplate(
      'release_common',
      site_config.templates.full,
      site_config.templates.official,
      site_config.templates.internal,
      display_label=config_lib.DISPLAY_LABEL_RELEASE,
      build_type=constants.CANARY_TYPE,
      luci_builder=config_lib.LUCI_BUILDER_LEGACY_RELEASE,
      chroot_use_image=False,
      suite_scheduling=True,
      # Because release builders never use prebuilts, they need the
      # longer timeout.  See crbug.com/938958.
      build_timeout=12 * 60 * 60,
      useflags=config_lib.append_useflags(['-cros-debug']),
      manifest=constants.OFFICIAL_MANIFEST,
      manifest_version=True,
      images=['base', 'recovery', 'test', 'factory_install'],
      sign_types=['recovery', 'accessory_rwsig'],
      push_image=True,
      upload_symbols=True,
      run_cpeexport=True,
      run_build_configs_export=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=[
          config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                  test_suite='smoke'),
          config_lib.VMTestConfig(constants.DEV_MODE_TEST_TYPE),
          config_lib.VMTestConfig(constants.CROS_VM_TEST_TYPE)],
      # Some release builders disable VMTests to be able to build on GCE, but
      # still want VMTests enabled on trybot builders.
      vm_tests_override=[
          config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                  test_suite='smoke'),
          config_lib.VMTestConfig(constants.DEV_MODE_TEST_TYPE),
          config_lib.VMTestConfig(constants.CROS_VM_TEST_TYPE)],
      paygen=True,
      signer_tests=True,
      hwqual=True,
      description='Release Builds (canary) (internal)',
      chrome_sdk=True,
      image_test=True,
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-Canaries',
  )

  site_config.AddTemplate(
      'release_basic',
      site_config.templates.release_common,
      luci_builder=config_lib.LUCI_BUILDER_LEGACY_RELEASE,
      description='Fail Fast Release Builds (canary) (internal)',
      basic_builder=True,
      notification_configs=[
          config_lib.NotificationConfig(email='navil+spam@chromium.org')
      ],
      chromeos_official=False,
      paygen=False,
      suite_scheduling=False,
      unittests=False,
      hw_tests=[],
      hw_tests_override=[],
      hwqual=False,
      image_test=False,
      paygen_skip_testing=True,
      signer_tests=False,
      vm_tests=[],
      vm_tests_override=None,
      push_image=False,
      sign_types=[],
      upload_symbols=False,
      upload_stripped_packages=[],
      archive=False,
      archive_build_debug=False,
      upload_standalone_images=False,
      upload_hw_test_artifacts=False,
      cpe_export=False,
      run_cpeexport=False,
      run_build_configs_export=False)

  site_config.AddTemplate(
      'release',
      site_config.templates.release_common,
      luci_builder=config_lib.LUCI_BUILDER_LEGACY_RELEASE,
  )

  site_config.AddTemplate(
      'factory_firmware',
      site_config.templates.release_common,
      luci_builder=config_lib.LUCI_BUILDER_FACTORY,
  )

  site_config.AddTemplate(
      'moblab_release',
      site_config.templates.release,
      description='Moblab release builders',
      images=['base', 'recovery', 'test'],
      signer_tests=False,
  )

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

  site_config.AddTemplate(
      'factory',
      site_config.templates.factory_firmware,
      display_label=config_lib.DISPLAY_LABEL_FACTORY,
      chrome_sdk=False,
      chrome_sdk_build_chrome=False,
      description='Factory Builds',
      dev_installer_prebuilts=False,
      factory_toolkit=True,
      hwqual=False,
      images=['test', 'factory_install'],
      image_test=False,
      paygen=False,
      signer_tests=False,
      sign_types=['factory'],
      upload_hw_test_artifacts=False,
      upload_symbols=False,
  )

  # This should be used by any "workspace_builders."
  site_config.AddTemplate(
      'workspace',
      postsync_patch=False,
  )

  # Requires that you set boards, and workspace_branch.
  site_config.AddTemplate(
      'firmwarebranch',
      site_config.templates.factory_firmware,
      site_config.templates.workspace,
      display_label=config_lib.DISPLAY_LABEL_FIRMWARE,
      images=[],
      hwqual=False,
      factory_toolkit=False,
      packages=['virtual/chromeos-firmware'],
      usepkg_build_packages=False,
      sync_chrome=False,
      chrome_sdk=False,
      unittests=False,
      dev_installer_prebuilts=False,
      upload_hw_test_artifacts=False,
      upload_symbols=False,
      useflags=config_lib.append_useflags(['chromeless_tty']),
      signer_tests=False,
      paygen=False,
      image_test=False,
      manifest=constants.DEFAULT_MANIFEST,
      sign_types=['firmware', 'accessory_rwsig'],
      build_type=constants.GENERIC_TYPE,
      uprev=True,
      overlays=constants.BOTH_OVERLAYS,
      push_overlays=constants.BOTH_OVERLAYS,
      builder_class_name='workspace_builders.FirmwareBranchBuilder',
      build_timeout=6*60 * 60,
      description='TOT builder to build a firmware branch.',
      doc='https://goto.google.com/tot-for-firmware-branches',
  )

  site_config.AddTemplate(
      'payloads',
      site_config.templates.internal,
      site_config.templates.no_unittest_builder,
      display_label=config_lib.DISPLAY_LABEL_TRYJOB,
      build_type=constants.PAYLOADS_TYPE,
      luci_builder=config_lib.LUCI_BUILDER_LEGACY_RELEASE,
      builder_class_name='release_builders.GeneratePayloadsBuilder',
      description='Regenerate release payloads.',
      # 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,
  )

  site_config.AddTemplate(
      'build_external_chrome',
      useflags=config_lib.append_useflags(
          ['-%s' % constants.USE_CHROME_INTERNAL]),
  )

  # Tast is an alternate system for running integration tests.

  # The expression specified here matches the union of the tast.critical-*
  # Autotest server tests, which are executed by the bvt-tast-cq suite on real
  # hardware in the lab.
  site_config.AddTemplate(
      'tast_vm_paladin_tests',
      tast_vm_tests=[
          config_lib.TastVMTestConfig(
              'tast_vm_paladin',
              ['("group:mainline" && !informational)'])],
  )
  # The expression specified here matches the union of the
  # tast.critical-{android,chrome} Autotest server tests, which are executed by
  # the bvt-tast-chrome-pfq suite on real hardware in the lab.
  site_config.AddTemplate(
      'tast_vm_chrome_pfq_tests',
      tast_vm_tests=[
          config_lib.TastVMTestConfig(
              'tast_vm_chrome_pfq',
              ['("group:mainline" && !informational && '
               '("dep:android*" || "dep:chrome"))'])],
  )
  # The expression specified here matches the tast.critical-android Autotest
  # server test, which is executed by the bvt-tast-android-pfq suite on real
  # hardware in the lab.
  site_config.AddTemplate(
      'tast_vm_android_pfq_tests',
      tast_vm_tests=[
          config_lib.TastVMTestConfig(
              'tast_vm_android_pfq',
              ['("group:mainline" && !informational && "dep:android*")'])],
  )
  # The expression specified here matches the union of the tast.critical-* and
  # tast.informational-* Autotest server tests, which are executed by the
  # bvt-tast-cq and bvt-tast-informational suites on real hardware in the lab.
  site_config.AddTemplate(
      'tast_vm_canary_tests',
      tast_vm_tests=[
          config_lib.TastVMTestConfig(
              'tast_vm_canary_critical',
              ['("group:mainline" && !informational)']),
          config_lib.TastVMTestConfig(
              'tast_vm_canary_informational',
              ['("group:mainline" && informational)'],
              # TODO(crbug/1173026): revert this to 3 hours once the
              # informational tests are split out into their own builders.
              timeout=4 * 60 * 60),
      ],
  )

  site_config.AddTemplate(
      'moblab_vm_tests',
      moblab_vm_tests=[
          config_lib.MoblabVMTestConfig(constants.MOBLAB_VM_SMOKE_TEST_TYPE)],
  )

  site_config.AddTemplate(
      'buildspec',
      site_config.templates.workspace,
      site_config.templates.internal,
      luci_builder=config_lib.LUCI_BUILDER_FACTORY,
      master=True,
      boards=[],
      build_type=constants.GENERIC_TYPE,
      uprev=True,
      overlays=constants.BOTH_OVERLAYS,
      push_overlays=constants.BOTH_OVERLAYS,
      builder_class_name='workspace_builders.BuildSpecBuilder',
      build_timeout=4*60 * 60,
      description='Buildspec creator.',
  )


def CreateBoardConfigs(site_config, boards_dict, ge_build_config):
  """Create mixin templates for each board."""
  # Extract the full list of board names from GE data.
  separate_board_names = set(config_lib.GeBuildConfigAllBoards(ge_build_config))
  unified_builds = config_lib.GetUnifiedBuildConfigAllBuilds(ge_build_config)
  unified_board_names = set([b[config_lib.CONFIG_TEMPLATE_REFERENCE_BOARD_NAME]
                             for b in unified_builds])
  board_names = separate_board_names | unified_board_names

  # TODO(crbug.com/648473): Remove these, after GE adds them to their data set.
  board_names = board_names.union(boards_dict['all_boards'])

  result = dict()
  for board in board_names:
    board_config = config_lib.BuildConfig(boards=[board])

    if board in chromeos_boards.brillo_boards:
      board_config.apply(site_config.templates.brillo)
    if board in chromeos_boards.lakitu_boards:
      board_config.apply(site_config.templates.lakitu)
    if board in chromeos_boards.lassen_boards:
      board_config.apply(site_config.templates.lassen)
    if board in ['x30evb']:
      board_config.apply(site_config.templates.x30evb)
    if board in chromeos_boards.loonix_boards:
      board_config.apply(site_config.templates.loonix)
    if board in chromeos_boards.wshwos_boards:
      board_config.apply(site_config.templates.wshwos)
    if board in chromeos_boards.dustbuster_boards:
      board_config.apply(site_config.templates.dustbuster)
    if board in chromeos_boards.moblab_boards:
      board_config.apply(site_config.templates.moblab)
    if board in chromeos_boards.accelerator_boards:
      board_config.apply(site_config.templates.accelerator)
    if board in chromeos_boards.termina_boards:
      board_config.apply(site_config.templates.termina)
    if board in chromeos_boards.nofactory_boards:
      board_config.apply(factory=False,
                         factory_toolkit=False,
                         factory_install_netboot=False,
                         images=remove_images(['factory_install']))
    if board in chromeos_boards.toolchains_from_source:
      board_config.apply(usepkg_toolchain=False)
    if board in chromeos_boards.noimagetest_boards:
      board_config.apply(image_test=False)
    if board in chromeos_boards.nohwqual_boards:
      board_config.apply(hwqual=False)
    if board in chromeos_boards.base_layout_boards:
      board_config.apply(disk_layout='base')
    if board in chromeos_boards.beaglebone_boards:
      board_config.apply(site_config.templates.beaglebone)
    if board in chromeos_boards.builder_incompatible_binaries_boards:
      board_config.apply(unittests=False)

    result[board] = board_config

  return result


def CreateInternalBoardConfigs(site_config, boards_dict, ge_build_config):
  """Create mixin templates for each board."""
  result = CreateBoardConfigs(
      site_config, boards_dict, ge_build_config)

  for board in boards_dict['internal_boards']:
    if board in result:
      result[board].apply(site_config.templates.internal,
                          site_config.templates.official_chrome,
                          manifest=constants.OFFICIAL_MANIFEST)

  return result


def UpdateBoardConfigs(board_configs, boards, *args, **kwargs):
  """Update "board_configs" for selected chromeos_boards.

  Args:
    board_configs: Dict in CreateBoardConfigs format to filter from.
    boards: Iterable of boards to update in the dict.
    args: List of templates to apply.
    kwargs: Individual keys to update.

  Returns:
    Copy of board_configs dict with boards boards update with templates
    and values applied.
  """
  result = board_configs.copy()
  for b in boards:
    result[b] = result[b].derive(*args, **kwargs)

  return result


def ToolchainBuilders(site_config, boards_dict, ge_build_config):
  """Define templates used for toolchain builders.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)
  hw_test_list = HWTestList(ge_build_config)

  site_config.AddTemplate(
      'base_toolchain',
      # Full build, AFDO, latest-toolchain, -cros-debug, and simple-chrome.
      site_config.templates.full,
      display_label=config_lib.DISPLAY_LABEL_TOOLCHAIN,
      build_type=constants.TOOLCHAIN_TYPE,
      build_timeout=(15 * 60 + 50) * 60,
      # Need to re-enable platform_SyncCrash after issue crosbug/658864 is
      # fixed. Need to re-enable network_VPNConnect.* tests after issue
      # crosbug/585936 is fixed. Need to re-enable
      # power_DarkResumeShutdownServer after issue crosbug/689598 is fixed.
      # According to crosbug/653496 security_OpenFDs will not work for
      # non-official builds, so we need to leave it permanently disabled.
      # Need to reenable power_DarkResumeDisplay after crosbug/703250 is fixed.
      # Need to reenable cheets_SELinuxTest after crosbug/693308 is fixed.
      # Add strict_toolchain_checks to perform toolchain-related checks
      useflags=config_lib.append_useflags([
          '-cros-debug',
          '-tests_security_OpenFDs',
          '-tests_platform_SyncCrash',
          '-tests_network_VPNConnect.l2tpipsec_xauth',
          '-tests_network_VPNConnect.l2tpipsec_psk',
          '-tests_power_DarkResumeShutdownServer',
          '-tests_power_DarkResumeDisplay',
          '-tests_cheets_SELinuxTest',
          'thinlto',
          'strict_toolchain_checks']),
      latest_toolchain=True,
      enable_skylab_hw_tests=True,
      debuginfo_test=True,
  )

  site_config.AddTemplate(
      'toolchain',
      site_config.templates.base_toolchain,
      site_config.templates.internal,
      site_config.templates.official_chrome,
      site_config.templates.no_vmtest_builder,
      images=['base', 'test', 'recovery'],
      manifest=constants.OFFICIAL_MANIFEST,
      manifest_version=True,
      git_sync=False,
      description='Toolchain Builds (internal)',
  )
  site_config.AddTemplate(
      'gcc_toolchain',
      site_config.templates.toolchain,
      description='Full release build with next minor GCC toolchain revision',
      useflags=config_lib.append_useflags(['next_gcc']),
      hw_tests=hw_test_list.ToolchainTestFull(
          constants.HWTEST_QUOTA_POOL,
          quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
      ),
      hw_tests_override=hw_test_list.ToolchainTestFull(
          constants.HWTEST_QUOTA_POOL,
          quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
      ),
  )
  site_config.AddTemplate(
      'llvm_toolchain',
      site_config.templates.toolchain,
      description='Full release build with LLVM toolchain',
      hw_tests=hw_test_list.ToolchainTestMedium(
          constants.HWTEST_QUOTA_POOL,
          quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
      ),
      hw_tests_override=hw_test_list.ToolchainTestMedium(
          constants.HWTEST_QUOTA_POOL,
          quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
      ),
  )
  site_config.AddTemplate(
      'llvm_next_toolchain',
      site_config.templates.llvm_toolchain,
      description='Full release build with LLVM (next) toolchain',
      useflags=config_lib.append_useflags(['llvm-next']),
  )
  site_config.AddTemplate(
      'llvm_tot_toolchain',
      site_config.templates.llvm_toolchain,
      useflags=config_lib.append_useflags(['llvm-tot']),
      description='Full release builds with a near-top-of-tree LLVM. Since '
      'this uses internal sources, it should only be used with LLVM revisions '
      'that have been reviewed manually somehow',
  )

  site_config.AddTemplate(
      'afdo_toolchain',
      site_config.templates.full,
      site_config.templates.official,
      site_config.templates.internal,
      site_config.templates.no_vmtest_builder,
      site_config.templates.no_hwtest_builder,
      git_sync=False,
      images=[],
      unittests=False,
      image_test=False,
      chrome_sdk=False,
      paygen=False,
      signer_tests=False,
      useflags=config_lib.append_useflags(['-cros-debug']),
      display_label=config_lib.DISPLAY_LABEL_TOOLCHAIN,
  )

  site_config.AddTemplate(
      'afdo_verify',
      site_config.templates.afdo_toolchain,
      images=['base', 'test'],
      image_test=True,
      unittests=True,
  )
  # This build config is dedicated to improve code layout of Chrome. It adopts
  # the Call-Chain Clustering (C3) approach and other techniques to improve
  # the code layout. It builds Chrome and generates an orderfile as a result.
  # The orderfile will be uploaded so Chrome in the future production will use
  # the orderfile to improve code layout.
  #
  # This builder is not a toolchain builder, i.e. it won't build all the
  # toolchain. Instead, it's a release builder. It's put here because it
  # belongs to the toolchain team.

  site_config.AddTemplate(
      'orderfile_generate_toolchain',
      site_config.templates.afdo_toolchain,
      orderfile_generate=True,
      useflags=config_lib.append_useflags(['orderfile_generate',
                                           '-orderfile_use']),
      description='Build Chrome and generate an orderfile for better layout',
  )

  site_config.AddTemplate(
      'orderfile_verify_toolchain',
      site_config.templates.afdo_verify,
      orderfile_verify=True,
      useflags=config_lib.append_useflags(['orderfile_verify',
                                           '-reorder_text_sections',
                                           'strict_toolchain_checks']),
      description='Verify the most recent orderfile is building correctly',
  )

  # This build config is used to asynchronously generate benchmark
  # AFDO profile. It inherites from afdo_toolchain template, i.e.
  # it is essentially a release builder but doesn't run hwtests, etc.
  # But it should run a special HWTest "AFDOGenerate" to collect
  # profiling data on a device. So this template needs to build image.
  site_config.AddTemplate(
      'benchmark_afdo_generate',
      site_config.templates.afdo_toolchain,
      images=['test'],
      hw_tests=[hw_test_list.AFDORecordTest()],
      hw_tests_override=[hw_test_list.AFDORecordTest()],
      afdo_generate_async=True,
      # FIXME(tcwang): Might need to revisit this later.
      # For now, use the same useflags as PFQ AFDO generator:
      # In other words, it turns off afdo_use, thinlto, cfi compared to
      # release images.
      afdo_use=False,
      useflags=config_lib.append_useflags(['-transparent_hugepage',
                                           '-debug_fission',
                                           '-thinlto',
                                           '-cfi']),
      description='Generate AFDO profile based on benchmarks.'
  )

  # This build config is used to verify merged and redacted AFDO profile,
  # aka. profiles for release, can build packages without any problems.
  site_config.AddTemplate(
      'release_afdo_verify',
      site_config.templates.afdo_verify,
      description='Verify the most recent AFDO profile for release can '
                  'build Chrome images correctly.'
  )

  #
  # Create toolchain tryjob builders.
  #
  builder_to_boards_dict = config_lib.GroupBoardsByBuilder(
      ge_build_config[config_lib.CONFIG_TEMPLATE_BOARDS])

  toolchain_tryjob_boards = builder_to_boards_dict[
      config_lib.CONFIG_TEMPLATE_RELEASE] | boards_dict['all_boards']

  site_config.AddForBoards(
      'llvm-toolchain',
      toolchain_tryjob_boards,
      board_configs,
      site_config.templates.llvm_toolchain,
  )
  site_config.AddForBoards(
      'llvm-next-toolchain',
      toolchain_tryjob_boards,
      board_configs,
      site_config.templates.llvm_next_toolchain,
  )

  # All *-generic boards are external.
  site_config.Add(
      'eve-llvm-tot-toolchain',
      site_config.templates.llvm_tot_toolchain,
      vm_tests=[config_lib.VMTestConfig(
          constants.VM_SUITE_TEST_TYPE,
          test_suite='smoke',
          use_ctest=False)],
      vm_tests_override=TRADITIONAL_VM_TESTS_SUPPORTED,
      boards=['eve'],
  )
  site_config.Add(
      'kevin-llvm-tot-toolchain',
      site_config.templates.llvm_tot_toolchain,
      site_config.templates.no_vmtest_builder,
      boards=['kevin'],
  )

  site_config.Add(
      'benchmark-afdo-generate',
      site_config.templates.benchmark_afdo_generate,
      boards=['chell'],
      # This builder is now running under recipes.
      # TODO(crbug/1019868): remove this builder from legacy.
  )

  def ChromeAFDOPublishBuilders(name, board):
    site_config.Add(
        'chrome-' + name + '-release-afdo-verify',
        site_config.templates.release_afdo_verify,
        boards=[board],
        chrome_afdo_verify=True,
        afdo_use=False,
        useflags=config_lib.append_useflags(['afdo_verify']),
        # These builders are now running under recipes.
        # TODO(crbug/1019868): remove this builder from legacy.
        # schedule=schedule,
    )

  # Start at 7 hours after benchmark-afdo-generate, to
  # give the builder enough time to finish.
  # Since these builders upload different profiles, we can start
  # them at the same time, as soon as we might get a new benchmark
  # profile.
  ChromeAFDOPublishBuilders('silvermont', 'samus')
  ChromeAFDOPublishBuilders('airmont', 'snappy')
  ChromeAFDOPublishBuilders('broadwell', 'eve')

  def KernelAFDOPublishBuilders(name, board, _schedule):
    site_config.Add(
        name + '-release-afdo-verify',
        site_config.templates.release_afdo_verify,
        boards=[board],
        kernel_afdo_verify=True,
        # These builders are now running under recipes.
        # TODO(crbug/1019868): remove this builder from legacy.
        # schedule=schedule,
    )

  # Start at the same time every day. The kernel profiles are
  # rolled every Monday, but we run these builders daily (instead of
  # weekly), in case the Monday profile drop is red, or in case
  # the tree is red for unrelated reasons on Monday.
  # Schedule these tryjobs 6 hours apart from each other.
  KernelAFDOPublishBuilders('kernel-3_18', 'chell', '0 17 * * *')
  KernelAFDOPublishBuilders('kernel-4_4', 'eve', '0 23 * * *')
  KernelAFDOPublishBuilders('kernel-4_14', 'auron_yuna', '0 5 * * *')
  KernelAFDOPublishBuilders('kernel-4_19', 'banon', '0 11 * * *')

  site_config.Add(
      'orderfile-generate-toolchain',
      site_config.templates.orderfile_generate_toolchain,
      # The board should not matter much, since we are not running
      # anything on the board.
      boards=['terra'],
      # This builder is now running under recipes.
      # TODO(crbug/1019868): remove this builder from legacy.
      # schedule='0 10/12 * * *',
  )

  site_config.Add(
      'orderfile-verify-toolchain',
      site_config.templates.orderfile_verify_toolchain,
      # Only test on X86 for now.
      boards=['eve'],
      # This builder is now running under recipes.
      # TODO(crbug/1019868): remove this builder from legacy.
      # schedule='0 2/12 * * *',
  )

  # This config is manually run when we want to generate a 'release' AFDO
  # profile, which is a mixture of CWP/benchmark profiles. This is done
  # manually once per branch, since these are (currently) hand-rolled into
  # branches for Android and Linux builds of Chrome. See crbug.com/858856 for
  # context (comment #4 in particular).
  #
  # FIXME(gbiv): Ideally, this should be done as a part of the regular AFDO
  # pipeline if Chrome OS finds these profiles useful.
  site_config.Add(
      'release-afdo-profile-generate',
      # No board is necessary; this just runs a few commands inside of the SDK.
      boards=[],
      build_type=constants.TOOLCHAIN_TYPE,
      builder_class_name='release_profile_builders.ReleaseProfileMergeBuilder',
      chrome_sdk=False,
      description='Generates merged AFDO profiles for select Chrome releases',
      display_label=config_lib.DISPLAY_LABEL_TOOLCHAIN,
  )


def AndroidTemplates(site_config):
  """Apply Android specific config to site_config

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
  """
  # Generic template shared by all Android versions.
  site_config.AddTemplate(
      'generic_android_pfq',
      site_config.templates.no_vmtest_builder,
      build_type=constants.ANDROID_PFQ_TYPE,
      uprev=False,
      overlays=constants.BOTH_OVERLAYS,
      manifest_version=True,
      sync_chrome=True,
      android_rev=constants.ANDROID_REV_LATEST,
      description='Preflight Android Uprev & Build (internal)',
      luci_builder=config_lib.LUCI_BUILDER_PFQ,
      # Raise Android PFQ timeout to 8 hours to allow for longer runs to
      # complete successfully.
      build_timeout=8 * 60 * 60,
  )

  # Template for Android Pi.
  site_config.AddTemplate(
      'pi_android_pfq',
      site_config.templates.generic_android_pfq,
      site_config.templates.internal,
      display_label=config_lib.DISPLAY_LABEL_PI_ANDROID_PFQ,
      android_package='android-container-pi',
      android_import_branch=constants.ANDROID_PI_BUILD_BRANCH,
  )

  # Template for Android VM Rvc.
  site_config.AddTemplate(
      'vmrvc_android_pfq',
      site_config.templates.generic_android_pfq,
      site_config.templates.internal,
      display_label=config_lib.DISPLAY_LABEL_VMRVC_ANDROID_PFQ,
      android_package='android-vm-rvc',
      android_import_branch=constants.ANDROID_VMRVC_BUILD_BRANCH,
  )

  # Template for Android VM Master.
  site_config.AddTemplate(
      'vmmst_android_pfq',
      site_config.templates.generic_android_pfq,
      site_config.templates.internal,
      display_label=config_lib.DISPLAY_LABEL_VMMST_ANDROID_PFQ,
      android_package='android-vm-master',
      android_import_branch=constants.ANDROID_VMMST_BUILD_BRANCH,
  )

  # Mixin for masters.
  site_config.AddTemplate(
      'master_android_pfq_mixin',
      site_config.templates.internal,
      site_config.templates.no_vmtest_builder,
      boards=[],
      master=True,
      push_overlays=constants.BOTH_OVERLAYS,
  )


def AndroidPfqBuilders(site_config, boards_dict, ge_build_config):
  """Create all build configs associated with the Android PFQ.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)
  hw_test_list = HWTestList(ge_build_config)
  # TODO(b/153392483): Temporarily remove bvt-arc from list of test
  # suites blocking RVC PFQ.
  vmrvc_hwtest_list = [hwtest for hwtest in hw_test_list.SharedPoolPFQ()
                       if hwtest.suite != constants.HWTEST_ARC_COMMIT_SUITE]

  # Android VM MST master
  vmmst_master_config = site_config.Add(
      constants.VMMST_ANDROID_PFQ_MASTER,
      site_config.templates.vmmst_android_pfq,
      site_config.templates.master_android_pfq_mixin,
      schedule='with 150m interval'
  )
  _vmmst_no_hwtest_boards = frozenset([
      'betty-arcvm-master', # No HWTest, No VMTest.
      'hatch-arc-s',
  ])

  # Android PI master.
  pi_master_config = site_config.Add(
      constants.PI_ANDROID_PFQ_MASTER,
      site_config.templates.pi_android_pfq,
      site_config.templates.master_android_pfq_mixin,
      build_timeout=10 * 60 * 60,
      schedule='with 60m interval',
  )

  _pi_no_hwtest_boards = frozenset([
      'caroline',
      'coral',
      'eve', # TODO(b/172889735): Temporary no_hwtest.
      'reef',
  ])
  _pi_no_hwtest_experimental_boards = frozenset([])
  _pi_hwtest_boards = frozenset([
      # TODO(b/172889735): Temporary disable eve because DUTs are reserved
      # due to crbug/1141713. Instead, adding rammus to cover x86_64.
      # 'eve',
      'grunt',
      'kevin',
      'rammus',
  ])
  _pi_hwtest_experimental_boards = frozenset([])
  _pi_hwtest_skylab_boards = frozenset([
      # 'eve', TODO(b/172889735): See above.
      'grunt',
      'kevin',
      'rammus',
  ])
  _pi_vmtest_boards = frozenset([
      'betty-pi-arc',
  ])
  _pi_vmtest_experimental_boards = frozenset([
  ])

  # Android VM RVC master.
  vmrvc_master_config = site_config.Add(
      constants.VMRVC_ANDROID_PFQ_MASTER,
      site_config.templates.vmrvc_android_pfq,
      site_config.templates.master_android_pfq_mixin,
      schedule='with 60m interval',
  )

  _vmrvc_no_hwtest_boards = frozenset([])
  _vmrvc_no_hwtest_experimental_boards = frozenset([])
  _vmrvc_hwtest_boards = frozenset([
      'grunt-arc-r',
      'hatch-arc-r',
      'kukui-arc-r',
      'rammus-arc-r',
  ])
  _vmrvc_hwtest_experimental_boards = frozenset([])
  _vmrvc_vmtest_boards = frozenset([])
  _vmrvc_vmtest_experimental_boards = frozenset([])

  # Android VMMST slaves.
  # No board to build for now (just roll). empty slave to pass test.
  vmmst_master_config.AddSlaves(
      site_config.AddForBoards(
          'vmmst-android-pfq',
          _vmmst_no_hwtest_boards,
          board_configs,
          site_config.templates.vmmst_android_pfq,
      )
  )

  # Android PI slaves.
  pi_master_config.AddSlaves(
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_hwtest_boards - _pi_hwtest_skylab_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          hw_tests=hw_test_list.SharedPoolPFQ(),
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_hwtest_skylab_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          enable_skylab_hw_tests=True,
          hw_tests=hw_test_list.SharedPoolPFQ(),
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_no_hwtest_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_no_hwtest_experimental_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          important=False,
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_hwtest_experimental_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          important=False,
          hw_tests=hw_test_list.SharedPoolPFQ(),
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_vmtest_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                            test_suite='smoke')],
      ) +
      site_config.AddForBoards(
          'pi-android-pfq',
          _pi_vmtest_experimental_boards,
          board_configs,
          site_config.templates.pi_android_pfq,
          important=False,
          vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                            test_suite='smoke')],
      )
  )

  # Android VMRVC slaves.
  vmrvc_master_config.AddSlaves(
      site_config.AddForBoards(
          'vmrvc-android-pfq',
          _vmrvc_hwtest_boards,
          board_configs,
          site_config.templates.vmrvc_android_pfq,
          enable_skylab_hw_tests=True,
          hw_tests=vmrvc_hwtest_list,
      ) +
      site_config.AddForBoards(
          'vmrvc-android-pfq',
          _vmrvc_hwtest_experimental_boards,
          board_configs,
          site_config.templates.vmrvc_android_pfq,
          enable_skylab_hw_tests=True,
          hw_tests=vmrvc_hwtest_list,
          important=False,
      ) +
      site_config.AddForBoards(
          'vmrvc-android-pfq',
          _vmrvc_no_hwtest_boards,
          board_configs,
          site_config.templates.vmrvc_android_pfq,
      ) +
      site_config.AddForBoards(
          'vmrvc-android-pfq',
          _vmrvc_no_hwtest_experimental_boards,
          board_configs,
          site_config.templates.vmrvc_android_pfq,
          important=False,
      ) +
      site_config.AddForBoards(
          'vmrvc-android-pfq',
          _vmrvc_vmtest_boards,
          board_configs,
          site_config.templates.vmrvc_android_pfq,
          vm_tests=[config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                            test_suite='smoke')],
      )
  )


def FullBuilders(site_config, boards_dict, ge_build_config):
  """Create all full builders.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  active_builders = frozenset([
      'amd64-generic',
      'arm-generic',
      'arm64-generic',
      'eve',
      'kevin',
      'kevin64',
      'oak',
      'tael',
      'tatl',
  ])

  # Move the following builders to active_builders once they are consistently
  # green.
  unstable_builders = frozenset([
      'lakitu',  # TODO: Re-enable after crbug.com/919630 resolved.
  ])

  external_board_configs = CreateBoardConfigs(
      site_config, boards_dict, ge_build_config)

  site_config.AddForBoards(
      config_lib.CONFIG_TYPE_FULL,
      boards_dict['all_full_boards'],
      external_board_configs,
      site_config.templates.full,
      site_config.templates.build_external_chrome,
      run_cpeexport=True,
      internal=False,
      manifest_repo_url=config_lib.GetSiteParams().MANIFEST_URL,
      manifest_branch='main',
      overlays=constants.PUBLIC_OVERLAYS,
      prebuilts=constants.PUBLIC)

  master_config = site_config.Add(
      'master-full',
      site_config.templates.full,
      site_config.templates.internal,
      site_config.templates.build_external_chrome,
      boards=[],
      master=True,
      manifest_version=True,
      overlays=constants.PUBLIC_OVERLAYS,
      slave_configs=[],
      schedule='0 */3 * * *',
  )

  master_config.AddSlaves(
      site_config.ApplyForBoards(
          config_lib.CONFIG_TYPE_FULL,
          active_builders,
          manifest_version=True,
      )
  )

  master_config.AddSlaves(
      site_config.ApplyForBoards(
          config_lib.CONFIG_TYPE_FULL,
          unstable_builders,
          manifest_version=True,
          important=False,
      )
  )


def IncrementalBuilders(site_config, boards_dict, ge_build_config):
  """Create all incremental build configs.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)

  site_config.AddTemplate(
      'incremental_affinity',
      build_affinity=True,
      luci_builder=config_lib.LUCI_BUILDER_INCREMENTAL,
  )

  master_config = site_config.Add(
      'master-incremental',
      site_config.templates.incremental,
      site_config.templates.internal_incremental,
      boards=[],
      master=True,
      manifest_version=True,
      slave_configs=[],
      schedule='with 10m interval',
  )

  # Build external source, for an internal board.
  master_config.AddSlave(
      site_config.Add(
          'amd64-generic-incremental',
          site_config.templates.incremental,
          site_config.templates.incremental_affinity,
          board_configs['amd64-generic'],
          manifest_version=True,
      )
  )

  master_config.AddSlave(
      site_config.Add(
          'betty-incremental',
          site_config.templates.incremental,
          site_config.templates.internal_incremental,
          site_config.templates.incremental_affinity,
          boards=['betty'],
          manifest_version=True,
      )
  )

  master_config.AddSlave(
      site_config.Add(
          'chell-incremental',
          site_config.templates.incremental,
          site_config.templates.internal_incremental,
          site_config.templates.incremental_affinity,
          boards=['chell'],
          manifest_version=True,
      )
  )

  master_config.AddSlave(
      site_config.Add(
          'lakitu-incremental',
          site_config.templates.incremental,
          site_config.templates.internal_incremental,
          site_config.templates.incremental_affinity,
          site_config.templates.lakitu_notification_emails,
          board_configs['lakitu'],
          manifest_version=True,
      )
  )

  #
  # Available, but not regularly scheduled.
  #
  site_config.Add(
      'x32-generic-incremental',
      site_config.templates.incremental,
      board_configs['x32-generic'],
  )

  site_config.Add(
      'beaglebone-incremental',
      site_config.templates.incremental,
      site_config.templates.beaglebone,
      boards=['beaglebone'],
      description='Incremental Beaglebone Builder',
  )


def InformationalBuilders(site_config, boards_dict, ge_build_config):
  """Create all informational builders.

  We have a number of informational builders that are built, but whose output is
  not directly used for anything other than reporting success or failure.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  internal_board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)

  _chrome_boards = frozenset(
      board for board, config in internal_board_configs.items()
      if config.get('sync_chrome', True))

  site_config.Add(
      'amd64-generic-asan',
      site_config.templates.asan,
      site_config.templates.incremental,
      site_config.templates.no_hwtest_builder,
      site_config.templates.build_external_chrome,
      site_config.templates.informational,
      boards=['amd64-generic'],
      description='Build with Address Sanitizer (Clang)',
      # Every 3 hours.
      schedule='0 */3 * * *',
      board_replace=True,
  )

  site_config.Add(
      'betty-asan',
      site_config.templates.asan,
      site_config.templates.incremental,
      site_config.templates.no_hwtest_builder,
      site_config.templates.internal,
      site_config.templates.informational,
      boards=['betty'],
      description='Build with Address Sanitizer (Clang)',
      # Once every day. 3 PM UTC is 7 AM PST (no daylight savings).
      # Currently disabled, to schedule uncomment the next line.
      # schedule='0 15 * * *',
      board_replace=True,
      vm_tests=[],
  )

  site_config.Add(
      'amd64-generic-fuzzer',
      site_config.templates.fuzzer,
      boards=['amd64-generic'],
      description='Build for fuzzing testing',
      # THESE IMAGES CAN DAMAGE THE LAB and cannot be used for hardware testing.
      disk_layout='4gb-rootfs',
      image_test=None,
      # Every 3 hours.
      schedule='0 */3 * * *',
      board_replace=True,
  )

  site_config.Add(
      'amd64-generic-coverage-fuzzer',
      site_config.templates.fuzzer,
      boards=['amd64-generic'],
      profile='coverage-fuzzer',
      description='Build for fuzzing coverage testing',
      gs_path='gs://chromeos-fuzzing-artifacts/libfuzzer-coverage',
      disk_layout='4gb-rootfs',
      image_test=None,
      # Every 3 hours.
      # Currently disabled, to schedule uncomment the next line.
      # schedule='0 */3 * * *',
      board_replace=True,
  )

  site_config.Add(
      'amd64-generic-msan-fuzzer',
      site_config.templates.fuzzer,
      boards=['amd64-generic'],
      profile='msan-fuzzer',
      description='Build for msan fuzzing testing',
      gs_path='gs://chromeos-fuzzing-artifacts/libfuzzer-msan',
      disk_layout='4gb-rootfs',
      image_test=None,
      # Every 3 hours.
      schedule='0 */3 * * *',
      board_replace=True,
  )

  site_config.Add(
      'amd64-generic-ubsan',
      site_config.templates.ubsan,
      site_config.templates.incremental,
      site_config.templates.no_hwtest_builder,
      site_config.templates.informational,
      boards=['amd64-generic'],
      description='Build with Undefined Behavior Sanitizer (Clang)',
      # THESE IMAGES CAN DAMAGE THE LAB and cannot be used for hardware testing.
      disk_layout='16gb-rootfs',
      # Every 3 hours.
      schedule='0 */3 * * *',
      board_replace=True,
      vm_tests=[],
  )

  site_config.Add(
      'amd64-generic-ubsan-fuzzer',
      site_config.templates.fuzzer,
      boards=['amd64-generic'],
      profile='ubsan-fuzzer',
      description='Build for fuzzing testing',
      gs_path='gs://chromeos-fuzzing-artifacts/libfuzzer-ubsan',
      disk_layout='4gb-rootfs',
      image_test=None,
      # Every 3 hours.
      schedule='0 */3 * * *',
      board_replace=True,
  )


def FirmwareBuilders(site_config, _boards_dict, _ge_build_config):
  """Create all firmware build configs.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  # pylint: disable=unused-variable
  # Defines "interval", "branch", "boards", "kwargs" for firmwarebranch builds.
  #
  # Intervals:
  NONE = ''  # Do not schedule automatically.
  DAILY = 'with 24h interval'  # 1 day interval
  WEEKLY = 'with 168h interval'  # 1 week interval
  MONTHLY = 'with 720h interval'  # 30 day interval
  # Override these template variables via kwargs.
  GSC = {'sign_types': ['gsc_firmware']}
  firmware_branch_builders = [
      (MONTHLY, 'firmware-monroe-4921.B', ['monroe'], {}),
      (MONTHLY, 'firmware-enguarde-5216.201.B', ['enguarde'], {}),
      (MONTHLY, 'firmware-expresso-5216.223.B', ['expresso'], {}),
      (MONTHLY, 'firmware-kip-5216.227.B', ['kip'], {}),
      (MONTHLY, 'firmware-swanky-5216.238.B', ['swanky'], {}),
      (MONTHLY, 'firmware-gnawty-5216.239.B', ['gnawty'], {}),
      (MONTHLY, 'firmware-winky-5216.265.B', ['winky'], {}),
      (MONTHLY, 'firmware-candy-5216.310.B', ['candy'], {}),
      (MONTHLY, 'firmware-cr50-9308.B', ['reef'], GSC),
      (MONTHLY, 'firmware-cr50-guc-factory-9308.26.B', ['reef'], GSC),
      (MONTHLY, 'firmware-cr50-mp-release-9308.87.B', ['reef'], GSC),
      (MONTHLY, 'firmware-banjo-5216.334.B', ['banjo'], {}),
      (MONTHLY, 'firmware-orco-5216.362.B', ['orco'], {}),
      (MONTHLY, 'firmware-sumo-5216.382.B', ['sumo'], {}),
      (MONTHLY, 'firmware-ninja-5216.383.B', ['ninja'], {}),
      (MONTHLY, 'firmware-heli-5216.392.B', ['heli'], {}),
      (MONTHLY, 'firmware-nyan-5771.B', ['nyan_big', 'nyan_blaze'], {}),
      (MONTHLY, 'firmware-kitty-5771.61.B', ['nyan_kitty'], {}),
      (MONTHLY, 'firmware-samus-6300.B', ['samus'], {}),
      (MONTHLY, 'firmware-paine-6301.58.B', ['auron_paine'], {}),
      (MONTHLY, 'firmware-yuna-6301.59.B', ['auron_yuna'], {}),
      (MONTHLY, 'firmware-guado-6301.108.B', ['guado'], {}),
      (MONTHLY, 'firmware-tidus-6301.109.B', ['tidus'], {}),
      (MONTHLY, 'firmware-rikku-6301.110.B', ['rikku'], {}),
      (MONTHLY, 'firmware-lulu-6301.136.B', ['lulu'], {}),
      (MONTHLY, 'firmware-gandof-6301.155.B', ['gandof'], {}),
      (MONTHLY, 'firmware-buddy-6301.202.B', ['buddy'], {}),
      (MONTHLY, 'firmware-veyron-6588.B', [
          'veyron_mighty',
          'veyron_speedy', 'veyron_jaq',
          'veyron_minnie',
          'veyron_mickey', 'veyron_rialto', 'veyron_tiger',
          'veyron_fievel'], {}),
      (MONTHLY, 'firmware-glados-7820.B', [
          'glados', 'chell', 'lars',
          'sentry', 'cave', 'asuka', 'caroline'], {}),
      (MONTHLY, 'firmware-strago-7287.B', [
          'wizpig', 'setzer', 'banon', 'kefka', 'relm'], {}),
      (MONTHLY, 'firmware-cyan-7287.57.B', ['cyan'], {}),
      (MONTHLY, 'firmware-celes-7287.92.B', ['celes'], {}),
      (MONTHLY, 'firmware-ultima-7287.131.B', ['ultima'], {}),
      (MONTHLY, 'firmware-reks-7287.133.B', ['reks'], {}),
      (MONTHLY, 'firmware-terra-7287.154.B', ['terra'], {}),
      (MONTHLY, 'firmware-edgar-7287.167.B', ['edgar'], {}),
      (MONTHLY, 'firmware-smaug-7900.B', ['smaug'], {}),
      (MONTHLY, 'firmware-gale-8281.B', ['gale'], {}),
      (MONTHLY, 'firmware-oak-8438.B', ['oak', 'elm', 'hana'], {}),
      (MONTHLY, 'firmware-gru-8785.B', ['gru', 'kevin', 'bob'], {}),
      (MONTHLY, 'firmware-reef-9042.B', [
          'reef', 'pyro', 'sand', 'snappy'], {}),
      (MONTHLY, 'firmware-eve-9584.B', ['eve'], {}),
      (MONTHLY, 'firmware-coral-10068.B', ['coral'], {}),
      (MONTHLY, 'firmware-fizz-10139.B', ['fizz'], {}),
      (MONTHLY, 'firmware-fizz-10139.94.B', ['fizz'], {}),
      (MONTHLY, 'firmware-scarlet-10388.B', ['scarlet'], {}),
      (MONTHLY, 'firmware-poppy-10431.B', ['poppy', 'soraka', 'nautilus'], {}),
      (MONTHLY, 'firmware-nami-10775.B', ['nami'], {}),
      (MONTHLY, 'firmware-nocturne-10984.B', ['nocturne'], {}),
      (MONTHLY, 'firmware-grunt-11031.B', ['grunt'], {}),
      (MONTHLY, 'firmware-nami-10775.108.B', ['nami'], {}),
      (WEEKLY, 'firmware-rammus-11275.B', ['rammus'], {}),
      (WEEKLY, 'firmware-octopus-11297.B', ['octopus'], {}),
      (WEEKLY, 'firmware-kalista-11343.B', ['kalista'], {}),
      (WEEKLY, 'firmware-atlas-11827.B', ['atlas'], {}),
      (WEEKLY, 'firmware-sarien-12200.B', ['sarien'], {}),
      (WEEKLY, 'firmware-mistral-12422.B', ['mistral'], {}),
      (WEEKLY, 'firmware-kukui-12573.B', ['kukui', 'jacuzzi'], {}),
      (WEEKLY, 'firmware-hatch-12672.B', ['hatch'], {}),
      (WEEKLY, 'firmware-servo-12768.B', ['nautilus'], {}),
      (DAILY, 'firmware-drallion-12930.B', ['drallion'], {}),
      (DAILY, 'firmware-endeavour-13259.B', ['endeavour'], {}),
      (DAILY, 'firmware-puff-13324.B', ['puff', 'ambassador'], {}),
      (DAILY, 'firmware-zork-13434.B', ['zork'], {}),
      (DAILY, 'firmware-trogdor-13577.B', ['strongbad', 'trogdor'], {}),
      (DAILY, 'firmware-dedede-13606.B', ['dedede'], {}),
      (DAILY, 'firmware-volteer-13672.B', ['volteer'], {}),
      (NONE, 'firmware-octopus-11297.196.B', ['octopus'], {}), # b/178093560
  ]

  for interval, branch, boards, kwargs in firmware_branch_builders:
    site_config.Add(
        '%s-firmwarebranch' % branch,
        site_config.templates.firmwarebranch,
        boards=boards,
        workspace_branch=branch,
        schedule=interval,
        **kwargs)


def FactoryBuilders(site_config, _boards_dict, _ge_build_config):
  """Create all factory build configs.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  # pylint: disable=unused-variable
  # Intervals:
  # None: Do not schedule automatically.
  DAILY = 'with 24h interval'  # 1 day interval
  WEEKLY = 'with 168h interval'  # 1 week interval
  MONTHLY = 'with 720h interval'  # 30 day interval
  branch_builders = [
      (MONTHLY, 'factory-rambi-5517.B', [
          'enguarde', 'expresso', 'kip', 'swanky', 'winky']),
      (MONTHLY, 'factory-nyan-5772.B', [
          'nyan_big', 'nyan_blaze', 'nyan_kitty']),
      (MONTHLY, 'factory-rambi-6420.B', [
          'enguarde', 'candy', 'banjo',
          'ninja', 'sumo', 'orco', 'heli', 'gnawty']),
      (MONTHLY, 'factory-auron-6459.B', [
          'auron_paine', 'auron_yuna', 'lulu',
          'gandof', 'buddy']),
      (MONTHLY, 'factory-whirlwind-6509.B', ['whirlwind']),
      (MONTHLY, 'factory-veyron-6591.B', [
          'veyron_mighty',
          'veyron_speedy', 'veyron_jaq',
          'veyron_minnie', 'veyron_mickey']),
      (MONTHLY, 'factory-auron-6772.B', [
          'guado', 'tidus', 'rikku', 'buddy']),
      (MONTHLY, 'factory-whirlwind-6812.41.B', ['whirlwind']),
      (MONTHLY, 'factory-strago-7458.B', [
          'cyan', 'celes', 'ultima', 'reks', 'terra', 'edgar',
          'wizpig', 'setzer', 'banon', 'kefka', 'relm', 'kip']),
      (MONTHLY, 'factory-veyron-7505.B', [
          'veyron_mickey', 'veyron_tiger', 'veyron_fievel', 'veyron_rialto']),
      (MONTHLY, 'factory-glados-7657.B', ['glados', 'chell']),
      (MONTHLY, 'factory-glados-7828.B', [
          'glados', 'chell', 'lars',
          'sentry', 'cave', 'asuka', 'caroline']),
      (MONTHLY, 'factory-oak-8182.B', ['elm', 'hana']),
      (MONTHLY, 'factory-gru-8652.B', ['kevin']),
      (MONTHLY, 'factory-gale-8743.19.B', ['gale']),
      (MONTHLY, 'factory-reef-8811.B', ['reef', 'pyro', 'sand', 'snappy']),
      (MONTHLY, 'factory-gru-9017.B', ['gru', 'bob']),
      (MONTHLY, 'factory-eve-9667.B', ['eve']),
      (MONTHLY, 'factory-coral-10122.B', ['coral']),
      (MONTHLY, 'factory-fizz-10167.B', ['fizz', 'fizz-accelerator']),
      (MONTHLY, 'factory-scarlet-10211.B', ['scarlet']),
      (MONTHLY, 'factory-soraka-10323.39.B', ['soraka']),
      (MONTHLY, 'factory-poppy-10504.B', ['nautilus']),
      (MONTHLY, 'factory-nami-10715.B', ['nami', 'kalista']),
      (MONTHLY, 'factory-nocturne-11066.B', ['nocturne']),
      (MONTHLY, 'factory-grunt-11164.B', ['grunt']),
      (MONTHLY, 'factory-rammus-11289.B', ['rammus']),
      (WEEKLY, 'factory-octopus-11512.B', ['octopus']),
      (WEEKLY, 'factory-atlas-11907.B', ['atlas']),
      (WEEKLY, 'factory-sarien-12033.B', ['sarien']),
      (WEEKLY, 'factory-mistral-12361.B', ['mistral']),
      (WEEKLY, 'factory-kukui-12587.B', ['kukui', 'jacuzzi']),
      (WEEKLY, 'factory-hatch-12692.B', ['hatch']),
      (WEEKLY, 'factory-excelsior-12812.B', ['excelsior']),
      (WEEKLY, 'factory-drallion-13080.B', ['drallion']),
      (DAILY, 'factory-endeavour-13295.B', ['endeavour']),
      (WEEKLY, 'factory-puff-13329.B', ['puff']),
      (WEEKLY, 'factory-zork-13427.B', ['zork']),
      (DAILY, 'factory-trogdor-13443.B', ['trogdor', 'strongbad']),
      (DAILY, 'factory-volteer-13600.B', ['volteer']),
      (DAILY, 'factory-dedede-13683.B', ['dedede']),
      (WEEKLY, 'factory-zork-13700.B', ['zork']),
      # This is intended to create master branch tryjobs, NOT for production
      # builds. Update the associated list of boards as needed.
      (None, 'master', ['atlas', 'octopus', 'rammus', 'coral', 'eve',
                        'sarien', 'mistral', 'drallion']),
  ]

  _FACTORYBRANCH_TIMEOUT = 12 * 60 * 60

  # Requires that you set boards, and workspace_branch.
  site_config.AddTemplate(
      'factorybranch',
      site_config.templates.factory,
      site_config.templates.workspace,
      sign_types=['factory'],
      build_type=constants.GENERIC_TYPE,
      uprev=True,
      overlays=constants.BOTH_OVERLAYS,
      push_overlays=constants.BOTH_OVERLAYS,
      useflags=config_lib.append_useflags(['-cros-debug', 'chrome_internal']),
      builder_class_name='workspace_builders.FactoryBranchBuilder',
      build_timeout=_FACTORYBRANCH_TIMEOUT,
      description='TOT builder to build a firmware branch.',
      doc='https://goto.google.com/tot-for-firmware-branches',
  )

  site_config.AddTemplate(
      'old_factorybranch_packages',
      packages=[
          'virtual/target-os',
          'virtual/target-os-dev',
          'virtual/target-os-test',
          'chromeos-base/chromeos-installshim',
          'chromeos-base/chromeos-factory',
          'chromeos-base/chromeos-hwid',
          'chromeos-base/autotest-factory-install',
          'chromeos-base/autotest-all',
      ],
  )

  # These branches require a differnt list of packages to build.
  old_package_branches = {
      'factory-beltino-5140.14.B',
      'factory-rambi-5517.B',
      'factory-nyan-5772.B',
      'factory-rambi-6420.B',
      'factory-auron-6459.B',
      'factory-whirlwind-6509.B',
      'factory-veyron-6591.B',
      'factory-samus-6658.B',
      'factory-auron-6772.B',
      'factory-whirlwind-6812.41.B',
      'factory-arkham-7077.113.B',
      'factory-strago-7458.B',
      'factory-veyron-7505.B',
      'factory-glados-7657.B',
      'factory-glados-7828.B',
  }

  for active, branch, boards in branch_builders:
    schedule = {}
    if active:
      schedule = {
          'schedule': active,
      }

    # Define the buildspec builder for the branch.
    branch_master = site_config.Add(
        '%s-buildspec' % branch,
        site_config.templates.buildspec,
        display_label=config_lib.DISPLAY_LABEL_FACTORY,
        workspace_branch=branch,
        build_timeout=_FACTORYBRANCH_TIMEOUT,
        **schedule
    )

    # Define the per-board builders for the branch.
    for board in boards:
      child = site_config.Add(
          '%s-%s-factorybranch' % (board, branch),
          site_config.templates.factorybranch,
          boards=[board],
          workspace_branch=branch,
      )
      if branch in old_package_branches:
        child.apply(site_config.templates.old_factorybranch_packages)
      branch_master.AddSlave(child)


def ReleaseBuilders(site_config, boards_dict, ge_build_config):
  """Create all release builders.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)

  unified_builds = config_lib.GetUnifiedBuildConfigAllBuilds(ge_build_config)
  unified_board_names = set([b[config_lib.CONFIG_TEMPLATE_REFERENCE_BOARD_NAME]
                             for b in unified_builds])

  def _IsLakituConfig(config):
    return 'lakitu' in config['name']

  def _CreateMasterConfig(name,
                          template=site_config.templates.release,
                          schedule='  0 2,10,18 * * *'):
    return site_config.Add(
        name,
        template,
        boards=[],
        master=True,
        slave_configs=[],
        sync_chrome=True,
        chrome_sdk=False,
        # Because PST is 8 hours from UTC, these times are the same in both. But
        # daylight savings time is NOT adjusted for
        schedule=schedule,
    )

  ### Master release configs.
  master_config = _CreateMasterConfig('master-release')
  # pylint: disable=unused-variable
  basic_master_config = _CreateMasterConfig(
      'master-release-basic',
      template=site_config.templates.release_basic,
      schedule='30 */2 * * * *')
  # pylint: disable=unused-variable
  lakitu_master_config = _CreateMasterConfig('master-lakitu-release')

  def _AssignToMaster(config):
    """Add |config| as a slave config to the appropriate master config."""
    # Default to chromeos master release builder.
    master = master_config

    # Add this config to the master release basic builder.
    if config.name.endswith('-release-basic'):
      master = basic_master_config

    # Add this config to 'master-lakitu-release' instead if this is an LTS
    # branch for lakitu. This is typically only done on a branch after it is
    # out of ChromeOS support window.
    # To do this, set 'lakitu_lts_branch' to 'True' and re-run
    # 'config/refresh_generated_files'.
    lakitu_lts_branch = False
    if lakitu_lts_branch and _IsLakituConfig(config):
      master = lakitu_master_config

    master.AddSlave(config)

  ### Release configs.

  # Used for future bvt migration.
  _release_experimental_boards = frozenset([
      'betty-kernelnext',
      'elm-kernelnext',
      'eve-arcvm-mesa-virgl-next',
      'grunt-kernelnext',
      'hana-kernelnext',
      'hatch-kernelnext',
      'lakitu',
      'volteer-kernelnext',
      'zork-kernelnext',
  ])

  _release_enable_skylab_hwtest = frozenset([
      'asuka',
      'coral',
      'nyan_blaze',
      'reef',
  ])

  _release_enable_skylab_partial_boards = {
      'coral': ['astronaut', 'nasher', 'lava'],
  }

  _release_enable_skylab_cts_hwtest = frozenset([
      'samus',
      'terra',
  ])

  _no_unittest_configs = [
      'grunt-kernelnext-release',
  ]

  def _get_skylab_settings(board_name):
    """Get skylab settings for release builder.

    Args:
      board_name: A string board name.

    Returns:
      A dict mapping suite types to booleans indicating whether this suite on
        this board is to be run on Skylab. Current suite types:
        - cts: all suites using pool:cts,
        - default: the rest of the suites.
    """
    return {
        'cts': board_name in _release_enable_skylab_cts_hwtest,
        'default': board_name in _release_enable_skylab_hwtest,
    }

  builder_to_boards_dict = config_lib.GroupBoardsByBuilder(
      ge_build_config[config_lib.CONFIG_TEMPLATE_BOARDS])

  _all_release_builder_boards = builder_to_boards_dict[
      config_lib.CONFIG_TEMPLATE_RELEASE]

  site_config.AddForBoards(
      config_lib.CONFIG_TYPE_RELEASE,
      ((boards_dict['all_release_boards'] | _all_release_builder_boards)
       - unified_board_names),
      board_configs,
      site_config.templates.release,
  )

  hw_test_list = HWTestList(ge_build_config)

  for unibuild in config_lib.GetUnifiedBuildConfigAllBuilds(ge_build_config):
    models = []
    for model in unibuild[config_lib.CONFIG_TEMPLATE_MODELS]:
      name = model[config_lib.CONFIG_TEMPLATE_MODEL_NAME]
      lab_board_name = config_lib.GetNonUniBuildLabBoardName(
          model[config_lib.CONFIG_TEMPLATE_MODEL_BOARD_NAME])
      enable_skylab = True
      if (lab_board_name in _release_enable_skylab_hwtest and
          lab_board_name in _release_enable_skylab_partial_boards and
          name not in _release_enable_skylab_partial_boards[lab_board_name]):
        enable_skylab = False

      if config_lib.CONFIG_TEMPLATE_MODEL_TEST_SUITES in model:
        test_suites = model[config_lib.CONFIG_TEMPLATE_MODEL_TEST_SUITES]
        models.append(config_lib.ModelTestConfig(
            name,
            lab_board_name,
            test_suites,
            enable_skylab=enable_skylab))
      else:
        no_model_test_suites = []
        models.append(config_lib.ModelTestConfig(
            name, lab_board_name, no_model_test_suites,
            enable_skylab=enable_skylab))

    reference_board_name = unibuild[
        config_lib.CONFIG_TEMPLATE_REFERENCE_BOARD_NAME]

    config_name = '%s-release' % reference_board_name

    # Move unibuild to skylab.
    important = not unibuild[config_lib.CONFIG_TEMPLATE_EXPERIMENTAL]
    if reference_board_name in _release_experimental_boards:
      important = False

    enable_skylab_hw_tests = _get_skylab_settings(reference_board_name)
    props = {
        'models': models,
        'important': important,
        'enable_skylab_hw_tests': enable_skylab_hw_tests['default'],
        'hw_tests': hw_test_list.SharedPoolCanary()
    }
    if config_name in _no_unittest_configs:
      props['unittests'] = False
    site_config.AddForBoards(
        config_lib.CONFIG_TYPE_RELEASE,
        [reference_board_name],
        board_configs,
        site_config.templates.release,
        **props
    )
    _AssignToMaster(site_config[config_name])

  def GetReleaseConfigName(board):
    """Convert a board name into a release config name."""
    return '%s-release' % board

  def GetConfigName(builder, board):
    """Convert a board name into a config name."""
    if builder == config_lib.CONFIG_TEMPLATE_RELEASE:
      return GetReleaseConfigName(board)
    else:
      # Currently just support RELEASE builders
      raise Exception('Do not support other builders.')

  def _GetConfigValues(board):
    """Get and return config values from template and user definitions."""
    important = not board[config_lib.CONFIG_TEMPLATE_EXPERIMENTAL]
    if board['name'] in _release_experimental_boards:
      important = False

    enable_skylab_hw_tests = _get_skylab_settings(board['name'])

    # Move non-unibuild to skylab.
    config_values = {
        'important': important,
        'enable_skylab_hw_tests': enable_skylab_hw_tests['default'],
        'enable_skylab_cts_hw_tests': enable_skylab_hw_tests['cts'],
    }

    return config_values

  def _AdjustUngroupedReleaseConfigs(builder_ungrouped_dict):
    """Adjust for ungrouped release boards"""
    for builder in builder_ungrouped_dict:
      for board in builder_ungrouped_dict[builder]:
        config_name = GetConfigName(builder,
                                    board[config_lib.CONFIG_TEMPLATE_NAME])
        site_config[config_name].apply(
            _GetConfigValues(board),
        )
        _AssignToMaster(site_config[config_name])

  def _AdjustGroupedReleaseConfigs(builder_group_dict):
    """Adjust leader and follower configs for grouped boards"""
    for builder in builder_group_dict:
      for group in builder_group_dict[builder]:
        board_group = builder_group_dict[builder][group]

        # Leaders are built on baremetal builders and run all tests needed by
        # the related boards.
        for board in board_group.leader_boards:
          config_name = GetConfigName(builder,
                                      board[config_lib.CONFIG_TEMPLATE_NAME])
          site_config[config_name].apply(
              _GetConfigValues(board),
          )
          _AssignToMaster(site_config[config_name])

        # Followers are built on GCE instances, and turn off testing that breaks
        # on GCE. The missing tests run on the leader board.
        for board in board_group.follower_boards:
          config_name = GetConfigName(builder,
                                      board[config_lib.CONFIG_TEMPLATE_NAME])
          site_config[config_name].apply(
              _GetConfigValues(board),
              chrome_sdk_build_chrome=False,
              vm_tests=[],
          )
          _AssignToMaster(site_config[config_name])

  def _AdjustReleaseConfigs():
    """Adjust ungrouped and grouped release configs"""
    (builder_group_dict, builder_ungrouped_dict) = (
        config_lib.GroupBoardsByBuilderAndBoardGroup(
            ge_build_config[config_lib.CONFIG_TEMPLATE_BOARDS]))
    _AdjustUngroupedReleaseConfigs(builder_ungrouped_dict)
    _AdjustGroupedReleaseConfigs(builder_group_dict)

    for board in chromeos_boards.moblab_boards:
      config_name = GetReleaseConfigName(board)
      if config_name not in site_config:
        continue
      # If the board is in moblab_boards, use moblab_release template
      site_config[config_name].apply(
          site_config.templates.moblab_release,
          board_configs[board],
      )

  def AddReleaseBasicMirrors():
    """Create basic release builder variants for relevant build configs."""
    release_basic_boards = ['eve', 'atlas', 'grunt']
    for board in release_basic_boards:
      config_name = '%s-release-basic' % board
      site_config.Add(config_name, site_config.templates.release_basic,
                      site_config[board + '-release'])
      site_config[config_name].apply(site_config.templates.release_basic)
      _AssignToMaster(site_config[config_name])

  _AdjustReleaseConfigs()
  AddReleaseBasicMirrors()


def PayloadBuilders(site_config, boards_dict):
  """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.
  """
  for board in boards_dict['all_release_boards']:
    if site_config['%s-release' % board].paygen:
      site_config.Add(
          '%s-payloads' % board,
          site_config.templates.payloads,
          boards=[board],
      )


def AddNotificationConfigs(site_config):
  """Add NotificationConfigs to specific builders.

  Set the notification_config property of specific builders enabling
  notifications through luci-notify.

  notification_config values should only be set through this method as it will
  overwrite notification_config values set elsewhere.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding
                  NotificationConfigs.
  """

  # Notifiers is a map of builder config names to a list of NotificationConfig
  # objects. Example:
  # notifiers = {
  #     'sample-release': [
  #         config_lib.NotificationConfig(email='test1@google.com'),
  #         config_lib.NotificationConfig(email='test2@google.com')
  #     ],
  #     'test-release': [
  #         config_lib.NotificationConfig(email='test1@chromium.org')
  #     ],
  # }
  notifiers = {
      'dedede-release': [
          config_lib.NotificationConfig(
              email='dedede-release-builder-alerts@google.com', threshold=2),
      ],
      'hatch-borealis-release': [
          config_lib.NotificationConfig(
              email='borealis-release-builder-alerts@google.com', threshold=2),
      ],
      'swanky-release': [
          config_lib.NotificationConfig(email='navil+spam@chromium.org'),
      ],
      'zork-borealis-release': [
          config_lib.NotificationConfig(
              email='borealis-release-builder-alerts@google.com', threshold=2),
      ],
      'tatl-release': [
          config_lib.NotificationConfig(
              email='clumptini+release-builder-alerts@google.com'),
      ],
      'tael-release': [
          config_lib.NotificationConfig(
              email='clumptini+release-builder-alerts@google.com'),
      ],
  }

  for config_name, notification_configs in notifiers.items():
    site_config[config_name].apply(
        **{'notification_configs': notification_configs})


def ApplyCustomOverrides(site_config, ge_build_config):
  """Method with to override specific flags for specific builders.

  Generally try really hard to avoid putting anything here that isn't
  a really special case for a single specific builder. This is performed
  after every other bit of processing, so it always has the final say.

  Args:
    site_config: config_lib.SiteConfig containing builds to have their
                 waterfall values updated.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """

  overwritten_configs = {
      'amd64-generic-cheets-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1000717',
      },

      'asurada-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/150746591',
      },

      # The board does not exist in the lab. See crbug.com/1003981
      'beaglebone_servo-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1003981',
      },

      # No hw tests for beaglebone, expresso (crbug.com/1011171).
      'beaglebone-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1011171',
      },

      'expresso-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1011171',
      },

      # No tests for ARCVM builders.
      'betty-arcvm-master-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/144139998',
          'vm_tests': [],
          'vm_tests_override': []
      },
      # Currently betty-arc-r is VM only.
      'betty-arc-r-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/998427',
          'vm_tests': [],
          'vm_tests_override': []
      },


      # No hw tests for any betty builders.  See crbug/998427.
      'betty-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/998427',
      },

      'betty-pi-arc-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1026430',
      },

      # No hw_tests for caroline-ndktranslation.  See crbug.com/1091053.
      'caroline-ndktranslation-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'http://crbug.com/1091053',
      },

      # No hw_tests for eve-arc-r.  See crbug.com/1161335
      'eve-arc-r-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'http://crbug.com/1161335',
      },

      # No hw_tests for eve-kvm.  See crbug.com/1085769.
      'eve-kvm-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'http://crbug.com/1085769',
      },

      # No hw_tests for eve-userdebug.  See crbug.com/1085769.
      'eve-userdebug-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'http://crbug.com/1085769',
      },

      'heli-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'http://b/148950027',
      },

      'novato-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1000717',
      },

      'novato-arc64-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1000717',
      },

      'setzer-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1092947',
      },

      # No hw tests for any veyron_rialto builders. See http://b/141387161.
      'veyron_rialto-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/141387161',
      },


      # No hw_tests for arkham, whirlwind, gale, mistral.  See b/140317527.
      'arkham-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/140317527',
      },

      'whirlwind-release': {
          'dev_installer_prebuilts': True,
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/140317527',
          'paygen_skip_testing': True,
      },

      'gale-release': {
          'dev_installer_prebuilts': True,
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/140317527',
          'paygen_skip_testing': True,
      },

      'mistral-release': {
          'dev_installer_prebuilts': True,
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/140317527',
          'paygen_skip_testing': True,
      },

      'lakitu-release': config_lib.BuildConfig().apply(
          site_config.templates.lakitu_notification_emails,
          sign_types=['base'],
      ),

      # This is the full build of open-source overlay.
      'lakitu-full': config_lib.BuildConfig().apply(
          site_config.templates.lakitu_notification_emails,
      ),

      # TODO(yshaul): find out if hwqual needs to go as well
      # TODO(yshaul): fix apply method to merge base and test
      'guado_labstation-release': {
          'hwqual': False,
          'images': ['base', 'test'],
          'paygen': False,
      },

      'fizz-labstation-release': {
          'hwqual': False,
          'images': ['base', 'test'],
          'paygen': False,
      },

      # Run TestSimpleChromeWorkflow only on kevin64-release instead of
      # arm64-generic/kevin64-full.
      'arm64-generic-full': {
          'chrome_sdk_build_chrome': False,
      },
      'kevin64-full': {
          'chrome_sdk_build_chrome': False,
      },
      'kevin64-release': {
          'chrome_sdk_build_chrome': True,
      },

      # Currently factory and firmware branches will be created after DVT stage
      # therefore we need signed factory shim or accessory_rwsig firmware from
      # ToT temporarily.
      #
      # After factory and firmware branches are created, the configuation of
      # this project should be removed.
      # --- start from here ---
      'cheza-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'dedede-release': {
          'sign_types': ['recovery', 'factory'],
      },

      # See go/cros-fingerprint-firmware-branching-and-signing for details on
      # accessory_rwsig signing.
      'hatch-release': {
          'sign_types': ['recovery', 'factory', 'accessory_rwsig'],
      },

      # Mushu does not have DUTs in lab See http://b/147462165
      'mushu-release': {
          'sign_types': ['recovery', 'factory'],
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://b/147462165',
      },

      'jacuzzi-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'puff-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'kukui-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'sarien-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'strongbad-release': {
          'sign_types': ['recovery', 'factory'],
          # Strongbad has no DUTs in the lab.
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'b/152055929',
      },

      'trogdor-release': {
          'sign_types': ['recovery', 'factory'],
      },

      'trogdor64-release': {
          'sign_types': ['recovery', 'factory'],
          # Trogdor64 has no DUTs in the lab. (b/152055929)
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'b/152055929',
      },

      'shadowkeep-release': {
          'sign_types': ['recovery', 'factory'],
          # Shadowkeep has no DUTs in the lab (b/159934902).
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'b/159934902',
      },

      'brya-release': {
          'sign_types': ['recovery', 'factory'],
          # Brya has no DUTs in the lab (b/167721012).
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'b/167721012',
      },

      'volteer-release': {
          'sign_types': ['recovery', 'factory'],
      },

      # See go/cros-fingerprint-firmware-branching-and-signing for details on
      # accessory_rwsig signing.
      'zork-release': {
          'sign_types': ['recovery', 'factory', 'accessory_rwsig'],
      },

      'drallion-release': {
          'sign_types': ['recovery', 'factory'],
      },

      # reven board does not exist in the lab.
      'reven-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1066311',
      },

      # puff-moblab board does not exist in the lab.
      'puff-moblab-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1145306',
      },

      # fizz-moblab board fails are not being monitored.
      'fizz-moblab-release': {
          'hw_tests': [],
          'hw_tests_override': [],
          'hw_tests_disabled_bug': 'https://crbug.com/1145306',
      },


      # --- end from here ---

      # Enable distributed ThinLTO (crbug/877722) only on nocturne for now.
      'nocturne-release': {
          'useflags': config_lib.append_useflags(['goma_thinlto']),
      },

  }

  # Kick off for *-borealis builds the 'av-analysis_trace_per-build'
  # suite, but for devices in the cros_av_analysis pool only.
  # TODO(ddmail): Clean up once -borealis gets merged back into their
  # parent boards.
  av_analysis_args = {
      'pool':'cros_av_analysis',
      'timeout':3 * 60*60,
      'retry':False,
      'max_retries':0,
      'blocking':False,
      'async': True,
  }

  _additional_test_config = {
    'hatch-borealis-release': [
        config_lib.HWTestConfig(
            'av-analysis_trace_per-build',
            **av_analysis_args)
    ],
    'puff-borealis-release': [
        config_lib.HWTestConfig(
            'av-analysis_trace_per-build',
            **av_analysis_args)
    ],
    'zork-borealis-release': [
        config_lib.HWTestConfig(
            'av-analysis_trace_per-build',
            **av_analysis_args)
    ],
  }

  # Some Uniboard boards need to run additional tests suites. This means
  # adding the suites at the model level as well.
  for config_name, _configs in _additional_test_config.items():
    config = site_config.get(config_name)
    if not config:
      continue

    if config_name not in overwritten_configs:
      overwritten_configs[config_name] = {}

    hwtests = []
    if 'hw_tests' in config:
      hwtests = config['hw_tests'] + _configs
    else:
      hwtests = HWTestList(ge_build_config).DefaultList()
    overwritten_configs[config_name]['hw_tests'] = hwtests

    suites = []
    for hwtestConfig in _configs:
      suites += [hwtestConfig.suite]

    if config and 'models' in config:
      models = []
      for model in config['models']:
        models.append(config_lib.ModelTestConfig(
          model.name,
          model.lab_board_name,
          model.test_suites + suites,
          enable_skylab = model.enable_skylab,
          )
        )
      overwritten_configs[config_name]['models'] = models

  # Some Unibuild boards need to have hardware tests disabled.  This means
  # disabling it at the model level as well.
  _unibuild_disabled_hw_tests = frozenset([
      'eve-arc-r-release',  # crbug.com/1161335
  ])

  for config_name in _unibuild_disabled_hw_tests:
    config = site_config.get(config_name)
    if config and 'models' in config:
      models = []
      for model in config['models']:
        models.append(
            config_lib.ModelTestConfig(
                model.name,
                model.lab_board_name, [],
                enable_skylab=model.enable_skylab))
      overwritten_configs[config_name]['models'] = models

  # Some boards in toolchain builder are not using the same configuration as
  # release builders. Configure it here since it's easier, for both
  # llvm-toolchain and llvm-next-toolchain builders.
  for board in ['lakitu', 'fizz-moblab', 'gale', 'mistral', 'whirlwind']:
    if board == 'lakitu':
      overwritten_configs[board+'-llvm-toolchain'] = {
          'vm_tests': [config_lib.VMTestConfig(constants.VM_SUITE_TEST_TYPE,
                                               test_suite='smoke')],
          'gce_tests': [config_lib.GCETestConfig(constants.GCE_SUITE_TEST_TYPE,
                                                 test_suite='gce-sanity'),
                        config_lib.GCETestConfig(constants.GCE_SUITE_TEST_TYPE,
                                                 test_suite='gce-smoke')]
      }
    elif board == 'fizz-moblab':
      overwritten_configs[board+'-llvm-toolchain'] = {
          'enable_skylab_hw_tests': False,
          'hw_tests': [
              config_lib.HWTestConfig(
                  constants.HWTEST_MOBLAB_QUICK_SUITE)
          ],
          'hw_tests_override': [
              config_lib.HWTestConfig(
                  constants.HWTEST_MOBLAB_QUICK_SUITE)
          ],
      }
    else: # This is the case for gale, mistral and whirlwind
      overwritten_configs[board+'-llvm-toolchain'] = {
          'hw_tests': [
              config_lib.HWTestConfig(
                  constants.HWTEST_JETSTREAM_COMMIT_SUITE,
                  pool=constants.HWTEST_QUOTA_POOL,
                  quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
              )
          ],
          'hw_tests_override': [
              config_lib.HWTestConfig(
                  constants.HWTEST_JETSTREAM_COMMIT_SUITE,
                  pool=constants.HWTEST_QUOTA_POOL,
                  quota_account=constants.HWTEST_QUOTA_ACCOUNT_TOOLCHAIN,
              )
          ]
      }

    # Use the same configuration for llvm-next
    overwritten_configs[board+'-llvm-next-toolchain'] = \
      overwritten_configs[board+'-llvm-toolchain']

  for config_name, overrides  in overwritten_configs.items():
    # TODO: Turn this assert into a unittest.
    # config = site_config[config_name]
    # for k, v in overrides.items():
    #   assert config[k] != v, ('Unnecessary override: %s: %s' %
    #                           (config_name, k))
    config = site_config.get(config_name)
    if config:
      config.apply(**overrides)


def SpecialtyBuilders(site_config, boards_dict, ge_build_config):
  """Add a variety of specialized builders or tryjobs.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
    boards_dict: A dict mapping board types to board name collections.
    ge_build_config: Dictionary containing the decoded GE configuration file.
  """
  board_configs = CreateInternalBoardConfigs(
      site_config, boards_dict, ge_build_config)

  site_config.AddWithoutTemplate(
      'success-build',
      site_config.templates.external,
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_vmtest_builder,
      boards=[],
      display_label=config_lib.DISPLAY_LABEL_TRYJOB,
      luci_builder=config_lib.LUCI_BUILDER_TRY,
      builder_class_name='test_builders.SucessBuilder',
      description='Builder always passes as quickly as possible.',
  )

  # Used by cbuildbot/stages/sync_stages_unittest
  site_config.AddWithoutTemplate(
      'sync-test-cbuildbot',
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_vmtest_builder,
      boards=[],
      display_label=config_lib.DISPLAY_LABEL_TRYJOB,
      luci_builder=config_lib.LUCI_BUILDER_INFRA,
      builder_class_name='test_builders.SucessBuilder',
      description='Used by sync_stages_unittest.',
  )

  site_config.AddWithoutTemplate(
      'fail-build',
      site_config.templates.external,
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_vmtest_builder,
      boards=[],
      display_label=config_lib.DISPLAY_LABEL_TRYJOB,
      luci_builder=config_lib.LUCI_BUILDER_TRY,
      builder_class_name='test_builders.FailBuilder',
      description='Builder always fails as quickly as possible.',
  )

  site_config.AddWithoutTemplate(
      'chromiumos-sdk',
      site_config.templates.full,
      site_config.templates.no_hwtest_builder,
      # The amd64-host has to be last as that is when the toolchains
      # are bundled up for inclusion in the sdk.
      #
      # TODO(crbug.com/1159924): Audit this and other builder's branch
      # since we deprecated the old external tracking branch.
      manifest_branch='main',

      boards=[
          'arm-generic', 'amd64-generic'
      ],
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      build_type=constants.CHROOT_BUILDER_TYPE,
      builder_class_name='sdk_builders.ChrootSdkBuilder',
      use_sdk=False,
      prebuilts=constants.PUBLIC,
      build_timeout=18 * 60 * 60,
      description='Build the SDK and all the cross-compilers',
      doc='https://dev.chromium.org/chromium-os/build/builder-overview#'
          'TOC-Continuous',
      schedule='with 30m interval',
  )

  site_config.AddWithoutTemplate(
      'chromiumos-sdk-llvm-next',
      site_config.templates.full,
      site_config.templates.no_hwtest_builder,
      boards=[
          'arm-generic', 'amd64-generic'
      ],
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      build_type=constants.CHROOT_BUILDER_TYPE,
      builder_class_name='sdk_builders.ChrootSdkBuilder',
      use_sdk=False,
      useflags=config_lib.append_useflags(['llvm-next']),
      # Do not store artifacts in gs://chromiumos-sdk.
      debug=True,
      prebuilts=constants.PUBLIC,
      description='Build the SDK with llvm-next',
      # Once every day. 8 AM UTC is 1 AM PST.
      schedule='0 8 * * *',
  )

  site_config.AddWithoutTemplate(
      'config-updater',
      site_config.templates.internal,
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_vmtest_builder,
      site_config.templates.infra_builder,
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      description=('Build Config Updater reads updated GE config files from'
                   ' GS, and commits them to chromite after running tests.'),
      build_type=constants.GENERIC_TYPE,
      boards=[],
      builder_class_name='config_builders.UpdateConfigBuilder',
      schedule='@hourly',
  )

  site_config.AddWithoutTemplate(
      'luci-scheduler-updater',
      site_config.templates.internal,
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_vmtest_builder,
      site_config.templates.infra_builder,
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      description=('Deploy changes to luci_scheduler.cfg.'),
      build_type=constants.GENERIC_TYPE,
      boards=[],
      builder_class_name='config_builders.LuciSchedulerBuilder',
      schedule='triggered',
      triggered_gitiles=[[
          'https://chromium.googlesource.com/chromiumos/chromite',
          ['refs/heads/master'],
          ['config/luci-scheduler.cfg']
      ], [
          'https://chrome-internal.googlesource.com/chromeos/infra/config',
          ['refs/heads/master'],
          ['generated/luci-scheduler.cfg']
      ]],
  )

  site_config.Add(
      'betty-vmtest-informational',
      site_config.templates.informational,
      site_config.templates.internal,
      site_config.templates.no_hwtest_builder,
      description='VMTest Informational Builder for running long run tests.',
      build_type=constants.GENERIC_TYPE,
      boards=['betty'],
      builder_class_name='test_builders.VMInformationalBuilder',
      vm_tests=getInfoVMTest(),
      vm_tests_override=getInfoVMTest(),
      vm_test_report_to_dashboards=True,
      # 3 PM UTC is 7 AM PST (no daylight savings).
      schedule='0 15 * * *',
  )

  # Create our unittest stress build configs (used for tryjobs only)
  site_config.AddForBoards(
      'unittest-stress',
      boards_dict['all_boards'],
      board_configs,
      site_config.templates.unittest_stress,
      luci_builder=config_lib.LUCI_BUILDER_TRY,
      unittests=True,
  )

  site_config.AddGroup(
      'test-ap-group',
      site_config.Add('whirlwind-test-ap',
                      site_config.templates.test_ap,
                      boards=['whirlwind']),
      site_config.Add('gale-test-ap',
                      site_config.templates.test_ap,
                      boards=['gale']),
      description='Create images used to power access points in WiFi lab.',
  )

  # *-pre-flight-branch builders are in chromeos_release waterfall.
  # *-no-afdo-uprev builder skips upreving Chrome AFDO profiles in the PFQ
  # builder, as we have separate builders to do so.
  site_config.Add(
      'chell-chrome-no-afdo-uprev-pre-flight-branch',
      site_config.templates.pre_flight_branch,
      display_label=config_lib.DISPLAY_LABEL_CHROME_PFQ,
      boards=['chell'],
      afdo_use=True,
      afdo_update_kernel_ebuild=True,
      sync_chrome=True,
      chrome_rev=constants.CHROME_REV_STICKY,
      prebuilts=False,
      archive_build_debug=True,
  )

  # Loonix release builders; no signed images nor testing
  # Associated with Rapid releases, triggered from Rapid.
  for board in frozenset.union(chromeos_boards.loonix_boards,
                               chromeos_boards.dustbuster_boards,
                               chromeos_boards.wshwos_boards):
    site_config.Add(
        '{}-rapid'.format(board),
        site_config.templates.release,
        site_config.templates.loonix,
        display_label=config_lib.DISPLAY_LABEL_UTILITY,
        luci_builder=config_lib.LUCI_BUILDER_RAPID,
        boards=[board],
        debug=True,
        hwqual=False,
        push_image=False,
        suite_scheduling=False,
        # crbug.com/1111964 - Disable rootfs verification
        rootfs_verification=False,
        description=('Create unsigned release image for ingestion ' +
                     'into build tool'),
    )

  site_config.Add(
      'grunt-android-pi-pre-flight-branch',
      site_config.templates.pre_flight_branch,
      display_label=config_lib.DISPLAY_LABEL_PI_ANDROID_PFQ,
      boards=['grunt'],
      sync_chrome=True,
      android_rev=constants.ANDROID_REV_LATEST,
      android_package='android-container-pi',
      android_import_branch=constants.ANDROID_PI_BUILD_BRANCH,
      prebuilts=False,
      unittests=False,
  )

  site_config.Add(
      'hatch-arc-r-android-rvc-pre-flight-branch',
      site_config.templates.pre_flight_branch,
      display_label=config_lib.DISPLAY_LABEL_VMRVC_ANDROID_PFQ,
      boards=['hatch-arc-r'],
      sync_chrome=True,
      android_rev=constants.ANDROID_REV_LATEST,
      android_package='android-vm-rvc',
      android_import_branch=constants.ANDROID_VMRVC_BUILD_BRANCH,
      prebuilts=False,
      unittests=False,
  )

  site_config.AddWithoutTemplate(
      'chromeos-infra-go',
      site_config.templates.no_hwtest_builder,
      site_config.templates.no_unittest_builder,
      site_config.templates.no_vmtest_builder,
      site_config.templates.infra_builder,
      boards=[],
      display_label=config_lib.DISPLAY_LABEL_UTILITY,
      build_type=constants.GENERIC_TYPE,
      builder_class_name='infra_builders.InfraGoBuilder',
      use_sdk=True,
      prebuilts=constants.PUBLIC,
      build_timeout=60 * 60,
      description='Build Chromium OS infra Go binaries',
      doc='https://goto.google.com/cros-infra-go-packaging',
      schedule='triggered',
      triggered_gitiles=[[
          'https://chromium.googlesource.com/chromiumos/infra/lucifer',
          ['refs/heads/master']
      ], [
          'https://chromium.googlesource.com/chromiumos/infra/skylab_inventory',
          ['refs/heads/master'],
      ]],
  )


def TryjobMirrors(site_config):
  """Create tryjob specialized variants of every build config.

  This creates a new 'tryjob' config for every existing config, unless the
  existing config is already a tryjob config.

  Args:
    site_config: config_lib.SiteConfig to be modified by adding templates
                 and configs.
  """
  tryjob_configs = {}

  for build_name, config in site_config.items():
    # Don't mirror builds that are already tryjob safe.
    if config_lib.isTryjobConfig(config):
      config.apply(hw_tests_override=None, vm_tests_override=None)
      continue

    tryjob_name = build_name + '-tryjob'

    # Don't overwrite mirrored versions that were explicitly created earlier.
    if tryjob_name in site_config:
      continue

    tryjob_config = copy.deepcopy(config)
    tryjob_config.apply(
        name=tryjob_name,
        display_label=config_lib.DISPLAY_LABEL_TRYJOB,
        luci_builder=config_lib.LUCI_BUILDER_TRY,
        notification_configs=[],
        # Generally make tryjobs safer.
        chroot_replace=True,
        debug=True,
        push_image=False,
        # Force uprev. This is so patched in changes are always built.
        uprev=True,
        gs_path=config_lib.GS_PATH_DEFAULT,
        schedule=None,
        suite_scheduling=False,
        triggered_gitiles=None,
        important=True,
        build_affinity=False,
    )

    # Force uprev. This is so patched in changes are always built.
    if tryjob_config.internal:
      tryjob_config.apply(overlays=constants.BOTH_OVERLAYS)

    # In trybots, we want to always run VM tests and all unit tests, so that
    # developers will get better testing for their changes.
    if tryjob_config.hw_tests_override is not None:
      tryjob_config.apply(hw_tests=tryjob_config.hw_tests_override,
                          hw_tests_override=None)

    if tryjob_config.vm_tests_override is not None:
      tryjob_config.apply(vm_tests=tryjob_config.vm_tests_override,
                          vm_tests_override=None)

    if tryjob_config.master:
      tryjob_config.apply(debug_cidb=True)

    if tryjob_config.build_type != constants.PAYLOADS_TYPE:
      tryjob_config.apply(paygen=False)

    if tryjob_config.slave_configs:
      new_children = []
      for c in tryjob_config.slave_configs:
        if not config_lib.isTryjobConfig(site_config[c]):
          c = '%s-tryjob' % c
        new_children.append(c)

      tryjob_config.apply(slave_configs=new_children)

    # Save off the new config so we can insert into site_config.
    tryjob_configs[tryjob_name] = tryjob_config

  for tryjob_name, tryjob_config in tryjob_configs.items():
    site_config[tryjob_name] = tryjob_config


def BranchScheduleConfig():
  """Create a list of configs to schedule for branch builds.

  This function returns a list of build configs with just enough
  information to correctly schedule builds on branches. This function
  is only used by scripts/gen_luci_scheduler.

  After making changes to this function, they must be deployed to take
  effect. See gen_luci_scheduler --help for details.

  Returns:
    List of config_lib.BuildConfig instances.
  """
  #
  # Define each branched schedule with:
  #   branch_name: Name of the branch to build as a string.
  #   config_name: Name of the build config already present on the branch.
  #   label: Display label for UI use. Usually release, factory, firmware.
  #   schedule: When to do the build. Can take several formats.
  #     'triggered' for manual builds.
  #     Cron style in UTC timezone: '0 15 * * *'
  #     'with 30d interval' to run X time after previous build.
  #
  #     https://github.com/luci/luci-go/blob/master/scheduler/
  #                        appengine/messages/config.proto
  #
  # When updating this be sure to run `config/refresh_generated_files`
  # or the change will fail chromite unittests.
  branch_builds = [
      # Add non release branch schedules here, if needed.
      # <branch>, <build_config>, <display_label>, <schedule>, <triggers>,
      # <builder>

      # NOTE: R69, R73, R77 and R81 are Long Term Support (LTS) milestones for
      # lakitu and they'd like to keep them a little longer. Please let
      # lakitu-dev@google.com know before deleting this.
      ('release-R69-10895.B', 'master-lakitu-release',
       config_lib.DISPLAY_LABEL_RELEASE, '0 4 * * *', None,
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),
      ('release-R73-11647.B', 'master-lakitu-release',
       config_lib.DISPLAY_LABEL_RELEASE, '0 8 * * *', None,
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),
      ('release-R77-12371.B', 'master-lakitu-release',
       config_lib.DISPLAY_LABEL_RELEASE, '0 12 * * *', None,
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),
      ('release-R81-12871.B', 'master-lakitu-release',
       config_lib.DISPLAY_LABEL_RELEASE, '0 16 * * *', None,
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),
  ]

  # The three active release branches.
  # (<branch>, [<android PFQs>], <chrome PFQ>, [<orderfiles>], [<Chrome AFDOs>])
  # Note: <chrome PFQ> is no longer actually doing anything pre-flight: pupr
  # does that as of 2020-09-15.  It needs to run because it *does* update the
  # CWP profiles.

  # Do not remove BOT-TAG:* comments. They are used to help parse config.
  # BOT-TAG:RELEASES_START
  RELEASES = [
      ('release-R89-13729.B',
       ['grunt-android-pi-pre-flight-branch',
        'hatch-arc-r-android-rvc-pre-flight-branch'],
       '',
       [],
       [],
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),

      ('release-R88-13597.B',
       ['grunt-android-pi-pre-flight-branch'],
       '',
       [],
       [],
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),

      ('release-R87-13505.B',
       ['grunt-android-pi-pre-flight-branch'],
       '',
       ['orderfile-generate-toolchain',
        'orderfile-verify-toolchain'],
       ['benchmark-afdo-generate',
        'chrome-silvermont-release-afdo-verify',
        'chrome-airmont-release-afdo-verify',
        'chrome-broadwell-release-afdo-verify'],
       config_lib.LUCI_BUILDER_LEGACY_RELEASE),

      # LTS branch, please do not delete. Contact: cros-lts-team@google.com.
      # BOT-TAG:NO_PRUNE
      ('release-R86-13421.B',
       ['grunt-android-pi-pre-flight-branch'],
       'chell-chrome-no-afdo-uprev-pre-flight-branch',
       ['orderfile-generate-toolchain',
        'orderfile-verify-toolchain'],
       ['benchmark-afdo-generate',
        'chrome-silvermont-release-afdo-verify',
        'chrome-airmont-release-afdo-verify',
        'chrome-broadwell-release-afdo-verify'],
       config_lib.LUCI_BUILDER_LTS_RELEASE ),
  ]
  # BOT-TAG:RELEASES_END

  PFQ_SCHEDULE = [
      '0 3,7,11,15,19,23 * * *',
      '0 2,6,10,14,18,22 * * *',
      '0 2,6,10,14,18,22 * * *',
      '0 2,6,10,14,18,22 * * *',
  ]

  ORDERFILE_SCHEDULES = [
      '0 8/12 * * *',
      '0 0/12 * * *',
  ]

  AFDO_SCHEDULES = [
      # Start at a different time than the master AFDO generate, as it might
      # increase lab pressure on chell boards
      '0 8/12 * * *',
      # Start verification builders after 7 hours
      '0 3/12 * * *',
      '0 3/12 * * *',
      '0 3/12 * * *',
  ]

  assert len(RELEASES) == len(PFQ_SCHEDULE)
  for ((branch, android_pfq, chrome_pfq, orderfile, afdo, builder),
       android_schedule) in zip(
           RELEASES, PFQ_SCHEDULE):
    release_num = re.search(r'release-R(\d+)-.*', branch).group(1)
    # All branches are only triggered by a Chrome uprev, or manually.
    branch_builds.append(
        [branch, 'master-release',
         config_lib.DISPLAY_LABEL_RELEASE, 'triggered',
         [[('https://chromium.googlesource.com/chromiumos/' +
            'overlays/chromiumos-overlay'),
           [r'regexp:refs/heads/%s\\..*' % branch],
           [('chromeos-base/chromeos-chrome/chromeos-chrome-%s.*.ebuild'
             % release_num)]]], builder])
    branch_builds.extend([[branch, pfq,
                           config_lib.DISPLAY_LABEL_RELEASE,
                           android_schedule, None, builder]
                          for pfq in android_pfq])

    if chrome_pfq:
      # We extract the release number from the branch, and use it to
      # watch for new chrome tags to trigger Chrome PFQ builds.
      # release-R71-11151.B -> 71 -> regexp:refs/tags/71\\..*
      # Chrome PFQ is retired as of R88, so chrome_pfq may be empty.
      branch_builds.append(
          [branch, chrome_pfq, config_lib.DISPLAY_LABEL_RELEASE, 'triggered',
           [['https://chromium.googlesource.com/chromium/src',
             [r'regexp:refs/tags/%s\\..*' % release_num]]], builder])
    if orderfile:
      assert len(orderfile) == len(ORDERFILE_SCHEDULES)
      for b, s in zip(orderfile, ORDERFILE_SCHEDULES):
        branch_builds.append([branch, b,
                              config_lib.DISPLAY_LABEL_RELEASE,
                              s, None, builder])

    if afdo:
      assert len(afdo) == len(AFDO_SCHEDULES)
      for b, s in zip(afdo, AFDO_SCHEDULES):
        branch_builds.append([branch, b,
                              config_lib.DISPLAY_LABEL_RELEASE,
                              s, None, builder])

  # Convert all branch builds into scheduler config entries.
  default_config = config_lib.GetConfig().GetDefault()

  result = []
  for branch, config_name, label, schedule, trigger, builder in branch_builds:
    result.append(default_config.derive(
        name=config_name,
        display_label=label,
        luci_builder=builder,
        schedule_branch=branch,
        schedule=schedule,
        triggered_gitiles=trigger,
    ))

  return result


@memoize.Memoize
def GetConfig():
  """Create the Site configuration for all ChromeOS builds.

  Returns:
    A config_lib.SiteConfig.
  """
  defaults = DefaultSettings()

  ge_build_config = config_lib.LoadGEBuildConfigFromFile()

  # site_config with no templates or build configurations.
  site_config = config_lib.SiteConfig(defaults=defaults)
  boards_dict = GetBoardTypeToBoardsDict(ge_build_config)

  GeneralTemplates(site_config)

  chromeos_test.GeneralTemplates(site_config, ge_build_config)

  ToolchainBuilders(site_config, boards_dict, ge_build_config)

  ReleaseBuilders(site_config, boards_dict, ge_build_config)

  PayloadBuilders(site_config, boards_dict)

  SpecialtyBuilders(site_config, boards_dict, ge_build_config)

  IncrementalBuilders(site_config, boards_dict, ge_build_config)

  InformationalBuilders(site_config, boards_dict, ge_build_config)

  FirmwareBuilders(site_config, boards_dict, ge_build_config)

  FactoryBuilders(site_config, boards_dict, ge_build_config)

  AndroidTemplates(site_config)

  chromeos_test.AndroidTemplates(site_config)

  AndroidPfqBuilders(site_config, boards_dict, ge_build_config)

  FullBuilders(site_config, boards_dict, ge_build_config)

  AddNotificationConfigs(site_config)

  ApplyCustomOverrides(site_config, ge_build_config)

  chromeos_test.ApplyConfig(site_config, boards_dict, ge_build_config)

  TryjobMirrors(site_config)

  return site_config
