# -*- python -*-
# ex: set syntax=python:
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# See master.experimental/slaves.cfg for documentation.

def linux():
  chromeos_boards = ('x86-generic', 'amd64-generic', 'daisy')
  cq_slaves = (range(111, 131) + range(162, 399) + range(427, 453) +
               range(493, 497) + range(506, 540) + range(590, 600) +
               range(621, 651) + range(779, 799) + range(800, 837) +
               range(841, 864) + range(878, 897) + range(909, 914) +
               range(1010, 1029))
  cq_builders = [
    'blimp_linux_dbg',
    'cast_shell_linux',
    'chromium_presubmit',
    'linux_chromium_archive_rel_ng',
    'linux_chromium_asan_rel_ng',
    'linux_chromium_chromeos_asan_rel_ng',
    'linux_chromium_chromeos_compile_dbg_ng',
    'linux_chromium_chromeos_ozone_rel_ng',
    'linux_chromium_chromeos_rel_ng',
    'linux_chromium_clobber_rel_ng',
    'linux_chromium_compile_dbg_ng',
    'linux_chromium_gn_chromeos_dbg',
    'linux_chromium_gn_chromeos_rel',
    'linux_chromium_rel_ng',
  ]
  cq_builders += [
    'chromeos_%s_chromium_compile_only_ng' % (board,)
    for board in chromeos_boards
  ]

  # Slave pools have two competing constraints:
  #  - load: peak number of concurrent builds. Larger pools are safer.
  #  - disk space: too many builders on the same pool will exhaust
  #     the disk space on all slaves. Smaller pools are safer.
  #
  # Currently, we need two optional pools due to disk space. When
  # adding new builders, try sharing the existing slavebuilddir.
  optional_slaves1 = [568, 747, 866, 867]
  optional_slaves2 = range(714, 719)

  # Contain all the builders with the following large slavebuilddir:
  #  - linux
  #  - linux_chromeos
  #  - linux_msan
  #  - *_Codesearch_Builder
  optional_builders1 = [                     # slavebuilddir
    'Chromium Linux Codesearch Builder',     # Chromium_Linux_Codesearch_Builder
    'ChromiumOS Codesearch Builder',         # ChromiumOS_Codesearch_Builder
    'closure_compilation',                    # linux
    'linux_chromium_chromeos_compile_rel_ng', # linux_chromeos
    'linux_chromium_chromeos_dbg_ng',         # linux_chromeos
    'linux_chromium_chromeos_variable',       # linux_chromeos
    'linux_chromium_compile_dbg_32_ng',       # linux
    'linux_chromium_compile_rel_ng',          # linux
    'linux_chromium_dbg_ng',                  # linux
    'linux_chromium_dbg_32_ng',               # linux
    'linux_chromium_msan_rel_ng',             # linux_msan
    'linux_chromiumos_full_variable',         # linux_chromeos
    'linux_site_isolation',                   # linux
  ]
  # Contains all the optional builders with smaller slavebuilddir not
  # covered by optional_builders1.
  optional_builders2 = [
    'chromeos_%s_variable' % (board,)        # chromeos_<board>
    for board in chromeos_boards
  ]
  optional_builders2 += [
    'linux_arm',                              # linux_arm
    'linux_chromium_chromeos_asan_variable',  # linux_chromeos_asan
    'linux_chromium_chromeos_msan_rel_ng',    # linux_chromeos_msan
    'linux_chromium_chromeos_variable_chrome',# linux_chromeos_chrome
    'linux_chromium_gn_chromeos_variable',    # linux_chromium_gn_chromeos
    'linux_chromium_gn_upload',               # build_and_upload_gn
    'linux_chromium_tsan_rel_ng',             # linux_tsan
    'linux_nacl_sdk',                         # linux_nacl_sdk
    'linux_nacl_sdk_build',                   # linux_nacl_sdk_build
    'linux_optional_gpu_tests_rel',           # linux_nacl_sdk_build
  ]

  # Super beefy machines.
  optional_highmem_slaves = [904, 905]
  optional_highmem_builders = [
    'linux_upload_clang',
    'linux_chromium_cfi_rel_ng',
  ]

  # High-cpu slaves for dedicated use by Findit.
  optional_highcpu_slaves = [799] + range(873, 878)
  optional_highcpu_builders = [               # slavebuilddir
    'linux_chromium_asan_variable',           # linux_asan
    'linux_chromium_variable',                # linux
    'linux_chromium_blimp_variable',          # linux_blimp
    'linux_chromium_cast_variable',           # linux_cast
    'linux_chromium_variable_32',             # linux_32
    'linux_chromium_variable_32_chrome',      # linux_chrome_32
    'linux_chromium_variable_32_clobber',     # linux_clobber_32
    'linux_chromium_variable_chrome',         # linux_chrome
    'linux_chromium_variable_clobber',        # linux_clobber
    'linux_chromium_webkit_asan_variable',    # linux_layout_asan
    'linux_chromium_webkit_leak_variable',    # linux_layout_leak
    'linux_chromium_webkit_msan_variable',    # linux_layout_msan
    'linux_chromium_webkit_variable',         # linux_layout
  ]

  # Set up normal slaves.
  result = []
  for i, slave in enumerate(cq_slaves):
    result.append({
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': cq_builders,
      'preferred_builder': cq_builders[i % len(cq_builders)],
      'hostname': 'slave%d-c4' % slave,
      'pool': 'linux_cq',
    })
  for slave in optional_slaves1:
    result.append({
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': optional_builders1,
      'hostname': 'slave%d-c4' % slave,
      'pool': 'linux_optional1',
    })
  for slave in optional_slaves2:
    result.append({
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': optional_builders2,
      'hostname': 'slave%d-c4' % slave,
      'pool': 'linux_optional2',
    })
  for slave in optional_highmem_slaves:
    result.append({
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': optional_highmem_builders,
      'hostname': 'slave%d-c4' % slave,
      'pool': 'linux_optional_highmem',
    })
  for slave in optional_highcpu_slaves:
    result.append({
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': optional_highcpu_builders,
      'hostname': 'slave%d-c4' % slave,
      'pool': 'linux_optional_highcpu',
    })

  # Bot for linux_chromium_browser_side_navigation_rel.
  result.extend([
    {
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': ['linux_chromium_browser_side_navigation_rel'],
      'hostname': 'slave914-c4',
      'pool': 'linux_chromium_browser_side_navigation_rel',
    }
  ])

  result.extend([
    {
      'master': 'TryServerChromiumLinux',
      'os': 'linux',
      'version': 'precise',
      'bits': '64',
      'builder': ['linux_layout_tests_slimming_paint_v2'],
      'hostname': 'slave775-c4',
      'pool': 'linux_layout_tests_slimming_paint_v2',
    }
  ])

  return result


slaves = linux()
