Package buildbot :: Package status :: Package web :: Module slaves
[frames] | no frames]

Source Code for Module buildbot.status.web.slaves

  1  # This file is part of Buildbot.  Buildbot is free software: you can 
  2  # redistribute it and/or modify it under the terms of the GNU General Public 
  3  # License as published by the Free Software Foundation, version 2. 
  4  # 
  5  # This program is distributed in the hope that it will be useful, but WITHOUT 
  6  # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
  8  # details. 
  9  # 
 10  # You should have received a copy of the GNU General Public License along with 
 11  # this program; if not, write to the Free Software Foundation, Inc., 51 
 12  # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 
 13  # 
 14  # Copyright Buildbot Team Members 
 15   
 16   
 17  import time, urllib 
 18  from twisted.web import html 
 19  from twisted.web.util import Redirect 
 20  from twisted.web.error import NoResource 
 21   
 22  from buildbot.status.web.base import HtmlResource, abbreviate_age, \ 
 23      BuildLineMixin, path_to_slave, path_to_authfail 
 24  from buildbot import util 
 25   
 26  # /buildslaves/$slavename 
27 -class OneBuildSlaveResource(HtmlResource, BuildLineMixin):
28 addSlash = False
29 - def __init__(self, slavename):
32
33 - def getTitle(self, req):
34 return "Buildbot: %s" % self.slavename
35
36 - def getChild(self, path, req):
37 s = self.getStatus(req) 38 slave = s.getSlave(self.slavename) 39 if path == "shutdown": 40 if self.getAuthz(req).actionAllowed("gracefulShutdown", req, slave): 41 slave.setGraceful(True) 42 else: 43 return Redirect(path_to_authfail(req)) 44 return Redirect(path_to_slave(req, slave))
45
46 - def content(self, request, ctx):
47 s = self.getStatus(request) 48 slave = s.getSlave(self.slavename) 49 50 my_builders = [] 51 for bname in s.getBuilderNames(): 52 b = s.getBuilder(bname) 53 for bs in b.getSlaves(): 54 if bs.getName() == self.slavename: 55 my_builders.append(b) 56 57 # Current builds 58 current_builds = [] 59 for b in my_builders: 60 for cb in b.getCurrentBuilds(): 61 if cb.getSlavename() == self.slavename: 62 current_builds.append(self.get_line_values(request, cb)) 63 64 try: 65 max_builds = int(request.args.get('numbuilds')[0]) 66 except: 67 max_builds = 10 68 69 recent_builds = [] 70 n = 0 71 for rb in s.generateFinishedBuilds(builders=[b.getName() for b in my_builders]): 72 if rb.getSlavename() == self.slavename: 73 n += 1 74 recent_builds.append(self.get_line_values(request, rb)) 75 if n > max_builds: 76 break 77 78 # connects over the last hour 79 slave = s.getSlave(self.slavename) 80 connect_count = slave.getConnectCount() 81 82 ctx.update(dict(slave=slave, 83 slavename = self.slavename, 84 current = current_builds, 85 recent = recent_builds, 86 shutdown_url = request.childLink("shutdown"), 87 authz = self.getAuthz(request), 88 this_url = "../../../" + path_to_slave(request, slave), 89 access_uri = slave.getAccessURI()), 90 admin = unicode(slave.getAdmin() or '', 'utf-8'), 91 host = unicode(slave.getHost() or '', 'utf-8'), 92 slave_version = slave.getVersion(), 93 show_builder_column = True, 94 connect_count = connect_count) 95 template = request.site.buildbot_service.templates.get_template("buildslave.html") 96 data = template.render(**ctx) 97 return data
98 99 # /buildslaves
100 -class BuildSlavesResource(HtmlResource):
101 title = "BuildSlaves" 102 addSlash = True 103
104 - def content(self, request, ctx):
105 s = self.getStatus(request) 106 107 #?no_builders=1 disables build column 108 show_builder_column = not (request.args.get('no_builders', '0')[0])=='1' 109 ctx['show_builder_column'] = show_builder_column 110 111 used_by_builder = {} 112 for bname in s.getBuilderNames(): 113 b = s.getBuilder(bname) 114 for bs in b.getSlaves(): 115 slavename = bs.getName() 116 if slavename not in used_by_builder: 117 used_by_builder[slavename] = [] 118 used_by_builder[slavename].append(bname) 119 120 slaves = ctx['slaves'] = [] 121 for name in util.naturalSort(s.getSlaveNames()): 122 info = {} 123 slaves.append(info) 124 slave = s.getSlave(name) 125 slave_status = s.botmaster.slaves[name].slave_status 126 info['running_builds'] = len(slave_status.getRunningBuilds()) 127 info['link'] = request.childLink(urllib.quote(name,'')) 128 info['name'] = name 129 130 if show_builder_column: 131 info['builders'] = [] 132 for b in used_by_builder.get(name, []): 133 info['builders'].append(dict(link=request.childLink("../builders/%s" % b), name=b)) 134 135 info['version'] = slave.getVersion() 136 info['connected'] = slave.isConnected() 137 info['connectCount'] = slave.getConnectCount() 138 139 if slave.isConnected(): 140 info['admin'] = unicode(slave.getAdmin() or '', 'utf-8') 141 last = slave.lastMessageReceived() 142 if last: 143 info['last_heard_from_age'] = abbreviate_age(time.time() - last) 144 info['last_heard_from_time'] = time.strftime("%Y-%b-%d %H:%M:%S", 145 time.localtime(last)) 146 147 template = request.site.buildbot_service.templates.get_template("buildslaves.html") 148 data = template.render(**ctx) 149 return data
150
151 - def getChild(self, path, req):
152 try: 153 self.getStatus(req).getSlave(path) 154 return OneBuildSlaveResource(path) 155 except KeyError: 156 return NoResource("No such slave '%s'" % html.escape(path))
157