def POST(self): ''' Method:post ''' try: log.info("CI:Post") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) body = HTTPAdaptor.format_form_data(web.data()) if not (query.has_key("action") and query.has_key("commit_id")): raise "Invalid query string" commit_id = query["commit_id"] sopt = SQLAdaptor() if query["action"] == "Revoke": sopt.SetCommitStatus(commit_id, 6) elif query["action"] == "Ignore": sopt.SetCommitStatus(commit_id, 5) author = "mxu" request_num = sopt.GetUnprocessedRequest(author) request_url = "/".join([config.server["cvproxy"],"myunprocessedrequests"]) author_info = {"name":author, "request_url":request_url, "request_num":request_num} dashboard_url = "/".join([config.server["cvproxy"], "dashboard"]) navi = [ {"name":"Dashboard", "url":dashboard_url, "theme":"unselected" }, {"name":"Current review request", "url":"#", "theme":"selected" } ] result = { "category": body["category"], "comment": body["comment"], "choice": query["action"] } sopt.InsertActionInfo(commit_id, author, query["action"], body["category"], body["comment"]) return render.render_template('current_review_result.tmpl', author = author_info, navi = navi, commit_id = commit_id, result = result ) except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
def GET(self): ''' Method:get ''' try: log.info("CI:Get") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) if not (query.has_key("action") and query.has_key("commit_id")): raise "Invalid query string" sopt = SQLAdaptor() author = "mxu" commit_id = query["commit_id"] sopt.SetCommitStatus(commit_id, 6) request_num = sopt.GetUnprocessedRequest(author) request_url = "/".join( [config.server["cvproxy"], "myunprocessedrequests"]) author_info = { "name": author, "request_url": request_url, "request_num": request_num } dashboard_url = "/".join([config.server["cvproxy"], "dashboard"]) navi = [{ "name": "Dashboard", "url": dashboard_url, "theme": "unselected" }, { "name": "Current review request", "url": "#", "theme": "selected" }] sopt.InsertActionInfo(commit_id, query["action"], author, comment) result = { "category": "An issue", "comment": "Haha!", "choice": query["action"] } return render.render_template('current_review_result.tmpl', author=author_info, navi=navi, commit_id=commit_id, result=result) except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
def GET(self): ''' Method:get ''' try: log.info("Ajax:Get") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) if not (query.has_key("commit_id")): raise "Invalid query string" commit_id = query.get("commit_id") return {"s1":[3,4],"s2":[3,10]} except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
def GET(self): ''' Method:get ''' try: log.info("Ajax:Get") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) if not (query.has_key("commit_id")): raise "Invalid query string" commit_id = query.get("commit_id") return {"s1": [3, 4], "s2": [3, 10]} except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
def TriggerJobs(jobs): is_triggered = False for job_name, job_content in jobs.iteritems(): urlprefix = config.ciserver["urlprefix"] urlsuffix = config.ciserver["urlsuffix"] auth = [job_content["author"], job_content["token"]] log.debug("auth: %s token: %s" % (job_content["author"], job_content["token"])) if not urlprefix: raise IncorrectCIServerPrefixError elif not urlsuffix: raise IncorrectCIServerSuffixError else: job_url = "".join([urlprefix, job_name, urlsuffix]) log.debug("Job url: %s" % job_url) body = utils.format_body_for_ci(job_content) code = HTTPAdaptor.get_url(job_url , auth = auth, body = body) if not code == 200: dbopts = SQLAdaptor() dbopts.SetBuildToInvalid(job_name, job_content) log.error("Code: %s" % code) else: is_triggered = True log.info("trigger request sent for job '%s'. code returned is %s" % (job_name, code)) if not is_triggered: raise NoJobTriggeredError
def POST(self): ''' Method: post ''' try: try: data = web.data() build_info = utils.json_load_to_str(data) log.debug("build info: %s" % build_info) except Exception, e: log.error(e) raise UnableParsePostDataError # update status dbopts = SQLAdaptor() # commit_id = dbopts.SetBuildStatus(build_info) # if all results are failures, send email to commitor # phase_id, failure_list, commit_id = dbopts.CheckBuildFailures(build_info) if failure_list: if not opts.SendEmailToCommitor(build_info, commit_id): dbopts.SetCommitStatus(commit_id, 10) else: dbopts.SetCommitStatus(commit_id, 4) elif (not failure_list) and (phase_id == 3): dbopts.SetCommitStatus(commit_id, 1) else: dbopts.SetCommitStatus(commit_id, 3) return HTTPAdaptor.format_response("ok", "003", "Update status based on CI")
class SVNCallBack: ''' API for submitting call back request ''' def POST(self): try: #@Step 1: Parse commit info try: data = web.data() callback = utils.json_load_to_str(data) log.debug("callback: %s" % callback) uuid = callback["uuid"] txn = callback["transaction"] status = callback["status"] except Exception, e: log.error(e) raise UnableParsePostDataError dbopts = SQLAdaptor() dbopts.UpdateStatusByTxn(uuid, txn, status) return HTTPAdaptor.format_response("ok", "00", "Jobs are triggered. Please wait for the response.") except Error, e: return HTTPAdaptor.format_response("err", code = e.status, msg = e.message)
def TriggerJobs(jobs): is_triggered = False for job_name, job_content in jobs.iteritems(): urlprefix = config.ciserver["urlprefix"] urlsuffix = config.ciserver["urlsuffix"] auth = [job_content["author"], job_content["token"]] log.debug("auth: %s token: %s" % (job_content["author"], job_content["token"])) if not urlprefix: raise IncorrectCIServerPrefixError elif not urlsuffix: raise IncorrectCIServerSuffixError else: job_url = "".join([urlprefix, job_name, urlsuffix]) log.debug("Job url: %s" % job_url) body = utils.format_body_for_ci(job_content) code = HTTPAdaptor.get_url(job_url, auth=auth, body=body) if not code == 200: dbopts = SQLAdaptor() dbopts.SetBuildToInvalid(job_name, job_content) log.error("Code: %s" % code) else: is_triggered = True log.info( "trigger request sent for job '%s'. code returned is %s" % (job_name, code)) if not is_triggered: raise NoJobTriggeredError
def GET(self): ''' Method: get ''' try: query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) transaction = query["transaction"] if query.has_key("transaction") else "" revision = query["revision"] if query.has_key("revision") else "" if not transaction and not revision: raise "Invalid query string" sopt = SQLAdaptor() status = sopt.CheckCommitStatus(transaction, revision) return HTTPAdaptor.format_response("ok", status_id = status, msg = "Status %s returned" % status) except Error, e: return HTTPAdaptor.format_response("err", code = e.status, msg = e.message)
def GET(self): ''' Method:post ''' try: log.info("Dashboard:Get") render.render_template("layout.tmpl") except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
def POST(self): ''' Method:post ''' try: #@Step 1: Parse commit info try: data = web.data() commit_info = utils.json_load_to_str(data) commit_info = opts.FormatChangeSet(commit_info) log.debug("commit info: %s" % commit_info) except Exception, e: log.error(e) raise UnableParsePostDataError #@Step 2: Check author info if not opts.CheckAuthorInfo(commit_info["author"]): return HTTPAdaptor.format_response("pass", "001", "No authors available.") # log.error(NoAuthorFoundError.message) # raise NoAuthorFoundError #@Step 3: Check jobs needed to be triggerred jobs = opts.GetJobs(commit_info) if not jobs: log.warning(NoValidJobFoundError().message) return HTTPAdaptor.format_response("pass", "001", "No tests can be executed.") #@Step 4: Insert commit info dbopts = SQLAdaptor() dbopts.InsertCommitInfo(commit_info) dbopts.InsertJobInfo(jobs) log.debug("set status id to :%s" % 7) #@Step 5: Trigger jobs opts.TriggerJobs(jobs) return HTTPAdaptor.format_response("ok", "003", "Jobs are triggered. Please wait for the response.")
class SubmitStatus: ''' API for submitting CI build status ''' def POST(self): ''' Method: post ''' try: try: data = web.data() build_info = utils.json_load_to_str(data) log.debug("build info: %s" % build_info) except Exception, e: log.error(e) raise UnableParsePostDataError # update status dbopts = SQLAdaptor() # commit_id = dbopts.SetBuildStatus(build_info) # if all results are failures, send email to commitor # phase_id, failure_list, commit_id = dbopts.CheckBuildFailures( build_info) if failure_list: if not opts.SendEmailToCommitor(build_info, commit_id): dbopts.SetCommitStatus(commit_id, 10) else: dbopts.SetCommitStatus(commit_id, 4) elif (not failure_list) and (phase_id == 3): dbopts.SetCommitStatus(commit_id, 1) else: dbopts.SetCommitStatus(commit_id, 3) return HTTPAdaptor.format_response("ok", "003", "Update status based on CI") except Error, e: return HTTPAdaptor.format_response("err", code=e.status, msg=e.message)
def POST(self): try: #@Step 1: Parse commit info try: data = web.data() callback = utils.json_load_to_str(data) log.debug("callback: %s" % callback) uuid = callback["uuid"] txn = callback["transaction"] status = callback["status"] except Exception, e: log.error(e) raise UnableParsePostDataError dbopts = SQLAdaptor() dbopts.UpdateStatusByTxn(uuid, txn, status) return HTTPAdaptor.format_response("ok", "00", "Jobs are triggered. Please wait for the response.")
def GET(self): ''' Method:get ''' try: log.info("CI:Get") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) if not (query.has_key("author") and query.has_key("commit_id") and query.has_key("token")): raise InvalidQueryStringError author = query.get("author") commit_id = query.get("commit_id") token = query.get("token") # if not utils.validate_token( author = author, commit_id = commit_id, url = config.server["cvproxy"],token = token): # raise AuthenticationError sopt = SQLAdaptor() request_num = sopt.GetUnprocessedRequest(author) request_url = "/".join([config.server["cvproxy"],"myunprocessedrequests"]) author_info = {"name":author, "request_url":request_url, "request_num":request_num} dashboard_url = "/".join([config.server["cvproxy"], "dashboard"]) navi = [ # {"name":"Dashboard", # "url":dashboard_url, # "theme":"unselected" # }, {"name":"Current review request", "url":"#", "theme":"selected" } ] url = {"ignore": {"absolute": "/".join([config.server["cvproxy"],"submitaction?action=ignore&commit_id=%s" % commit_id]), "relative": "submitaction?action=Ignore&commit_id=%s" % commit_id}, "revoke": {"absolute": "/".join([config.server["cvproxy"],"submitaction?action=revoke&commit_id=%s" % commit_id]), "relative": "submitaction?action=Revoke&commit_id=%s" % commit_id} } cijob = sopt.GetJobNameByCommit(commit_id) files_committed = sopt.GetCommitedFilesNum(commit_id) downstreamjobs = sopt.GetDownstreamJobs(cijob) if downstreamjobs: project_info = sopt.GetProjectInfo(downstreamjobs[0]) test_info = sopt.GetTestSummary(downstreamjobs) results, failed_jobs = sopt.GetTestResult(downstreamjobs) else: project_info = sopt.GetProjectInfo(cijob) test_info = sopt.GetTestSummary([cijob]) results, failed_jobs = sopt.GetTestResult([cijob]) log.debug("downstream jobs: %s" % downstreamjobs) log.debug("project_info: %s" % project_info) log.debug("test_info: %s" % test_info) info = {"product": project_info["product"], "platform":project_info["platform"], "version":project_info["version"], "files_committed": files_committed, "tests_executed": test_info["tests"], "failures":test_info["failures"]} ci_url = config.ciserver["urlprefix"] jobs = [] jobs.append( {"jobpage":"/".join([ci_url,cijob[0]]), "name":cijob[0], "overview": "/".join([ci_url,cijob[0],cijob[1]]), "console": "/".join([ci_url,cijob[0],cijob[1],"console"]), "workspace": "/".join([ci_url,cijob[0],"ws"]), "testresult": "/".join([ci_url,cijob[0],cijob[1],"TestReport/?"]), "logs": "/".join([ci_url,cijob[0],cijob[1],"artifact/logs"]), "results": results, "failed_jobs": opts.FormatFailedJobs(failed_jobs) } ) categories = sopt.GetCategory() diff_list = sopt.GetDiffSetByCommit(commit_id) codes = opts.FormatDiffs(diff_list) return render.render_template('current_review_request.tmpl', author = author_info, navi = navi, url = url, commit_id = commit_id, info = info, categories = categories, jobs = jobs, codes = codes) except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")
txn = callback["transaction"] status = callback["status"] except Exception, e: log.error(e) raise UnableParsePostDataError dbopts = SQLAdaptor() dbopts.UpdateStatusByTxn(uuid, txn, status) return HTTPAdaptor.format_response("ok", "00", "Jobs are triggered. Please wait for the response.") except Error, e: return HTTPAdaptor.format_response("err", code = e.status, msg = e.message) except Exception, e: return HTTPAdaptor.format_response("err", msg = "Server execution failed") class TriggerRequest: ''' API for submitting trigger request ''' def POST(self): ''' Method:post ''' try: #@Step 1: Parse commit info try:
def GET(self): ''' Method:get ''' try: log.info("CI:Get") query = HTTPAdaptor.format_query(web.ctx.env["QUERY_STRING"]) if not (query.has_key("author") and query.has_key("commit_id") and query.has_key("token")): raise InvalidQueryStringError author = query.get("author") commit_id = query.get("commit_id") token = query.get("token") # if not utils.validate_token( author = author, commit_id = commit_id, url = config.server["cvproxy"],token = token): # raise AuthenticationError sopt = SQLAdaptor() request_num = sopt.GetUnprocessedRequest(author) request_url = "/".join( [config.server["cvproxy"], "myunprocessedrequests"]) author_info = { "name": author, "request_url": request_url, "request_num": request_num } dashboard_url = "/".join([config.server["cvproxy"], "dashboard"]) navi = [ # {"name":"Dashboard", # "url":dashboard_url, # "theme":"unselected" # }, { "name": "Current review request", "url": "#", "theme": "selected" } ] url = { "ignore": { "absolute": "/".join([ config.server["cvproxy"], "submitaction?action=ignore&commit_id=%s" % commit_id ]), "relative": "submitaction?action=Ignore&commit_id=%s" % commit_id }, "revoke": { "absolute": "/".join([ config.server["cvproxy"], "submitaction?action=revoke&commit_id=%s" % commit_id ]), "relative": "submitaction?action=Revoke&commit_id=%s" % commit_id } } cijob = sopt.GetJobNameByCommit(commit_id) files_committed = sopt.GetCommitedFilesNum(commit_id) downstreamjobs = sopt.GetDownstreamJobs(cijob) if downstreamjobs: project_info = sopt.GetProjectInfo(downstreamjobs[0]) test_info = sopt.GetTestSummary(downstreamjobs) results, failed_jobs = sopt.GetTestResult(downstreamjobs) else: project_info = sopt.GetProjectInfo(cijob) test_info = sopt.GetTestSummary([cijob]) results, failed_jobs = sopt.GetTestResult([cijob]) log.debug("downstream jobs: %s" % downstreamjobs) log.debug("project_info: %s" % project_info) log.debug("test_info: %s" % test_info) info = { "product": project_info["product"], "platform": project_info["platform"], "version": project_info["version"], "files_committed": files_committed, "tests_executed": test_info["tests"], "failures": test_info["failures"] } ci_url = config.ciserver["urlprefix"] jobs = [] jobs.append({ "jobpage": "/".join([ci_url, cijob[0]]), "name": cijob[0], "overview": "/".join([ci_url, cijob[0], cijob[1]]), "console": "/".join([ci_url, cijob[0], cijob[1], "console"]), "workspace": "/".join([ci_url, cijob[0], "ws"]), "testresult": "/".join([ci_url, cijob[0], cijob[1], "TestReport/?"]), "logs": "/".join([ci_url, cijob[0], cijob[1], "artifact/logs"]), "results": results, "failed_jobs": opts.FormatFailedJobs(failed_jobs) }) categories = sopt.GetCategory() diff_list = sopt.GetDiffSetByCommit(commit_id) codes = opts.FormatDiffs(diff_list) return render.render_template('current_review_request.tmpl', author=author_info, navi=navi, url=url, commit_id=commit_id, info=info, categories=categories, jobs=jobs, codes=codes) except Exception, e: log.error(e) return HTTPAdaptor.format_response("error", "Request processing failed.")