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