Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 from datetime import datetime | 5 from datetime import datetime |
| 6 from datetime import time | 6 from datetime import time |
| 7 from datetime import timedelta | 7 from datetime import timedelta |
| 8 | 8 |
| 9 from common.base_handler import BaseHandler | 9 from common.base_handler import BaseHandler |
| 10 from common.base_handler import Permission | 10 from common.base_handler import Permission |
| 11 | 11 |
| 12 from lib import time_util | 12 from lib import time_util |
| 13 from model import result_status | 13 from model import result_status |
| 14 from model.flake.master_flake_analysis import MasterFlakeAnalysis | 14 from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| 15 | 15 |
| 16 | 16 |
| 17 PAGE_SIZE = 100 | |
| 18 | |
| 19 | |
| 17 def FilterMasterFlakeAnalysis( | 20 def FilterMasterFlakeAnalysis( |
| 18 master_flake_analysis_query, master_name=None, builder_name=None, | 21 master_flake_analysis_query, master_name=None, builder_name=None, |
| 19 build_number=None, step_name=None, test_name=None, start_date=None, | 22 build_number=None, step_name=None, test_name=None, start_date=None, |
| 20 end_date=None, status_code=result_status.UNSPECIFIED): | 23 end_date=None, status_code=result_status.UNSPECIFIED, offset=0): |
|
stgao
2016/12/01 18:26:06
We'd better use cursor instead of offset for perfo
| |
| 21 if master_name: | 24 if master_name: |
| 22 master_flake_analysis_query = master_flake_analysis_query.filter( | 25 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 23 MasterFlakeAnalysis.master_name == master_name) | 26 MasterFlakeAnalysis.master_name == master_name) |
| 24 if builder_name: | 27 if builder_name: |
| 25 master_flake_analysis_query = master_flake_analysis_query.filter( | 28 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 26 MasterFlakeAnalysis.builder_name == builder_name) | 29 MasterFlakeAnalysis.builder_name == builder_name) |
| 27 if build_number: | 30 if build_number: |
| 28 master_flake_analysis_query = master_flake_analysis_query.filter( | 31 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 29 MasterFlakeAnalysis.build_number == build_number) | 32 MasterFlakeAnalysis.build_number == build_number) |
| 30 if step_name: | 33 if step_name: |
| 31 master_flake_analysis_query = master_flake_analysis_query.filter( | 34 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 32 MasterFlakeAnalysis.step_name == step_name) | 35 MasterFlakeAnalysis.step_name == step_name) |
| 33 if test_name: | 36 if test_name: |
| 34 master_flake_analysis_query = master_flake_analysis_query.filter( | 37 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 35 MasterFlakeAnalysis.test_name == test_name) | 38 MasterFlakeAnalysis.test_name == test_name) |
| 36 if start_date: | 39 if start_date: |
| 37 master_flake_analysis_query = master_flake_analysis_query.filter( | 40 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 38 MasterFlakeAnalysis.request_time >= start_date) | 41 MasterFlakeAnalysis.request_time >= start_date) |
| 39 if end_date: | 42 if end_date: |
| 40 master_flake_analysis_query = master_flake_analysis_query.filter( | 43 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 41 MasterFlakeAnalysis.request_time < end_date) | 44 MasterFlakeAnalysis.request_time < end_date) |
| 42 if status_code != result_status.UNSPECIFIED: | 45 if status_code != result_status.UNSPECIFIED: |
| 43 master_flake_analysis_query = master_flake_analysis_query.filter( | 46 master_flake_analysis_query = master_flake_analysis_query.filter( |
| 44 MasterFlakeAnalysis.result_status == status_code) | 47 MasterFlakeAnalysis.result_status == status_code) |
| 45 | 48 |
| 46 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) | 49 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) |
| 47 return master_flake_analysis_query.fetch() | 50 |
| 51 # TODO(lijeffrey): use cursor instead of offset. | |
| 52 analyses, _, more = master_flake_analysis_query.fetch_page( | |
| 53 PAGE_SIZE, offset=offset) | |
| 54 | |
| 55 return analyses, more | |
| 48 | 56 |
| 49 | 57 |
| 50 class ListFlakes(BaseHandler): | 58 class ListFlakes(BaseHandler): |
| 51 PERMISSION_LEVEL = Permission.ANYONE | 59 PERMISSION_LEVEL = Permission.ANYONE |
| 52 | 60 |
| 53 def _GetStartAndEndDates(self, triage): | 61 def _GetStartAndEndDates(self, triage): |
| 54 start_date = None | 62 start_date = None |
| 55 end_date = None | 63 end_date = None |
| 56 | 64 |
| 57 if triage: | 65 if triage: |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 72 status_code = int( | 80 status_code = int( |
| 73 self.request.get('result_status', result_status.UNSPECIFIED)) | 81 self.request.get('result_status', result_status.UNSPECIFIED)) |
| 74 master_name = self.request.get('master_name').strip() | 82 master_name = self.request.get('master_name').strip() |
| 75 builder_name = self.request.get('builder_name').strip() | 83 builder_name = self.request.get('builder_name').strip() |
| 76 build_number = self.request.get('build_number').strip() | 84 build_number = self.request.get('build_number').strip() |
| 77 if build_number: | 85 if build_number: |
| 78 build_number = int(build_number) | 86 build_number = int(build_number) |
| 79 step_name = self.request.get('step_name').strip() | 87 step_name = self.request.get('step_name').strip() |
| 80 test_name = self.request.get('test_name').strip() | 88 test_name = self.request.get('test_name').strip() |
| 81 triage = self.request.get('triage') == '1' | 89 triage = self.request.get('triage') == '1' |
| 90 offset = int(self.request.get('offset', '0').strip()) | |
| 82 | 91 |
| 83 # Only allow querying by start/end dates for admins during triage to avoid | 92 # Only allow querying by start/end dates for admins during triage to avoid |
| 84 # overcomplicating the UI for other users. | 93 # overcomplicating the UI for other users. |
| 85 start_date, end_date = self._GetStartAndEndDates(triage) | 94 start_date, end_date = self._GetStartAndEndDates(triage) |
| 86 | 95 |
| 87 master_flake_analyses = FilterMasterFlakeAnalysis( | 96 master_flake_analyses, more = FilterMasterFlakeAnalysis( |
| 88 MasterFlakeAnalysis.query(), master_name, builder_name, build_number, | 97 MasterFlakeAnalysis.query(), master_name, builder_name, build_number, |
| 89 step_name, test_name, start_date, end_date, status_code) | 98 step_name, test_name, start_date, end_date, status_code, offset) |
| 90 | 99 |
| 91 data = { | 100 data = { |
| 92 'master_flake_analyses': [], | 101 'master_flake_analyses': [], |
| 93 'result_status_filter': status_code, | 102 'result_status_filter': status_code, |
| 94 'master_name_filter': master_name, | 103 'master_name_filter': master_name, |
| 95 'builder_name_filter': builder_name, | 104 'builder_name_filter': builder_name, |
| 96 'build_number_filter': build_number, | 105 'build_number_filter': build_number, |
| 97 'step_name_filter': step_name, | 106 'step_name_filter': step_name, |
| 98 'test_name_filter': test_name | 107 'test_name_filter': test_name, |
| 108 'page_size': PAGE_SIZE, | |
| 109 'offset': offset, | |
| 110 'more': more, | |
| 99 } | 111 } |
| 100 | 112 |
| 101 if triage: # pragma: no cover | 113 if triage: # pragma: no cover |
| 102 data['triage'] = triage | 114 data['triage'] = triage |
| 103 data['start_date'] = start_date | 115 data['start_date'] = start_date |
| 104 data['end_date'] = end_date | 116 data['end_date'] = end_date |
| 105 | 117 |
| 106 for master_flake_analysis in master_flake_analyses: | 118 for master_flake_analysis in master_flake_analyses: |
| 107 data['master_flake_analyses'].append({ | 119 data['master_flake_analyses'].append({ |
| 108 'master_name': master_flake_analysis.master_name, | 120 'master_name': master_flake_analysis.master_name, |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 120 | 132 |
| 121 # TODO (stgao): use index instead of in-memory sort. | 133 # TODO (stgao): use index instead of in-memory sort. |
| 122 # Index doesn't work for now, possibly due to legacy data. | 134 # Index doesn't work for now, possibly due to legacy data. |
| 123 data['master_flake_analyses'].sort( | 135 data['master_flake_analyses'].sort( |
| 124 key=lambda e: e['request_time'], reverse=True) | 136 key=lambda e: e['request_time'], reverse=True) |
| 125 | 137 |
| 126 return { | 138 return { |
| 127 'template': 'flake/dashboard.html', | 139 'template': 'flake/dashboard.html', |
| 128 'data': data | 140 'data': data |
| 129 } | 141 } |
| OLD | NEW |