def content(self, req, cxt): status = self.getStatus(req) cxt['path_to_codebases'] = path_to_codebases(req, self.project.name) cxt['selectedproject'] = self.project.name codebases = {} getCodebasesArg(req, codebases) project_json = SingleProjectJsonResource(status, self.project) project_dict = yield project_json.asDict(req) url = status.getBuildbotURL() + path_to_json_builders(req, self.project.name) filters = { "project": self.project.name, "sources": codebases } cxt['instant_json']['builders'] = {"url": url, "data": json.dumps(project_dict, separators=(',', ':')), "waitForPush": status.master.config.autobahn_push, "pushFilters": { "buildStarted": filters, "buildFinished": filters, "requestSubmitted": filters, "requestCancelled": filters, "stepStarted": filters, "stepFinished": filters, }} template = req.site.buildbot_service.templates.get_template("builders.html") defer.returnValue(template.render(**cxt))
def set_instant_json(json_name, cmp_info): # Create our instant json for the given builders for bName, branch in cmp_info["codebases"].iteritems(): request.args[bName + "_branch"] = branch url = status.getBuildbotURL() + path_to_json_builders( request, self.project.name) # Remove the extra array we don't need for autobahn sources = {} for n, src in cmp_info["codebases"].iteritems(): sources[n] = src[0] filters = {"project": self.project.name, "sources": sources} cxt['instant_json'][json_name] = \ { "url": url, "data": json.dumps(cmp_info["output"], separators=(',', ':')), "waitForPush": status.master.config.autobahn_push, "pushFilters": { "buildFinished": filters, } } # Remove from the object as we no longer need these values del cmp_info["output"]
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>": try: for scheduler in master.allSchedulers(): if isinstance( scheduler, ForceScheduler ) and builderNames[0] in scheduler.builderNames: schedulername = scheduler.name break else: raise RuntimeError("Could not find force scheduler") except: defer.returnValue((path_to_builder( req, self.builder_status ), "forcescheduler arg not found, and could not find a default force scheduler for builderName" )) 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 scheduler in master.allSchedulers(): if schedulername == scheduler.name: try: yield scheduler.force(owner, builderNames, **args) msg = "" except ValidationError, e: msg = html.escape(e.message.encode('ascii', 'ignore')) break # send the user back to the proper page returnpage = args.get("returnpage", None) if "builders" in returnpage: defer.returnValue( (path_to_builders(req, self.builder_status.getProject()))) elif "builders_json" in returnpage: s = self.getStatus(req) defer.returnValue( (s.getBuildbotURL() + path_to_json_builders(req, self.builder_status.getProject()))) elif "pending_json" in returnpage and builderNames > 0: s = self.getStatus(req) defer.returnValue((s.getBuildbotURL() + path_to_json_pending(req, builderNames[0]))) defer.returnValue((path_to_builder(req, self.builder_status)))
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: yield build_req.cancel() else: defer.returnValue(path_to_authzfail(req)) return if not cancel_all: break args = req.args.copy() returnpage = args.get("returnpage", None) if returnpage is None: defer.returnValue((path_to_builder(req, self.builder_status))) elif "builders" in returnpage: defer.returnValue( (path_to_builders(req, self.builder_status.getProject()))) elif "buildqueue" in returnpage: defer.returnValue(path_to_buildqueue(req)) elif "builders_json": s = self.getStatus(req) defer.returnValue( (s.getBuildbotURL() + path_to_json_builders(req, self.builder_status.getProject())))
def force(self, req, builderNames): master = self.getBuildmaster(req) owner = self.getAuthz(req).getUsernameFull(req) scheduler_name = req.args.get("forcescheduler", ["<unknown>"])[0] args = self.decode_request_arguments(req) if scheduler_name == "<unknown>": scheduler = master.scheduler_manager.findSchedulerByBuilderName( builderNames[0], scheduler_type=ForceScheduler, ) else: scheduler = master.scheduler_manager.findSchedulerByName( name=scheduler_name) try: yield scheduler.force(owner, builderNames, **args) except ValidationError: pass except AttributeError: if scheduler_name == '<unknown>': defer.returnValue(( path_to_builder(req, self.builder_status), 'forcescheduler arg not found, and could not find a default force scheduler for builderName', ), ) # send the user back to the proper page returnpage = args.get("returnpage", {}) if "builders" in returnpage: defer.returnValue( (path_to_builders(req, self.builder_status.getProject()))) elif "builders_json" in returnpage: s = self.getStatus(req) defer.returnValue( (s.getBuildbotURL() + path_to_json_builders(req, self.builder_status.getProject()))) elif "pending_json" in returnpage and builderNames > 0: s = self.getStatus(req) defer.returnValue((s.getBuildbotURL() + path_to_json_pending(req, builderNames[0]))) defer.returnValue((path_to_builder(req, self.builder_status)))