blob: 45602fbbbb174b57c64036a345f438d17f542e7b [file] [log] [blame]
mblighe8819cd2008-02-15 16:48:40 +00001"""\
2Logic for control file generation.
3"""
4
5__author__ = 'showard@google.com (Steve Howard)'
6
showard9ca52702008-06-02 21:14:49 +00007import re, os
mblighe8819cd2008-02-15 16:48:40 +00008import frontend.settings
9
10AUTOTEST_DIR = os.path.abspath(os.path.join(
11 os.path.dirname(frontend.settings.__file__), '..'))
12
13
showard1d445e92008-03-12 21:33:31 +000014CLIENT_KERNEL_TEMPLATE = """\
showard9ca52702008-06-02 21:14:49 +000015kernel = '%(kernel)s'
mblighe8819cd2008-02-15 16:48:40 +000016def step_init():
mblighf5fdfab2008-06-16 23:57:25 +000017 job.next_step([step_test])
18 testkernel = job.kernel('%(kernel)s')
19 %(kernel_config_line)s
20 testkernel.install()
21 testkernel.boot(args='%(kernel_args)s')
mblighe8819cd2008-02-15 16:48:40 +000022
23def step_test():
24"""
25
showard1d445e92008-03-12 21:33:31 +000026SERVER_KERNEL_TEMPLATE = """\
showard9ca52702008-06-02 21:14:49 +000027kernel = '%%(kernel)s'
showard1d445e92008-03-12 21:33:31 +000028kernel_install_control = \"""
mblighf5fdfab2008-06-16 23:57:25 +000029%s pass
showard1d445e92008-03-12 21:33:31 +000030\"""
31
32at = autotest.Autotest()
33def install_kernel(machine):
jadmanski8d631c92008-08-18 21:12:40 +000034 host = hosts.create_host(machine)
mblighf5fdfab2008-06-16 23:57:25 +000035 at.run(kernel_install_control, host=host)
mbligh6437ff52008-04-17 15:24:38 +000036job.parallel_simple(install_kernel, machines)
showard1d445e92008-03-12 21:33:31 +000037
38""" % CLIENT_KERNEL_TEMPLATE
39
mblighf5fdfab2008-06-16 23:57:25 +000040CLIENT_STEP_TEMPLATE = " job.next_step('step%d')\n"
showard9ca52702008-06-02 21:14:49 +000041
showard1d445e92008-03-12 21:33:31 +000042
mblighe8819cd2008-02-15 16:48:40 +000043def kernel_config_line(kernel, platform):
jadmanski0afbb632008-06-06 21:10:57 +000044 if (not kernel.endswith('.rpm') and platform and
45 platform.kernel_config):
46 return "testkernel.config('%s')" % platform.kernel_config
47 return ''
mblighe8819cd2008-02-15 16:48:40 +000048
49
50def read_control_file(test):
jadmanski0afbb632008-06-06 21:10:57 +000051 control_file = open(os.path.join(AUTOTEST_DIR, test.path))
52 control_contents = control_file.read()
53 control_file.close()
54 return control_contents
mblighe8819cd2008-02-15 16:48:40 +000055
56
showard1d445e92008-03-12 21:33:31 +000057def get_kernel_stanza(kernel, platform=None, kernel_args='', is_server=False):
jadmanski0afbb632008-06-06 21:10:57 +000058 if is_server:
59 template = SERVER_KERNEL_TEMPLATE
60 else:
61 template = CLIENT_KERNEL_TEMPLATE
showard1d445e92008-03-12 21:33:31 +000062
jadmanski0afbb632008-06-06 21:10:57 +000063 stanza = template % {
64 'kernel' : kernel,
65 'kernel_config_line' : kernel_config_line(kernel, platform),
66 'kernel_args' : kernel_args}
67 return stanza
mblighe8819cd2008-02-15 16:48:40 +000068
69
showard9ca52702008-06-02 21:14:49 +000070def add_boilerplate_to_nested_steps(lines):
jadmanski0afbb632008-06-06 21:10:57 +000071 # Look for a line that begins with 'def step_init():' while
72 # being flexible on spacing. If it's found, this will be
73 # a nested set of steps, so add magic to make it work.
74 # See client/bin/job.py's step_engine for more info.
75 if re.search(r'^(.*\n)*def\s+step_init\s*\(\s*\)\s*:', lines):
76 lines += '\nreturn locals() '
77 lines += '# Boilerplate magic for nested sets of steps'
78 return lines
showard9ca52702008-06-02 21:14:49 +000079
80
81def format_step(item, lines):
mblighf5fdfab2008-06-16 23:57:25 +000082 lines = indent_text(lines, ' ')
jadmanski0afbb632008-06-06 21:10:57 +000083 lines = 'def step%d():\n%s' % (item, lines)
84 return lines
showard9ca52702008-06-02 21:14:49 +000085
jadmanski0afbb632008-06-06 21:10:57 +000086
showard9ca52702008-06-02 21:14:49 +000087def get_tests_stanza(tests, is_server, prepend=[], append=[]):
jadmanski0afbb632008-06-06 21:10:57 +000088 raw_control_files = [read_control_file(test) for test in tests]
mblighc5ddfd12008-08-04 17:15:00 +000089 return _get_tests_stanza(raw_control_files, is_server, prepend, append)
90
91
92def _get_tests_stanza(raw_control_files, is_server, prepend, append):
jadmanski0afbb632008-06-06 21:10:57 +000093 if is_server:
94 return '\n'.join(raw_control_files)
95 raw_steps = prepend + [add_boilerplate_to_nested_steps(step)
96 for step in raw_control_files] + append
97 steps = [format_step(index, step)
98 for index, step in enumerate(raw_steps)]
99 header = ''.join(CLIENT_STEP_TEMPLATE % i for i in xrange(len(steps)))
100 return header + '\n' + '\n\n'.join(steps)
mblighe8819cd2008-02-15 16:48:40 +0000101
102
103def indent_text(text, indent):
jadmanski0afbb632008-06-06 21:10:57 +0000104 lines = [indent + line for line in text.splitlines()]
105 return '\n'.join(lines)
mblighe8819cd2008-02-15 16:48:40 +0000106
107
showard2b9a88b2008-06-13 20:55:03 +0000108def _get_profiler_commands(profilers, is_server):
109 'Return (prepend, append)'
110 prepend, append = [], []
111 if is_server:
112 return prepend, append
113 for profiler in profilers:
114 prepend.append("job.profilers.add('%s')" % profiler.name)
115 append.append("job.profilers.delete('%s')" % profiler.name)
116 return prepend, append
117
118
119def generate_control(tests, kernel=None, platform=None, is_server=False,
120 profilers=[]):
jadmanski0afbb632008-06-06 21:10:57 +0000121 control_file_text = ''
122 if kernel:
123 control_file_text = get_kernel_stanza(kernel, platform,
124 is_server=is_server)
125 elif not is_server:
126 control_file_text = 'def step_init():\n'
showard9ca52702008-06-02 21:14:49 +0000127
showard2b9a88b2008-06-13 20:55:03 +0000128 prepend, append = _get_profiler_commands(profilers, is_server)
129
130 control_file_text += get_tests_stanza(tests, is_server, prepend, append)
jadmanski0afbb632008-06-06 21:10:57 +0000131 return control_file_text