Bug 472931 - per-slave status on buildbot waterfalls r=bhearsum

This patch adds /buildslaves/SLAVENAME to see the per-slave build
history on buildbot.

Upstream ticket is http://buildbot.net/trac/ticket/110


git-svn-id: svn://10.0.0.236/trunk@255806 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
catlee%mozilla.com
2009-01-14 15:34:31 +00:00
parent a442ef0308
commit 996ef2ac03
4 changed files with 108 additions and 9 deletions

View File

@@ -170,6 +170,11 @@ def path_to_step(request, stepstatus):
return (path_to_build(request, stepstatus.getBuild()) +
"/steps/%s" % urllib.quote(stepstatus.getName(), safe=''))
def path_to_slave(request, slave):
return (path_to_root(request) +
"buildslaves/" +
urllib.quote(slave.getName(), safe=''))
class Box:
# a Box wraps an Event. The Box has HTML <td> parameters that Events
# lack, and it has a base URL to which each File's name is relative.

View File

@@ -6,7 +6,7 @@ from twisted.internet import defer, reactor
import urllib, time
from twisted.python import log
from buildbot.status.web.base import HtmlResource, make_row, make_stop_form, \
css_classes, path_to_builder
css_classes, path_to_builder, path_to_slave
from buildbot.status.web.tests import TestsResource
from buildbot.status.web.step import StepsResource
@@ -90,7 +90,11 @@ class StatusResourceBuild(HtmlResource):
# TODO: turn this into a table, or some other sort of definition-list
# that doesn't take up quite so much vertical space
data += "<h2>Buildslave:</h2>\n %s\n" % html.escape(b.getSlavename())
try:
slaveurl = path_to_slave(req, status.getSlave(b.getSlavename()))
data += "<h2>Buildslave:</h2>\n <a href=\"%s\">%s</a>\n" % (html.escape(slaveurl), html.escape(b.getSlavename()))
except KeyError:
data += "<h2>Buildslave:</h2>\n %s\n" % html.escape(b.getSlavename())
data += "<h2>Reason:</h2>\n%s\n" % html.escape(b.getReason())
data += "<h2>Steps and Logfiles:</h2>\n"

View File

@@ -7,7 +7,7 @@ import re, urllib, time
from twisted.python import log
from buildbot import interfaces
from buildbot.status.web.base import HtmlResource, make_row, \
make_force_build_form, OneLineMixin
make_force_build_form, OneLineMixin, path_to_slave
from buildbot.process.base import BuildRequest
from buildbot.sourcestamp import SourceStamp
from buildbot import version, util
@@ -93,7 +93,8 @@ class StatusResourceBuilder(HtmlResource, OneLineMixin):
data += "<h2>Buildslaves:</h2>\n"
data += "<ol>\n"
for slave in slaves:
data += "<li><b>%s</b>: " % html.escape(slave.getName())
slaveurl = path_to_slave(req, slave)
data += "<li><b><a href=\"%s\">%s</a></b>: " % (html.escape(slaveurl), html.escape(slave.getName()))
if slave.isConnected():
data += "CONNECTED\n"
if slave.getAdmin():

View File

@@ -1,10 +1,96 @@
import time
from buildbot.status.web.base import HtmlResource, abbreviate_age
import time, urllib
from twisted.python import log
from twisted.web import html
from buildbot.status.web.base import HtmlResource, abbreviate_age, OneLineMixin
from buildbot import version, util
# /buildslaves/$slavename
class OneBuildSlaveResource(HtmlResource):
pass # TODO
class OneBuildSlaveResource(HtmlResource, OneLineMixin):
def __init__(self, slavename):
self.slavename = slavename
def getTitle(self, req):
return "Buildbot: %s" % html.escape(self.slavename)
def body(self, req):
s = self.getStatus(req)
my_builders = []
for bname in s.getBuilderNames():
b = s.getBuilder(bname)
for bs in b.getSlaves():
slavename = bs.getName()
if bs.getName() == self.slavename:
my_builders.append(b)
# Current builds
current_builds = []
for b in my_builders:
for cb in b.getCurrentBuilds():
if cb.getSlavename() == self.slavename:
current_builds.append(cb)
data = []
projectName = s.getProjectName()
data.append("<a href=\"%s\">%s</a>\n" % (self.path_to_root(req), projectName))
data.append("<h1>Build Slave: %s</h1>\n" % self.slavename)
if current_builds:
data.append("<h2>Currently building:</h2>\n")
data.append("<ul>\n")
for build in current_builds:
data.append("<li>%s</li>\n" % self.make_line(req, build, True))
data.append("</ul>\n")
else:
data.append("<h2>no current builds</h2>\n")
# Recent builds
data.append("<h2>Recent builds:</h2>\n")
data.append("<ul>\n")
n = 0
try:
max_builds = int(req.args.get('builds')[0])
except:
max_builds = 10
for build in s.generateFinishedBuilds(builders=[b.getName() for b in my_builders]):
if build.getSlavename() == self.slavename:
n += 1
data.append("<li>%s</li>\n" % self.make_line(req, build, True))
if n > max_builds:
break
data.append("</ul>\n")
projectURL = s.getProjectURL()
projectName = s.getProjectName()
data.append('<hr /><div class="footer">\n')
welcomeurl = self.path_to_root(req) + "index.html"
data.append("[<a href=\"%s\">welcome</a>]\n" % welcomeurl)
data.append("<br />\n")
data.append('<a href="http://buildbot.sourceforge.net/">Buildbot</a>')
data.append("-%s " % version)
if projectName:
data.append("working for the ")
if projectURL:
data.append("<a href=\"%s\">%s</a> project." % (projectURL,
projectName))
else:
data.append("%s project." % projectName)
data.append("<br />\n")
data.append("Page built: " +
time.strftime("%a %d %b %Y %H:%M:%S",
time.localtime(util.now()))
+ "\n")
data.append("</div>\n")
return "".join(data)
# /buildslaves
class BuildSlavesResource(HtmlResource):
@@ -30,7 +116,7 @@ class BuildSlavesResource(HtmlResource):
slave = s.getSlave(name)
slave_status = s.botmaster.slaves[name].slave_status
isBusy = len(slave_status.getRunningBuilds())
data += " <li>%s:\n" % name
data += " <li><a href=\"%s\">%s</a>:\n" % (req.childLink(urllib.quote(name,'')), name)
data += " <ul>\n"
builder_links = ['<a href="%s">%s</a>'
% (req.childLink("../builders/%s" % bname),bname)
@@ -69,3 +155,6 @@ class BuildSlavesResource(HtmlResource):
data += "</ol>\n"
return data
def getChild(self, path, req):
return OneBuildSlaveResource(path)