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

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: Adding tests Created 4 years, 2 months 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 from google.appengine.ext import ndb 5 from google.appengine.ext import ndb
6 6
7 from datetime import datetime
8 from datetime import time
9 from datetime import timedelta
10
7 from common.base_handler import BaseHandler 11 from common.base_handler import BaseHandler
8 from common.base_handler import Permission 12 from common.base_handler import Permission
9 from common import time_util 13 from common import time_util
14 from model import result_status
10 from model.flake.master_flake_analysis import MasterFlakeAnalysis 15 from model.flake.master_flake_analysis import MasterFlakeAnalysis
11 16
12 17
13 def FilterMasterFlakeAnalysis(master_flake_analysis_query, master_name, 18 def FilterMasterFlakeAnalysis(
14 builder_name, build_number, step_name, test_name): 19 master_flake_analysis_query, master_name=None, builder_name=None,
20 build_number=None, step_name=None, test_name=None, start_date=None,
21 end_date=None, status_code=result_status.UNSPECIFIED):
15 if master_name: 22 if master_name:
16 master_flake_analysis_query = master_flake_analysis_query.filter( 23 master_flake_analysis_query = master_flake_analysis_query.filter(
17 MasterFlakeAnalysis.master_name == master_name) 24 MasterFlakeAnalysis.master_name == master_name)
18 if builder_name: 25 if builder_name:
19 master_flake_analysis_query = master_flake_analysis_query.filter( 26 master_flake_analysis_query = master_flake_analysis_query.filter(
20 MasterFlakeAnalysis.builder_name == builder_name) 27 MasterFlakeAnalysis.builder_name == builder_name)
21 if build_number: 28 if build_number:
22 master_flake_analysis_query = master_flake_analysis_query.filter( 29 master_flake_analysis_query = master_flake_analysis_query.filter(
23 MasterFlakeAnalysis.build_number == build_number) 30 MasterFlakeAnalysis.build_number == build_number)
24 if step_name: 31 if step_name:
25 master_flake_analysis_query = master_flake_analysis_query.filter( 32 master_flake_analysis_query = master_flake_analysis_query.filter(
26 MasterFlakeAnalysis.step_name == step_name) 33 MasterFlakeAnalysis.step_name == step_name)
27 if test_name: 34 if test_name:
28 master_flake_analysis_query = master_flake_analysis_query.filter( 35 master_flake_analysis_query = master_flake_analysis_query.filter(
29 MasterFlakeAnalysis.test_name == test_name) 36 MasterFlakeAnalysis.test_name == test_name)
30 if not (master_name or builder_name or build_number or 37 if start_date:
31 step_name or test_name): 38 master_flake_analysis_query = master_flake_analysis_query.filter(
32 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time) 39 MasterFlakeAnalysis.request_time >= start_date)
40 if end_date:
41 master_flake_analysis_query = master_flake_analysis_query.filter(
42 MasterFlakeAnalysis.request_time < end_date)
43 if status_code != result_status.UNSPECIFIED:
44 master_flake_analysis_query = master_flake_analysis_query.filter(
45 MasterFlakeAnalysis.result_status == status_code)
46
47 master_flake_analysis_query.order(-MasterFlakeAnalysis.request_time)
33 return master_flake_analysis_query.fetch() 48 return master_flake_analysis_query.fetch()
34 49
35 50
36 class ListFlakes(BaseHandler): 51 class ListFlakes(BaseHandler):
37 PERMISSION_LEVEL = Permission.ANYONE 52 PERMISSION_LEVEL = Permission.ANYONE
38 53
54 def _GetStartAndEndDates(self, triage): # pragma: no cover
chanli 2016/10/21 05:49:28 Add tests? Or you just forgot to remove that pragm
lijeffrey 2016/10/21 20:02:01 Done.
55 start_date = None
56 end_date = None
57
58 if triage:
59 midnight_today = datetime.combine(time_util.GetUTCNow(), time.min)
60 midnight_yesterday = midnight_today - timedelta(days=1)
61 midnight_tomorrow = midnight_today + timedelta(days=1)
62
63 start = self.request.get('start_date')
64 end = self.request.get('end_date')
65 start_date = (datetime.strptime(start, '%Y-%m-%d') if start else
66 midnight_yesterday)
67 end_date = (datetime.strptime(end, '%Y-%m-%d') if end else
68 midnight_tomorrow)
chanli 2016/10/21 05:49:28 Question: it seems that if I have triage=1 and I w
lijeffrey 2016/10/21 20:02:01 triage=1 only makes it so the date picker shows up
chanli 2016/10/21 22:50:59 I just checked, so if I add triage=1, I can only g
chanli 2016/10/24 20:53:27 Acknowledged.
69
70 return start_date, end_date
71
39 def HandleGet(self): 72 def HandleGet(self):
73 status_code = int(self.request.get('result_status', '-1'))
chanli 2016/10/21 05:49:28 Is -1 result_status.UNSPECIFIED?
lijeffrey 2016/10/21 20:02:01 Done.
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

Powered by Google App Engine
This is Rietveld 408576698