Should work from here on.
[build.git] / run-nightlies.py
1 #!/usr/bin/python
2 # Script to read build configs in /etc/build_conf.py, turn the configuration into command lines and execute it
3
4 import os
5 import re
6
7 # Assemble a list of builds from a single build spec
8 def interpret_build(build, param_names, current_concrete_build={}, concrete_build_list=[]):
9         if (param_names==[]):
10                 concrete_build_list.extend([current_concrete_build])
11         else:
12                 (cur_param_name,remaining_param_names)=(param_names[0],param_names[1:])
13                 cur_param = build[cur_param_name]
14
15                 # If it's a list, produce a concrete build for each element of the list
16                 if (type(cur_param)==type([])):
17                         for value in cur_param:
18                                 new_concrete_build = current_concrete_build.copy()
19                                 new_concrete_build[cur_param_name] = value
20                                 concrete_build_list = interpret_build(build, remaining_param_names, new_concrete_build, concrete_build_list)
21                 
22                 # If not, just tack on the value and move on
23                 else:
24                         current_concrete_build[cur_param_name] = cur_param
25                         concrete_build_list = interpret_build(build, remaining_param_names, current_concrete_build,concrete_build_list)
26
27         return concrete_build_list
28                         
29
30 # Fill in parameters that are not defined in __default_build__
31 def complete_build_spec_with_defaults (build, default_build):
32         for default_param in default_build.keys():
33                 if (not build.has_key(default_param)):
34                         build[default_param]=default_build[default_param]
35         return build
36         
37
38 # Turn a concrete build into a commandline
39
40 def concrete_build_to_commandline(concrete_build):
41     
42     cmdline = '''%(sh)s 
43             %(vbuildnightly)s
44             -b %(pldistro)s-%(fcdistro)s-%(arch)s-%(myplcversion)s-%(release)s-%(date)s
45             -f %(fcdistro)s 
46             -m %(mailto)s 
47             -p %(personality)s
48             -r %(webpath)s
49             -s %(svnpath)s
50             -t %(tags)s 
51             -w %(webpath)s/%(pldistro)s/%(fcdistro)s
52             %(runtests)s'''.replace('\n','')
53
54     cmdline = cmdline % concrete_build
55
56     purge_spaces = re.compile('\s+')
57
58     return purge_spaces.sub(' ', cmdline)
59
60                     
61 # reduce dependencies in a build 
62 def reduce_dependencies(concrete_build):
63     for b in concrete_build.keys():
64         val = concrete_build[b]
65         if (type(val)==type(lambda x:x)):
66             concrete_build[b] = val(concrete_build)
67     return concrete_build
68
69
70 # Turn build parameter dicts into commandlines and execute them
71 def process_builds (builds, build_names, default_build):
72         for build_name in build_names:
73                 build = complete_build_spec_with_defaults (builds[build_name], default_build)
74                 concrete_builds_without_deps = interpret_build (build, build.keys())
75                 concrete_builds = map(lambda cb: reduce_dependencies(cb), concrete_builds_without_deps)
76                 for concrete_build in concrete_builds:
77                         build_commandline = concrete_build_to_commandline(concrete_build)
78                         os.system(build_commandline)
79         
80 def main():
81         config_file = '/etc/build-conf-planetlab.py'
82         builds = {}
83         try:
84                 execfile(config_file, builds)
85         except IOError, e:
86                 raise IOError, "Could not open %s\n" % config_file
87
88
89         config_file_attributes = builds.keys()
90         build_names = [e for e in config_file_attributes if not e.startswith('__')]     
91
92         try:
93                 default_build = builds['__default_build__']
94         except KeyError:
95                 raise KeyError, "Please define the default build config in %s\n" % config_file
96         
97         process_builds(builds, build_names, default_build)
98
99
100 if __name__ == "__main__":
101         main()
102