Added server_job.set_test_tag() function (similar to the one in 
client.bin.job) to specify a default tag to use for run_test() runs.

Changed the way we generate server control files from the frontend to be
very close to the client control files (using step_init(), stepX()
functions for each phase of the test). Changed generation of server
kernel control file to properly deal with the case of multiple kernels
given.

Risk: High

Signed-off-by: Mihai Rusu <dizzy@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3051 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/frontend/afe/control_file.py b/frontend/afe/control_file.py
index 1cd5677..c78010e 100644
--- a/frontend/afe/control_file.py
+++ b/frontend/afe/control_file.py
@@ -13,10 +13,10 @@
 AUTOTEST_DIR = os.path.abspath(os.path.join(
     os.path.dirname(frontend.settings.__file__), '..'))
 
-CLIENT_EMPTY_TEMPLATE = 'def step_init():\n'
+EMPTY_TEMPLATE = 'def step_init():\n'
 
 CLIENT_KERNEL_TEMPLATE = """\
-kernel_list = %(kernel_list)r
+kernel_list = %(client_kernel_list)s
 
 def step_init():
     for kernel_version in kernel_list:
@@ -38,20 +38,41 @@
 """
 
 SERVER_KERNEL_TEMPLATE = """\
-kernel_list = %%(kernel_list)r
+kernel_list = %%(server_kernel_list)s
 kernel_install_control = \"""
 %s    pass
 \"""
 
 at = autotest.Autotest()
-def install_kernel(machine):
+def install_kernel(machine, kernel_version):
     host = hosts.create_host(machine)
-    at.run(kernel_install_control, host=host)
-job.parallel_simple(install_kernel, machines)
+    at.install(host=host)
+    at.run(kernel_install_control %%%%
+           {'client_kernel_list': repr([kernel_version])}, host=host)
 
+def step_init():
+    # a host object we use solely for the purpose of finding out the booted
+    # kernel version, we use machines[0] since we already check that the same
+    # kernel has been booted on all machines
+    if len(kernel_list) > 1:
+        kernel_host = hosts.create_host(machines[0])
+
+    for kernel_version in kernel_list:
+        func = lambda machine: install_kernel(machine, kernel_version)
+        job.parallel_simple(func, machines)
+
+        # have server_job.run_test() automatically add the kernel version as
+        # a suffix to the test name otherwise we cannot run the same test on
+        # different kernel versions
+        if len(kernel_list) > 1:
+            job.set_test_tag(kernel_host.get_kernel_ver())
+        step_test()
+
+def step_test():
 """ % CLIENT_KERNEL_TEMPLATE
 
 CLIENT_STEP_TEMPLATE = "    job.next_step('step%d')\n"
+SERVER_STEP_TEMPLATE = '    step%d()\n'
 
 
 def kernel_config_line(kernel, platform):
@@ -70,18 +91,23 @@
 
 def get_kernel_stanza(kernel_list, platform=None, kernel_args='',
                       is_server=False):
-    if is_server:
-        template = SERVER_KERNEL_TEMPLATE
-    else:
-        template = CLIENT_KERNEL_TEMPLATE
 
-    stanza = template % {
-        'kernel_list' : kernel_list,
+    template_args = {
         # XXX This always looks up the config line using the first kernel
         # in the list rather than doing it for each kernel.
         'kernel_config_line' : kernel_config_line(kernel_list[0], platform),
         'kernel_args' : kernel_args}
-    return stanza
+
+    if is_server:
+        template = SERVER_KERNEL_TEMPLATE
+        # leave client_kernel_list as a placeholder
+        template_args['client_kernel_list'] = '%(client_kernel_list)s'
+        template_args['server_kernel_list'] = repr(kernel_list)
+    else:
+        template = CLIENT_KERNEL_TEMPLATE
+        template_args['client_kernel_list'] = repr(kernel_list)
+
+    return template % template_args
 
 
 def add_boilerplate_to_nested_steps(lines):
@@ -144,8 +170,6 @@
 
     @returns The combined mega control file.
     """
-    if is_server:
-        return '\n'.join(prepend + raw_control_files + append)
     if client_control_file:
         # 'return locals()' is always appended incase the user forgot, it
         # is necessary to allow for nested step engine execution to work.
@@ -154,8 +178,15 @@
                            for step in raw_control_files] + append
     steps = [format_step(index, step)
              for index, step in enumerate(raw_steps)]
-    header = ''.join(CLIENT_STEP_TEMPLATE % i for i in xrange(len(steps)))
-    return header + '\n' + '\n\n'.join(steps)
+    if is_server:
+        step_template = SERVER_STEP_TEMPLATE
+        footer = '\n\nstep_init()\n'
+    else:
+        step_template = CLIENT_STEP_TEMPLATE
+        footer = ''
+
+    header = ''.join(step_template % i for i in xrange(len(steps)))
+    return header + '\n' + '\n\n'.join(steps) + footer
 
 
 def indent_text(text, indent):
@@ -218,8 +249,8 @@
         kernel_list = split_kernel_list(kernel)
         control_file_text = get_kernel_stanza(kernel_list, platform,
                                               is_server=is_server)
-    elif not is_server:
-        control_file_text = CLIENT_EMPTY_TEMPLATE
+    else:
+        control_file_text = EMPTY_TEMPLATE
 
     prepend, append = _get_profiler_commands(profilers, is_server)