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

# READ THIS:
# See http://dev.chromium.org/developers/testing/chromium-build-infrastructure

import os
import socket

from buildbot.scheduler import Triggerable

# These modules come from scripts, which must be in the PYTHONPATH.
from master import master_config
from master import master_config_tryserver
from master import master_utils
from master import slaves_list
from master.builders_pools import BuildersPools
from master.factory import annotator_factory
from master.factory import chromium_factory
from master.try_job_http import TryJobHTTP
from master.try_job_rietveld import TryJobRietveld
from master.try_job_svn import TryJobSubversion

import config
import master_site_config

ActiveMaster = master_site_config.TryServerChromiumWin


MAIL_NOTIFIER = ActiveMaster.is_production_host
UPDATE_CODEREVIEW = ActiveMaster.is_production_host
LISTEN_TO_SVN = ActiveMaster.svn_url and ActiveMaster.is_production_host

CreateBuilder = master_config_tryserver.CreateBuilder
m_annotator = annotator_factory.AnnotatorFactory(ActiveMaster)
m_chromium_win = master_config_tryserver.m_chromium_win
m_chromium_win_ninja = master_config_tryserver.m_chromium_win_ninja

# This is the dictionary that the buildmaster pays attention to. We also use
# a shorter alias to save typing.
c = BuildmasterConfig = {}

config.DatabaseSetup(c, require_dbconfig=ActiveMaster.is_production_host)

####### CHANGESOURCES

c['change_source'] = []

# Avoid merging requests.
c['mergeRequests'] = False


####### BUILDERS

# Try queues.
pools = BuildersPools('chrome')

chromium_builders = []

for targ in ('_rel', '_dbg'):
  chromium_builders.extend([{
    'name': 'win_chromium%s_ng' % targ,
    'factory': m_annotator.BaseFactory(
        'chromium_trybot', timeout=3600, max_time=master_utils.CQ_MAX_TIME),
    # Share build directory with compatible existing builders to save space.
    'slavebuilddir': 'win'
  }, {
    'name': 'win_chromium_compile%s_ng' % targ,
    'factory': m_annotator.BaseFactory(
        'chromium_trybot', timeout=3600, max_time=master_utils.CQ_MAX_TIME),
    # Share build directory with compatible existing builders to save space.
    'slavebuilddir': 'win'
  }])

