Reland "Use dev_server to determine the url of the devserver."

Condition for deploying required a scheduler restart.  Original
change was fine.

This reverts commit 5ca9d1b7a16b80d71acdbf01bd5b8019b13e3165.

BUG=chromium-os:26451
TEST=Unittests + local run with prod devservers

Change-Id: I9acd6bce50a8919f85ca3ed65420ad235e8501e7
Reviewed-on: https://gerrit.chromium.org/gerrit/28855
Reviewed-by: Chris Sosa <sosa@chromium.org>
Tested-by: Chris Sosa <sosa@chromium.org>
diff --git a/server/cros/dynamic_suite.py b/server/cros/dynamic_suite.py
index fa4a7fa..86e935d 100644
--- a/server/cros/dynamic_suite.py
+++ b/server/cros/dynamic_suite.py
@@ -277,7 +277,6 @@
                                         debug=False)
     manager = host_lock_manager.HostLockManager(afe=afe)
     reimager = Reimager(job.autodir, afe, tko, results_dir=job.resultdir)
-
     try:
         if skip_reimage or reimager.attempt(build, board, pool,
                                             job.record_entry, check_hosts,
@@ -368,6 +367,12 @@
     return CONFIG.get_config_value('CROS', 'package_url_pattern', type=str)
 
 
+def get_package_url(build):
+    """Returns the package url for the given build."""
+    devserver_url = dev_server.DevServer.devserver_url_for_build(build)
+    return _package_url_pattern() % (devserver_url, build)
+
+
 def skip_reimage(g):
     return g.get('SKIP_IMAGE')
 
@@ -493,7 +498,7 @@
         return job_status.gather_per_host_results(self._afe,
                                                   self._tko,
                                                   [canary_job],
-                                                  REIMAGE_JOB_NAME+'-')
+                                                  REIMAGE_JOB_NAME + '-')
 
 
     def _ensure_enough_hosts(self, board, pool, num):
@@ -601,8 +606,10 @@
         @param num_machines: how many devices to reimage.
         @return a frontend.Job object for the reimaging job we scheduled.
         """
+        image_url = _image_url_pattern() % (
+            dev_server.DevServer.devserver_url_for_build(build), build)
         control_file = inject_vars(
-            {'image_url': _image_url_pattern() % build, 'image_name': build},
+            dict(image_url=image_url, image_name=build),
             self._cf_getter.get_control_file_contents_by_name('autoupdate'))
         job_deps = []
         if pool:
diff --git a/server/cros/dynamic_suite_unittest.py b/server/cros/dynamic_suite_unittest.py
index 5efd76f..476ac51 100755
--- a/server/cros/dynamic_suite_unittest.py
+++ b/server/cros/dynamic_suite_unittest.py
@@ -16,6 +16,7 @@
 
 from autotest_lib.client.common_lib import base_job, control_data, error
 from autotest_lib.client.common_lib import global_config
+from autotest_lib.client.common_lib.cros import dev_server
 from autotest_lib.frontend.afe.json_rpc import proxy
 from autotest_lib.server.cros import control_file_getter, dynamic_suite
 from autotest_lib.server.cros import host_lock_manager, job_status
@@ -89,7 +90,7 @@
 
     def testVetRequiredReimageAndRunArgs(self):
         """Should verify only that required args are present and correct."""
-        build, board, name, job, _, _, _, _,_ = \
+        build, board, name, job, _, _, _, _, _ = \
             dynamic_suite._vet_reimage_and_run_args(**self._DARGS)
         self.assertEquals(build, self._DARGS['build'])
         self.assertEquals(board, self._DARGS['board'])
@@ -165,7 +166,8 @@
     @var _BOARD: fake board to reimage
     """
 
-    _URL = 'http://nothing/%s'
+    _DEVSERVER_URL = 'http://nothing:8082'
+    _URL = '%s/%s'
     _BUILD = 'build'
     _NUM = 4
     _BOARD = 'board'
@@ -232,12 +234,12 @@
         """Should inject dict of varibles into provided strings."""
         def find_all_in(d, s):
             """Returns true if all key-value pairs in |d| are printed in |s|."""
