2014-09-04 04:52:43 -07:00
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import cStringIO
|
|
|
|
import gzip
|
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import requests
|
|
|
|
import urlparse
|
|
|
|
|
|
|
|
treeherder_base = "https://treeherder.mozilla.org/"
|
|
|
|
|
|
|
|
"""Simple script for downloading structured logs from treeherder.
|
|
|
|
|
|
|
|
For the moment this is specialised to work with web-platform-tests
|
|
|
|
logs; in due course it should move somewhere generic and get hooked
|
|
|
|
up to mach or similar"""
|
|
|
|
|
|
|
|
# Interpretation of the "job" list from
|
|
|
|
# https://github.com/mozilla/treeherder-service/blob/master/treeherder/webapp/api/utils.py#L18
|
|
|
|
|
|
|
|
def create_parser():
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("branch", action="store",
|
|
|
|
help="Branch on which jobs ran")
|
|
|
|
parser.add_argument("commit",
|
|
|
|
action="store",
|
|
|
|
help="Commit hash for push")
|
|
|
|
|
|
|
|
return parser
|
|
|
|
|
|
|
|
def download(url, prefix, dest, force_suffix=True):
|
|
|
|
if dest is None:
|
|
|
|
dest = "."
|
|
|
|
|
|
|
|
if prefix and not force_suffix:
|
|
|
|
name = os.path.join(dest, prefix + ".log")
|
|
|
|
else:
|
|
|
|
name = None
|
|
|
|
counter = 0
|
|
|
|
|
|
|
|
while not name or os.path.exists(name):
|
|
|
|
counter += 1
|
|
|
|
sep = "" if not prefix else "-"
|
|
|
|
name = os.path.join(dest, prefix + sep + str(counter) + ".log")
|
|
|
|
|
|
|
|
with open(name, "wb") as f:
|
2015-01-13 01:42:40 -08:00
|
|
|
resp = requests.get(url, stream=True)
|
|
|
|
for chunk in resp.iter_content(1024):
|
|
|
|
f.write(chunk)
|
2014-09-04 04:52:43 -07:00
|
|
|
|
|
|
|
def get_blobber_url(branch, job):
|
2015-03-02 06:07:09 -08:00
|
|
|
job_id = job["id"]
|
2014-09-04 04:52:43 -07:00
|
|
|
resp = requests.get(urlparse.urljoin(treeherder_base,
|
|
|
|
"/api/project/%s/artifact/?job_id=%i&name=Job%%20Info" % (branch,
|
|
|
|
job_id)))
|
|
|
|
job_data = resp.json()
|
2015-03-02 06:07:09 -08:00
|
|
|
|
2014-09-04 04:52:43 -07:00
|
|
|
if job_data:
|
|
|
|
assert len(job_data) == 1
|
|
|
|
job_data = job_data[0]
|
|
|
|
try:
|
|
|
|
details = job_data["blob"]["job_details"]
|
|
|
|
for item in details:
|
2015-01-13 01:42:40 -08:00
|
|
|
if item["value"] == "wpt_raw.log":
|
2014-09-04 04:52:43 -07:00
|
|
|
return item["url"]
|
|
|
|
except:
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def get_structured_logs(branch, commit, dest=None):
|
2015-03-02 06:07:09 -08:00
|
|
|
resp = requests.get(urlparse.urljoin(treeherder_base, "/api/project/%s/resultset/?revision=%s" % (branch, commit)))
|
|
|
|
|
|
|
|
revision_data = resp.json()
|
|
|
|
|
|
|
|
result_set = revision_data["results"][0]["id"]
|
|
|
|
|
|
|
|
resp = requests.get(urlparse.urljoin(treeherder_base, "/api/project/%s/jobs/?result_set_id=%s&count=2000&exclusion_profile=false" % (branch, result_set)))
|
|
|
|
|
2014-09-04 04:52:43 -07:00
|
|
|
job_data = resp.json()
|
|
|
|
|
|
|
|
for result in job_data["results"]:
|
2015-03-02 06:07:09 -08:00
|
|
|
job_type_name = result["job_type_name"]
|
|
|
|
if job_type_name.startswith("W3C Web Platform"):
|
|
|
|
url = get_blobber_url(branch, result)
|
|
|
|
if url:
|
|
|
|
prefix = result["platform"] # platform
|
|
|
|
download(url, prefix, None)
|
2014-09-04 04:52:43 -07:00
|
|
|
|
|
|
|
def main():
|
|
|
|
parser = create_parser()
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
get_structured_logs(args.branch, args.commit)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|