[autotest] Delete support for parameterized jobs.

This deletes the `create_parameterized_job()` RPC endpoint and the
associated (unused!) "parameterized_jobs" config setting.  It also
garbage collects code made unreferenced by these deletions.

BUG=chromium:679903
TEST=unit tests, and run push_to_prod suite in a local instance

Change-Id: I8ed683d0c8ffa879d0e10319b0a736133d56327e
Reviewed-on: https://chromium-review.googlesource.com/436407
Commit-Ready: Richard Barnette <jrbarnette@chromium.org>
Tested-by: Richard Barnette <jrbarnette@chromium.org>
Reviewed-by: Richard Barnette <jrbarnette@google.com>
diff --git a/frontend/afe/rpc_interface.py b/frontend/afe/rpc_interface.py
index c6e4882..e3fa0c1 100644
--- a/frontend/afe/rpc_interface.py
+++ b/frontend/afe/rpc_interface.py
@@ -75,16 +75,6 @@
 
 # Relevant CrosDynamicSuiteExceptions are defined in client/common_lib/error.py.
 
-def get_parameterized_autoupdate_image_url(job):
-    """Get the parameterized autoupdate image url from a parameterized job."""
-    known_test_obj = models.Test.smart_get('autoupdate_ParameterizedJob')
-    image_parameter = known_test_obj.testparameter_set.get(test=known_test_obj,
-                                                           name='image')
-    para_set = job.parameterized_job.parameterizedjobparameter_set
-    job_test_para = para_set.get(test_parameter=image_parameter)
-    return job_test_para.parameter_value
-
-
 # labels
 
 def modify_label(id, **data):
@@ -791,125 +781,6 @@
     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)
-    """
-    # 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(
-                name=name,
-                priority=priority,
-                control_type=control_type,
-                hosts=hosts,
-                meta_hosts=meta_hosts,
-                one_time_hosts=one_time_hosts,
-                atomic_group_name=atomic_group_name,
-                synch_count=synch_count,
-                is_template=is_template,
-                timeout=timeout,
-                timeout_mins=timeout_mins,
-                max_runtime_mins=max_runtime_mins,
-                run_verify=run_verify,
-                email_list=email_list,
-                dependencies=dependencies,
-                reboot_before=reboot_before,
-                reboot_after=reboot_after,
-                parse_failed_repair=parse_failed_repair,
-                hostless=hostless,
-                keyvals=keyvals,
-                drone_set=drone_set,
-                parameterized_job=parameterized_job.id,
-                run_reset=run_reset,
-                require_ssp=require_ssp)
-    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,
@@ -1228,8 +1099,6 @@
                                             for label in job.dependencies)
         job_dict['keyvals'] = dict((keyval.key, keyval.value)
                                    for keyval in job.keyvals)
-        if job.parameterized_job:
-            job_dict['image'] = get_parameterized_autoupdate_image_url(job)
         job_dicts.append(job_dict)
     return rpc_utils.prepare_for_serialization(job_dicts)
 
@@ -1320,48 +1189,42 @@
 
 
 def _get_image_for_job(job, hostless):
-    """ Gets the image used for a job.
+    """Gets the image used for a job.
 
-    Gets the image used for an AFE job. If the job is a parameterized job, get
-    the image from the job parameter; otherwise, tries to get the image from
-    the job's keyvals 'build' or 'builds'. As a last resort, if the job is a
-    hostless job, tries to get the image from its control file attributes
-    'build' or 'builds'.
+    Gets the image used for an AFE job from the job's keyvals 'build' or
+    'builds'. If that fails, and the job is a hostless job, tries to
+    get the image from its control file attributes 'build' or 'builds'.
 
     TODO(ntang): Needs to handle FAFT with two builds for ro/rw.
 
     @param job      An AFE job object.
-    @param hostless Boolean on of the job is hostless.
+    @param hostless Boolean indicating whether the job is hostless.
 
     @returns The image build used for the job.
     """
-    image = None
-    if job.parameterized_job:
-        image = get_parameterized_autoupdate_image_url(job)
-    else:
-        keyvals = job.keyval_dict()
-        image = keyvals.get('build')
-        if not image:
-            value = keyvals.get('builds')
-            builds = None
-            if isinstance(value, dict):
-                builds = value
-            elif isinstance(value, basestring):
-                builds = ast.literal_eval(value)
-            if builds:
+    keyvals = job.keyval_dict()
+    image = keyvals.get('build')
+    if not image:
+        value = keyvals.get('builds')
+        builds = None
+        if isinstance(value, dict):
+            builds = value
+        elif isinstance(value, basestring):
+            builds = ast.literal_eval(value)
+        if builds:
+            image = builds.get('cros-version')
+    if not image and hostless and job.control_file:
+        try:
+            control_obj = control_data.parse_control_string(
+                    job.control_file)
+            if hasattr(control_obj, 'build'):
+                image = getattr(control_obj, 'build')
+            if not image and hasattr(control_obj, 'builds'):
+                builds = getattr(control_obj, 'builds')
                 image = builds.get('cros-version')
-        if not image and hostless and job.control_file:
-            try:
-                control_obj = control_data.parse_control_string(
-                        job.control_file)
-                if hasattr(control_obj, 'build'):
-                    image = getattr(control_obj, 'build')
-                if not image and hasattr(control_obj, 'builds'):
-                    builds = getattr(control_obj, 'builds')
-                    image = builds.get('cros-version')
-            except:
-                logging.warning('Failed to parse control file for job: %s',
-                                job.name)
+        except:
+            logging.warning('Failed to parse control file for job: %s',
+                            job.name)
     return image
 
 
@@ -1709,7 +1572,6 @@
     result['motd'] = rpc_utils.get_motd()
     result['drone_sets_enabled'] = models.DroneSet.drone_sets_enabled()
     result['drone_sets'] = drone_sets
-    result['parameterized_jobs'] = models.Job.parameterized_jobs_enabled()
 
     result['status_dictionary'] = {"Aborted": "Aborted",
                                    "Verifying": "Verifying Host",