# -*- 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)'],
              timeout=3 * 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_jerry', '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'], {}),
      (DAILY, '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_jerry', '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.

  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.
      ('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 ),
  ]

  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
