1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import urllib
6
7from common.buildbot import builds
8from common.buildbot import network
9
10
11def Builders(master_name):
12  builder_data = network.FetchData(network.BuildUrl(
13      master_name, 'json/builders'))
14  return sorted(Builder(master_name, builder_name, builder_info)
15                for builder_name, builder_info in builder_data.iteritems())
16
17
18class Builder(object):
19
20  def __init__(self, master_name, name, data):
21    self._master_name = master_name
22    self._name = name
23    self._url = network.BuildUrl(
24        master_name, 'builders/%s' % urllib.quote(self.name))
25    self._builds = builds.Builds(master_name, name, self._url)
26
27    self.Update(data)
28
29  def __lt__(self, other):
30    return self.name < other.name
31
32  def __str__(self):
33    return self.name
34
35  def Update(self, data=None):
36    if not data:
37      data = network.FetchData(network.BuildUrl(
38          self.master_name, 'json/builders/%s' % urllib.quote(self.name)))
39    self._state = data['state']
40    self._pending_build_count = data['pendingBuilds']
41    self._current_builds = frozenset(data['currentBuilds'])
42    self._cached_builds = frozenset(data['cachedBuilds'])
43    self._slaves = frozenset(data['slaves'])
44
45  @property
46  def master_name(self):
47    return self._master_name
48
49  @property
50  def name(self):
51    return self._name
52
53  @property
54  def url(self):
55    return self._url
56
57  @property
58  def state(self):
59    return self._state
60
61  @property
62  def builds(self):
63    return self._builds
64
65  @property
66  def pending_build_count(self):
67    return self._pending_build_count
68
69  @property
70  def current_builds(self):
71    """Set of build numbers currently building.
72
73    There may be multiple entries if there are multiple build slaves.
74    """
75    return self._current_builds
76
77  @property
78  def cached_builds(self):
79    """Set of builds whose data are visible on the master in increasing order.
80
81    More builds may be available than this.
82    """
83    return self._cached_builds
84
85  @property
86  def available_builds(self):
87    return self.cached_builds - self.current_builds
88
89  @property
90  def last_build(self):
91    """Last completed build."""
92    return max(self.available_builds)
93
94  @property
95  def slaves(self):
96    return self._slaves
97