Revert "[autotest] Remove create_parameterized_test() RPC, et seq."

This reverts commit 7983b635dd5c4db5106bf5092174d716a3d1dd63.

Change-Id: I966beaf4b9660d234bd197357da2ebf3b970bfd2
Reviewed-on: https://chromium-review.googlesource.com/344350
Reviewed-by: Richard Barnette <jrbarnette@chromium.org>
Reviewed-by: Shuqian Zhao <shuqianz@chromium.org>
Commit-Queue: Shuqian Zhao <shuqianz@chromium.org>
Tested-by: Shuqian Zhao <shuqianz@chromium.org>
diff --git a/frontend/afe/rpc_interface.py b/frontend/afe/rpc_interface.py
index 387bff0..f7c8dcb 100644
--- a/frontend/afe/rpc_interface.py
+++ b/frontend/afe/rpc_interface.py
@@ -1,4 +1,4 @@
-# pylint: disable=C0111
+# pylint: disable-msg=C0111
 
 """\
 Functions to expose over the RPC interface.
@@ -802,6 +802,91 @@
     return cf_info
 
 
+def create_parameterized_job(name, priority, test, parameters, kernel=None,
+                             label=None, profilers=(), profiler_parameters=None,
+                             use_container=False, profile_only=None,
+                             upload_kernel_config=False, hosts=(),
+                             meta_hosts=(), one_time_hosts=(),
+                             atomic_group_name=None, synch_count=None,
+                             is_template=False, timeout=None,
+                             timeout_mins=None, max_runtime_mins=None,
+                             run_verify=False, email_list='', dependencies=(),
+                             reboot_before=None, reboot_after=None,
+                             parse_failed_repair=None, hostless=False,
+                             keyvals=None, drone_set=None, run_reset=True,
+                             require_ssp=None):
+    """
+    Creates and enqueues a parameterized job.
+
+    Most parameters a combination of the parameters for generate_control_file()
+    and create_job(), with the exception of:
+
+    @param test name or ID of the test to run
+    @param parameters a map of parameter name ->
+                          tuple of (param value, param type)
+    @param profiler_parameters a dictionary of parameters for the profilers:
+                                   key: profiler name
+                                   value: dict of param name -> tuple of
+                                                                (param value,
+                                                                 param type)
+    """
+    # Save the values of the passed arguments here. What we're going to do with
+    # them is pass them all to rpc_utils.get_create_job_common_args(), which
+    # will extract the subset of these arguments that apply for
+    # rpc_utils.create_job_common(), which we then pass in to that function.
+    args = locals()
+
+    # Set up the parameterized job configs
+    test_obj = models.Test.smart_get(test)
+    control_type = test_obj.test_type
+
+    try:
+        label = models.Label.smart_get(label)
+    except models.Label.DoesNotExist:
+        label = None
+
+    kernel_objs = models.Kernel.create_kernels(kernel)
+    profiler_objs = [models.Profiler.smart_get(profiler)
+                     for profiler in profilers]
+
+    parameterized_job = models.ParameterizedJob.objects.create(
+            test=test_obj, label=label, use_container=use_container,
+            profile_only=profile_only,
+            upload_kernel_config=upload_kernel_config)
+    parameterized_job.kernels.add(*kernel_objs)
+
+    for profiler in profiler_objs:
+        parameterized_profiler = models.ParameterizedJobProfiler.objects.create(
+                parameterized_job=parameterized_job,
+                profiler=profiler)
+        profiler_params = profiler_parameters.get(profiler.name, {})
+        for name, (value, param_type) in profiler_params.iteritems():
+            models.ParameterizedJobProfilerParameter.objects.create(
+                    parameterized_job_profiler=parameterized_profiler,
+                    parameter_name=name,
+                    parameter_value=value,
+                    parameter_type=param_type)
+
+    try:
+        for parameter in test_obj.testparameter_set.all():
+            if parameter.name in parameters:
+                param_value, param_type = parameters.pop(parameter.name)
+                parameterized_job.parameterizedjobparameter_set.create(
+                        test_parameter=parameter, parameter_value=param_value,
+                        parameter_type=param_type)
+
+        if parameters:
+            raise Exception('Extra parameters remain: %r' % parameters)
+
+        return rpc_utils.create_job_common(
+                parameterized_job=parameterized_job.id,
+                control_type=control_type,
+                **rpc_utils.get_create_job_common_args(args))
+    except:
+        parameterized_job.delete()
+        raise
+
+
 def create_job_page_handler(name, priority, control_file, control_type,
                             image=None, hostless=False, firmware_rw_build=None,
                             firmware_ro_build=None, test_source_build=None,