Pull toolchain isos from gs:// when on bots

VS2013 isos are mirrored to gs://chrome-wintoolchain/ (which is googler-
only accessible). This is used to isolate bots from external dependency
as detected by CHROME_HEADLESS=1 in the environment.

TBR=iannucci@chromium.org
R=hinoka@chromium.org
BUG=324987

Review URL: https://codereview.chromium.org/148613003

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@247398 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/win_toolchain/toolchain2013.py b/win_toolchain/toolchain2013.py
index b1b389f..4b14214 100755
--- a/win_toolchain/toolchain2013.py
+++ b/win_toolchain/toolchain2013.py
@@ -20,6 +20,10 @@
 g_temp_dirs = []
 
 
+sys.path.append(os.path.join(BASEDIR, '..'))
+import download_from_google_storage
+
+
 def GetLongPathName(path):
   """Converts any 8dot3 names in the path to the full name."""
   buf = ctypes.create_unicode_buffer(260)
@@ -56,7 +60,9 @@
 def GetIsoUrl(pro):
   """Gets the .iso URL.
 
-  If |pro| is False, downloads the Express edition.
+  If |pro| is False, downloads the Express edition. If |CHROME_HEADLESS| is
+  set in the environment, then we assume we're on an internal bot, and download
+  from internal google storage instead.
   """
   prefix = 'http://download.microsoft.com/download/'
   if pro:
@@ -153,6 +159,31 @@
   raise SystemExit("After multiple retries, couldn't download Win8 SDK")
 
 
+def DownloadUsingGsutil(filename):
+  """Downloads the given file from Google Storage chrome-wintoolchain bucket."""
+  temp_dir = TempDir()
+  assert os.path.basename(filename) == filename
+  target_path = os.path.join(temp_dir, filename)
+  gsutil = download_from_google_storage.Gsutil(
+      download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None)
+  code = gsutil.call('cp', 'gs://chrome-wintoolchain/' + filename, target_path)
+  if code != 0:
+    raise SystemExit('gsutil failed')
+  return target_path
+
+
+def GetVSInternal():
+  """Uses gsutil to pull the toolchain from internal Google Storage bucket."""
+  return DownloadUsingGsutil('VS2013_RTM_PRO_ENU.iso')
+
+
+def GetSDKInternal():
+  """Downloads a zipped copy of the SDK from internal Google Storage bucket,
+  and extracts it."""
+  zip_file = DownloadUsingGsutil('Standalone.zip')
+  return ExtractIso(zip_file)
+
+
 class SourceImages(object):
   def __init__(self, vs_path, sdk8_path):
     self.vs_path = vs_path
@@ -161,7 +192,9 @@
 
 def GetSourceImages(local_dir, pro):
   url = GetIsoUrl(pro)
-  if local_dir:
+  if os.environ.get('CHROME_HEADLESS'):
+    return SourceImages(GetVSInternal(), GetSDKInternal())
+  elif local_dir:
     return SourceImages(os.path.join(local_dir, os.path.basename(url)),
                         os.path.join(local_dir, 'Standalone'))
   else: