Add ability to associate drone sets with jobs. This restricts a job to
running on a specified set of drones.

Signed-off-by: James Ren <jamesren@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@4439 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/frontend/afe/rpc_interface.py b/frontend/afe/rpc_interface.py
index ab2596a..fc60a75 100644
--- a/frontend/afe/rpc_interface.py
+++ b/frontend/afe/rpc_interface.py
@@ -403,7 +403,7 @@
                timeout=None, max_runtime_hrs=None, run_verify=True,
                email_list='', dependencies=(), reboot_before=None,
                reboot_after=None, parse_failed_repair=None, hostless=False,
-               keyvals=None):
+               keyvals=None, drone_set=None):
     """\
     Create and enqueue a job.
 
@@ -432,6 +432,7 @@
     one host will be chosen from that label to run the job on.
     @param one_time_hosts List of hosts not in the database to run the job on.
     @param atomic_group_name The name of an atomic group to schedule the job on.
+    @param drone_set The name of the drone set to run this test on.
 
 
     @returns The created Job id number.
@@ -529,7 +530,8 @@
                    reboot_before=reboot_before,
                    reboot_after=reboot_after,
                    parse_failed_repair=parse_failed_repair,
-                   keyvals=keyvals)
+                   keyvals=keyvals,
+                   drone_set=drone_set)
     return rpc_utils.create_new_job(owner=owner,
                                     options=options,
                                     host_objects=host_objects,
@@ -656,6 +658,7 @@
     else:
         info['atomic_group_name'] = None
     info['hostless'] = job_info['hostless']
+    info['drone_set'] = job.drone_set and job.drone_set.name
 
     return rpc_utils.prepare_for_serialization(info)
 
@@ -802,6 +805,11 @@
     """
 
     job_fields = models.Job.get_field_dict()
+    default_drone_set_name = models.DroneSet.default_drone_set_name()
+    drone_sets = ([default_drone_set_name] +
+                  sorted(drone_set.name for drone_set in
+                         models.DroneSet.objects.exclude(
+                                 name=default_drone_set_name)))
 
     result = {}
     result['priorities'] = models.Job.Priority.choices()
@@ -824,6 +832,8 @@
     result['reboot_before_options'] = model_attributes.RebootBefore.names
     result['reboot_after_options'] = model_attributes.RebootAfter.names
     result['motd'] = rpc_utils.get_motd()
+    result['drone_sets_enabled'] = models.DroneSet.drone_sets_enabled()
+    result['drone_sets'] = drone_sets
 
     result['status_dictionary'] = {"Aborted": "Aborted",
                                    "Verifying": "Verifying Host",