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
This commit is contained in:
Thierry Carrez 2020-02-18 15:20:59 +01:00
parent 42b588e9ec
commit 7cf9ad4754
1 changed files with 23 additions and 18 deletions

View File

@ -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)