#!/usr/bin/env python
# Copyright 2015 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.

from buildbot.process import buildrequest
from buildbot.process.properties import WithProperties
from buildbot.scheduler import Nightly
from buildbot.scheduler import Triggerable
from buildbot.schedulers.basic import SingleBranchScheduler

from master import gitiles_poller
from master import master_utils
from master import slaves_list
from master.factory import annotator_factory
from master.factory import remote_run_factory

import config
import master_site_config

import math

ActiveMaster = master_site_config.V8FYI
MAIL_NOTIFIER = ActiveMaster.is_production_host

INFRA_REPO_URL = 'https://chromium.googlesource.com/infra/infra'

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


####### DATABASE

config.DatabaseSetup(c)


####### CHANGESOURCES

comparator = gitiles_poller.GitilesRevisionComparator()
c['change_source'] = [
  gitiles_poller.GitilesPoller(
      'https://chromium.googlesource.com/v8/v8',
      branches=['master', 'candidate'],
      pollInterval=20,
      comparator=comparator,
  )
]

# TODO(machenbach): Find common place for this and internal copy:
# http://shortn/_PM6ecAbllK
def merge_requests_logarithmic(req1, req2, queue_length, merged_length):
  """Merges builds dependent on the number of builds in the queue."""
  if not buildrequest.BuildRequest.canBeMergedWith(req1, req2):
    return False

  return merged_length <= int(math.log(queue_length, 2))

# Tell buildbot that we want to use a non-standard fuction with 4 parameters.
setattr(merge_requests_logarithmic, 'with_length', True)

####### FACTORIES

F = annotator_factory.AnnotatorFactory().BaseFactory

def m_remote_run(recipe, **kwargs):
  props = {'path_config': 'kitchen'}
  props.update(kwargs.pop('properties', {}))
  return remote_run_factory.RemoteRunFactory(
    active_master=ActiveMaster,
    repository=kwargs.pop(
        'repository',
        'https://chromium.googlesource.com/chromium/tools/build.git'
    ),
    recipe=recipe,
    factory_properties=props,
    **kwargs)

####### BUILDER SPECS

CATEGORY_RELEASE = '1Release|release'
CATEGORY_LAYOUT = '2Layout|chromium'
CATEGORY_NONLAYOUT = '3Nonlayout|chromium'
CATEGORY_NONLAYOUT_NO_MAIL = '3Nonlayout'
CATEGORY_GPU_NO_MAIL = '4GPU'
CATEGORY_CLUSTERFUZZ = '5Clusterfuzz|clusterfuzz'
CATEGORY_NODE_JS = '6Node.js|node'

nightly_builders = [
  {
    'name': 'V8 lkgr finder',
    'builddir': 'v8-lkgr',
    'factory': m_remote_run(
        'lkgr_finder',
        repository=INFRA_REPO_URL,
        properties={'lkgr_project': 'v8', 'allowed_lag': 4},
    ),
    'category': CATEGORY_RELEASE,
    'auto_reboot' : False,
  },
  {
    'name': 'Auto-roll - push',
    'builddir': 'auto-roll-push',
    'factory': F('v8/auto_roll_push'),
    'category': CATEGORY_RELEASE,
    'auto_reboot' : False,
  },
  {
    'name': 'Auto-roll - deps',
    'builddir': 'auto-roll-deps',
    'factory': F('v8/auto_roll_deps'),
    'category': CATEGORY_RELEASE,
    'auto_reboot' : False,
  },
  {
    'name': 'Auto-roll - v8 deps',
    'builddir': 'auto-roll-v8-deps',
    'factory': F('v8/auto_roll_v8_deps'),
    'category': CATEGORY_RELEASE,
    'auto_reboot' : False,
  },
  {
    'name': 'Auto-roll - v8rel',
    'builddir': 'v8rel',
    'factory': F('v8/auto_roll_v8rel'),
    'category': CATEGORY_RELEASE,
    'auto_reboot' : False,
  },
  {
    'name': 'Auto-roll - release process',
    'builddir': 'release',
    'factory': F('v8/auto_roll_release_process'),
    'category': CATEGORY_RELEASE + '|clusterfuzz',
    'auto_reboot' : False,
  },
]