-            for k,v in d.iteritems():
+            for k, v in d.iteritems():
                 if isinstance(v, str):
-                    if "%s='%s'\n" % (k,v) not in s:
+                    if "%s='%s'\n" % (k, v) not in s:
                         return False
                 else:
-                    if "%s=%r\n" % (k,v) not in s:
+                    if "%s=%r\n" % (k, v) not in s:
                         return False
             return True
 
@@ -252,13 +254,17 @@
         cf_getter = self.mox.CreateMock(control_file_getter.ControlFileGetter)
         cf_getter.get_control_file_contents_by_name('autoupdate').AndReturn('')
         self.reimager._cf_getter = cf_getter
-
+        self._CONFIG.override_config_value('CROS',
+                                           'dev_server',
+                                           self._DEVSERVER_URL)
         self._CONFIG.override_config_value('CROS',
                                            'image_url_pattern',
                                            self._URL)
         self.afe.create_job(
-            control_file=mox.And(mox.StrContains(self._BUILD),
-                                 mox.StrContains(self._URL % self._BUILD)),
+            control_file=mox.And(
+                mox.StrContains(self._BUILD),
+                mox.StrContains(self._URL % (self._DEVSERVER_URL,
+                                             self._BUILD))),
             name=mox.StrContains(self._BUILD),
             control_type='Server',
             meta_hosts=[self._BOARD] * self._NUM,
@@ -268,6 +274,18 @@
         self.reimager._schedule_reimage_job(self._BUILD, self._BOARD, None,
                                             self._NUM)
 
+    def testPackageUrl(self):
+        """Should be able to get the package_url for any build."""
+        self._CONFIG.override_config_value('CROS',
+                                           'dev_server',
+                                           self._DEVSERVER_URL)
+        self._CONFIG.override_config_value('CROS',
+                                           'package_url_pattern',
+                                           self._URL)
+        self.mox.ReplayAll()
+        package_url = dynamic_suite.get_package_url(self._BUILD)
+        self.assertEqual(package_url, self._URL % (self._DEVSERVER_URL,
+                                                   self._BUILD))
 
     def expect_attempt(self, canary_job, statuses, ex=None, check_hosts=True):
         """Sets up |self.reimager| to expect an attempt() that returns |success|
@@ -293,7 +311,6 @@
         self.mox.StubOutWithMock(job_status, 'gather_per_host_results')
         self.mox.StubOutWithMock(job_status, 'record_and_report_results')
 
-
         self.reimager._ensure_version_label(mox.StrContains(self._BUILD))
         self.reimager._schedule_reimage_job(self._BUILD,
                                             self._BOARD,
@@ -318,7 +335,7 @@
                             statuses)
 
         if statuses:
-            ret_val = reduce(lambda v,s: v and s.is_good(),
+            ret_val = reduce(lambda v, s: v and s.is_good(),
                              statuses.values(), True)
             job_status.record_and_report_results(
                 statuses.values(), mox.IgnoreArg()).AndReturn(ret_val)
diff --git a/server/site_tests/autoupdate/control b/server/site_tests/autoupdate/control
index 374a4ce..0f36977 100644
--- a/server/site_tests/autoupdate/control
+++ b/server/site_tests/autoupdate/control
@@ -16,7 +16,7 @@
 Assumes that a label including the image name has already been created.
 
 @param image_url: the devserver URL at which the image to install is served.
-@param image_name: the name of the image, used to label the device
+@param image_name: the name of the image, used to label the device a.k.a. build
 """
 
 from autotest_lib.server.cros import frontend_wrappers
@@ -26,7 +26,7 @@
 if 'image_name' in locals():
     from autotest_lib.server.cros import dynamic_suite
     vers = dynamic_suite.VERSION_PREFIX
-    repo_url = dynamic_suite._package_url_pattern() % image_name
+    repo_url = dynamic_suite.get_package_url(build=image_name)
 
 AFE = frontend_wrappers.RetryingAFE(timeout_min=30, delay_sec=10, debug=False)