| 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): |
| 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 analyses, _, more = master_flake_analysis_query.fetch_page( |
| 51 PAGE_SIZE, offset=offset) |
| 52 |
| 53 return analyses, more |
| 48 | 54 |
| 49 | 55 |
| 50 class ListFlakes(BaseHandler): | 56 class ListFlakes(BaseHandler): |
| 51 PERMISSION_LEVEL = Permission.ANYONE | 57 PERMISSION_LEVEL = Permission.ANYONE |
| 52 | 58 |
| 53 def _GetStartAndEndDates(self, triage): | 59 def _GetStartAndEndDates(self, triage): |
| 54 start_date = None | 60 start_date = None |
| 55 end_date = None | 61 end_date = None |
| 56 | 62 |
| 57 if triage: | 63 if triage: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 72 status_code = int( | 78 status_code = int( |
| 73 self.request.get('result_status', result_status.UNSPECIFIED)) | 79 self.request.get('result_status', result_status.UNSPECIFIED)) |
| 74 master_name = self.request.get('master_name').strip() | 80 master_name = self.request.get('master_name').strip() |
| 75 builder_name = self.request.get('builder_name').strip() | 81 builder_name = self.request.get('builder_name').strip() |
| 76 build_number = self.request.get('build_number').strip() | 82 build_number = self.request.get('build_number').strip() |
| 77 if build_number: | 83 if build_number: |
| 78 build_number = int(build_number) | 84 build_number = int(build_number) |
| 79 step_name = self.request.get('step_name').strip() | 85 step_name = self.request.get('step_name').strip() |
| 80 test_name = self.request.get('test_name').strip() | 86 test_name = self.request.get('test_name').strip() |
| 81 triage = self.request.get('triage') == '1' | 87 triage = self.request.get('triage') == '1' |
| 88 offset = int(self.request.get('offset', '0').strip()) |
| 82 | 89 |
| 83 # Only allow querying by start/end dates for admins during triage to avoid | 90 # Only allow querying by start/end dates for admins during triage to avoid |
| 84 # overcomplicating the UI for other users. | 91 # overcomplicating the UI for other users. |
| 85 start_date, end_date = self._GetStartAndEndDates(triage) | 92 start_date, end_date = self._GetStartAndEndDates(triage) |
| 86 | 93 |
| 87 master_flake_analyses = FilterMasterFlakeAnalysis( | 94 master_flake_analyses, more = FilterMasterFlakeAnalysis( |
| 88 MasterFlakeAnalysis.query(), master_name, builder_name, build_number, | 95 MasterFlakeAnalysis.query(), master_name, builder_name, build_number, |
| 89 step_name, test_name, start_date, end_date, status_code) | 96 step_name, test_name, start_date, end_date, status_code, offset) |
| 90 | 97 |
| 91 data = { | 98 data = { |
| 92 'master_flake_analyses': [], | 99 'master_flake_analyses': [], |
| 93 'result_status_filter': status_code, | 100 'result_status_filter': status_code, |
| 94 'master_name_filter': master_name, | 101 'master_name_filter': master_name, |
| 95 'builder_name_filter': builder_name, | 102 'builder_name_filter': builder_name, |
| 96 'build_number_filter': build_number, | 103 'build_number_filter': build_number, |
| 97 'step_name_filter': step_name, | 104 'step_name_filter': step_name, |
| 98 'test_name_filter': test_name | 105 'test_name_filter': test_name, |
| 106 'page_size': PAGE_SIZE, |
| 107 'offset': offset, |
| 108 'more': more, |
| 99 } | 109 } |
| 100 | 110 |
| 101 if triage: # pragma: no cover | 111 if triage: # pragma: no cover |
| 102 data['triage'] = triage | 112 data['triage'] = triage |
| 103 data['start_date'] = start_date | 113 data['start_date'] = start_date |
| 104 data['end_date'] = end_date | 114 data['end_date'] = end_date |
| 105 | 115 |
| 106 for master_flake_analysis in master_flake_analyses: | 116 for master_flake_analysis in master_flake_analyses: |
| 107 data['master_flake_analyses'].append({ | 117 data['master_flake_analyses'].append({ |
| 108 'master_name': master_flake_analysis.master_name, | 118 'master_name': master_flake_analysis.master_name, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 120 | 130 |
| 121 # TODO (stgao): use index instead of in-memory sort. | 131 # TODO (stgao): use index instead of in-memory sort. |
| 122 # Index doesn't work for now, possibly due to legacy data. | 132 # Index doesn't work for now, possibly due to legacy data. |
| 123 data['master_flake_analyses'].sort( | 133 data['master_flake_analyses'].sort( |
| 124 key=lambda e: e['request_time'], reverse=True) | 134 key=lambda e: e['request_time'], reverse=True) |
| 125 | 135 |
| 126 return { | 136 return { |
| 127 'template': 'flake/dashboard.html', | 137 'template': 'flake/dashboard.html', |
| 128 'data': data | 138 'data': data |
| 129 } | 139 } |
| OLD | NEW |