OLD | NEW |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 """This module is to provide Findit service APIs through Cloud Endpoints: | 5 """This module is to provide Findit service APIs through Cloud Endpoints: |
6 | 6 |
7 Current APIs include: | 7 Current APIs include: |
8 1. Analysis of compile/test failures in Chromium waterfalls. | 8 1. Analysis of compile/test failures in Chromium waterfalls. |
9 Analyzes failures and detects suspected CLs. | 9 Analyzes failures and detects suspected CLs. |
10 """ | 10 """ |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 try_job_key = try_job_map.get(step_name, {}).get(test_name) | 129 try_job_key = try_job_map.get(step_name, {}).get(test_name) |
130 | 130 |
131 if not try_job_key: | 131 if not try_job_key: |
132 return None | 132 return None |
133 | 133 |
134 try_job = WfTryJob.Get(*try_job_key.split('/')) | 134 try_job = WfTryJob.Get(*try_job_key.split('/')) |
135 if not try_job or not try_job.completed or try_job.failed: | 135 if not try_job or not try_job.completed or try_job.failed: |
136 return None | 136 return None |
137 | 137 |
138 if build_failure_type == failure_type.COMPILE: | 138 if build_failure_type == failure_type.COMPILE: |
| 139 if not try_job.compile_results: # pragma: no cover. |
| 140 return None |
139 return try_job.compile_results[-1].get('culprit', {}).get(step_name) | 141 return try_job.compile_results[-1].get('culprit', {}).get(step_name) |
140 | 142 |
| 143 if not try_job.test_results: # pragma: no cover. |
| 144 return None |
| 145 |
141 if test_name is None: | 146 if test_name is None: |
142 step_info = try_job.test_results[-1].get('culprit', {}).get(step_name) | 147 step_info = try_job.test_results[-1].get('culprit', {}).get(step_name) |
143 if not step_info or step_info.get('tests'): # pragma: no cover. | 148 if not step_info or step_info.get('tests'): # pragma: no cover. |
144 # TODO(chanli): For some steps like checkperms/sizes/etc, the culprit | 149 # TODO(chanli): For some steps like checkperms/sizes/etc, the culprit |
145 # finding try-job might have test-level results. | 150 # finding try-job might have test-level results. |
146 return None | 151 return None |
147 return step_info | 152 return step_info |
148 | 153 |
149 task = WfSwarmingTask.Get(*try_job_key.split('/'), step_name=step_name) | 154 task = WfSwarmingTask.Get(*try_job_key.split('/'), step_name=step_name) |
150 ref_name = (task.parameters.get('ref_name') if task and task.parameters | 155 ref_name = (task.parameters.get('ref_name') if task and task.parameters |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 logging.info('%d build failure(s), while %d are supported', | 243 logging.info('%d build failure(s), while %d are supported', |
239 len(request.builds), len(supported_builds)) | 244 len(request.builds), len(supported_builds)) |
240 try: | 245 try: |
241 _TriggerNewAnalysesOnDemand(supported_builds) | 246 _TriggerNewAnalysesOnDemand(supported_builds) |
242 except Exception: # pragma: no cover. | 247 except Exception: # pragma: no cover. |
243 # If we fail to post a task to the task queue, we ignore and wait for next | 248 # If we fail to post a task to the task queue, we ignore and wait for next |
244 # request. | 249 # request. |
245 logging.exception('Failed to trigger new analyses on demand.') | 250 logging.exception('Failed to trigger new analyses on demand.') |
246 | 251 |
247 return _BuildFailureAnalysisResultCollection(results=results) | 252 return _BuildFailureAnalysisResultCollection(results=results) |
OLD | NEW |