diff options
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/builder.py')
-rw-r--r-- | lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/builder.py | 632 |
1 files changed, 0 insertions, 632 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/builder.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/builder.py deleted file mode 100644 index b4d15233..00000000 --- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/builder.py +++ /dev/null @@ -1,632 +0,0 @@ -# This file is part of Buildbot. Buildbot is free software: you can -# redistribute it and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Copyright Buildbot Team Members - - -from twisted.web import html -import urllib, time -from twisted.python import log -from twisted.internet import defer -from buildbot import interfaces -from buildbot.status.web.base import HtmlResource, BuildLineMixin, \ - path_to_build, path_to_slave, path_to_builder, path_to_change, \ - path_to_root, ICurrentBox, build_get_class, \ - map_branches, path_to_authzfail, ActionResource, \ - getRequestCharset -from buildbot.schedulers.forcesched import ForceScheduler -from buildbot.schedulers.forcesched import ValidationError -from buildbot.status.web.build import BuildsResource, StatusResourceBuild -from buildbot import util -import collections - -class ForceAction(ActionResource): - @defer.inlineCallbacks - def force(self, req, builderNames): - master = self.getBuildmaster(req) - owner = self.getAuthz(req).getUsernameFull(req) - schedulername = req.args.get("forcescheduler", ["<unknown>"])[0] - if schedulername == "<unknown>": - defer.returnValue((path_to_builder(req, self.builder_status), - "forcescheduler arg not found")) - return - - args = {} - # decode all of the args - encoding = getRequestCharset(req) - for name, argl in req.args.iteritems(): - if name == "checkbox": - # damn html's ungeneric checkbox implementation... - for cb in argl: - args[cb.decode(encoding)] = True - else: - args[name] = [ arg.decode(encoding) for arg in argl ] - - for sch in master.allSchedulers(): - if schedulername == sch.name: - try: - yield sch.force(owner, builderNames, **args) - msg = "" - except ValidationError, e: - msg = html.escape(e.message.encode('ascii','ignore')) - break - - # send the user back to the builder page - defer.returnValue(msg) - - -class ForceAllBuildsActionResource(ForceAction): - - def __init__(self, status, selectedOrAll): - self.status = status - self.selectedOrAll = selectedOrAll - self.action = "forceAllBuilds" - - @defer.inlineCallbacks - def performAction(self, req): - authz = self.getAuthz(req) - res = yield authz.actionAllowed('forceAllBuilds', req) - - if not res: - defer.returnValue(path_to_authzfail(req)) - return - - if self.selectedOrAll == 'all': - builderNames = None - elif self.selectedOrAll == 'selected': - builderNames = [b for b in req.args.get("selected", []) if b] - - msg = yield self.force(req, builderNames) - - # back to the welcome page - defer.returnValue((path_to_root(req) + "builders", msg)) - -class StopAllBuildsActionResource(ActionResource): - - def __init__(self, status, selectedOrAll): - self.status = status - self.selectedOrAll = selectedOrAll - self.action = "stopAllBuilds" - - @defer.inlineCallbacks - def performAction(self, req): - authz = self.getAuthz(req) - res = yield authz.actionAllowed('stopAllBuilds', req) - if not res: - defer.returnValue(path_to_authzfail(req)) - return - - builders = None - if self.selectedOrAll == 'all': - builders = self.status.getBuilderNames() - elif self.selectedOrAll == 'selected': - builders = [b for b in req.args.get("selected", []) if b] - - for bname in builders: - builder_status = self.status.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 - build = StatusResourceBuild(build_status) - build.stop(req, auth_ok=True) - - # go back to the welcome page - defer.returnValue(path_to_root(req)) - - -class CancelAllPendingBuildsActionResource(ActionResource): - - def __init__(self, status, selectedOrAll): - self.status = status - self.selectedOrAll = selectedOrAll - self.action = 'cancelAllPendingBuilds' - - @defer.inlineCallbacks - def performAction(self, req): - authz = self.getAuthz(req) - res = yield authz.actionAllowed('cancelAllPendingBuilds', req) - if not res: - defer.returnValue(path_to_authzfail(req)) - return - - builders = None - if self.selectedOrAll == 'all': - builders = self.status.getBuilderNames() - elif self.selectedOrAll == 'selected': - builders = [b for b in req.args.get("selected", []) if b] - - c = interfaces.IControl(self.getBuildmaster(req)) - for bname in builders: - authz = self.getAuthz(req) - builder_control = c.getBuilder(bname) - - brcontrols = yield builder_control.getPendingBuildRequestControls() - - for build_req in brcontrols: - log.msg("Cancelling %s" % build_req) - build_req.cancel() - - # go back to the welcome page - defer.returnValue(path_to_root(req)) - - -class PingBuilderActionResource(ActionResource): - - def __init__(self, builder_status): - self.builder_status = builder_status - self.action = "pingBuilder" - - @defer.inlineCallbacks - def performAction(self, req): - log.msg("web ping of builder '%s'" % self.builder_status.getName()) - res = yield self.getAuthz(req).actionAllowed('pingBuilder', req, - self.builder_status) - if not res: - log.msg("..but not authorized") - defer.returnValue(path_to_authzfail(req)) - return - - c = interfaces.IControl(self.getBuildmaster(req)) - bc = c.getBuilder(self.builder_status.getName()) - bc.ping() - # send the user back to the builder page - defer.returnValue(path_to_builder(req, self.builder_status)) - -class ForceBuildActionResource(ForceAction): - - def __init__(self, builder_status): - self.builder_status = builder_status - self.action = "forceBuild" - - @defer.inlineCallbacks - def performAction(self, req): - # check if this is allowed - res = yield self.getAuthz(req).actionAllowed(self.action, req, - self.builder_status) - if not res: - log.msg("..but not authorized") - defer.returnValue(path_to_authzfail(req)) - return - - builderName = self.builder_status.getName() - - msg = yield self.force(req, [builderName]) - - # send the user back to the builder page - defer.returnValue((path_to_builder(req, self.builder_status), msg)) - -def buildForceContextForField(req, default_props, sch, field, master, buildername): - pname = "%s.%s"%(sch.name, field.fullName) - - default = field.default - - if "list" in field.type: - choices = field.getChoices(master, sch, buildername) - if choices: - default = choices[0] - default_props[pname+".choices"] = choices - - default = req.args.get(pname, [default])[0] - if "bool" in field.type: - default = "checked" if default else "" - elif isinstance(default, unicode): - # filter out unicode chars, and html stuff - default = html.escape(default.encode('utf-8','ignore')) - - default_props[pname] = default - - if "nested" in field.type: - for subfield in field.fields: - buildForceContextForField(req, default_props, sch, subfield, master, buildername) - -def buildForceContext(cxt, req, master, buildername=None): - force_schedulers = {} - default_props = collections.defaultdict(str) - for sch in master.allSchedulers(): - if isinstance(sch, ForceScheduler) and (buildername is None or(buildername in sch.builderNames)): - force_schedulers[sch.name] = sch - for field in sch.all_fields: - buildForceContextForField(req, default_props, sch, field, master, buildername) - - cxt['force_schedulers'] = force_schedulers - cxt['default_props'] = default_props - -# /builders/$builder -class StatusResourceBuilder(HtmlResource, BuildLineMixin): - addSlash = True - - def __init__(self, builder_status, numbuilds=20): - HtmlResource.__init__(self) - self.builder_status = builder_status - self.numbuilds = numbuilds - - def getPageTitle(self, request): - return "Buildbot: %s" % self.builder_status.getName() - - def builder(self, build, req): - b = {} - - b['num'] = build.getNumber() - b['link'] = path_to_build(req, build) - - when = build.getETA() - if when is not None: - b['when'] = util.formatInterval(when) - b['when_time'] = time.strftime("%H:%M:%S", - time.localtime(time.time() + when)) - - step = build.getCurrentStep() - # TODO: is this necessarily the case? - if not step: - b['current_step'] = "[waiting for Lock]" - else: - if step.isWaitingForLocks(): - b['current_step'] = "%s [waiting for Lock]" % step.getName() - else: - b['current_step'] = step.getName() - - b['stop_url'] = path_to_build(req, build) + '/stop' - - return b - - @defer.inlineCallbacks - def content(self, req, cxt): - b = self.builder_status - - cxt['name'] = b.getName() - cxt['description'] = b.getDescription() - req.setHeader('Cache-Control', 'no-cache') - slaves = b.getSlaves() - connected_slaves = [s for s in slaves if s.isConnected()] - - cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()] - - cxt['pending'] = [] - statuses = yield b.getPendingBuildRequestStatuses() - for pb in statuses: - changes = [] - - source = yield pb.getSourceStamp() - submitTime = yield pb.getSubmitTime() - bsid = yield pb.getBsid() - - properties = yield \ - pb.master.db.buildsets.getBuildsetProperties(bsid) - - if source.changes: - for c in source.changes: - changes.append({ 'url' : path_to_change(req, c), - 'who' : c.who, - 'revision' : c.revision, - 'repo' : c.repository }) - - cxt['pending'].append({ - 'when': time.strftime("%b %d %H:%M:%S", - time.localtime(submitTime)), - 'delay': util.formatInterval(util.now() - submitTime), - 'id': pb.brid, - 'changes' : changes, - 'num_changes' : len(changes), - 'properties' : properties, - }) - - numbuilds = cxt['numbuilds'] = int(req.args.get('numbuilds', [self.numbuilds])[0]) - recent = cxt['recent'] = [] - for build in b.generateFinishedBuilds(num_builds=int(numbuilds)): - recent.append(self.get_line_values(req, build, False)) - - sl = cxt['slaves'] = [] - connected_slaves = 0 - for slave in slaves: - s = {} - sl.append(s) - s['link'] = path_to_slave(req, slave) - s['name'] = slave.getName() - c = s['connected'] = slave.isConnected() - s['paused'] = slave.isPaused() - s['admin'] = unicode(slave.getAdmin() or '', 'utf-8') - if c: - connected_slaves += 1 - cxt['connected_slaves'] = connected_slaves - - cxt['authz'] = self.getAuthz(req) - cxt['builder_url'] = path_to_builder(req, b) - buildForceContext(cxt, req, self.getBuildmaster(req), b.getName()) - template = req.site.buildbot_service.templates.get_template("builder.html") - defer.returnValue(template.render(**cxt)) - - def ping(self, req): - return PingBuilderActionResource(self.builder_status) - - def getChild(self, path, req): - if path == "force": - return ForceBuildActionResource(self.builder_status) - if path == "ping": - return self.ping(req) - if path == "cancelbuild": - return CancelChangeResource(self.builder_status) - if path == "stopchange": - return StopChangeResource(self.builder_status) - if path == "builds": - return BuildsResource(self.builder_status) - - return HtmlResource.getChild(self, path, req) - -class CancelChangeResource(ActionResource): - - def __init__(self, builder_status): - ActionResource.__init__(self) - self.builder_status = builder_status - - @defer.inlineCallbacks - def performAction(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 - - authz = self.getAuthz(req) - if request_id: - c = interfaces.IControl(self.getBuildmaster(req)) - builder_control = c.getBuilder(self.builder_status.getName()) - - brcontrols = yield builder_control.getPendingBuildRequestControls() - - for build_req in brcontrols: - if cancel_all or (build_req.brid == request_id): - log.msg("Cancelling %s" % build_req) - res = yield authz.actionAllowed('cancelPendingBuild', req, - build_req) - if res: - build_req.cancel() - else: - defer.returnValue(path_to_authzfail(req)) - return - if not cancel_all: - break - - defer.returnValue(path_to_builder(req, self.builder_status)) - -class StopChangeMixin(object): - - @defer.inlineCallbacks - def stopChangeForBuilder(self, req, builder_status, auth_ok=False): - try: - request_change = req.args.get("change", [None])[0] - request_change = int(request_change) - except: - request_change = None - - authz = self.getAuthz(req) - if request_change: - c = interfaces.IControl(self.getBuildmaster(req)) - builder_control = c.getBuilder(builder_status.getName()) - - brcontrols = yield builder_control.getPendingBuildRequestControls() - build_controls = dict((x.brid, x) for x in brcontrols) - - build_req_statuses = yield \ - builder_status.getPendingBuildRequestStatuses() - - for build_req in build_req_statuses: - ss = yield build_req.getSourceStamp() - - if not ss.changes: - continue - - for change in ss.changes: - if change.number == request_change: - control = build_controls[build_req.brid] - log.msg("Cancelling %s" % control) - res = yield authz.actionAllowed('stopChange', req, control) - if (auth_ok or res): - control.cancel() - else: - defer.returnValue(False) - return - - defer.returnValue(True) - - -class StopChangeResource(StopChangeMixin, ActionResource): - - def __init__(self, builder_status): - ActionResource.__init__(self) - self.builder_status = builder_status - - @defer.inlineCallbacks - def performAction(self, req): - """Cancel all pending builds that include a given numbered change.""" - success = yield self.stopChangeForBuilder(req, self.builder_status) - - if not success: - defer.returnValue(path_to_authzfail(req)) - else: - defer.returnValue(path_to_builder(req, self.builder_status)) - - -class StopChangeAllResource(StopChangeMixin, ActionResource): - - def __init__(self, status): - ActionResource.__init__(self) - self.status = status - - @defer.inlineCallbacks - def performAction(self, req): - """Cancel all pending builds that include a given numbered change.""" - authz = self.getAuthz(req) - res = yield authz.actionAllowed('stopChange', req) - if not res: - defer.returnValue(path_to_authzfail(req)) - return - - for bname in self.status.getBuilderNames(): - builder_status = self.status.getBuilder(bname) - res = yield self.stopChangeForBuilder(req, builder_status, auth_ok=True) - if not res: - defer.returnValue(path_to_authzfail(req)) - return - - defer.returnValue(path_to_root(req)) - - -# /builders/_all -class StatusResourceAllBuilders(HtmlResource, BuildLineMixin): - - def __init__(self, status): - HtmlResource.__init__(self) - self.status = status - - def getChild(self, path, req): - if path == "forceall": - return self.forceall(req) - if path == "stopall": - return self.stopall(req) - if path == "stopchangeall": - return StopChangeAllResource(self.status) - if path == "cancelpendingall": - return CancelAllPendingBuildsActionResource(self.status, 'all') - - return HtmlResource.getChild(self, path, req) - - def forceall(self, req): - return ForceAllBuildsActionResource(self.status, 'all') - - def stopall(self, req): - return StopAllBuildsActionResource(self.status, 'all') - -# /builders/_selected - - -class StatusResourceSelectedBuilders(HtmlResource, BuildLineMixin): - - def __init__(self, status): - HtmlResource.__init__(self) - self.status = status - - def getChild(self, path, req): - if path == "forceselected": - return self.forceselected(req) - if path == "stopselected": - return self.stopselected(req) - if path == "cancelpendingselected": - return CancelAllPendingBuildsActionResource(self.status, 'selected') - - return HtmlResource.getChild(self, path, req) - - def forceselected(self, req): - return ForceAllBuildsActionResource(self.status, 'selected') - - def stopselected(self, req): - return StopAllBuildsActionResource(self.status, 'selected') - -# /builders - - -class BuildersResource(HtmlResource): - pageTitle = "Builders" - addSlash = True - - def __init__(self, numbuilds=20): - HtmlResource.__init__(self) - self.numbuilds = numbuilds - - @defer.inlineCallbacks - def content(self, req, cxt): - status = self.getStatus(req) - encoding = getRequestCharset(req) - - builders = req.args.get("builder", status.getBuilderNames()) - branches = [ b.decode(encoding) - for b in req.args.get("branch", []) - if b ] - - # get counts of pending builds for each builder - brstatus_ds = [] - brcounts = {} - def keep_count(statuses, builderName): - brcounts[builderName] = len(statuses) - for builderName in builders: - builder_status = status.getBuilder(builderName) - d = builder_status.getPendingBuildRequestStatuses() - d.addCallback(keep_count, builderName) - brstatus_ds.append(d) - yield defer.gatherResults(brstatus_ds) - - cxt['branches'] = branches - bs = cxt['builders'] = [] - - building = 0 - online = 0 - base_builders_url = path_to_root(req) + "builders/" - for bn in builders: - bld = { 'link': base_builders_url + urllib.quote(bn, safe=''), - 'name': bn } - bs.append(bld) - - builder = status.getBuilder(bn) - builds = list(builder.generateFinishedBuilds(map_branches(branches), - num_builds=1)) - if builds: - b = builds[0] - bld['build_url'] = (bld['link'] + "/builds/%d" % b.getNumber()) - label = None - all_got_revisions = b.getAllGotRevisions() - # If len = 1 then try if revision can be used as label. - if len(all_got_revisions) == 1: - label = all_got_revisions[all_got_revisions.keys()[0]] - if not label or len(str(label)) > 20: - label = "#%d" % b.getNumber() - - bld['build_label'] = label - bld['build_text'] = " ".join(b.getText()) - bld['build_css_class'] = build_get_class(b) - - current_box = ICurrentBox(builder).getBox(status, brcounts) - bld['current_box'] = current_box.td() - - builder_status = builder.getState()[0] - if builder_status == "building": - building += 1 - online += 1 - elif builder_status != "offline": - online += 1 - - cxt['authz'] = self.getAuthz(req) - cxt['num_building'] = building - cxt['num_online'] = online - buildForceContext(cxt, req, self.getBuildmaster(req)) - template = req.site.buildbot_service.templates.get_template("builders.html") - defer.returnValue(template.render(**cxt)) - - def getChild(self, path, req): - s = self.getStatus(req) - if path in s.getBuilderNames(): - builder_status = s.getBuilder(path) - return StatusResourceBuilder(builder_status, self.numbuilds) - if path == "_all": - return StatusResourceAllBuilders(self.getStatus(req)) - if path == "_selected": - return StatusResourceSelectedBuilders(self.getStatus(req)) - - return HtmlResource.getChild(self, path, req) - |