Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(558)

Side by Side Diff: appengine/findit/waterfall/process_flake_swarming_task_result_pipeline.py

Issue 2369333002: [Findit] Capture versionized metadata for master_flake_analysis (Closed)
Patch Set: Fixing passing version through pipelines Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging
6
5 from collections import defaultdict 7 from collections import defaultdict
6 8
7 from common.pipeline_wrapper import BasePipeline 9 from model.flake.flake_swarming_task import FlakeSwarmingTask
8
9 from model.flake.master_flake_analysis import MasterFlakeAnalysis 10 from model.flake.master_flake_analysis import MasterFlakeAnalysis
10 from model.flake.flake_swarming_task import FlakeSwarmingTask
11 from waterfall.process_base_swarming_task_result_pipeline import ( 11 from waterfall.process_base_swarming_task_result_pipeline import (
12 ProcessBaseSwarmingTaskResultPipeline) 12 ProcessBaseSwarmingTaskResultPipeline)
13 13
14 14
15 class ProcessFlakeSwarmingTaskResultPipeline( 15 class ProcessFlakeSwarmingTaskResultPipeline(
16 ProcessBaseSwarmingTaskResultPipeline): 16 ProcessBaseSwarmingTaskResultPipeline):
17 """A pipeline for monitoring swarming task and processing task result. 17 """A pipeline for monitoring swarming task and processing task result.
18 18
19 This pipeline waits for result for a swarming task and processes the result to 19 This pipeline waits for result for a swarming task and processes the result to
20 generate a dict for statuses for each test run. 20 generate a dict for statuses for each test run.
21 """ 21 """
22 22
23 # Arguments number differs from overridden method - pylint: disable=W0221 23 # Arguments number differs from overridden method - pylint: disable=W0221
24 def _CheckTestsRunStatuses(self, output_json, master_name, 24 def _CheckTestsRunStatuses(self, output_json, master_name,
25 builder_name, build_number, step_name, 25 builder_name, build_number, step_name,
26 master_build_number, test_name): 26 master_build_number, test_name, version_number):
27 """Checks result status for each test run and saves the numbers accordingly. 27 """Checks result status for each test run and saves the numbers accordingly.
28 28
29 Args: 29 Args:
30 output_json (dict): A dict of all test results in the swarming task. 30 output_json (dict): A dict of all test results in the swarming task.
31 master_name (string): Name of master of swarming rerun. 31 master_name (string): Name of master of swarming rerun.
32 builder_name (dict): Name of builder of swarming rerun. 32 builder_name (dict): Name of builder of swarming rerun.
33 build_number (int): Build Number of swarming rerun. 33 build_number (int): Build Number of swarming rerun.
34 step_name (dict): Name of step of swarming rerun. 34 step_name (dict): Name of step of swarming rerun.
35 master_build_number (int): Build number of corresponding mfa 35 master_build_number (int): Build number of corresponding mfa.
36 test_name (string): Name of test of swarming rerun 36 test_name (string): Name of test of swarming rerun.
37 version_number (int): The version to save analysis results and data to.
37 38
38 Returns: 39 Returns:
39 tests_statuses (dict): A dict of different statuses for each test. 40 tests_statuses (dict): A dict of different statuses for each test.
40 41
41 Currently for each test, we are saving number of total runs, 42 Currently for each test, we are saving number of total runs,
42 number of succeeded runs and number of failed runs. 43 number of succeeded runs and number of failed runs.
43 """ 44 """
44 45
45 tests_statuses = defaultdict(lambda: defaultdict(int)) 46 tests_statuses = defaultdict(lambda: defaultdict(int))
46 47
47 if not output_json: 48 if not output_json:
48 return tests_statuses 49 return tests_statuses
49 50
50 for iteration in output_json.get('per_iteration_data'): 51 for iteration in output_json.get('per_iteration_data'):
51 for name, test_runs in iteration.iteritems(): 52 for name, test_runs in iteration.iteritems():
52 tests_statuses[name]['total_run'] += len(test_runs) 53 tests_statuses[name]['total_run'] += len(test_runs)
53 for test_run in test_runs: 54 for test_run in test_runs:
54 tests_statuses[name][test_run['status']] += 1 55 tests_statuses[name][test_run['status']] += 1
55 56
56 # Should query by test name, because some test has dependencies which 57 # Should query by test name, because some test has dependencies which
57 # are also run, like TEST and PRE_TEST in browser_tests. 58 # are also run, like TEST and PRE_TEST in browser_tests.
58 tries = tests_statuses.get(test_name, {}).get('total_run', 0) 59 tries = tests_statuses.get(test_name, {}).get('total_run', 0)
59 successes = tests_statuses.get(test_name, {}).get('SUCCESS', 0) 60 successes = tests_statuses.get(test_name, {}).get('SUCCESS', 0)
60 61
61 if tries > 0: 62 if tries > 0:
62 success_rate = successes * 1.0 / tries 63 pass_rate = successes * 1.0 / tries
63 else: 64 else:
64 success_rate = -1 # Special value to indicate test is not existing. 65 pass_rate = -1 # Special value to indicate test is not existing.
65 66
66 master_flake_analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 67 master_flake_analysis = MasterFlakeAnalysis.GetVersion(
67 master_build_number, 68 master_name, builder_name, master_build_number, step_name, test_name,
68 step_name, test_name) 69 version=version_number)
70 logging.info(
71 'Updating MasterFlakeAnalysis data %s/%s/%s/%s/%s',
72 master_name, builder_name, build_number, step_name, test_name)
73 logging.info('MasterFlakeAnalysis %s version %s',
74 master_flake_analysis, master_flake_analysis.version_number)
75
76 master_flake_analysis.build_numbers.append(build_number)
77 master_flake_analysis.pass_rates.append(pass_rate)
78
69 flake_swarming_task = FlakeSwarmingTask.Get( 79 flake_swarming_task = FlakeSwarmingTask.Get(
70 master_name, builder_name, build_number, step_name, test_name) 80 master_name, builder_name, build_number, step_name, test_name)
71
72 master_flake_analysis.build_numbers.append(build_number)
73 master_flake_analysis.success_rates.append(success_rate)
74 flake_swarming_task.tries = tries 81 flake_swarming_task.tries = tries
75 flake_swarming_task.successes = successes 82 flake_swarming_task.successes = successes
76 flake_swarming_task.put() 83 flake_swarming_task.put()
84
85 results = flake_swarming_task.ResultsToJsonDict()
86 # TODO(lijeffrey): Determine whether or not this flake swarming task
87 # was a cache hit (already ran results for more iterations than were
88 # requested) and update results['cache_hit'] accordingly.
89
90 task_id = flake_swarming_task.task_id
91 master_flake_analysis.swarming_rerun_results[task_id] = results
77 master_flake_analysis.put() 92 master_flake_analysis.put()
78 return tests_statuses 93 return tests_statuses
79 94
80 def _GetArgs(self, master_name, builder_name, build_number, 95 def _GetArgs(self, master_name, builder_name, build_number,
81 step_name, *args): 96 step_name, *args):
82 master_build_number = args[0] 97 master_build_number = args[0]
83 test_name = args[1] 98 test_name = args[1]
99 version_number = args[2]
84 return (master_name, builder_name, build_number, step_name, 100 return (master_name, builder_name, build_number, step_name,
85 master_build_number, test_name) 101 master_build_number, test_name, version_number)
86 102
87 # Unused Argument - pylint: disable=W0612,W0613 103 # Unused Argument - pylint: disable=W0612,W0613
88 def _GetSwarmingTask(self, master_name, builder_name, build_number, 104 def _GetSwarmingTask(self, master_name, builder_name, build_number,
89 step_name, master_build_number, test_name): 105 step_name, master_build_number, test_name, _):
90 # Get the appropriate kind of Swarming Task (Flake). 106 # Get the appropriate kind of Swarming Task (Flake).
91 return FlakeSwarmingTask.Get(master_name, builder_name, 107 return FlakeSwarmingTask.Get(master_name, builder_name,
92 build_number, step_name, test_name) 108 build_number, step_name, test_name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698