[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/models.py b/frontend/afe/models.py
index 9919977..e877e8a 100644
--- a/frontend/afe/models.py
+++ b/frontend/afe/models.py
@@ -1061,145 +1061,14 @@
         return unicode(self.name)
 
 
-class Kernel(dbmodels.Model):
-    """
-    A kernel configuration for a parameterized job
-    """
-    version = dbmodels.CharField(max_length=255)
-    cmdline = dbmodels.CharField(max_length=255, blank=True)
-
-    @classmethod
-    def create_kernels(cls, kernel_list):
-        """Creates all kernels in the kernel list.
-
-        @param cls: Implicit class object.
-        @param kernel_list: A list of dictionaries that describe the kernels,
-            in the same format as the 'kernel' argument to
-            rpc_interface.generate_control_file.
-        @return A list of the created kernels.
-        """
-        if not kernel_list:
-            return None
-        return [cls._create(kernel) for kernel in kernel_list]
-
-
-    @classmethod
-    def _create(cls, kernel_dict):
-        version = kernel_dict.pop('version')
-        cmdline = kernel_dict.pop('cmdline', '')
-
-        if kernel_dict:
-            raise Exception('Extraneous kernel arguments remain: %r'
-                            % kernel_dict)
-
-        kernel, _ = cls.objects.get_or_create(version=version,
-                                              cmdline=cmdline)
-        return kernel
-
-
-    class Meta:
-        """Metadata for class Kernel."""
-        db_table = 'afe_kernels'
-        unique_together = ('version', 'cmdline')
-
-    def __unicode__(self):
-        return u'%s %s' % (self.version, self.cmdline)
-
-
 class ParameterizedJob(dbmodels.Model):
     """
     Auxiliary configuration for a parameterized job.
+
+    This stub exists merely for unit tests.  See Job.parameterized_job
+    for more details.
     """
-    test = dbmodels.ForeignKey(Test)
-    label = dbmodels.ForeignKey(Label, null=True)
-    use_container = dbmodels.BooleanField(default=False)
-    profile_only = dbmodels.BooleanField(default=False)
-    upload_kernel_config = dbmodels.BooleanField(default=False)
-
-    kernels = dbmodels.ManyToManyField(
-            Kernel, db_table='afe_parameterized_job_kernels')
-    profilers = dbmodels.ManyToManyField(
-            Profiler, through='ParameterizedJobProfiler')
-
-
-    @classmethod
-    def smart_get(cls, id_or_name, *args, **kwargs):
-        """For compatibility with Job.add_object.
-
-        @param cls: Implicit class object.
-        @param id_or_name: The ID or name to get.
-        @param args: Non-keyword arguments.
-        @param kwargs: Keyword arguments.
-        """
-        return cls.objects.get(pk=id_or_name)
-
-
-    def job(self):
-        """Returns the job if it exists, or else None."""
-        jobs = self.job_set.all()
-        assert jobs.count() <= 1
-        return jobs and jobs[0] or None
-
-
-    class Meta:
-        """Metadata for class ParameterizedJob."""
-        db_table = 'afe_parameterized_jobs'
-
-    def __unicode__(self):
-        return u'%s (parameterized) - %s' % (self.test.name, self.job())
-
-
-class ParameterizedJobProfiler(dbmodels.Model):
-    """
-    A profiler to run on a parameterized job
-    """
-    parameterized_job = dbmodels.ForeignKey(ParameterizedJob)
-    profiler = dbmodels.ForeignKey(Profiler)
-
-    class Meta:
-        """Metedata for class ParameterizedJobProfiler."""
-        db_table = 'afe_parameterized_jobs_profilers'
-        unique_together = ('parameterized_job', 'profiler')
-
-
-class ParameterizedJobProfilerParameter(dbmodels.Model):
-    """
-    A parameter for a profiler in a parameterized job
-    """
-    parameterized_job_profiler = dbmodels.ForeignKey(ParameterizedJobProfiler)
-    parameter_name = dbmodels.CharField(max_length=255)
-    parameter_value = dbmodels.TextField()
-    parameter_type = dbmodels.CharField(
-            max_length=8, choices=model_attributes.ParameterTypes.choices())
-
-    class Meta:
-        """Metadata for class ParameterizedJobProfilerParameter."""
-        db_table = 'afe_parameterized_job_profiler_parameters'
-        unique_together = ('parameterized_job_profiler', 'parameter_name')
-
-    def __unicode__(self):
-        return u'%s - %s' % (self.parameterized_job_profiler.profiler.name,
-                             self.parameter_name)
-
-
-class ParameterizedJobParameter(dbmodels.Model):
-    """
-    Parameters for a parameterized job
-    """
-    parameterized_job = dbmodels.ForeignKey(ParameterizedJob)
-    test_parameter = dbmodels.ForeignKey(TestParameter)
-    parameter_value = dbmodels.TextField()
-    parameter_type = dbmodels.CharField(
-            max_length=8, choices=model_attributes.ParameterTypes.choices())
-
-    class Meta:
-        """Metadata for class ParameterizedJobParameter."""
-        db_table = 'afe_parameterized_job_parameters'
-        unique_together = ('parameterized_job', 'test_parameter')
-
-    def __unicode__(self):
-        return u'%s - %s' % (self.parameterized_job.job().name,
-                             self.test_parameter.name)
+    pass
 
 
 class JobManager(model_logic.ExtendedManager):
@@ -1404,6 +1273,13 @@
     max_runtime_mins = dbmodels.IntegerField(default=DEFAULT_MAX_RUNTIME_MINS)
     drone_set = dbmodels.ForeignKey(DroneSet, null=True, blank=True)
 
+    # TODO(jrbarnette)  We have to keep `parameterized_job` around or it
+    # breaks the scheduler_models unit tests (and fixing the unit tests
+    # will break the scheduler, so don't do that).
+    #
+    # The ultimate fix is to delete the column from the database table
+    # at which point, you _must_ delete this.  Until you're ready to do
+    # that, DON'T MUCK WITH IT.
     parameterized_job = dbmodels.ForeignKey(ParameterizedJob, null=True,
                                             blank=True)
 
@@ -1442,41 +1318,6 @@
 
 
     @classmethod
-    def parameterized_jobs_enabled(cls):
-        """Returns whether parameterized jobs are enabled.
-
-        @param cls: Implicit class object.
-        """
-        return global_config.global_config.get_config_value(
-                'AUTOTEST_WEB', 'parameterized_jobs', type=bool)
-
-
-    @classmethod
-    def check_parameterized_job(cls, control_file, parameterized_job):
-        """Checks that the job is valid given the global config settings.
-
-        First, either control_file must be set, or parameterized_job must be
-        set, but not both. Second, parameterized_job must be set if and only if
-        the parameterized_jobs option in the global config is set to True.
-
-        @param cls: Implict class object.
-        @param control_file: A control file.
-        @param parameterized_job: A parameterized job.
-        """
-        if not (bool(control_file) ^ bool(parameterized_job)):
-            raise Exception('Job must have either control file or '
-                            'parameterization, but not both')
-
-        parameterized_jobs_enabled = cls.parameterized_jobs_enabled()
-        if control_file and parameterized_jobs_enabled:
-            raise Exception('Control file specified, but parameterized jobs '
-                            'are enabled')
-        if parameterized_job and not parameterized_jobs_enabled:
-            raise Exception('Parameterized job specified, but parameterized '
-                            'jobs are not enabled')
-
-
-    @classmethod
     def create(cls, owner, options, hosts):
         """Creates a job.
 
@@ -1491,16 +1332,7 @@
         AclGroup.check_for_acl_violation_hosts(hosts)
 
         control_file = options.get('control_file')
-        parameterized_job = options.get('parameterized_job')
 
-        # The current implementation of parameterized jobs requires that only
-        # control files or parameterized jobs are used. Using the image
-        # parameter on autoupdate_ParameterizedJob doesn't mix pure
-        # parameterized jobs and control files jobs, it does muck enough with
-        # normal jobs by adding a parameterized id to them that this check will
-        # fail. So for now we just skip this check.
-        # cls.check_parameterized_job(control_file=control_file,
-        #                             parameterized_job=parameterized_job)
         user = User.current_user()
         if options.get('reboot_before') is None:
             options['reboot_before'] = user.get_reboot_before_display()
@@ -1530,7 +1362,6 @@
             parse_failed_repair=options.get('parse_failed_repair'),
             created_on=datetime.now(),
             drone_set=drone_set,
-            parameterized_job=parameterized_job,
             parent_job=options.get('parent_job_id'),
             test_retry=options.get('test_retry'),
             run_reset=options.get('run_reset'),
@@ -1603,18 +1434,6 @@
         return []
 
 
-    def save(self, *args, **kwargs):
-        # The current implementation of parameterized jobs requires that only
-        # control files or parameterized jobs are used. Using the image
-        # parameter on autoupdate_ParameterizedJob doesn't mix pure
-        # parameterized jobs and control files jobs, it does muck enough with
-        # normal jobs by adding a parameterized id to them that this check will
-        # fail. So for now we just skip this check.
-        # cls.check_parameterized_job(control_file=self.control_file,
-        #                             parameterized_job=self.parameterized_job)
-        super(Job, self).save(*args, **kwargs)
-
-
     def queue(self, hosts, atomic_group=None, is_template=False):
         """Enqueue a job on the given hosts.