two new major features:

(1) added test and job dependencies
 -added M2M relationship between tests and labels and between jobs and labels, for tracking the labels on which a test/job depends
 -modified test_importer to read the DEPENDENCIES field and create the right M2M relationships
 -modified generate_control_file() RPC to compute and return the union of test dependencies.  since generate_control_file now returns four pieces of information, i converted its return type from tuple to dict, and changed clients accordingly.
 -modified job creation clients (GWT and CLI) to pass this dependency list to the create_job() RPC
 -modified the create_job() RPC to check that hosts satisfy job dependencies, and to create M2M relationships
 -modified the scheduler to check dependencies when scheduling jobs
 -modified JobDetailView to show a job's dependencies

(2) added "only_if_needed" bit to labels; if true, a machine with this label can only be used if the label is requested (either by job dependencies or by the metahost label)
 -added boolean field to Labels
 -modified CLI label creation/viewing to support this new field
 -made create_job() RPC and scheduler check for hosts with such a label that was not requested, and reject such hosts

also did some slight refactoring of other code in create_job() to simplify it while I was changing things there.

a couple notes:
-an only_if_needed label can be used if either the job depends on the label or it's a metahost for that label.  we assume that if the user specifically requests the label in a metahost, then it's OK, even if the job doesn't depend on that label.
-one-time-hosts are assumed to satisfy job dependencies.

Signed-off-by: Steve Howard <showard@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@2215 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/cli/job.py b/cli/job.py
index 1208789..7a7c30f 100755
--- a/cli/job.py
+++ b/cli/job.py
@@ -321,6 +321,10 @@
                 self.ctrl_file_data['do_push_packages'] = True
             self.ctrl_file_data['use_container'] = options.container
 
+        # TODO: add support for manually specifying dependencies, when this is
+        # added to the frontend as well
+        self.data['dependencies'] = []
+
         return (options, leftover)
 
 
@@ -330,20 +334,20 @@
                 socket.setdefaulttimeout(topic_common.UPLOAD_SOCKET_TIMEOUT)
                 print 'Uploading Kernel: this may take a while...',
 
-            (ctrl_file, on_server,
-             is_synch) = self.execute_rpc(op='generate_control_file',
-                                          item=self.jobname,
-                                          **self.ctrl_file_data)
+            cf_info = self.execute_rpc(op='generate_control_file',
+                                        item=self.jobname,
+                                        **self.ctrl_file_data)
 
             if self.ctrl_file_data.has_key('kernel'):
                 print 'Done'
                 socket.setdefaulttimeout(topic_common.DEFAULT_SOCKET_TIMEOUT)
-            self.data['control_file'] = ctrl_file
-            self.data['is_synchronous'] = is_synch
-            if on_server:
+            self.data['control_file'] = cf_info['control_file']
+            self.data['is_synchronous'] = cf_info['is_synchronous']
+            if cf_info['is_server']:
                 self.data['control_type'] = 'Server'
             else:
                 self.data['control_type'] = 'Client'
+            self.data['dependencies'] = cf_info['dependencies']
         return super(job_create, self).execute()