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

Side by Side Diff: appengine/findit/handlers/flake/list_flakes.py

Issue 2435013005: [Findit] Updating flakiness dashboard to be able to triage results (Closed)
Patch Set: Fixing nit 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
« no previous file with comments | « no previous file | appengine/findit/handlers/flake/test/list_flakes_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 from google.appengine.ext import ndb 5 from datetime import datetime
6 from datetime import time
7 from datetime import timedelta
6 8
9 from common import time_util
7 from common.base_handler import BaseHandler 10 from common.base_handler import BaseHandler
8 from common.base_handler import Permission 11 from common.base_handler import Permission
9 from common import time_util 12
13 from model import result_status
10 from model.flake.master_flake_analysis import MasterFlakeAnalysis 14 from model.flake.master_flake_analysis import MasterFlakeAnalysis
11 15
12 16
13 def FilterMasterFlakeAnalysis(master_flake_analysis_query, master_name, 17 def FilterMasterFlakeAnalysis(
14 builder_name, build_number, step_name, test_name): 18 master_flake_analysis_query, master_name=None, builder_name=None,
19 build_number=None, step_name=None, test_name=None, start_date=None,
20 end_date=None, status_code=result_status.UNSPECIFIED):
15 if master_name: 21 if master_name:
16 master_flake_analysis_query = master_flake_analysis_query.filter( 22 master_flake_analysis_query = master_flake_analysis_query.filter(
17 MasterFlakeAnalysis.master_name == master_name) 23 MasterFlakeAnalysis.master_name == master_name)
18 if builder_name: 24 if builder_name:
19 master_flake_analysis_query = master_flake_analysis_query.filter( 25 master_flake_analysis_query = master_flake_analysis_query.filter(
20 MasterFlakeAnalysis.builder_name == builder_name) 26 MasterFlakeAnalysis.builder_name == builder_name)
21 if build_number: 27 if build_number:
22 master_flake_analysis_query = master_flake_analysis_query.filter( 28 master_flake_analysis_query = master_flake_analysis_query.filter(
23 MasterFlakeAnalysis.build_number == build_number) 29 MasterFlakeAnalysis.build_number == build_number)
24 if step_name: 30 if step_name:
25 master_flake_analysis_query = master_flake_analysis_query.filter( 31 master_flake_analysis_query = master_flake_analysis_query.filter(
26 MasterFlakeAnalysis.step_name == step_name) 32 MasterFlakeAnalysis.step_name == step_name)
27 if test_name: 33 if test_name:
28 master_flake_analysis_query = master_flake_analysis_query.filter( 34 master_flake_analysis_query = master_flake_analysis_query.filter(
29 MasterFlakeAnalysis.test_name == test_name) 35 MasterFlakeAnalysis.test_name == test_name)
30 if not (master_name or builder_name or build_number or 36 if start_date:
31 step_name or test_name): 37 master_flake_analysis_query = master_flake_analysis_query.filter(
32 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) 38 MasterFlakeAnalysis.request_time >= start_date)
39 if end_date:
40 master_flake_analysis_query = master_flake_analysis_query.filter(
41 MasterFlakeAnalysis.request_time < end_date)
42 if status_code != result_status.UNSPECIFIED:
43 master_flake_analysis_query = master_flake_analysis_query.filter(
44 MasterFlakeAnalysis.result_status == status_code)
45
46 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time)
33 return master_flake_analysis_query.fetch() 47 return master_flake_analysis_query.fetch()
34 48
35 49
36 class ListFlakes(BaseHandler): 50 class ListFlakes(BaseHandler):
37 PERMISSION_LEVEL = Permission.ANYONE 51 PERMISSION_LEVEL = Permission.ANYONE
38 52
53 def _GetStartAndEndDates(self, triage):
54 start_date = None
55 end_date = None
56
57 if triage:
58 midnight_today = datetime.combine(time_util.GetUTCNow(), time.min)
59 midnight_yesterday = midnight_today - timedelta(days=1)
60 midnight_tomorrow = midnight_today + timedelta(days=1)
61
62 start = self.request.get('start_date')
63 end = self.request.get('end_date')
64 start_date = (datetime.strptime(start, '%Y-%m-%d') if start else
65 midnight_yesterday)
66 end_date = (datetime.strptime(end, '%Y-%m-%d') if end else
67 midnight_tomorrow)
68
69 return start_date, end_date
70
39 def HandleGet(self): 71 def HandleGet(self):
72 status_code = int(
73 self.request.get('result_status', result_status.UNSPECIFIED))
40 master_name = self.request.get('master_name').strip() 74 master_name = self.request.get('master_name').strip()
41 builder_name = self.request.get('builder_name').strip() 75 builder_name = self.request.get('builder_name').strip()
42 build_number = self.request.get('build_number').strip() 76 build_number = self.request.get('build_number').strip()
43 if build_number: 77 if build_number:
44 build_number = int(build_number) 78 build_number = int(build_number)
45 step_name = self.request.get('step_name').strip() 79 step_name = self.request.get('step_name').strip()
46 test_name = self.request.get('test_name').strip() 80 test_name = self.request.get('test_name').strip()
81 triage = self.request.get('triage') == '1'
82
83 # Only allow querying by start/end dates for admins during triage to avoid
84 # overcomplicating the UI for other users.
85 start_date, end_date = self._GetStartAndEndDates(triage)
47 86
48 master_flake_analyses = FilterMasterFlakeAnalysis( 87 master_flake_analyses = FilterMasterFlakeAnalysis(
49 MasterFlakeAnalysis.query(), master_name, builder_name, build_number, 88 MasterFlakeAnalysis.query(), master_name, builder_name, build_number,
50 step_name, test_name) 89 step_name, test_name, start_date, end_date, status_code)
51 data = {'master_flake_analyses': []} 90
91 data = {
92 'master_flake_analyses': [],
93 'result_status_filter': status_code,
94 'master_name_filter': master_name,
95 'builder_name_filter': builder_name,
96 'build_number_filter': build_number,
97 'step_name_filter': step_name,
98 'test_name_filter': test_name
99 }
100
101 if triage: # pragma: no cover
102 data['triage'] = triage
103 data['start_date'] = start_date
104 data['end_date'] = end_date
52 105
53 for master_flake_analysis in master_flake_analyses: 106 for master_flake_analysis in master_flake_analyses:
54 data['master_flake_analyses'].append({ 107 data['master_flake_analyses'].append({
55 'master_name': master_flake_analysis.master_name, 108 'master_name': master_flake_analysis.master_name,
56 'builder_name': master_flake_analysis.builder_name, 109 'builder_name': master_flake_analysis.builder_name,
57 'build_number': master_flake_analysis.build_number, 110 'build_number': master_flake_analysis.build_number,
58 'step_name': master_flake_analysis.step_name, 111 'step_name': master_flake_analysis.step_name,
59 'test_name': master_flake_analysis.test_name, 112 'test_name': master_flake_analysis.test_name,
60 'status': master_flake_analysis.status_description, 113 'status': master_flake_analysis.status_description,
61 'suspected_build': master_flake_analysis.suspected_flake_build_number, 114 'suspected_build': master_flake_analysis.suspected_flake_build_number,
62 'request_time': time_util.FormatDatetime( 115 'request_time': time_util.FormatDatetime(
63 master_flake_analysis.request_time), 116 master_flake_analysis.request_time),
117 'result_status': result_status.RESULT_STATUS_TO_DESCRIPTION.get(
118 master_flake_analysis.result_status)
64 }) 119 })
65 120
66 # TODO (stgao): use index instead of in-memory sort. 121 # TODO (stgao): use index instead of in-memory sort.
67 # Index doesn't work for now, possibly due to legacy data. 122 # Index doesn't work for now, possibly due to legacy data.
68 data['master_flake_analyses'].sort( 123 data['master_flake_analyses'].sort(
69 key=lambda e : e['request_time'], reverse=True) 124 key=lambda e: e['request_time'], reverse=True)
70 125
71 return { 126 return {
72 'template': 'flake/dashboard.html', 127 'template': 'flake/dashboard.html',
73 'data': data 128 'data': data
74 } 129 }
OLDNEW
« no previous file with comments | « no previous file | appengine/findit/handlers/flake/test/list_flakes_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698