예제 #1
0
def prefill_builds_cache(cache, master_url, builder_name):  # pragma: no cover
    master_name = master_name_from_url(master_url)
    builds_url = '%s/get_builds' % CBE_BASE
    params = {'master': master_name, 'builder': builder_name}
    response = requests.get(builds_url, params=params)
    builds = []
    try:
        builds = response.json()['builds']
    except ValueError:
        logging.error(
            'Failed to parse JSON response from master: %s, builder: %s',
            master_name, builder_name)
    for build in builds:
        if not build.get('number'):
            index = builds.index(build)
            logging.error('build at index %s in %s missing number?', index,
                          response.url)
            continue
        build_number = build['number']
        key = cache_key_for_build(master_url, builder_name, build_number)
        cache.set(key, build)
    build_numbers = map(operator.itemgetter('number'), builds)
    logging.debug('Prefilled (%.1fs) %s for %s %s',
                  response.elapsed.total_seconds(),
                  string_helpers.re_range(build_numbers), master_name,
                  builder_name)
    return build_numbers
예제 #2
0
def prefill_builds_cache(cache, master_url, builder_name):  # pragma: no cover
  master_name = master_name_from_url(master_url)
  builds_url = '%s/get_builds' % CBE_BASE
  params = {'master': master_name, 'builder': builder_name}
  response = requests.get(builds_url, params=params)
  builds = []
  try:
    builds = response.json()['builds']
  except ValueError:
    logging.error(
        'Failed to parse JSON response from master: %s, builder: %s',
        master_name, builder_name)
  for build in builds:
    if not build.get('number'):
      index = builds.index(build)
      logging.error(
          'build at index %s in %s missing number?', index, response.url)
      continue
    build_number = build['number']
    key = cache_key_for_build(master_url, builder_name, build_number)
    cache.set(key, build)
  build_numbers = map(operator.itemgetter('number'), builds)
  logging.debug('Prefilled (%.1fs) %s for %s %s',
                response.elapsed.total_seconds(),
                string_helpers.re_range(build_numbers),
                master_name, builder_name)
  return build_numbers
예제 #3
0
 def test_re_range(self):
   self.assertEquals(string_helpers.re_range([3, 2, 1]), "1-3")
   self.assertEquals(string_helpers.re_range([1, 1]), "1, 1")
   self.assertEquals(string_helpers.re_range([1, 2, 2, 3]), "1-2, 2-3")
예제 #4
0
def compute_transition(cache, alert, recent_build_ids):  # pragma: no cover
  master = alert['master_url']
  builder = alert['builder_name']
  step = alert['step_name']
  reason = alert['reason']

  previous_build_ids = [num for num in recent_build_ids
                        if num < alert['last_failing_build']]

  def fetch_function(num):
    return buildbot.fetch_build_json(cache, master, builder, num)

  first_fail = fetch_function(alert['last_failing_build'])[0]

  last_pass = None
  builds_missing_steps = []
  for build_id in previous_build_ids:
    build = fetch_function(build_id)

    # build is a tuple of the json and the origin of the data
    build_data = build[0]

    if not build_data:
      # fetch_build_json will already log critical in this case.
      continue

    matching_steps = [s for s in build_data['steps'] if s['name'] == step]
    if len(matching_steps) != 1:
      if not matching_steps:
        # This case is pretty common, so just warn all at once at the end.
        builds_missing_steps.append(build_data['number'])
      else:
        logging.error(
            '%s has unexpected number of %s steps: %s', build_data['number'],
            step, matching_steps)
      continue

    step_data = matching_steps[0]
    step_result = step_data['results'][0]
    if step_result not in NON_FAILING_RESULTS:
      if reason:
        reasons = reasons_for_failure(
            cache, step_data, build_data, builder, master)
        # This build doesn't seem to have this step reason, ignore it.
        if not reasons:
          continue
        # Failed, but our failure reason wasn't present!
        # FIXME: This is wrong for compile failures, and possibly
        # for test failures as well if not all tests are run...
        if reason not in reasons:
          last_pass = build_data
          break

      first_fail = build_data
      continue

    # None is 'didn't run', not a passing result.
    if step_result is None:
      continue

    last_pass = build_data
    break

  if builds_missing_steps:
    logging.warn(
        'Builds %s missing step %s (%s %s).',
         string_helpers.re_range(builds_missing_steps),
         step, master, builder)

  return last_pass, first_fail
예제 #5
0
 def test_re_range(self):
   self.assertEquals(string_helpers.re_range([3, 2, 1]), "1-3")
   self.assertEquals(string_helpers.re_range([1, 1]), "1, 1")
   self.assertEquals(string_helpers.re_range([1, 2, 2, 3]), "1-2, 2-3")