Mercurial > mozilla > hg > talosnames
annotate talosnames/api.py @ 72:c4ba60b663fa default tip
make executable
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Thu, 07 Mar 2013 11:22:20 -0800 |
parents | 25812a846d24 |
children |
rev | line source |
---|---|
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
1 import os |
6 | 2 import re |
10 | 3 import require |
13
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
4 import subprocess |
1 | 5 import sqlite3 |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
6 import sys |
13
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
7 import talos |
33 | 8 import talos.run_tests |
16 | 9 import tempfile |
1 | 10 import urllib2 |
16 | 11 import yaml |
12 | |
13 try: | |
14 call = subprocess.check_call | |
15 except: | |
16 call = subprocess.call | |
1 | 17 |
13
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
18 talos_dir = os.path.dirname(os.path.abspath(talos.__file__)) |
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
19 |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
20 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) |
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
21 |
0 | 22 class TalosNames(object): |
42 | 23 |
24 # files for graphserver | |
0 | 25 graphserver_sql = 'http://hg.mozilla.org/graphs/raw-file/tip/sql/data.sql' |
1 | 26 schema = 'http://hg.mozilla.org/graphs/raw-file/tip/sql/schema.sql' |
42 | 27 |
28 # files for buildbot | |
10 | 29 project_branches = 'http://hg.mozilla.org/build/buildbot-configs/raw-file/tip/mozilla/project_branches.py' |
30 buildbot_config = 'http://hg.mozilla.org/build/buildbot-configs/raw-file/tip/mozilla-tests/config.py' | |
42 | 31 localconfig = 'http://hg.mozilla.org/build/buildbot-configs/raw-file/tip/mozilla-tests/production_config.py' |
1 | 32 |
5 | 33 # mapping file from builbot-configs name to tbpl codes: |
34 # http://hg.mozilla.org/users/mstange_themasta.com/tinderboxpushlog/file/tip/js/Config.js | |
69 | 35 tbpl_map = 'https://hg.mozilla.org/webtools/tbpl/raw-file/tip/js/Data.js' |
5 | 36 |
2 | 37 tables = {'os_list': '(id, name text)', |
3 | 38 'branches': '(id, name text)', |
2 | 39 'machines': '(id, os_id int, is_throttling int, cpu_speed text, name text, is_active int, date_added int)', |
40 'pagesets': '(id, name text)', | |
41 'tests': '(id, name text, pretty_name text, is_chrome int, is_active int, pageset_id int)' | |
42 } | |
1 | 43 |
10 | 44 ### initialization functions |
45 | |
0 | 46 def __init__(self): |
5 | 47 self.setup_database() |
48 self.tbpl_mapping() | |
10 | 49 self.setup_buildbot() |
21 | 50 |
51 # cache | |
17
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
52 self._talos_configs = {} |
21 | 53 self._tbpl_names = {} |
5 | 54 |
6 | 55 def setup_database(self): |
1 | 56 self.db = sqlite3.connect(':memory:') |
3 | 57 sql_lines = urllib2.urlopen(self.graphserver_sql).readlines() |
58 | |
59 # XXX remove the machines since they require a function, unix_timestamp(), sqlite does not have | |
60 sql_lines = [line for line in sql_lines | |
61 if 'unix_timestamp' not in line] | |
62 sql = '\n'.join(sql_lines) | |
63 | |
1 | 64 cursor = self.db.cursor() |
2 | 65 for table, schema in self.tables.items(): |
66 cursor.execute("""CREATE TABLE %s %s""" % (table, schema)) | |
3 | 67 cursor.executescript(sql) |
2 | 68 self.db.commit() |
69 cursor.close() | |
1 | 70 |
3 | 71 # create data structures |
72 self.names = {} | |
73 self.chrome = set() | |
74 cursor = self.db.cursor() | |
75 cursor.execute("SELECT * FROM tests") | |
76 for _, short_name, graphserver_name, is_chrome, _, _ in cursor.fetchall(): | |
77 self.names[short_name] = graphserver_name | |
78 if is_chrome: | |
79 self.chrome.add(short_name) | |
80 cursor.close() | |
81 | |
5 | 82 def tbpl_mapping(self): |
6 | 83 self.tbpl_regexs = {} |
84 lines = [line.strip() | |
85 for line in urllib2.urlopen(self.tbpl_map).readlines()] | |
86 lines = [line for line in lines | |
68
78e72729582e
a downstream file changed format! we better catch up!!!
Jeff Hammel <jhammel@mozilla.com>
parents:
51
diff
changeset
|
87 if line.startswith('/talos ')] |
78e72729582e
a downstream file changed format! we better catch up!!!
Jeff Hammel <jhammel@mozilla.com>
parents:
51
diff
changeset
|
88 regex = re.compile('\/talos (.*)\/.*\?.*\"([^"].*)\".*') |
6 | 89 for line in lines: |
90 match = regex.match(line) | |
91 assert match | |
92 _regex, name = match.groups() | |
93 self.tbpl_regexs[name] = _regex | |
5 | 94 |
10 | 95 def setup_buildbot(self): |
42 | 96 localconfig, project_branches, module = require.require(self.localconfig, |
97 self.project_branches, | |
98 self.buildbot_config, | |
99 **{self.localconfig: "localconfig.py"}) | |
10 | 100 self.suites = module.SUITES |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
101 self.buildbot_commands = {} |
41
4dfa9c298e3d
record whether a suite is enabled
Jeff Hammel <jhammel@mozilla.com>
parents:
33
diff
changeset
|
102 self.buildbot_enabled = {} |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
103 for key, value in self.suites.items(): |
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
104 self.buildbot_commands[key] = value['suites'] |
41
4dfa9c298e3d
record whether a suite is enabled
Jeff Hammel <jhammel@mozilla.com>
parents:
33
diff
changeset
|
105 self.buildbot_enabled[key] = value['enable_by_default'] |
10 | 106 |
107 ### functions for fetching information | |
108 | |
109 def tbpl_name(self, name): | |
51
601ebbbdf63e
more mysteries and random guesses
Jeff Hammel <jhammel@mozilla.com>
parents:
42
diff
changeset
|
110 """returns the TBPL long name from buildbot name""" |
601ebbbdf63e
more mysteries and random guesses
Jeff Hammel <jhammel@mozilla.com>
parents:
42
diff
changeset
|
111 if name.startswith('remote-'): |
601ebbbdf63e
more mysteries and random guesses
Jeff Hammel <jhammel@mozilla.com>
parents:
42
diff
changeset
|
112 name = name[len('remote-'):] |
601ebbbdf63e
more mysteries and random guesses
Jeff Hammel <jhammel@mozilla.com>
parents:
42
diff
changeset
|
113 |
21 | 114 if name in self._tbpl_names: |
115 return self._tbpl_names[name] | |
10 | 116 for tbplname, regex in self.tbpl_regexs.items(): |
117 regex = re.compile(regex) | |
118 if regex.match(name): | |
21 | 119 self._tbpl_names[name] = tbplname |
10 | 120 return tbplname |
121 | |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
122 def buildbot_command(self, name): |
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
123 """gets the buildbot command for a particular suite""" |
23 | 124 return self.buildbot_commands.get(name)[:] |
12
a4aa9f83e3be
adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents:
10
diff
changeset
|
125 |
14 | 126 def talos_config(self, name): |
127 """returns talos configuration for suite `name`""" | |
21 | 128 if name in self._talos_configs: |
129 return self._talos_configs[name] | |
130 | |
13
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
131 command = self.buildbot_command(name) |
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
132 assert command is not None, "Suite not found: %s" % name |
16 | 133 outfile = tempfile.mktemp(suffix='.yml') |
134 command += ['-o', outfile] # add an output file | |
135 command += ['-e', sys.executable] # add a pretend firefox so PerfConfigurator won't whine | |
30 | 136 print "\n%s" % subprocess.list2cmdline(command) |
16 | 137 call(['PerfConfigurator'] + command, stdout=subprocess.PIPE, cwd=talos_dir) |
138 assert os.path.exists(outfile) | |
139 config = yaml.load(file(outfile)) | |
21 | 140 self._talos_configs[name] = config |
17
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
141 return config |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
142 |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
143 def test_config(self, name): |
33 | 144 config = self.talos_config(name) |
145 test_config = config['tests'] | |
146 talos.run_tests.useBaseTestDefaults(config.get('basetest', {}), test_config) | |
17
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
147 retval = {} |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
148 for test in test_config: |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
149 name = test.pop('name') |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
150 retval[name] = test |
25e91fc7ff01
getting the test config now works
Jeff Hammel <jhammel@mozilla.com>
parents:
16
diff
changeset
|
151 return retval |
13
323a01abd180
putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
152 |
3 | 153 def __call__(self, name=None): |
26 | 154 """returns the graphserver name prefixed with `name`""" |
155 | |
3 | 156 retval = [] |
157 for short_name, graphserver_name in self.names.items(): | |
158 if (name is None) or (name == short_name or short_name.startswith(name + '_')): | |
159 retval.append((short_name, graphserver_name)) | |
160 retval.sort(key=lambda x: x[0]) | |
161 return retval | |
26 | 162 |
163 def graphserver_name(self, name): | |
164 for short_name, graphserver_name in self.names.items(): | |
165 if name == short_name: | |
166 return (short_name, graphserver_name) |