diff --git a/mozilla/tools/buildbot/buildbot/status/web/base.py b/mozilla/tools/buildbot/buildbot/status/web/base.py
index a1e5a972793..e7257756c47 100644
--- a/mozilla/tools/buildbot/buildbot/status/web/base.py
+++ b/mozilla/tools/buildbot/buildbot/status/web/base.py
@@ -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
parameters that Events
# lack, and it has a base URL to which each File's name is relative.
diff --git a/mozilla/tools/buildbot/buildbot/status/web/build.py b/mozilla/tools/buildbot/buildbot/status/web/build.py
index df55e875c42..6ce95abbc7b 100644
--- a/mozilla/tools/buildbot/buildbot/status/web/build.py
+++ b/mozilla/tools/buildbot/buildbot/status/web/build.py
@@ -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 += "Buildslave:\n %s\n" % html.escape(b.getSlavename())
+ try:
+ slaveurl = path_to_slave(req, status.getSlave(b.getSlavename()))
+ data += "Buildslave:\n %s\n" % (html.escape(slaveurl), html.escape(b.getSlavename()))
+ except KeyError:
+ data += "Buildslave:\n %s\n" % html.escape(b.getSlavename())
data += "Reason:\n%s\n" % html.escape(b.getReason())
data += "Steps and Logfiles:\n"
diff --git a/mozilla/tools/buildbot/buildbot/status/web/builder.py b/mozilla/tools/buildbot/buildbot/status/web/builder.py
index d625d431d35..5644d4f76dd 100644
--- a/mozilla/tools/buildbot/buildbot/status/web/builder.py
+++ b/mozilla/tools/buildbot/buildbot/status/web/builder.py
@@ -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 += "Buildslaves:\n"
data += "\n"
for slave in slaves:
- data += "- %s: " % html.escape(slave.getName())
+ slaveurl = path_to_slave(req, slave)
+ data += "
- %s: " % (html.escape(slaveurl), html.escape(slave.getName()))
if slave.isConnected():
data += "CONNECTED\n"
if slave.getAdmin():
diff --git a/mozilla/tools/buildbot/buildbot/status/web/slaves.py b/mozilla/tools/buildbot/buildbot/status/web/slaves.py
index 62c40124fbf..7d5a7b4b532 100644
--- a/mozilla/tools/buildbot/buildbot/status/web/slaves.py
+++ b/mozilla/tools/buildbot/buildbot/status/web/slaves.py
@@ -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("%s\n" % (self.path_to_root(req), projectName))
+
+ data.append("
Build Slave: %s\n" % self.slavename)
+
+ if current_builds:
+ data.append("Currently building:\n")
+ data.append("\n")
+ for build in current_builds:
+ data.append("- %s
\n" % self.make_line(req, build, True))
+ data.append(" \n")
+
+ else:
+ data.append("no current builds\n")
+
+
+ # Recent builds
+ data.append("Recent builds:\n")
+ data.append("\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("- %s
\n" % self.make_line(req, build, True))
+ if n > max_builds:
+ break
+ data.append(" \n")
+
+ projectURL = s.getProjectURL()
+ projectName = s.getProjectName()
+ data.append(' \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 += " - %s:\n" % name
+ data += "
- %s:\n" % (req.childLink(urllib.quote(name,'')), name)
data += "
\n"
builder_links = ['%s'
% (req.childLink("../builders/%s" % bname),bname)
@@ -69,3 +155,6 @@ class BuildSlavesResource(HtmlResource):
data += " \n"
return data
+
+ def getChild(self, path, req):
+ return OneBuildSlaveResource(path)
|