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

Side by Side Diff: infra/tools/builder_alerts/__main__.py

Issue 508873005: Reimplemented tree_for_master, which now uses gatekeeper config files to map master URLs to the tre… (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 6 years, 3 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 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2014 The Chromium Authors. All rights reserved. 2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import argparse 6 import argparse
7 import datetime 7 import datetime
8 import json 8 import json
9 import logging 9 import logging
10 import sys 10 import sys
(...skipping 14 matching lines...) Expand all
25 top_dir = os.path.dirname(infra_dir) 25 top_dir = os.path.dirname(infra_dir)
26 build_scripts_dir = os.path.join(top_dir, 'build', 'scripts') 26 build_scripts_dir = os.path.join(top_dir, 'build', 'scripts')
27 sys.path.insert(0, build_scripts_dir) 27 sys.path.insert(0, build_scripts_dir)
28 28
29 from slave import gatekeeper_ng_config 29 from slave import gatekeeper_ng_config
30 30
31 31
32 CACHE_PATH = 'build_cache' 32 CACHE_PATH = 'build_cache'
33 33
34 34
35 def apply_gatekeeper_rules(alerts, gatekeeper): 35 def apply_gatekeeper_rules(alerts, gatekeeper, gatekeeper_trees):
36 filtered_alerts = [] 36 filtered_alerts = []
37 for alert in alerts: 37 for alert in alerts:
38 master_url = alert['master_url'] 38 master_url = alert['master_url']
39 master_name = buildbot.master_name_from_url(master_url)
40 config = gatekeeper.get(master_url) 39 config = gatekeeper.get(master_url)
41 if not config: 40 if not config:
42 # Unclear if this should be set or not? 41 # Unclear if this should be set or not?
43 # alert['would_close_tree'] = False 42 # alert['would_close_tree'] = False
44 filtered_alerts.append(alert) 43 filtered_alerts.append(alert)
45 continue 44 continue
46 excluded_builders = gatekeeper_extras.excluded_builders(config) 45 excluded_builders = gatekeeper_extras.excluded_builders(config)
47 if alert['builder_name'] in excluded_builders: 46 if alert['builder_name'] in excluded_builders:
48 continue 47 continue
49 alert['would_close_tree'] = \ 48 alert['would_close_tree'] = gatekeeper_extras.would_close_tree(
50 gatekeeper_extras.would_close_tree(config, 49 config, alert['builder_name'], alert['step_name'])
51 alert['builder_name'], alert['step_name']) 50 tree_name = gatekeeper_extras.tree_for_master(master_url, gatekeeper_trees)
51 alert['tree_name'] = tree_name or buildbot.master_name_from_url(master_url)
ojan 2014/08/28 03:34:15 Nit: can we just call this tree instead of tree_na
Sergiy Byelozyorov 2014/08/28 17:45:58 Done.
52 filtered_alerts.append(alert) 52 filtered_alerts.append(alert)
53 alert['tree_name'] = gatekeeper_extras.tree_for_master(master_name)
54 return filtered_alerts 53 return filtered_alerts
55 54
56 55
57 def fetch_master_urls(gatekeeper, args): 56 def fetch_master_urls(gatekeeper, args):
58 # Currently using gatekeeper.json, but could use: 57 # Currently using gatekeeper.json, but could use:
59 # https://chrome-infra-stats.appspot.com/_ah/api#p/stats/v1/stats.masters.list 58 # https://chrome-infra-stats.appspot.com/_ah/api#p/stats/v1/stats.masters.list
60 master_urls = gatekeeper.keys() 59 master_urls = gatekeeper.keys()
61 if args.master_filter: 60 if args.master_filter:
62 master_urls = [url for url in master_urls if args.master_filter not in url] 61 master_urls = [url for url in master_urls if args.master_filter not in url]
63 return master_urls 62 return master_urls
(...skipping 16 matching lines...) Expand all
80 79
81 if args.use_cache: 80 if args.use_cache:
82 requests_cache.install_cache('failure_stats') 81 requests_cache.install_cache('failure_stats')
83 else: 82 else:
84 requests_cache.install_cache(backend='memory') 83 requests_cache.install_cache(backend='memory')
85 84
86 # FIXME: gatekeeper_config should find gatekeeper.json for us. 85 # FIXME: gatekeeper_config should find gatekeeper.json for us.
87 gatekeeper_path = os.path.abspath(args.gatekeeper) 86 gatekeeper_path = os.path.abspath(args.gatekeeper)
88 print "Processsing gatekeeper json: %s" % (gatekeeper_path) 87 print "Processsing gatekeeper json: %s" % (gatekeeper_path)
89 gatekeeper = gatekeeper_ng_config.load_gatekeeper_config(gatekeeper_path) 88 gatekeeper = gatekeeper_ng_config.load_gatekeeper_config(gatekeeper_path)
89
90 gatekeeper_trees_path = os.path.join(os.path.dirname(gatekeeper_path),
91 'gatekeeper_trees.json')
92 print 'Processing gatekeeper trees json: %s' % (gatekeeper_trees_path)
ojan 2014/08/28 03:34:15 These two prints seem unneccessary to me. Lets eit
Sergiy Byelozyorov 2014/08/28 17:45:58 Done.
93 gatekeeper_trees = gatekeeper_ng_config.load_gatekeeper_tree_config(
94 gatekeeper_trees_path)
95
90 master_urls = fetch_master_urls(gatekeeper, args) 96 master_urls = fetch_master_urls(gatekeeper, args)
91 start_time = datetime.datetime.now() 97 start_time = datetime.datetime.now()
92 98
93 latest_builder_info = {} 99 latest_builder_info = {}
94 100
95 cache = buildbot.BuildCache(CACHE_PATH) 101 cache = buildbot.BuildCache(CACHE_PATH)
96 102
97 alerts = [] 103 alerts = []
98 for master_url in master_urls: 104 for master_url in master_urls:
99 master_json = buildbot.fetch_master_json(master_url) 105 master_json = buildbot.fetch_master_json(master_url)
100 master_alerts = alert_builder.alerts_for_master(cache, 106 master_alerts = alert_builder.alerts_for_master(cache,
101 master_url, master_json, args.builder_filter) 107 master_url, master_json, args.builder_filter)
102 alerts.extend(master_alerts) 108 alerts.extend(master_alerts)
103 109
104 # FIXME: This doesn't really belong here. garden-o-matic wants 110 # FIXME: This doesn't really belong here. garden-o-matic wants
105 # this data and we happen to have the builder json cached at 111 # this data and we happen to have the builder json cached at
106 # this point so it's cheap to compute. 112 # this point so it's cheap to compute.
107 builder_info = buildbot.latest_builder_info_for_master(cache, 113 builder_info = buildbot.latest_builder_info_for_master(cache,
108 master_url, master_json) 114 master_url, master_json)
109 latest_builder_info.update(builder_info) 115 latest_builder_info.update(builder_info)
110 116
111 117
112 print "Fetch took: %s" % (datetime.datetime.now() - start_time) 118 print "Fetch took: %s" % (datetime.datetime.now() - start_time)
113 119
114 alerts = apply_gatekeeper_rules(alerts, gatekeeper) 120 alerts = apply_gatekeeper_rules(alerts, gatekeeper, gatekeeper_trees)
115 121
116 alerts = analysis.assign_keys(alerts) 122 alerts = analysis.assign_keys(alerts)
117 reason_groups = analysis.group_by_reason(alerts) 123 reason_groups = analysis.group_by_reason(alerts)
118 range_groups = analysis.merge_by_range(reason_groups) 124 range_groups = analysis.merge_by_range(reason_groups)
119 data = { 'content': json.dumps({ 125 data = { 'content': json.dumps({
120 'alerts': alerts, 126 'alerts': alerts,
121 'reason_groups': reason_groups, 127 'reason_groups': reason_groups,
122 'range_groups': range_groups, 128 'range_groups': range_groups,
123 'latest_builder_info': latest_builder_info, 129 'latest_builder_info': latest_builder_info,
124 })} 130 })}
125 131
126 if not args.data_url: 132 if not args.data_url:
127 with open('builder_alerts.json', 'w') as f: 133 with open('builder_alerts.json', 'w') as f:
128 f.write(json.dumps(data, indent=1)) 134 f.write(json.dumps(data, indent=1))
129 135
130 for url in args.data_url: 136 for url in args.data_url:
131 logging.info('POST %s alerts to %s' % (len(alerts), url)) 137 logging.info('POST %s alerts to %s' % (len(alerts), url))
132 requests.post(url, data=data) 138 requests.post(url, data=data)
133 139
134 140
135 if __name__ == '__main__': 141 if __name__ == '__main__':
136 sys.exit(main(sys.argv[1:])) 142 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | infra/tools/builder_alerts/gatekeeper_extras.py » ('j') | infra/tools/builder_alerts/gatekeeper_extras.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698