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 += "
  1. %s: " % html.escape(slave.getName()) + slaveurl = path_to_slave(req, slave) + data += "
  2. %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") + + else: + data.append("

    no current builds

    \n") + + + # Recent builds + data.append("

    Recent builds:

    \n") + 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 += "
  3. %s:\n" % name + data += "
  4. %s:\n" % (req.childLink(urllib.quote(name,'')), name) data += "
\n" return data + + def getChild(self, path, req): + return OneBuildSlaveResource(path)