Chromium Code Reviews| Index: content/test/gpu/gather_swarming_json_results.py |
| diff --git a/content/test/gpu/gather_swarming_json_results.py b/content/test/gpu/gather_swarming_json_results.py |
| index 159d4cb4065d1671b28aafebe2e3b4b9da86c406..cadff83361ecf05b79e6461b53458bc7b6f90cd5 100755 |
| --- a/content/test/gpu/gather_swarming_json_results.py |
| +++ b/content/test/gpu/gather_swarming_json_results.py |
| @@ -145,6 +145,16 @@ def Merge(dest, src): |
| return src |
| +def ExtractTestTimes(node, node_name, dest): |
| + if 'times' in node: |
| + dest[node_name] = node['times'][0] |
|
nednguyen
2017/02/21 13:39:39
hmhh, should we use dest[node_name] = sum(node['ti
Ken Russell (switch to Gerrit)
2017/02/22 01:19:13
Thanks, good idea. Done.
|
| + else: |
| + # Currently the prefix names in the trie are dropped. Could |
| + # concatenate them if the naming convention is changed. |
| + for k in node.iterkeys(): |
| + if isinstance(node[k], dict): |
| + ExtractTestTimes(node[k], k, dest) |
| + |
| def main(): |
| rest_args = sys.argv[1:] |
| parser = argparse.ArgumentParser( |
| @@ -162,63 +172,80 @@ def main(): |
| parser.add_argument('--step', type=str, default='webgl2_conformance_tests', |
| help='Which step to fetch (treated as a prefix)') |
| parser.add_argument('--output', type=str, default='output.json', |
| - help='Name of output file') |
| + help='Name of output file; contains only test run times') |
| + parser.add_argument('--full-output', type=str, default='', |
| + help='Name of complete output file if desired') |
| parser.add_argument('--leak-temp-dir', action='store_true', default=False, |
| help='Deliberately leak temporary directory') |
| + parser.add_argument('--start-from-temp-dir', type=str, default='', |
| + help='Start from temporary directory (for debugging)') |
| options = parser.parse_args(rest_args) |
| - Swarming.CheckAuth() |
| - |
| - waterfall = Waterfall(options.waterfall) |
| - build = options.build |
| - if build < 0: |
| - build = waterfall.GetMostRecentlyCompletedBuildNumberForBot(options.bot) |
| - |
| - build_json = waterfall.GetJsonForBuild(options.bot, build) |
| - |
| - if options.verbose: |
| - print 'Fetching information from %s, bot %s, build %s' % ( |
| - options.waterfall, options.bot, build) |
| - |
| - taskIDs = [] |
| - for s in build_json['steps']: |
| - if s['name'].startswith(options.step): |
| - # Found the step. |
| - # |
| - # The Swarming shards happen to be listed in the 'urls' property |
| - # of the step. Iterate down them. |
| - if 'urls' not in s or not s['urls']: |
| - # Note: we could also just download json.output if it exists. |
| - print ('%s on waterfall %s, bot %s, build %s doesn\'t ' |
| - 'look like a Swarmed task') % ( |
| - s['name'], options.waterfall, options.bot, build) |
| - return 1 |
| - taskIDs = Swarming.ExtractShardTaskIDs(s['urls']) |
| - if options.verbose: |
| - print 'Found Swarming task IDs for step %s' % s['name'] |
| - |
| - break |
| - if not taskIDs: |
| - print 'Problem gathering the Swarming task IDs for %s' % options.step |
| - return 1 |
| - |
| - # Collect the results. |
| - tmpdir = tempfile.mkdtemp() |
| - Swarming.Collect(taskIDs, tmpdir, options.verbose) |
| + if options.start_from_temp_dir: |
| + tmpdir = options.start_from_temp_dir |
| + shard_dirs = [f for f in os.listdir(tmpdir) |
| + if os.path.isdir(os.path.join(tmpdir, f))] |
| + numTaskIDs = len(shard_dirs) |
| + else: |
| + Swarming.CheckAuth() |
| + |
| + waterfall = Waterfall(options.waterfall) |
| + build = options.build |
| + if build < 0: |
| + build = waterfall.GetMostRecentlyCompletedBuildNumberForBot(options.bot) |
| + |
| + build_json = waterfall.GetJsonForBuild(options.bot, build) |
| + |
| + if options.verbose: |
| + print 'Fetching information from %s, bot %s, build %s' % ( |
| + options.waterfall, options.bot, build) |
| + |
| + taskIDs = [] |
| + for s in build_json['steps']: |
| + if s['name'].startswith(options.step): |
| + # Found the step. |
| + # |
| + # The Swarming shards happen to be listed in the 'urls' property |
| + # of the step. Iterate down them. |
| + if 'urls' not in s or not s['urls']: |
| + # Note: we could also just download json.output if it exists. |
| + print ('%s on waterfall %s, bot %s, build %s doesn\'t ' |
| + 'look like a Swarmed task') % ( |
| + s['name'], options.waterfall, options.bot, build) |
| + return 1 |
| + taskIDs = Swarming.ExtractShardTaskIDs(s['urls']) |
| + if options.verbose: |
| + print 'Found Swarming task IDs for step %s' % s['name'] |
| + |
| + break |
| + if not taskIDs: |
| + print 'Problem gathering the Swarming task IDs for %s' % options.step |
| + return 1 |
| + |
| + # Collect the results. |
| + tmpdir = tempfile.mkdtemp() |
| + Swarming.Collect(taskIDs, tmpdir, options.verbose) |
| + numTaskIDs = len(taskIDs) |
| # Shards' JSON outputs are in sequentially-numbered subdirectories |
| # of the output directory. |
| merged_json = None |
| - for i in xrange(len(taskIDs)): |
| + for i in xrange(numTaskIDs): |
| with open(os.path.join(tmpdir, str(i), 'output.json')) as f: |
| cur_json = JsonLoadStrippingUnicode(f) |
| if not merged_json: |
| merged_json = cur_json |
| else: |
| merged_json = Merge(merged_json, cur_json) |
| + extracted_times = {'times':{}} |
| + ExtractTestTimes(merged_json, '', extracted_times['times']) |
| with open(options.output, 'w') as f: |
| + json.dump(extracted_times, f, sort_keys=True, indent=2, |
| + separators=(',', ': ')) |
| + |
| + if options.full_output: |
| json.dump(merged_json, f, sort_keys=True, indent=2, |
| separators=(',', ': ')) |