summaryrefslogtreecommitdiff
path: root/buildscripts/download_sys_perf_binaries.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/download_sys_perf_binaries.py')
-rw-r--r--buildscripts/download_sys_perf_binaries.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/buildscripts/download_sys_perf_binaries.py b/buildscripts/download_sys_perf_binaries.py
new file mode 100644
index 00000000000..f94a328fd7b
--- /dev/null
+++ b/buildscripts/download_sys_perf_binaries.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+"""Download the binaries from a previous sys-perf run."""
+
+import argparse
+import requests
+
+BASE_URI = 'https://evergreen.mongodb.com/rest/v2/'
+
+
+def _get_auth_headers(evergreen_api_user, evergreen_api_key):
+ return {
+ 'Api-User': evergreen_api_user,
+ 'Api-Key': evergreen_api_key,
+ }
+
+
+def _get_build_id(build_variant_name, version_id, auth_headers):
+ url = BASE_URI + 'versions/' + version_id
+ response = requests.get(url, headers=auth_headers)
+ if response.status_code != 200:
+ raise ValueError('Invalid version_id:', version_id)
+
+ version_json = response.json()
+ build_variants = version_json['build_variants_status']
+ for build_variant in build_variants:
+ if build_variant['build_variant'] == build_variant_name:
+ return build_variant['build_id']
+
+ raise RuntimeError('The compile-variant ' + build_variant_name +
+ ' does not exist for the build with version_id ' + version_id)
+
+
+# All of our sys-perf compile variants have exactly one task,
+# so we can safely select the first one from the build variants tasks.
+def _get_task_id(build_id, auth_headers):
+ url = BASE_URI + 'builds/' + build_id
+ response = requests.get(url, headers=auth_headers)
+ if response.status_code != 200:
+ raise RuntimeError('Unexpected error when trying to reach' + url)
+
+ build_json = response.json()
+ task_list = build_json['tasks']
+ if len(task_list) != 1:
+ raise RuntimeError('Recieved unexpected tasklist:', task_list)
+ return task_list[0]
+
+
+# The API used here always grabs the latest execution
+def _get_binary_details(task_id, auth_headers):
+ url = BASE_URI + 'tasks/' + task_id
+ response = requests.get(url, headers=auth_headers)
+ if response.status_code != 200:
+ raise RuntimeError('Unexpected error when trying to reach' + url)
+
+ task_json = response.json()
+ if task_json['status'] != 'success':
+ raise RuntimeError('The task ' + task_id + ' did not run sucessfully')
+
+ # The binary will always be the first artifact, unless we make large changes to system_perf.yml
+ artifacts = task_json['artifacts']
+ if len(artifacts) > 0 and artifacts[0]['name'].startswith('mongo'):
+ return artifacts[0]
+ raise RuntimeError('Unexpected list of artifacts:' + artifacts)
+
+
+def _get_binary_url(version_id, build_variant, evergreen_api_user, evergreen_api_key):
+ auth_headers = _get_auth_headers(evergreen_api_user, evergreen_api_key)
+ build_id = _get_build_id(build_variant, version_id, auth_headers)
+ task_id = _get_task_id(build_id, auth_headers)
+ binary_json = _get_binary_details(task_id, auth_headers)
+ return binary_json['url']
+
+
+def _download_binary_file(url, save_path):
+ response = requests.get(url, stream=True)
+ if response.status_code == 200:
+ with open(save_path, 'wb') as file:
+ for chunk in response.iter_content(chunk_size=1024):
+ file.write(chunk)
+ else:
+ raise RuntimeError('Failed to download the file ' + url)
+
+
+def _download_sys_perf_binaries(version_id, build_variant, evergreen_api_user, evergreen_api_key):
+ url = _get_binary_url(version_id, build_variant, evergreen_api_user, evergreen_api_key)
+ _download_binary_file(url, 'binary.tar.gz')
+
+
+if __name__ == '__main__':
+ argParser = argparse.ArgumentParser()
+ argParser.add_argument("-v", "--version_id",
+ help="Evergreen version_id from which binaries will be downloaded")
+ argParser.add_argument("-b", "--build_variant",
+ help="Build variant for which binaries will be downloaded")
+ argParser.add_argument(
+ "-u", "--evergreen_api_user",
+ help="Evergreen API user, see https://spruce.mongodb.com/preferences/cli")
+ argParser.add_argument("-k", "--evergreen_api_key",
+ help="Evergreen API key, see https://spruce.mongodb.com/preferences/cli")
+ args = argParser.parse_args()
+
+ _download_sys_perf_binaries(args.version_id, args.build_variant, args.evergreen_api_user,
+ args.evergreen_api_key)