From 6e235967513b534182e3d24771429a852c816f46 Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: May 07 2018 15:18:15 +0000 Subject: Retrieve multiple waivers at once Omits doing multiple HTTP requests to WaiverDB. --- diff --git a/greenwave/api_v1.py b/greenwave/api_v1.py index addbaf4..3fcb1bb 100644 --- a/greenwave/api_v1.py +++ b/greenwave/api_v1.py @@ -248,18 +248,17 @@ def make_decision(): subjects = [item for item in data['subject'] if isinstance(item, dict)] if not subjects: raise BadRequest('Invalid subject, must be a list of dicts') - answers = [] - all_results, all_waivers = [], [] - for item in subjects: - results = retrieve_results(item) - results = [r for r in results if r['id'] not in ignore_results] - all_results.extend(results) + waivers = retrieve_waivers(product_version, subjects) + waivers = [w for w in waivers if w['id'] not in ignore_waivers] - waivers = retrieve_waivers(product_version, item) - waivers = [w for w in waivers if w['id'] not in ignore_waivers] - all_waivers.extend(waivers) + results = [] + for item in subjects: + results.extend(retrieve_results(item)) + results = [r for r in results if r['id'] not in ignore_results] + answers = [] + for item in subjects: for policy in applicable_policies: answers.extend(policy.check(item, results, waivers)) @@ -272,8 +271,8 @@ def make_decision(): } if verbose: res.update({ - 'results': all_results, - 'waivers': all_waivers, + 'results': results, + 'waivers': waivers, }) resp = jsonify(res) resp = insert_headers(resp) diff --git a/greenwave/resources.py b/greenwave/resources.py index c401675..cddc546 100644 --- a/greenwave/resources.py +++ b/greenwave/resources.py @@ -80,13 +80,15 @@ def retrieve_results(item): # NOTE - not cached, for now. @greenwave.utils.retry(wait_on=urllib3.exceptions.NewConnectionError) -def retrieve_waivers(product_version, item): +def retrieve_waivers(product_version, items): timeout = current_app.config['REQUESTS_TIMEOUT'] verify = current_app.config['REQUESTS_VERIFY'] + data = { 'product_version': product_version, - 'results': [{"subject": item}] + 'results': [{"subject": item} for item in items] } + response = requests_session.post( current_app.config['WAIVERDB_API_URL'] + '/waivers/+by-subjects-and-testcases', headers={'Content-Type': 'application/json'},