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

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

Issue 2477343003: [Findit] Refactoring monitor swarming task pipelines (Closed)
Patch Set: Addressing comment and further refactoring tests Created 4 years, 1 month 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 5 import logging
6 6
7 from collections import defaultdict
8
9 from model.flake.flake_swarming_task import FlakeSwarmingTask 7 from model.flake.flake_swarming_task import FlakeSwarmingTask
10 from model.flake.master_flake_analysis import DataPoint 8 from model.flake.master_flake_analysis import DataPoint
11 from model.flake.master_flake_analysis import MasterFlakeAnalysis 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis
12 from waterfall.process_base_swarming_task_result_pipeline import ( 10 from waterfall.process_base_swarming_task_result_pipeline import (
13 ProcessBaseSwarmingTaskResultPipeline) 11 ProcessBaseSwarmingTaskResultPipeline)
14 12
15 13
16 class ProcessFlakeSwarmingTaskResultPipeline( 14 class ProcessFlakeSwarmingTaskResultPipeline(
17 ProcessBaseSwarmingTaskResultPipeline): 15 ProcessBaseSwarmingTaskResultPipeline):
18 """A pipeline for monitoring swarming task and processing task result. 16 """A pipeline for monitoring swarming task and processing task result.
(...skipping 17 matching lines...) Expand all
36 master_build_number (int): Build number of corresponding mfa. 34 master_build_number (int): Build number of corresponding mfa.
37 test_name (string): Name of test of swarming rerun. 35 test_name (string): Name of test of swarming rerun.
38 version_number (int): The version to save analysis results and ` to. 36 version_number (int): The version to save analysis results and ` to.
39 37
40 Returns: 38 Returns:
41 tests_statuses (dict): A dict of different statuses for each test. 39 tests_statuses (dict): A dict of different statuses for each test.
42 40
43 Currently for each test, we are saving number of total runs, 41 Currently for each test, we are saving number of total runs,
44 number of succeeded runs and number of failed runs. 42 number of succeeded runs and number of failed runs.
45 """ 43 """
46
47 tests_statuses = defaultdict(lambda: defaultdict(int))
48
49 if not output_json:
50 return tests_statuses
51
52 for iteration in output_json.get('per_iteration_data'):
53 for name, test_runs in iteration.iteritems():
54 tests_statuses[name]['total_run'] += len(test_runs)
55 for test_run in test_runs:
56 tests_statuses[name][test_run['status']] += 1
57
58 # Should query by test name, because some test has dependencies which 44 # Should query by test name, because some test has dependencies which
59 # are also run, like TEST and PRE_TEST in browser_tests. 45 # are also run, like TEST and PRE_TEST in browser_tests.
chanli 2016/11/10 18:42:01 Nit: move this comment before ln49?
lijeffrey 2016/11/11 17:10:42 Done.
46 tests_statuses = super(ProcessFlakeSwarmingTaskResultPipeline,
47 self)._CheckTestsRunStatuses(output_json)
48
60 tries = tests_statuses.get(test_name, {}).get('total_run', 0) 49 tries = tests_statuses.get(test_name, {}).get('total_run', 0)
61 successes = tests_statuses.get(test_name, {}).get('SUCCESS', 0) 50 successes = tests_statuses.get(test_name, {}).get('SUCCESS', 0)
62 51
63 if tries > 0: 52 if tries > 0:
64 pass_rate = successes * 1.0 / tries 53 pass_rate = successes * 1.0 / tries
65 else: 54 else:
66 pass_rate = -1 # Special value to indicate test is not existing. 55 pass_rate = -1 # Special value to indicate test is not existing.
67 56
68 master_flake_analysis = MasterFlakeAnalysis.GetVersion( 57 master_flake_analysis = MasterFlakeAnalysis.GetVersion(
69 master_name, builder_name, master_build_number, step_name, test_name, 58 master_name, builder_name, master_build_number, step_name, test_name,
70 version=version_number) 59 version=version_number)
71 logging.info( 60 logging.info(
72 'Updating MasterFlakeAnalysis data %s/%s/%s/%s/%s', 61 'Updating MasterFlakeAnalysis data %s/%s/%s/%s/%s',
73 master_name, builder_name, build_number, step_name, test_name) 62 master_name, builder_name, master_build_number, step_name, test_name)
74 logging.info('MasterFlakeAnalysis %s version %s', 63 logging.info('MasterFlakeAnalysis %s version %s',
75 master_flake_analysis, master_flake_analysis.version_number) 64 master_flake_analysis, master_flake_analysis.version_number)
76 65
77 data_point = DataPoint() 66 data_point = DataPoint()
78 data_point.build_number = build_number 67 data_point.build_number = build_number
79 data_point.pass_rate = pass_rate 68 data_point.pass_rate = pass_rate
80 master_flake_analysis.data_points.append(data_point) 69 master_flake_analysis.data_points.append(data_point)
81 70
82 flake_swarming_task = FlakeSwarmingTask.Get( 71 flake_swarming_task = FlakeSwarmingTask.Get(
83 master_name, builder_name, build_number, step_name, test_name) 72 master_name, builder_name, build_number, step_name, test_name)
84 flake_swarming_task.tries = tries 73 flake_swarming_task.tries = tries
85 flake_swarming_task.successes = successes 74 flake_swarming_task.successes = successes
86 flake_swarming_task.put() 75 flake_swarming_task.put()
87 76
88 results = flake_swarming_task.GetFlakeSwarmingTaskData() 77 results = flake_swarming_task.GetFlakeSwarmingTaskData()
89 # TODO(lijeffrey): Determine whether or not this flake swarming task 78 # TODO(lijeffrey): Determine whether or not this flake swarming task
90 # was a cache hit (already ran results for more iterations than were 79 # was a cache hit (already ran results for more iterations than were
91 # requested) and update results['cache_hit'] accordingly. 80 # requested) and update results['cache_hit'] accordingly.
92 master_flake_analysis.swarming_rerun_results.append(results) 81 master_flake_analysis.swarming_rerun_results.append(results)
93 master_flake_analysis.put() 82 master_flake_analysis.put()
83
94 return tests_statuses 84 return tests_statuses
95 85
96 def _GetArgs(self, master_name, builder_name, build_number, 86 def _GetArgs(self, master_name, builder_name, build_number,
97 step_name, *args): 87 step_name, *args):
98 master_build_number = args[0] 88 master_build_number = args[0]
99 test_name = args[1] 89 test_name = args[1]
100 version_number = args[2] 90 version_number = args[2]
101 return (master_name, builder_name, build_number, step_name, 91 return (master_name, builder_name, build_number, step_name,
102 master_build_number, test_name, version_number) 92 master_build_number, test_name, version_number)
103 93
104 # Unused Argument - pylint: disable=W0612,W0613 94 # Unused Argument - pylint: disable=W0612,W0613
95 # Arguments number differs from overridden method - pylint: disable=W0221
105 def _GetSwarmingTask(self, master_name, builder_name, build_number, 96 def _GetSwarmingTask(self, master_name, builder_name, build_number,
106 step_name, master_build_number, test_name, _): 97 step_name, master_build_number, test_name, _):
107 # Get the appropriate kind of Swarming Task (Flake). 98 # Gets the appropriate kind of swarming task (FlakeSwarmingTask).
108 return FlakeSwarmingTask.Get(master_name, builder_name, 99 return FlakeSwarmingTask.Get(master_name, builder_name, build_number,
109 build_number, step_name, test_name) 100 step_name, test_name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698