import os
from buildbot.buildslave import BuildSlave
from buildbot.schedulers.forcesched import ForceScheduler
from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.schedulers.timed import Nightly
from buildbot.changes import filter
from buildbot.config import BuilderConfig
from buildbot.process.factory import BuildFactory
from buildbot.process.properties import Interpolate
from buildbot.steps.shell import ShellCommand
from buildbot.status import html, words
from buildbot.status.web import authz, auth
from buildbot.status.mail import MailNotifier

PORT_WEB = 80           # Buildbot webserver port
PORT_GITHUB = 8011      # Buildbot github hook port
PORT_MASTER = 9989      # Port where buildbot master listen buildworkers
TEST_USER = 'buildbot'  # Credential to authenticate build triggers
TEST_PWD = 'docker'     # Credential to authenticate build triggers
BUILDER_NAME = 'docker'
GITHUB_DOCKER = 'github.com/dotcloud/docker'
BUILDBOT_PATH = '/data/buildbot'
DOCKER_PATH = '/go/src/github.com/dotcloud/docker'
DOCKER_CI_PATH = '/docker-ci'
BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME)
PULL_REQUEST_PATH = '/data/buildbot/slave/pullrequest/build'

# Credentials set by setup.sh and Vagrantfile
BUILDBOT_PWD = ''
IRC_PWD = ''
IRC_CHANNEL = ''
SMTP_USER = ''
SMTP_PWD = ''
EMAIL_RCP = ''


c = BuildmasterConfig = {}

c['title'] = "Docker"
c['titleURL'] = "waterfall"
c['buildbotURL'] = "http://docker-ci.dotcloud.com/"
c['db'] = {'db_url':"sqlite:///state.sqlite"}
c['slaves'] = [BuildSlave('buildworker', BUILDBOT_PWD)]
c['slavePortnum'] = PORT_MASTER


# Schedulers
c['schedulers'] = [ForceScheduler(name='trigger', builderNames=[BUILDER_NAME,
    'index','registry','coverage','nightlyrelease'])]
c['schedulers'] += [SingleBranchScheduler(name="all",
    change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=None,
    builderNames=[BUILDER_NAME])]
c['schedulers'] += [SingleBranchScheduler(name='pullrequest',
    change_filter=filter.ChangeFilter(category='github_pullrequest'), treeStableTimer=None,
    builderNames=['pullrequest'])]
c['schedulers'] += [Nightly(name='daily', branch=None, builderNames=['nightlyrelease'],
    hour=7, minute=00)]
c['schedulers'] += [Nightly(name='every4hrs', branch=None, builderNames=['registry','index'],
    hour=range(0,24,4), minute=15)]

# Builders
# Docker commit test
factory = BuildFactory()
factory.addStep(ShellCommand(description='Docker', logEnviron=False,
    usePTY=True, command=['sh', '-c', Interpolate(
    '{0}/docker-test/test_docker.sh %(src::revision)s'.format(DOCKER_CI_PATH))]))
c['builders'] = [BuilderConfig(name='docker',slavenames=['buildworker'],
    factory=factory)]

# Docker pull request test
factory = BuildFactory()
factory.addStep(ShellCommand(description='pull_request', logEnviron=False,
    usePTY=True, command=['sh', '-c', Interpolate(
    '{0}/docker-test/test_docker.sh %(src::revision)s %(src::repository)s'
    ' %(src::branch)s'.format(DOCKER_CI_PATH))]))
c['builders'] += [BuilderConfig(name='pullrequest',slavenames=['buildworker'],
    factory=factory)]

# Docker coverage test
factory = BuildFactory()
factory.addStep(ShellCommand(description='Coverage', logEnviron=False,
    usePTY=True, command='{0}/docker-coverage/coverage-docker.sh'.format(
    DOCKER_CI_PATH)))
c['builders'] += [BuilderConfig(name='coverage',slavenames=['buildworker'],
    factory=factory)]

# Registry functional test
factory = BuildFactory()
factory.addStep(ShellCommand(description='registry', logEnviron=False,
    command='. {0}/master/credentials.cfg; '
    '/docker-ci/functionaltests/test_registry.sh'.format(BUILDBOT_PATH),
    usePTY=True))
c['builders'] += [BuilderConfig(name='registry',slavenames=['buildworker'],
    factory=factory)]

# Index functional test
factory = BuildFactory()
factory.addStep(ShellCommand(description='index', logEnviron=False,
    command='. {0}/master/credentials.cfg; '
    '{1}/testing/functionaltests/test_index.py'.format(BUILDBOT_PATH,
    DOCKER_PATH), usePTY=True))
c['builders'] += [BuilderConfig(name='index',slavenames=['buildworker'],
    factory=factory)]

# Docker nightly release
nightlyrelease_cmd = ('docker run -i -t -privileged -lxc-conf=lxc.aa_profile=unconfined'
    ' -e AWS_S3_BUCKET=test.docker.io dockerbuilder')
factory = BuildFactory()
factory.addStep(ShellCommand(description='NightlyRelease',logEnviron=False,usePTY=True,
    command=nightlyrelease_cmd))
c['builders'] += [BuilderConfig(name='nightlyrelease',slavenames=['buildworker'],
    factory=factory)]

# Status
authz_cfg = authz.Authz(auth=auth.BasicAuth([(TEST_USER, TEST_PWD)]),
    forceBuild='auth')
c['status'] = [html.WebStatus(http_port=PORT_WEB, authz=authz_cfg)]
c['status'].append(html.WebStatus(http_port=PORT_GITHUB, allowForce=True,
    change_hook_dialects={ 'github': True }))
c['status'].append(MailNotifier(fromaddr='buildbot@docker.io',
    sendToInterestedUsers=False, extraRecipients=[EMAIL_RCP],
    mode='failing', relayhost='smtp.mailgun.org', smtpPort=587, useTls=True,
    smtpUser=SMTP_USER, smtpPassword=SMTP_PWD))
c['status'].append(words.IRC("irc.freenode.net", "dockerqabot",
    channels=[IRC_CHANNEL], password=IRC_PWD, allowForce=True,
    notify_events={'exception':1, 'successToFailure':1, 'failureToSuccess':1}))