scheduled_builders = [
  {
    'name': 'V8-Blink Win',
    'factory': m_remote_run('blink_downstream'),
    'category': CATEGORY_LAYOUT,
  },
  {
    'name': 'V8-Blink Mac',
    'factory': m_remote_run('blink_downstream'),
    'category': CATEGORY_LAYOUT,
  },
  {
    'name': 'V8-Blink Linux 64',
    'factory': m_remote_run('blink_downstream'),
    'category': CATEGORY_LAYOUT,
    # Build all revisions.
    'mergeRequests': False,
  },
  {
    'name': 'V8-Blink Linux 64 - ignition',
    'factory': m_remote_run('blink_downstream'),
    'category': CATEGORY_LAYOUT,
  },
  {
    'name': 'V8-Blink Linux 64 (dbg)',
    'factory': m_remote_run('blink_downstream'),
    'category': CATEGORY_LAYOUT,
    'mergeRequests': merge_requests_logarithmic,
  },
  {
    'name': 'Linux Debug Builder',
    'factory': m_remote_run(
        'chromium', triggers=['cr_linux_dbg']),
    'category': CATEGORY_NONLAYOUT,
  },
  {
    'name': 'V8 Linux GN',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_NONLAYOUT,
  },
  {
    'name': 'V8 Android GN (dbg)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_NONLAYOUT,
  },
  {
    'name': 'Linux ASAN Builder',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_NONLAYOUT,
  },
  {
    'name': 'Android Builder',
    'factory': F('android/builder'),
    'category': CATEGORY_NONLAYOUT,
  },
  {
    'name': 'Linux Snapshot Builder',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_NONLAYOUT_NO_MAIL,
  },
  {
    'name': 'Win Release (NVIDIA)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_GPU_NO_MAIL,
  },
  {
    'name': 'Mac Release (Intel)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_GPU_NO_MAIL,
  },
  {
    'name': 'Linux Release (NVIDIA)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_GPU_NO_MAIL,
  },
  {
    'name': 'Android Release (Nexus 5X)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_GPU_NO_MAIL,
  },
]

clusterfuzz_builders = [
  {
    'name': 'Chromium ASAN (symbolized)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_CLUSTERFUZZ,
  },
  {
    'name': 'Chromium ASAN - debug',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_CLUSTERFUZZ,
  },
  {
    'name': 'Chromium Win SyzyASAN',
    'factory': m_remote_run(
        'chromium', timeout=3600),
    'category': CATEGORY_CLUSTERFUZZ,
  }
]

node_js_builders = [
  {
    'name': 'V8 - node.js integration',
    'builddir': 'node_js',
    'factory': F('v8/node_integration'),
    'category': CATEGORY_NODE_JS,
    'auto_reboot' : True,
  },
]

triggered_builders = [
  {
    'name': 'Linux Tests (dbg)(1)',
    'factory': m_remote_run('chromium'),
    'category': CATEGORY_NONLAYOUT_NO_MAIL,
  },
]


####### SCHEDULERS

c['schedulers'] = [
  SingleBranchScheduler(
      name='v8_fyi',
      branch='master',
      treeStableTimer=10,
      builderNames=[
        builder['name']
        for builder in scheduled_builders + node_js_builders
      ],
  ),
  SingleBranchScheduler(
      name='v8_candidate',
      branch='candidate',
      treeStableTimer=10,
      builderNames=[builder['name'] for builder in clusterfuzz_builders],
  ),
  Triggerable('cr_linux_dbg', ['Linux Tests (dbg)(1)']),
  # LKGR finder.
  Nightly(
      name='v8_lkgr_finder',
      branch=None,
      builderNames=['V8 lkgr finder'],
      minute=range(8, 60, 15),
  ),
  # Auto-roll builders.
  Nightly(
      name='v8_release_process',
      branch=None,
      builderNames=['Auto-roll - release process'],
      minute=range(10, 60, 15),
  ),
  Nightly(
      name='v8_auto_push',
      branch=None,
      builderNames=['Auto-roll - push'],
      minute=range(12, 60, 15),
  ),
  Nightly(
      name='v8_v8rel',
      branch=None,
      builderNames=[
        'Auto-roll - v8rel',
        'Auto-roll - deps',
      ],
      minute=range(0, 60, 15),
  ),
  # Run v8 deps roller every EMEA morning at 5am.
  Nightly(
      name='v8_v8deps',
      branch=None,
      builderNames=['Auto-roll - v8 deps'],
      hour=[20],
  ),
]

####### BUILDERS

c['builders'] = (
    nightly_builders +
    scheduled_builders +
    triggered_builders +
    clusterfuzz_builders +
    node_js_builders
)

# Associate the slaves to the builders. The configuration is in slaves.cfg.
slaves = slaves_list.SlavesList('slaves.cfg', 'V8FYI')
for builder in c['builders']:
  builder['slavenames'] = slaves.GetSlavesName(builder=builder['name'])


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


####### STATUS TARGETS

# Buildbot master url:
# Must come before AutoSetupMaster().
c['buildbotURL'] = ActiveMaster.buildbot_url

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

if MAIL_NOTIFIER:
  import mail_notifier_cfg
  mail_notifier_cfg.Update(config, ActiveMaster, c)

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


####### PROJECT IDENTITY

c['projectName'] = ActiveMaster.project_name
c['projectURL'] = config.Master.project_url
