Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Unified Diff: third_party/buildbot_7_12/buildbot/status/web/builder.py

Issue 12207158: Bye bye buildbot 0.7.12. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/buildbot_7_12/buildbot/status/web/builder.py
diff --git a/third_party/buildbot_7_12/buildbot/status/web/builder.py b/third_party/buildbot_7_12/buildbot/status/web/builder.py
deleted file mode 100644
index a4d0a1085baac9ff5c4d1451299a3e4f13b30d3e..0000000000000000000000000000000000000000
--- a/third_party/buildbot_7_12/buildbot/status/web/builder.py
+++ /dev/null
@@ -1,397 +0,0 @@
-
-from twisted.web.error import NoResource
-from twisted.web import html, static
-from twisted.web.util import Redirect
-
-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, path_to_build, path_to_slave, \
- path_to_builder, path_to_change, getAndCheckProperties
-from buildbot.process.base import BuildRequest
-from buildbot.process.properties import Properties
-from buildbot.sourcestamp import SourceStamp
-
-from buildbot.status.web.build import BuildsResource, StatusResourceBuild
-from buildbot import util
-
-# /builders/$builder
-class StatusResourceBuilder(HtmlResource, OneLineMixin):
- addSlash = True
-
- def __init__(self, builder_status, builder_control):
- HtmlResource.__init__(self)
- self.builder_status = builder_status
- self.builder_control = builder_control
-
- def getTitle(self, request):
- return "Buildbot: %s" % html.escape(self.builder_status.getName())
-
- def build_line(self, build, req):
- buildnum = build.getNumber()
- buildurl = path_to_build(req, build)
- data = '<a href="%s">#%d</a> ' % (buildurl, buildnum)
-
- when = build.getETA()
- if when is not None:
- when_time = time.strftime("%H:%M:%S",
- time.localtime(time.time() + when))
- data += "ETA %ds (%s) " % (when, when_time)
- step = build.getCurrentStep()
- if step:
- data += "[%s]" % step.getName()
- else:
- data += "[waiting for Lock]"
- # TODO: is this necessarily the case?
-
- if self.builder_control is not None:
- stopURL = path_to_build(req, build) + '/stop'
- data += '''
-<form method="post" action="%s" class="command stopbuild" style="display:inline">
- <input type="submit" value="Stop Build" />
-</form>''' % stopURL
- return data
-
- def request_line(self, build_request, req):
- when = time.strftime("%b %d %H:%M:%S", time.localtime(build_request.getSubmitTime()))
- delay = util.formatInterval(util.now() - build_request.getSubmitTime())
- changes = build_request.source.changes
- if changes:
- change_strings = []
- for c in changes:
- change_strings.append("<a href=\"%s\">%s</a>" % (path_to_change(req, c), c.who))
- if len(change_strings) == 1:
- reason = "change by %s" % change_strings[0]
- else:
- reason = "changes by %s" % ", ".join(change_strings)
- elif build_request.source.revision:
- reason = build_request.source.revision
- else:
- reason = "no changes specified"
-
- if self.builder_control is not None:
- cancelURL = path_to_builder(req, self.builder_status) + '/cancelbuild'
- cancelButton = '''
-<form action="%s" class="command cancelbuild" style="display:inline" method="post">
- <input type="hidden" name="id" value="%s" />
- <input type="submit" value="Cancel Build" />
-</form>''' % (cancelURL, id(build_request))
- else:
- cancelButton = ""
- return "<font size=\"-1\">(%s, waiting %s)</font>%s%s" % (when, delay, cancelButton, reason)
-
- def body(self, req):
- b = self.builder_status
- control = self.builder_control
- status = self.getStatus(req)
-
- slaves = b.getSlaves()
- connected_slaves = [s for s in slaves if s.isConnected()]
-
- projectName = status.getProjectName()
-
- data = '<a href="%s">%s</a>\n' % (self.path_to_root(req), projectName)
-
- data += "<h1>Builder: %s</h1>\n" % html.escape(b.getName())
-
- # the first section shows builds which are currently running, if any.
-
- current = b.getCurrentBuilds()
- if current:
- data += "<h2>Currently Building:</h2>\n"
- data += "<ul>\n"
- for build in current:
- data += " <li>" + self.build_line(build, req) + "</li>\n"
- data += "</ul>\n"
- else:
- data += "<h2>no current builds</h2>\n"
-
- pending = b.getPendingBuilds()
- if pending:
- data += "<h2>Pending Builds:</h2>\n"
- data += "<ul>\n"
- for request in pending:
- data += " <li>" + self.request_line(request, req) + "</li>\n"
- data += "</ul>\n"
-
- cancelURL = path_to_builder(req, self.builder_status) + '/cancelbuild'
- if self.builder_control is not None:
- data += '''
-<form action="%s" class="command cancelbuild" style="display:inline" method="post">
- <input type="hidden" name="id" value="all" />
- <input type="submit" value="Cancel All" />
-</form>''' % cancelURL
- else:
- data += "<h2>no pending builds</h2>\n"
-
- # Then a section with the last 5 builds, with the most recent build
- # distinguished from the rest.
-
- data += "<h2>Recent Builds:</h2>\n"
- data += "(<a href=\"%s\">view in waterfall</a>)\n" % (self.path_to_root(req)+"waterfall?show="+html.escape(b.getName()))
- data += "<ul>\n"
- numbuilds = int(req.args.get('numbuilds', ['5'])[0])
- for i,build in enumerate(b.generateFinishedBuilds(num_builds=int(numbuilds))):
- data += " <li>" + self.make_line(req, build, False) + "</li>\n"
- if i == 0:
- data += "<br />\n" # separator
- # TODO: or empty list?
- data += "</ul>\n"
-
-
- data += "<h2>Buildslaves:</h2>\n"
- data += "<ol>\n"
- for slave in slaves:
- 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():
- data += make_row("Admin:", html.escape(slave.getAdmin()))
- if slave.getHost():
- data += "<span class='label'>Host info:</span>\n"
- data += html.PRE(html.escape(slave.getHost()))
- else:
- data += ("NOT CONNECTED\n")
- data += "</li>\n"
- data += "</ol>\n"
-
- if control is not None and connected_slaves:
- forceURL = path_to_builder(req, b) + '/force'
- data += make_force_build_form(forceURL, self.isUsingUserPasswd(req))
- elif control is not None:
- data += """
- <p>All buildslaves appear to be offline, so it's not possible
- to force this build to execute at this time.</p>
- """
-
- if control is not None:
- pingURL = path_to_builder(req, b) + '/ping'
- data += """
- <form method="post" action="%s" class='command pingbuilder'>
- <p>To ping the buildslave(s), push the 'Ping' button</p>
-
- <input type="submit" value="Ping Builder" />
- </form>
- """ % pingURL
-
- data += self.footer(status, req)
-
- return data
-
- def force(self, req):
- """
-
- Custom properties can be passed from the web form. To do
- this, subclass this class, overriding the force() method. You
- can then determine the properties (usually from form values,
- by inspecting req.args), then pass them to this superclass
- force method.
-
- """
- name = req.args.get("username", ["<unknown>"])[0]
- reason = req.args.get("comments", ["<no reason specified>"])[0]
- branch = req.args.get("branch", [""])[0]
- revision = req.args.get("revision", [""])[0]
-
- r = "The web-page 'force build' button was pressed by '%s': %s\n" \
- % (html.escape(name), html.escape(reason))
- log.msg("web forcebuild of builder '%s', branch='%s', revision='%s'"
- " by user '%s'" % (self.builder_status.getName(), branch,
- revision, name))
-
- if not self.builder_control:
- # TODO: tell the web user that their request was denied
- log.msg("but builder control is disabled")
- return Redirect("..")
-
- if self.isUsingUserPasswd(req):
- if not self.authUser(req):
- return Redirect("../../authfail")
-
- # keep weird stuff out of the branch revision, and property strings.
- # TODO: centralize this somewhere.
- if not re.match(r'^[\w\.\-\/]*$', branch):
- log.msg("bad branch '%s'" % branch)
- return Redirect("..")
- if not re.match(r'^[\w\.\-\/]*$', revision):
- log.msg("bad revision '%s'" % revision)
- return Redirect("..")
- properties = getAndCheckProperties(req)
- if properties is None:
- return Redirect("..")
- if not branch:
- branch = None
- if not revision:
- revision = None
-
- # TODO: if we can authenticate that a particular User pushed the
- # button, use their name instead of None, so they'll be informed of
- # the results.
- # TODO2: we can authenticate that a particular User pushed the button
- # now, so someone can write this support. but it requires a
- # buildbot.changes.changes.Change instance which is tedious at this
- # stage to compute
- s = SourceStamp(branch=branch, revision=revision)
- req = BuildRequest(r, s, builderName=self.builder_status.getName(),
- properties=properties)
- try:
- self.builder_control.requestBuildSoon(req)
- except interfaces.NoSlaveError:
- # TODO: tell the web user that their request could not be
- # honored
- pass
- # send the user back to the builder page
- return Redirect(".")
-
- def ping(self, req):
- log.msg("web ping of builder '%s'" % self.builder_status.getName())
- self.builder_control.ping() # TODO: there ought to be an ISlaveControl
- # send the user back to the builder page
- return Redirect(".")
-
- def cancel(self, req):
- try:
- request_id = req.args.get("id", [None])[0]
- if request_id == "all":
- cancel_all = True
- else:
- cancel_all = False
- request_id = int(request_id)
- except:
- request_id = None
- if request_id:
- for build_req in self.builder_control.getPendingBuilds():
- if cancel_all or id(build_req.original_request.status) == request_id:
- log.msg("Cancelling %s" % build_req)
- build_req.cancel()
- if not cancel_all:
- break
- return Redirect(".")
-
- def getChild(self, path, req):
- if path == "force":
- return self.force(req)
- if path == "ping":
- return self.ping(req)
- if path == "events":
- num = req.postpath.pop(0)
- req.prepath.append(num)
- num = int(num)
- # TODO: is this dead code? .statusbag doesn't exist,right?
- log.msg("getChild['path']: %s" % req.uri)
- return NoResource("events are unavailable until code gets fixed")
- filename = req.postpath.pop(0)
- req.prepath.append(filename)
- e = self.builder_status.getEventNumbered(num)
- if not e:
- return NoResource("No such event '%d'" % num)
- file = e.files.get(filename, None)
- if file == None:
- return NoResource("No such file '%s'" % filename)
- if type(file) == type(""):
- if file[:6] in ("<HTML>", "<html>"):
- return static.Data(file, "text/html")
- return static.Data(file, "text/plain")
- return file
- if path == "cancelbuild":
- return self.cancel(req)
- if path == "builds":
- return BuildsResource(self.builder_status, self.builder_control)
-
- return HtmlResource.getChild(self, path, req)
-
-
-# /builders/_all
-class StatusResourceAllBuilders(HtmlResource, OneLineMixin):
-
- def __init__(self, status, control):
- HtmlResource.__init__(self)
- self.status = status
- self.control = control
-
- def getChild(self, path, req):
- if path == "force":
- return self.force(req)
- if path == "stop":
- return self.stop(req)
-
- return HtmlResource.getChild(self, path, req)
-
- def force(self, req):
- for bname in self.status.getBuilderNames():
- builder_status = self.status.getBuilder(bname)
- builder_control = None
- c = self.getControl(req)
- if c:
- builder_control = c.getBuilder(bname)
- build = StatusResourceBuilder(builder_status, builder_control)
- build.force(req)
- # back to the welcome page
- return Redirect("../..")
-
- def stop(self, req):
- for bname in self.status.getBuilderNames():
- builder_status = self.status.getBuilder(bname)
- builder_control = None
- c = self.getControl(req)
- if c:
- builder_control = c.getBuilder(bname)
- (state, current_builds) = builder_status.getState()
- if state != "building":
- continue
- for b in current_builds:
- build_status = builder_status.getBuild(b.number)
- if not build_status:
- continue
- if builder_control:
- build_control = builder_control.getBuild(b.number)
- else:
- build_control = None
- build = StatusResourceBuild(build_status, build_control,
- builder_control)
- build.stop(req)
- # go back to the welcome page
- return Redirect("../..")
-
-
-# /builders
-class BuildersResource(HtmlResource):
- title = "Builders"
- addSlash = True
-
- def body(self, req):
- s = self.getStatus(req)
- data = ""
- data += "<h1>Builders</h1>\n"
-
- # TODO: this is really basic. It should be expanded to include a
- # brief one-line summary of the builder (perhaps with whatever the
- # builder is currently doing)
- data += "<ol>\n"
- for bname in s.getBuilderNames():
- data += (' <li><a href="%s">%s</a></li>\n' %
- (req.childLink(urllib.quote(bname, safe='')),
- bname))
- data += "</ol>\n"
-
- data += self.footer(s, req)
-
- return data
-
- def getChild(self, path, req):
- s = self.getStatus(req)
- if path in s.getBuilderNames():
- builder_status = s.getBuilder(path)
- builder_control = None
- c = self.getControl(req)
- if c:
- builder_control = c.getBuilder(path)
- return StatusResourceBuilder(builder_status, builder_control)
- if path == "_all":
- return StatusResourceAllBuilders(self.getStatus(req),
- self.getControl(req))
-
- return HtmlResource.getChild(self, path, req)
-
« no previous file with comments | « third_party/buildbot_7_12/buildbot/status/web/build.py ('k') | third_party/buildbot_7_12/buildbot/status/web/buildstatus.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698