Mercurial > mozilla > hg > talosnames
annotate talosnames/web.py @ 46:fcd98303a90d
provide CLI handler for web
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 13 Aug 2012 15:14:53 -0700 |
parents | 10e59c3ae847 |
children | 11249e75ced6 |
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 | |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
17 here = os.path.dirname(os.path.abspath(__file__)) |
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
18 template = os.path.join(here, 'templates', 'index.html') |
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
19 |
0 | 20 class Handler(object): |
21 | |
22 def __init__(self, **kw): | |
18 | 23 self.api = TalosNames() |
0 | 24 |
25 | 25 # get data |
21 | 26 suites = sorted(self.api.suites.keys()) |
27 tests = {} | |
28 for suite in suites: | |
29 try: | |
30 test = self.api.test_config(suite) | |
31 tests[suite] = test | |
32 except: | |
33 tests[suite] = None | |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
34 self.suites = suites |
21 | 35 |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
36 self.data = {'suites': self.suites, |
41
4dfa9c298e3d
record whether a suite is enabled
Jeff Hammel <jhammel@mozilla.com>
parents:
40
diff
changeset
|
37 'enabled': self.api.buildbot_enabled, # whether the suite is enabled by default |
25 | 38 'commands': self.api.buildbot_commands, |
39 'tbpl': dict([(suite, self.api.tbpl_name(suite)) | |
40 for suite in suites]), | |
41 'tests': tests, | |
31
c6580ad2612f
better formatting of command
Jeff Hammel <jhammel@mozilla.com>
parents:
26
diff
changeset
|
42 'list2cmdline': list2cmdline |
25 | 43 } |
44 | |
26 | 45 paint = {} |
46 chrome = {} | |
47 graphserver = {} | |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
48 test_type = {} |
26 | 49 for suite in suites: |
50 for test in tests.get(suite) or []: | |
51 config = self.api.talos_config(suite) | |
52 _paint = '--mozAfterPaint' in self.data['commands'][suite] | |
53 _chrome = '--noChrome' not in self.data['commands'][suite] | |
54 extension = config.get('test_name_extension', '') | |
55 _extension = '' | |
56 if not _chrome: | |
57 _extension += '_nochrome' | |
58 if _paint: | |
59 _extension += '_paint' | |
60 if extension != _extension: | |
61 raise AssertionError | |
62 paint[suite] = _paint | |
63 chrome[suite] = _chrome | |
36 | 64 |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
65 # determine test extension |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
66 # TODO: move this to api.py |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
67 testname = test |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
68 testobj = talos.test.test_dict[testname] |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
69 if issubclass(testobj, talos.test.TsBase): |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
70 test_type.setdefault(suite, {})[test] = 'Startup Test' |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
71 elif issubclass(testobj, talos.test.PageloaderTest): |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
72 test_type.setdefault(suite, {})[test] = 'Page Load Test' |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
73 testname += extension |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
74 else: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
75 raise Exception |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
76 |
36 | 77 # get graphserver data |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
78 names = self.api.graphserver_name(testname) |
36 | 79 if names: |
80 graphserver.setdefault(suite, {})[test] = [names] | |
81 else: | |
82 graphserver.setdefault(suite, {})[test] = None | |
26 | 83 self.data['graphserver'] = graphserver |
84 self.data['paint'] = paint | |
85 self.data['chrome'] = chrome | |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
86 self.data['test_type'] = test_type |
25 | 87 |
88 def __call__(self, environ, start_response): | |
89 request = Request(environ) | |
90 response = Response(content_type='text/html', | |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
91 body=self.render(request)) |
25 | 92 return response(environ, start_response) |
93 | |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
94 def render(self, request=None): |
43 | 95 |
96 # 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
|
97 data = self.data.copy() |
43 | 98 |
44 | 99 if request : |
100 # filter by TBPL letter | |
101 if 'tbpl' in request.GET: | |
102 tbplnames = [] | |
103 for name in request.GET.getall('tbpl'): | |
104 if not name.startswith('Talos'): | |
105 name = 'Talos ' + name | |
106 tbplnames.append(name) | |
107 suites = [] | |
108 for suite, value in self.data['tbpl'].items(): | |
109 if value in tbplnames: | |
110 suites.append(suite) | |
111 data['suites'] = sorted(suites) | |
112 | |
113 # filter by disabled | |
114 if 'show' in request.GET: | |
115 show = request.GET['show'] | |
116 if show == 'active': | |
117 data['suites'] = [i for i in data['suites'] | |
118 if data['enabled'][i]] | |
119 elif show == 'disabled': | |
120 data['suites'] = [i for i in data['suites'] | |
121 if not data['enabled'][i]] | |
122 | |
43 | 123 |
32
1a9ec766f2b0
add a thing for tbpl short names
Jeff Hammel <jhammel@mozilla.com>
parents:
31
diff
changeset
|
124 contents = file(template).read() |
1a9ec766f2b0
add a thing for tbpl short names
Jeff Hammel <jhammel@mozilla.com>
parents:
31
diff
changeset
|
125 _template = tempita.HTMLTemplate(contents) |
40
10945dedde84
get query string working for TBPL suites
Jeff Hammel <jhammel@mozilla.com>
parents:
38
diff
changeset
|
126 return _template.substitute(data) |
19
aae0a420c4f7
should now actually do something
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
127 |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
128 def main(args=sys.argv[1:]): |
35 | 129 parser = optparse.OptionParser() |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
130 parser.add_option('-o', '--output', dest='output', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
131 help="file to output to") |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
132 parser.add_option('-p', '--port', dest='port', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
133 default=8080, type='int', |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
134 help="port to serve on") |
35 | 135 options, args = parser.parse_args() |
136 | |
0 | 137 app = Handler() |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
138 print "Done creating handler." |
38
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
139 |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
140 if options.output: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
141 f = file(options.output, 'w') |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
142 f.write(app.render()) |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
143 f.close() |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
144 else: |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
145 from wsgiref import simple_server |
ef8590b55605
determine actually correct name extension
Jeff Hammel <jhammel@mozilla.com>
parents:
36
diff
changeset
|
146 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
|
147 server.serve_forever() |
0 | 148 |
18 | 149 |
46
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
150 if __name__ == '__main__': |
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
151 main() |
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
152 |
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
153 |
fcd98303a90d
provide CLI handler for web
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
154 |