Mercurial > mozilla > hg > talosnames
annotate talosnames/web.py @ 72:c4ba60b663fa default tip
make executable
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Thu, 07 Mar 2013 11:22:20 -0800 |
parents | 6e495bad69bb |
children |
rev | line source |
---|---|
0 | 1 #!/usr/bin/env python |
2 | |
3 """ | |
4 web handler for talosnames | |
5 """ | |
6 | |
35 | 7 import optparse |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
8 import os |
22 | 9 import pprint |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
10 import sys |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
11 import talos.test |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
12 import tempita |
18 | 13 from api import TalosNames |
31
c6580ad2612f
better formatting of command
Jeff Hammel <jhammel@mozilla.com>
parents:
26
diff
changeset
|
14 from subprocess import list2cmdline |
0 | 15 from webob import Request, Response, exc |
16 | |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
17 try: |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
18 import json |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
19 except ImportError: |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
20 import simplejson as json |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
21 |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
22 here = os.path.dirname(os.path.abspath(__file__)) |
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
23 |
0 | 24 class Handler(object): |
25 | |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
26 paths = {'tbpl': 'tbpl.html'} |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
27 |
0 | 28 def __init__(self, **kw): |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
29 |
18 | 30 self.api = TalosNames() |
0 | 31 |
25 | 32 # get data |
21 | 33 suites = sorted(self.api.suites.keys()) |
34 tests = {} | |
35 for suite in suites: | |
36 try: | |
37 test = self.api.test_config(suite) | |
38 tests[suite] = test | |
39 except: | |
40 tests[suite] = None | |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
41 self.suites = suites |
21 | 42 |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
43 self.data = {'suites': self.suites, |
41
4dfa9c298e3d
record whether a suite is enabled
Jeff Hammel <jhammel@mozilla.com>
parents:
40
diff
changeset
|
44 'enabled': self.api.buildbot_enabled, # whether the suite is enabled by default |
25 | 45 'commands': self.api.buildbot_commands, |
46 'tbpl': dict([(suite, self.api.tbpl_name(suite)) | |
47 for suite in suites]), | |
48 'tests': tests, | |
49 } | |
50 | |
26 | 51 paint = {} |
52 chrome = {} | |
53 graphserver = {} | |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
54 test_type = {} |
26 | 55 for suite in suites: |
56 for test in tests.get(suite) or []: | |
57 config = self.api.talos_config(suite) | |
58 _paint = '--mozAfterPaint' in self.data['commands'][suite] | |
59 _chrome = '--noChrome' not in self.data['commands'][suite] | |
60 extension = config.get('test_name_extension', '') | |
61 _extension = '' | |
62 if not _chrome: | |
63 _extension += '_nochrome' | |
64 if _paint: | |
65 _extension += '_paint' | |
66 if extension != _extension: | |
67 raise AssertionError | |
68 paint[suite] = _paint | |
69 chrome[suite] = _chrome | |
36 | 70 |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
71 # determine test extension |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
72 # TODO: move this to api.py |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
73 testname = test |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
74 testobj = talos.test.test_dict[testname] |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
75 if issubclass(testobj, talos.test.TsBase): |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
76 test_type.setdefault(suite, {})[test] = 'Startup Test' |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
77 elif issubclass(testobj, talos.test.PageloaderTest): |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
78 test_type.setdefault(suite, {})[test] = 'Page Load Test' |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
79 testname += extension |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
80 else: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
81 raise Exception |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
82 |
36 | 83 # get graphserver data |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
84 names = self.api.graphserver_name(testname) |
36 | 85 if names: |
86 graphserver.setdefault(suite, {})[test] = [names] | |
87 else: | |
88 graphserver.setdefault(suite, {})[test] = None | |
26 | 89 self.data['graphserver'] = graphserver |
90 self.data['paint'] = paint | |
91 self.data['chrome'] = chrome | |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
92 self.data['test_type'] = test_type |
25 | 93 |
53
1d944da50135
expand the JSON to make it readable
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
94 self.data['json'] = json.dumps(self.data, indent=2, sort_keys=True) |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
95 |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
96 self.data['list2cmdline'] = list2cmdline |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
97 |
25 | 98 def __call__(self, environ, start_response): |
99 request = Request(environ) | |
100 response = Response(content_type='text/html', | |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
101 body=self.render(request.path_info, request)) |
25 | 102 return response(environ, start_response) |
103 | |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
104 def render(self, template='index.html', request=None): |
43 | 105 |
106 # make a local copy of the data | |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
107 data = self.data.copy() |
43 | 108 |
44 | 109 if request : |
110 # filter by TBPL letter | |
111 if 'tbpl' in request.GET: | |
112 tbplnames = [] | |
113 for name in request.GET.getall('tbpl'): | |
114 if not name.startswith('Talos'): | |
115 name = 'Talos ' + name | |
116 tbplnames.append(name) | |
117 suites = [] | |
118 for suite, value in self.data['tbpl'].items(): | |
119 if value in tbplnames: | |
120 suites.append(suite) | |
121 data['suites'] = sorted(suites) | |
122 | |
123 # filter by disabled | |
124 if 'show' in request.GET: | |
125 show = request.GET['show'] | |
126 if show == 'active': | |
127 data['suites'] = [i for i in data['suites'] | |
128 if data['enabled'][i]] | |
129 elif show == 'disabled': | |
130 data['suites'] = [i for i in data['suites'] | |
131 if not data['enabled'][i]] | |
132 | |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
133 path = self.template_path(template) |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
134 contents = file(path).read() |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
135 template = tempita.HTMLTemplate(contents) |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
136 return template.substitute(data) |
43 | 137 |
47
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
138 def template_path(self, path): |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
139 """returns template path""" |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
140 path = path.strip('/') |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
141 template = self.paths.get(path, 'index.html') |
11249e75ced6
allow more than one template path
Jeff Hammel <jhammel@mozilla.com>
parents:
46
diff
changeset
|
142 return os.path.join(here, 'templates', template) |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
143 |
66
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
144 def paste_factory(global_conf, **app_conf): |
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
145 """factory interface for paste""" |
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
146 app = Handler(**app_conf) |
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
147 return app |
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
148 |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
149 def main(args=sys.argv[1:]): |
66
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
150 """CLI entry point""" |
0f5c22c07146
add interface for paste since wsgiref falls over in production
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
151 |
35 | 152 parser = optparse.OptionParser() |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
153 parser.add_option('-o', '--output', dest='output', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
154 help="file to output to") |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
155 parser.add_option('-p', '--port', dest='port', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
156 default=8080, type='int', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
157 help="port to serve on") |
35 | 158 options, args = parser.parse_args() |
159 | |
0 | 160 app = Handler() |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
161 print "Done creating handler." |
70
6e495bad69bb
print out what you are serving
Jeff Hammel <jhammel@mozilla.com>
parents:
66
diff
changeset
|
162 print "http://localhost:%s/" % options.port |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
163 |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
164 if options.output: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
165 f = file(options.output, 'w') |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
166 f.write(app.render()) |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
167 f.close() |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
168 else: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
169 from wsgiref import simple_server |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
170 server = simple_server.make_server(host='0.0.0.0', port=options.port, app=app) |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
171 server.serve_forever() |
0 | 172 |
18 | 173 |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
174 if __name__ == '__main__': |
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
175 main() |