Modify dynamic suite pathway to allow some artifacts to be staged in the bgnd.

This change modifies the site_rpc_interface->dynamic_suite.py workflow to allow
autotest to stage larger build components while imaging devices. It uses
the download/wait_for_status interface provided by the devserver to
accomplish it.

BUG=chromium-os:27285
TEST=All effected unittests pass. Staging larger test on local devserver in
parallel.

Change-Id: Iae2a20762c565b8e6d440c9a501c1f99c73129ed
Reviewed-on: https://gerrit.chromium.org/gerrit/19328
Tested-by: Chris Sosa <sosa@chromium.org>
Reviewed-by: Scott Zawalski <scottz@chromium.org>
Tested-by: Scott Zawalski <scottz@chromium.org>
Commit-Ready: Scott Zawalski <scottz@chromium.org>
diff --git a/frontend/afe/site_rpc_interface.py b/frontend/afe/site_rpc_interface.py
index 3fb8937..c727319 100644
--- a/frontend/afe/site_rpc_interface.py
+++ b/frontend/afe/site_rpc_interface.py
@@ -63,9 +63,11 @@
     """
     # All suite names are assumed under test_suites/control.XX.
     suite_name = canonicalize_suite_name(suite_name)
-    # Ensure |build| is staged is on the dev server.
+    # Ensure components of |build| necessary for installing images are staged
+    # on the dev server. However set synchronous to False to allow other
+    # components to be downloaded in the background.
     ds = dev_server.DevServer.create()
-    if not ds.trigger_download(build):
+    if not ds.trigger_download(build, synchronous=False):
         raise StageBuildFailure("Server error while staging " + build)
 
     getter = control_file_getter.DevServerGetter.create(build, ds)
diff --git a/frontend/afe/site_rpc_interface_unittest.py b/frontend/afe/site_rpc_interface_unittest.py
index 686d636..c691e28 100644
--- a/frontend/afe/site_rpc_interface_unittest.py
+++ b/frontend/afe/site_rpc_interface_unittest.py
@@ -67,7 +67,8 @@
 
     def testStageBuildFail(self):
         """Ensure that a failure to stage the desired build fails the RPC."""
-        self.dev_server.trigger_download(self._BUILD).AndReturn(False)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(False)
         self.mox.ReplayAll()
         self.assertRaises(site_rpc_interface.StageBuildFailure,
                           site_rpc_interface.create_suite_job,
@@ -80,7 +81,8 @@
     def testGetControlFileFail(self):
         """Ensure that a failure to get needed control file fails the RPC."""
         self._mockDevServerGetter()
-        self.dev_server.trigger_download(self._BUILD).AndReturn(True)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(True)
         self.getter.get_control_file_contents_by_name(
             self._SUITE_NAME).AndReturn(None)
         self.mox.ReplayAll()
@@ -95,7 +97,8 @@
     def testGetControlFileListFail(self):
         """Ensure that a failure to get needed control file fails the RPC."""
         self._mockDevServerGetter()
-        self.dev_server.trigger_download(self._BUILD).AndReturn(True)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(True)
         self.getter.get_control_file_contents_by_name(
             self._SUITE_NAME).AndRaise(control_file_getter.NoControlFileList())
         self.mox.ReplayAll()
@@ -110,7 +113,8 @@
     def testCreateSuiteJobFail(self):
         """Ensure that failure to schedule the suite job fails the RPC."""
         self._mockDevServerGetter()
-        self.dev_server.trigger_download(self._BUILD).AndReturn(True)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(True)
         self.getter.get_control_file_contents_by_name(
             self._SUITE_NAME).AndReturn('f')
         self._mockRpcUtils(-1)
@@ -119,13 +123,14 @@
                                                               self._BOARD,
                                                               self._BUILD,
                                                               None),
-                          -1)
+                          - 1)
 
 
     def testCreateSuiteJobSuccess(self):
         """Ensures that success results in a successful RPC."""
         self._mockDevServerGetter()
-        self.dev_server.trigger_download(self._BUILD).AndReturn(True)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(True)
         self.getter.get_control_file_contents_by_name(
             self._SUITE_NAME).AndReturn('f')
         job_id = 5
@@ -141,7 +146,8 @@
     def testCreateSuiteJobNoHostCheckSuccess(self):
         """Ensures that success results in a successful RPC."""
         self._mockDevServerGetter()
-        self.dev_server.trigger_download(self._BUILD).AndReturn(True)
+        self.dev_server.trigger_download(self._BUILD,
+                                         synchronous=False).AndReturn(True)
         self.getter.get_control_file_contents_by_name(
             self._SUITE_NAME).AndReturn('f')
         job_id = 5