chromium_builders.append({
  'name': 'win_chromium_xp_rel_ng',
  'factory': m_annotator.BaseFactory('chromium_trybot', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})

# GCE Experimental builders
chromium_builders.append({
  'name': 'win_chromium_rel_ng_exp',
  'factory': m_annotator.BaseFactory('chromium_trybot', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})
chromium_builders.append({
  'name': 'win_chromium_compile_dbg_ng_exp',
  'factory': m_annotator.BaseFactory('chromium_trybot', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})
chromium_builders.append({
  'name': 'win_chromium_x64_rel_ng_exp',
  'factory': m_annotator.BaseFactory('chromium_trybot', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})


chromium_builders.append({
  'name': 'win_chromium_vista_rel_ng',
  'factory': m_annotator.BaseFactory('chromium_trybot', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})

chromium_builders.append({
  'name': 'win_chromium_x64_dbg',
  'factory': m_annotator.BaseFactory('chromium_trybot_legacy', timeout=3600),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})

chromium_builders.append({
  'name': 'win_chromium_x64_rel_ng',
  'factory': m_annotator.BaseFactory(
      'chromium_trybot', timeout=3600, max_time=master_utils.CQ_MAX_TIME),
  # Share build directory with compatible existing builders to save space.
  'slavebuilddir': 'win'
})

chromium_builders.extend([{
    'name': 'win8_chromium_dbg',
    'factory': m_annotator.BaseFactory('chromium_trybot_legacy'),
    'slavebuilddir': 'win',
  },{
    'name': 'win8_chromium_rel',
    'factory': m_annotator.BaseFactory(
        'chromium_trybot_legacy', max_time=master_utils.CQ_MAX_TIME),
    'slavebuilddir': 'win',
  },{
    'name': 'win8_chromium_ng',
    'factory': m_annotator.BaseFactory(
        'chromium_trybot', max_time=master_utils.CQ_MAX_TIME),
    'slavebuilddir': 'win',
  },
])

chromium_builders.extend([{
    'name': 'win_chromium_gn_x64_dbg',
    'factory': m_annotator.BaseFactory('chromium_gn'),
    'slavebuilddir': 'win_gn',
  },{
    'name': 'win_chromium_gn_x64_rel',
    'factory': m_annotator.BaseFactory('chromium_gn'),
    'slavebuilddir': 'win_gn',
  },{
    'name': 'win8_chromium_gn_dbg',
    'factory': m_annotator.BaseFactory('chromium_gn'),
    'slavebuilddir': 'win_gn',
  },{
    'name': 'win8_chromium_gn_rel',
    'factory': m_annotator.BaseFactory(
        'chromium_gn', max_time=master_utils.CQ_MAX_TIME),
    'slavebuilddir': 'win_gn',
  },{
    'name': 'win8_chromium_gn_upload',
    'factory': m_annotator.BaseFactory('chromium_gn_upload'),
    'slavebuilddir': 'win_gn',
  },
])

chromium_builders.extend([{
    'name': 'win_pgo',
    'factory':  m_annotator.BaseFactory('chromium_pgo', timeout=24000),
    'slavebuilddir': 'win',
  },
])

chromium_builders.append({
  'name': 'win_deterministic',
  'factory': m_annotator.BaseFactory('deterministic_build'),
  'slavebuilddir': 'det',
})

# NaCl SDK try bots
b_win_nacl_sdk = {
  'name': 'win_nacl_sdk',
  'factory': m_annotator.BaseFactory('nacl/sdk'),
}

# NaCl SDK build-only try bots
b_win_nacl_sdk_build = {
  'name': 'win_nacl_sdk_build',
  'factory': m_annotator.BaseFactory('nacl/sdk_build'),
}

c['builders'] = [
  b_win_nacl_sdk,
  b_win_nacl_sdk_build,
] + chromium_builders


# Slaves are loaded from slaves.cfg.
slaves = slaves_list.SlavesList('slaves.cfg', 'TryServerChromiumWin')

for builder in c['builders']:
  # Associate the slaves to the builders. The configuration is in slaves.cfg.
  builder['slavenames'] = slaves.GetSlavesName(builder=builder['name'])
  # Don't enable auto_reboot for people testing locally.
  builder.setdefault('auto_reboot', ActiveMaster.is_production_host)


####### BUILDSLAVES

# The 'slaves' list defines the set of allowable buildslaves. List all the
# slaves registered to a builder. Remove dupes.
c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
                                           config.Master.GetBotPassword())

# Make sure everything works together.
master_utils.VerifySetup(c, slaves)


####### SCHEDULERS

# Configure the Schedulers;
# Main Tryscheduler for the try queue. groups is defined in the loop above.
c['schedulers'] = []

last_good_urls = {'chrome': ActiveMaster.last_good_url,
                  'blink': ActiveMaster.last_good_blink_url}
code_review_sites = {'chrome': ActiveMaster.code_review_site,
                     'blink': ActiveMaster.code_review_site}

c['schedulers'].append(TryJobHTTP(
      name='try_job_http',
      port=ActiveMaster.try_job_port,
      last_good_urls=last_good_urls,
      code_review_sites=code_review_sites,
      pools=pools))

if ActiveMaster.is_production_host:
  c['schedulers'].append(TryJobRietveld(
        name='try_job_rietveld',
        last_good_urls=last_good_urls,
        code_review_sites=code_review_sites,
        pools=pools,
        project='chrome',
        filter_master=True))

if LISTEN_TO_SVN:
  c['schedulers'].append(TryJobSubversion(
      name='try_job_svn',
      svn_url=ActiveMaster.svn_url,
      last_good_urls=last_good_urls,
      code_review_sites=code_review_sites,
      pools=pools))

####### STATUS TARGETS

# Buildbot master url:
# Must come before AutoSetupMaster().
if ActiveMaster.is_production_host:
  c['buildbotURL'] = ActiveMaster.buildbot_url
else:
  c['buildbotURL'] = 'http://%s:%d/' % (
      socket.getfqdn(), ActiveMaster.master_port)

# Adds common status and tools to this master.
master_utils.AutoSetupMaster(
    c, ActiveMaster,
    public_html='../master.tryserver.chromium.linux/public_html',
    templates=['../master.tryserver.chromium.linux/templates'])

if MAIL_NOTIFIER:
  # Add a dumb MailNotifier first so it will be used for BuildSlave with
  # notify_on_missing set when they go missing.
  from buildbot.status import mail
  c['status'].append(mail.MailNotifier(
      fromaddr=ActiveMaster.from_address,
      builders=[],
      relayhost=config.Master.smtp,
      lookup=master_utils.UsersAreEmails()))

  from master import chromium_notifier
  c['status'].append(chromium_notifier.ChromiumNotifier(
      fromaddr=ActiveMaster.from_address,
      categories_steps={'': ['update_scripts']},
      relayhost=config.Master.smtp,
      status_header=
          '%(steps)s failed on slave "%(slavename)s" for builder "%(builder)s"',
      subject='%(steps)s failed on trybot %(slavename)s on %(date)s',
      sendToInterestedUsers=False,
      extraRecipients=['chrome-troopers+tryalert@google.com'],
      use_getname=True,
      enable_mail=ActiveMaster.is_production_host))

  # Try job result emails.
  from master.try_mail_notifier import TryMailNotifier
  c['status'].append(TryMailNotifier(
      fromaddr=ActiveMaster.from_address,
      reply_to=ActiveMaster.reply_to,
      subject="try %(result)s for %(reason)s @ r%(revision)s",
      mode='all',
      relayhost=config.Master.smtp,
      lookup=master_utils.UsersAreEmails(),
      # disable success emails from triggered builders
      no_email_on_success=['android_dbg', 'android_dbg_recipe',
                           'android_fyi_dbg', 'android_rel',
                           'linux_arm_cross_compile']))

if UPDATE_CODEREVIEW:
  from master.status_push import TryServerHttpStatusPush
  c['status'].append(
      TryServerHttpStatusPush(serverUrl=ActiveMaster.code_review_site))


# The followings are what is kept on disk.
# Keep last try jobs, the default is too low. Must keep at least a few days
# worth of try jobs. 3000 is not even a full day but the server is full. Keep
# more build objects than log since they are much smaller.
c['buildHorizon'] = 6000
c['logHorizon'] = 3000
# Must be at least 2x the number of slaves.
c['eventHorizon'] = 200
c['logCompressionLimit'] = False

# Adjust the buildCaches to be 3x the number of slaves per builder.
c['autoBuildCacheRatio'] = 3


# Hack buildbot so the Stop build button doesn't work anymore. Otherwise it's
# just a pain, user misuse this button all the time.
def hack_stop(function):
  def hook(*args, **kwargs):
    result = function(*args, **kwargs)
    result = result.replace('<input type="submit" value="Stop',
        '<input type="button" onclick="alert(\''
        'For more information, visit '
        'http://dev.chromium.org/developers/try-server-usage'
        '\');"'
        ' value="Stop')
    return result
  return hook

# Only do the hack_stop if we are the production master.  This allows
# us to keep the STOP button live for local/test instances.
#if ActiveMaster.is_production_host:
#  from buildbot.status.web.builder import StatusResourceBuilder
#  StatusResourceBuilder.build_line = hack_stop(StatusResourceBuilder.build_line)
#  from buildbot.status.web import base
#  base.make_stop_form = hack_stop(base.make_stop_form)


####### PROJECT IDENTITY

# The 'projectURL' string will be used to provide a link
# from buildbot HTML pages to your project's home page.
c['projectURL'] = 'http://dev.chromium.org/developers/testing/try-server-usage'

# vi: set ts=4 sts=2 sw=2 et:
