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