From 7cf9ad475462b4f08b7a2daa0e71643f0a387e85 Mon Sep 17 00:00:00 2001 From: Thierry Carrez Date: Tue, 18 Feb 2020 15:20:59 +0100 Subject: [PATCH] check-release-approval: retry once when Gerrit fails We've had a number of occurrences where Gerrit failed to return a complete JSON answer. In particular, the ['labels']['CodeReview']['all'] content is not provided, while the query requires o=DETAILED_LABELS. Since this is a rare occurrence (which could not be reproduced on manual testing) let's retry once to load the results from Gerrit. Change-Id: I98d1010e9586d2329137d5d600c66eeb8343fa97 --- .../files/check_approval.py | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/roles/check-release-approval/files/check_approval.py b/roles/check-release-approval/files/check_approval.py index e7d078cf10..2997faa25e 100755 --- a/roles/check-release-approval/files/check_approval.py +++ b/roles/check-release-approval/files/check_approval.py @@ -61,8 +61,21 @@ class GerritChange(object): with open(os.path.join(args.governance, PROJECTS_YAML), 'r') as dfile: self.gov_data = yaml.safe_load(dfile) + try: + self.load_from_gerrit(args.changeid) + except KeyError: + LOG.warning( + '\ndata from gerrit is missing required keys:\n\n%s\n', + json.dumps(self.raw_data, indent=2)) + LOG.warning("Retrying once...") + self.load_from_gerrit(args.changeid) + LOG.warning("Second try was successful.") + + self.workspace = args.releases + + def load_from_gerrit(self, changeid): # Grab changeid details from Gerrit - call = 'changes/%s' % args.changeid + \ + call = 'changes/%s' % changeid + \ '?o=CURRENT_REVISION&o=CURRENT_FILES&o=DETAILED_LABELS' + \ '&o=DETAILED_ACCOUNTS' raw = requests.get(GERRIT_URL + call) @@ -85,23 +98,15 @@ class GerritChange(object): # Instantiate object with retrieved data self.raw_data = decoded - try: - self.approvers = [i['email'] - for i in decoded['labels']['Code-Review']['all'] - if i['value'] > 0] - self.approvers.append(decoded['owner']['email']) - currev = decoded['current_revision'] - self.deliv_files = [ - x for x in decoded['revisions'][currev]['files'].keys() - if x.startswith('deliverables/') - ] - except KeyError: - LOG.error( - '\ndata from gerrit is missing required keys:\n\n%s\n', - json.dumps(decoded, indent=2)) - raise - - self.workspace = args.releases + self.approvers = [i['email'] + for i in decoded['labels']['Code-Review']['all'] + if i['value'] > 0] + self.approvers.append(decoded['owner']['email']) + currev = decoded['current_revision'] + self.deliv_files = [ + x for x in decoded['revisions'][currev]['files'].keys() + if x.startswith('deliverables/') + ] def is_approved(self): LOG.debug('Approvals: %s' % self.approvers)