2 # Script to read build configs in /etc/build_conf.py, turn the configuration into command lines and execute it
7 # Assemble a list of builds from a single build spec
8 def interpret_build(build, param_names, current_concrete_build={}, concrete_build_list=[]):
11 concrete_build_list.extend([current_concrete_build])
13 (cur_param_name,remaining_param_names)=(param_names[0],param_names[1:])
14 cur_param = build[cur_param_name]
16 # If it's a list, produce a concrete build for each element of the list
17 if (type(cur_param)==type([])):
18 for value in cur_param:
19 new_concrete_build = current_concrete_build.copy()
20 new_concrete_build[cur_param_name] = value
21 concrete_build_list = interpret_build(build, remaining_param_names, new_concrete_build, concrete_build_list)
23 # If not, just tack on the value and move on
25 current_concrete_build[cur_param_name] = cur_param
26 concrete_build_list = interpret_build(build, remaining_param_names, current_concrete_build,concrete_build_list)
28 return concrete_build_list
31 # Fill in parameters that are not defined in __default_build__
32 def complete_build_spec_with_defaults (build, default_build):
33 for default_param in default_build.keys():
34 if (not build.has_key(default_param)):
35 build[default_param]=default_build[default_param]
39 # Turn a concrete build into a commandline
41 def concrete_build_to_commandline(concrete_build):
45 -b %(pldistro)s-%(fcdistro)s-%(arch)s-%(myplcversion)s-%(release)s-%(date)s
52 -w %(webpath)s/%(pldistro)s/%(fcdistro)s
53 %(runtests)s'''.replace('\n','')
55 cmdline = cmdline % concrete_build
57 purge_spaces = re.compile('\s+')
59 return purge_spaces.sub(' ', cmdline)
62 # reduce dependencies in a build
63 def reduce_dependencies(concrete_build):
64 for b in concrete_build.keys():
65 val = concrete_build[b]
66 if (type(val)==type(lambda x:x)):
67 concrete_build[b] = val(concrete_build)
71 # Turn build parameter dicts into commandlines and execute them
72 def process_builds (builds, build_names, default_build):
73 for build_name in build_names:
74 build = complete_build_spec_with_defaults (builds[build_name], default_build)
75 concrete_builds_without_deps = interpret_build (build, build.keys(), {}, [])
76 concrete_builds = map(reduce_dependencies, concrete_builds_without_deps)
77 commandlines = map(concrete_build_to_commandline, concrete_builds)
78 for commandline in commandlines:
79 os.system(commandline)
82 config_file = '/etc/build-conf-planetlab.py'
85 execfile(config_file, builds)
87 raise IOError, "Could not open %s\n" % config_file
90 config_file_attributes = builds.keys()
91 build_names = [e for e in config_file_attributes if not e.startswith('__')]
94 default_build = builds['__default_build__']
96 raise KeyError, "Please define the default build config in %s\n" % config_file
98 process_builds(builds, build_names, default_build)
101 if __name__ == "__main__":