# coding=utf8
# 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.
"""Triggers experimental try jobs on Rietveld without monitoring the results."""

import random
import urllib2

from verification import base


class TriggerExperimentalTryJobVerifier(base.Verifier):
  name = 'trigger experimental try job'

  def __init__(self, context, percentage, revision, try_job_description):
    super(TriggerExperimentalTryJobVerifier, self).__init__()
    self.context = context
    self.percentage = percentage
    self.revision = revision
    self.try_job_description = try_job_description

  def verify(self, pending):
    if random.random() < self.percentage:
      try:
        self.context.rietveld.trigger_try_jobs(
            pending.issue, pending.patchset, 'CQ', False, self.revision,
            self.try_job_description)
      except urllib2.HTTPError as e:
        if e.code not in (400, 500, 503):
          raise

    # Always succeed - experimental try jobs are not stable enough
    # to block CQ on them, but triggering builds allows developers
    # to get enough real-world traffic to get them to stable state.
    pending.verifications[self.name] = base.SimpleStatus(base.SUCCEEDED)

  def update_status(self, queue):
    pass
