# -*- python -*-
# ex: set syntax=python:

# Copyright (c) 2012 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.

categories = {
  'precise32': {'master': 'NativeClientTryServer',
        'os': 'linux',
        'version': 'precise',
        'bits': '32',
      },
  'precise64': {'master': 'NativeClientTryServer',
        'os': 'linux',
        'version': 'precise',
        'bits': '64',
      },
  'mac': {'master': 'NativeClientTryServer',
        'os': 'mac',
        'version': '10.9',
        'bits': '64',
      },
  'win32': {'master': 'NativeClientTryServer',
        'os': 'win',
        'version': 'win7',
        'bits': '32',
      },
  'win64': {'master': 'NativeClientTryServer',
        'os': 'win',
        'version': 'win7',
        'bits': '64',
      },
  'win8': {'master': 'NativeClientTryServer',
        'os': 'win',
        'version': 'win8',
        'bits': '64',
      },
  'panda': {'master': 'NativeClientTryServer',
        'os': 'linux',
        'version': 'armboard',
        'bits': '32',
        'arm_tools': True,
      },
}


categories_to_slaves = {
  'precise32': ['vm%d-m4' % i for i in range(504, 509)],
  'precise64': ['slave%d-c4' % i for i in range(569, 574)],
  'mac': ['vm%d-m4' % i for i in range(741, 746)],
  'win32': ['vm%d-m4' % i for i in range(532, 537)],
  'win64': ['vm%d-m4' % i for i in range(539, 549)],
  'win8': ['vm%d-m4' % i for i in range(100, 103) + range(108, 110)],
  'panda': ['build%d-b4' % i for i in range(168, 171)],
}

categories_to_builders = {
  'mac': ['nacl-mac-newlib-dbg-asan',],
  'panda': ['nacl-arm_hw_opt_panda', 'nacl-arm_hw_perf_panda'],
  'precise32': [ 'nacl-precise32_newlib_dbg',
                 'nacl-precise32_newlib_opt'],
  'precise64': [ 'nacl-precise64_validator_opt',
                 'nacl-arm_opt_panda',
                 'nacl-arm_perf_panda'],
  'win32': ['nacl-win32_newlib_opt', 'nacl-win32_glibc_opt'],
  'win64': [ 'nacl-win64_newlib_dbg',
             'nacl-win64_newlib_opt',
             'nacl-win64_glibc_opt',
	     'nacl-toolchain-win7-glibc'],
  'win8': ['nacl-win8-64_newlib_dbg', 'nacl-win8-64_newlib_opt']
}

slaves = []

for category in categories:
  for hostname in categories_to_slaves[category]:
    slave = {}
    slave.update(categories[category])
    slave['builder'] = categories_to_builders[category]
    slave['hostname'] = hostname
    slave['category'] = category
    slaves.append(slave)
