def _GetCodeReview(code_review_data): """Get codereview object based on review_server_host in code_review_data.""" if (not code_review_data or not code_review_data.get('review_server_host') or not codereview_util.IsCodeReviewGerrit( code_review_data['review_server_host'])): return None return Gerrit(code_review_data['review_server_host'])
def CommitRevert(parameters, codereview_info): """Commits a revert. Args: parameters(SubmitRevertCLParameters): parameters needed to commit a revert. codereview_info(dict_: Code review information for the change that will be reverted. """ # Note that we don't know which was the final action taken by the pipeline # before this point. That is why this is where we increment the appropriate # metrics. culprit = entity_util.GetEntityFromUrlsafeKey(parameters.cl_key) assert culprit revision = culprit.revision codereview = _GetCodeReview(codereview_info) if not codereview: logging.error('Failed to get codereview object for change %s/%s.', culprit.repo_name, revision) return services_constants.ERROR if not codereview_util.IsCodeReviewGerrit( codereview_info['review_server_host']): return services_constants.SKIPPED revert_change_id = codereview.GetChangeIdFromReviewUrl(culprit.revert_cl_url) committed = codereview.SubmitRevert(revert_change_id) if committed: _AddReviewers(revision, culprit, codereview, revert_change_id, True) else: _AddReviewers(revision, culprit, codereview, revert_change_id, False) return services_constants.COMMITTED if committed else services_constants.ERROR
def NotifyCulprit(culprit, bug_id): """Sends a notification to a code review page. Args: culprit (FlakeCulprit): The culprit identified to have introduced flakiness. bud_id (int): An optional bug id to include in the notification. Pass None if not specified. Returns: Bool indicating whether a notification was sent. """ assert culprit revision = culprit.revision culprit_info = git.GetCodeReviewInfoForACommit(revision) review_server_host = culprit_info.get('review_server_host') review_change_id = culprit_info.get('review_change_id') code_review_settings = waterfall_config.GetCodeReviewSettings() codereview = Gerrit( review_server_host ) if review_server_host and codereview_util.IsCodeReviewGerrit( review_server_host, code_review_settings) else None sent = False if codereview and review_change_id: message = _GenerateMessageText(culprit, bug_id) sent = codereview.PostMessage(review_change_id, message) else: # Occasionally, a commit was not uploaded for code-review. logging.error('No code-review url for %s/%s', culprit.repo_name, culprit.revision) status = analysis_status.COMPLETED if sent else analysis_status.ERROR suspected_cl_util.UpdateCulpritNotificationStatus(culprit.key.urlsafe(), status) return sent
def testIsCodeReviewGerrit(self, review_host, is_codereivew_gerrit): self.assertEqual(is_codereivew_gerrit, codereview_util.IsCodeReviewGerrit(review_host))
def _CheckRevertStatusOfSuspectedCL(suspected_cl): """Updates suspected_cl with findings about what happened to its revert CL. Args: suspected_cl (wf_suspected_cl): A WfSuspectedCL entity. Returns: processed (bool): True if the suspected cl's revert outcome was determined, False if reverting was not relevant. None if the cl needed reverting but an outcome could not be determined. url (str): The code review url for manual investigation. status (str): The eventual outcome of the revert cl. """ revert_cl = suspected_cl.revert_cl if not revert_cl and not suspected_cl.should_be_reverted: # Findit did not deem this suspected cl as needing revert. No action needed. return False, None, None revision = suspected_cl.revision culprit_info = git.GetCodeReviewInfoForACommit(revision) review_server_host = culprit_info.get('review_server_host') change_id = culprit_info.get('review_change_id') if not review_server_host or not change_id: # pragma: no cover # TODO(lijeffrey): Handle cases a patch was committed without review. return None, None, None code_review_settings = FinditConfig().Get().code_review_settings codereview = Gerrit( review_server_host ) if review_server_host and codereview_util.IsCodeReviewGerrit( review_server_host, code_review_settings) else None if not codereview: logging.error('Could not get codereview for %s/q/%s', review_server_host, change_id) return None, None, None cl_info = codereview.GetClDetails(change_id) code_review_url = codereview.GetCodeReviewUrl(change_id) if not cl_info: logging.error('Could not get CL details for %s/q/%s', review_server_host, change_id) return None, code_review_url, None reverts_to_check = cl_info.GetRevertCLsByRevision(revision) if not reverts_to_check: logging.error('Could not get revert info for %s/q/%s', review_server_host, change_id) return None, code_review_url, None reverts_to_check.sort(key=lambda x: x.timestamp) if revert_cl: # Findit attempted to create a revert cl. any_revert_committed = False # Check whose revert CL was first commited. for revert in reverts_to_check: # pragma: no branch reverting_user = revert.reverting_user_email revert_commits = revert.reverting_cl.commits if revert_commits: # pragma: no branch any_revert_committed = True revert_commit = revert_commits[0] if reverting_user == constants.DEFAULT_SERVICE_ACCOUNT: # The sheriff used Findit's reverting CL. cq_attempt = revert.reverting_cl.commit_attempts[ revert_commit.patchset_id] _UpdateSuspectedCL( suspected_cl, sheriff_action_time=cq_attempt.last_cq_timestamp, revert_commit_timestamp=revert_commit.timestamp, revert_status=revert_cl_status.COMMITTED) break else: # Sheriff used own revert CL. _UpdateSuspectedCL( suspected_cl, sheriff_action_time=revert_commit.timestamp, revert_status=revert_cl_status.DUPLICATE) break # No revert was ever committed. False positive. if not any_revert_committed: # TODO(crbug.com/702056): Close the revert CLs that were not used. _UpdateSuspectedCL(suspected_cl, revert_status=revert_cl_status.FALSE_POSITIVE) elif suspected_cl.should_be_reverted: # pragma: no branch # Findit could have created a revert CL, but the sheriff was too fast. # Find the first revert that was successfully landed. for revert in reverts_to_check: # pragma: no branch revert_commits = revert.reverting_cl.commits if revert_commits: # pragma: no branch _UpdateSuspectedCL(suspected_cl, sheriff_action_time=revert.timestamp) break return True, code_review_url, (revert_cl.status if revert_cl else revert_cl_status.DUPLICATE)