annotate talosnames/api.py @ 13:323a01abd180

putting off this fun for later
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 10 Jul 2012 17:12:59 -0700
parents a4aa9f83e3be
children 1b18b2746e69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
1 import os
6
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
2 import re
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
3 import require
13
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
4 import subprocess
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
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
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
8 import urllib2
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
9
13
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
10 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
11
12
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
12 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
13
0
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 class TalosNames(object):
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 graphserver_sql = 'http://hg.mozilla.org/graphs/raw-file/tip/sql/data.sql'
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
16 schema = 'http://hg.mozilla.org/graphs/raw-file/tip/sql/schema.sql'
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
17 project_branches = 'http://hg.mozilla.org/build/buildbot-configs/raw-file/tip/mozilla/project_branches.py'
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
18 buildbot_config = 'http://hg.mozilla.org/build/buildbot-configs/raw-file/tip/mozilla-tests/config.py'
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
19
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
20 # mapping file from builbot-configs name to tbpl codes:
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
21 # http://hg.mozilla.org/users/mstange_themasta.com/tinderboxpushlog/file/tip/js/Config.js
6
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
22 tbpl_map = 'http://hg.mozilla.org/users/mstange_themasta.com/tinderboxpushlog/raw-file/tip/js/Data.js'
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
23
2
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
24 tables = {'os_list': '(id, name text)',
3
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
25 'branches': '(id, name text)',
2
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
26 'machines': '(id, os_id int, is_throttling int, cpu_speed text, name text, is_active int, date_added int)',
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
27 'pagesets': '(id, name text)',
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
28 'tests': '(id, name text, pretty_name text, is_chrome int, is_active int, pageset_id int)'
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
29 }
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
30
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
31 ### initialization functions
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
32
0
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33 def __init__(self):
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
34 self.setup_database()
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
35 self.tbpl_mapping()
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
36 self.setup_buildbot()
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
37
6
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
38 def setup_database(self):
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
39 self.db = sqlite3.connect(':memory:')
3
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
40 sql_lines = urllib2.urlopen(self.graphserver_sql).readlines()
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
41
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
42 # XXX remove the machines since they require a function, unix_timestamp(), sqlite does not have
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
43 sql_lines = [line for line in sql_lines
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
44 if 'unix_timestamp' not in line]
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
45 sql = '\n'.join(sql_lines)
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
46
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
47 cursor = self.db.cursor()
2
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
48 for table, schema in self.tables.items():
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
49 cursor.execute("""CREATE TABLE %s %s""" % (table, schema))
3
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
50 cursor.executescript(sql)
2
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
51 self.db.commit()
c98f2a383595 make some tables
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
52 cursor.close()
1
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
53
3
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
54 # create data structures
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
55 self.names = {}
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
56 self.chrome = set()
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
57 cursor = self.db.cursor()
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
58 cursor.execute("SELECT * FROM tests")
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
59 for _, short_name, graphserver_name, is_chrome, _, _ in cursor.fetchall():
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
60 self.names[short_name] = graphserver_name
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
61 if is_chrome:
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
62 self.chrome.add(short_name)
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
63 cursor.close()
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
64
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
65 def tbpl_mapping(self):
6
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
66 self.tbpl_regexs = {}
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
67 lines = [line.strip()
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
68 for line in urllib2.urlopen(self.tbpl_map).readlines()]
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
69 lines = [line for line in lines
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
70 if line.startswith('/talos.*')]
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
71 regex = re.compile('\/talos\.\*(.*)\/.*\?.*\"([^"].*)\".*')
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
72 for line in lines:
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
73 match = regex.match(line)
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
74 assert match
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
75 _regex, name = match.groups()
82aad57c7d1d add regex mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
76 self.tbpl_regexs[name] = _regex
5
2d883dd59a1a stub tbpl_mapping
Jeff Hammel <jhammel@mozilla.com>
parents: 3
diff changeset
77
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
78 def setup_buildbot(self):
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
79 # project_branches = require.require(self.project_branches)
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
80 module = require.require(self.buildbot_config)
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
81 self.suites = module.SUITES
12
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
82 self.buildbot_commands = {}
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
83 for key, value in self.suites.items():
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
84 self.buildbot_commands[key] = value['suites']
10
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
85
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
86 ### functions for fetching information
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
87
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
88 def tbpl_name(self, name):
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
89 """returns the TBPL long name"""
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
90 for tbplname, regex in self.tbpl_regexs.items():
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
91 regex = re.compile(regex)
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
92 if regex.match(name):
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
93 return tbplname
1029ddf7b806 get the buildbot config
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
94
12
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
95 def buildbot_command(self, name):
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
96 """gets the buildbot command for a particular suite"""
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
97 return self.buildbot_commands.get(name)
a4aa9f83e3be adding a thing for commands
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
98
13
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
99 def buildbot_config(self, name):
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
100 command = self.buildbot_command(name)
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
101 assert command is not None, "Suite not found: %s" % name
323a01abd180 putting off this fun for later
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
102
3
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
103 def __call__(self, name=None):
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
104 retval = []
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
105 for short_name, graphserver_name in self.names.items():
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
106 if (name is None) or (name == short_name or short_name.startswith(name + '_')):
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
107 retval.append((short_name, graphserver_name))
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
108 retval.sort(key=lambda x: x[0])
90e477181404 now basically works
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
109 return retval