Chromium Code Reviews| Index: testing_support/local_rietveld.py |
| diff --git a/testing_support/local_rietveld.py b/testing_support/local_rietveld.py |
| index 41b0166bf3c22a98774d24b0c27a70a36be3a229..77fc4db3f1249a7264f2780a2d23676d675dd5a5 100755 |
| --- a/testing_support/local_rietveld.py |
| +++ b/testing_support/local_rietveld.py |
| @@ -10,6 +10,7 @@ It makes sure Google AppEngine SDK is found, download Rietveld and Django code |
| if necessary and starts the server on a free inbound TCP port. |
| """ |
| +import base64 |
| import logging |
| import optparse |
| import os |
| @@ -18,6 +19,13 @@ import socket |
| import sys |
| import tempfile |
| import time |
| +import urllib2 |
| + |
| + |
| +INSTALL_GOOGLE_APPENGINE_HASH = 'f849aad85ac3589c931197bff861faf0e2ef0ece' |
| +INSTALL_GOOGLE_APPENGINE_URL = ( |
| + 'https://chromium.googlesource.com/infra/infra/+/%s' |
| + '/bootstrap/get_appengine.py?format=TEXT' % INSTALL_GOOGLE_APPENGINE_HASH) |
|
pgervais
2015/05/28 20:51:46
Downloading code before executing it is dangerous.
|
| try: |
| import subprocess2 |
| @@ -63,23 +71,38 @@ class LocalRietveld(object): |
| self.test_server = None |
| self.port = None |
| self.tempdir = None |
| + self.dev_app = None |
| - # Find the GAE SDK |
| - previous_dir = '' |
| - self.sdk_path = '' |
| - base_dir = self.base_dir |
| - while base_dir != previous_dir: |
| - previous_dir = base_dir |
| - self.sdk_path = os.path.join(base_dir, 'google_appengine') |
| - if not os.path.isfile(os.path.join(self.sdk_path, 'VERSION')): |
| - base_dir = os.path.dirname(base_dir) |
| - self.dev_app = os.path.join(self.sdk_path, 'dev_appserver.py') |
| + def urlfetch(self, url): |
| + req = urllib2.Request(url) |
| + req.add_header('User-Agent', 'depot_tools local_rietveld.py') |
| + for i in range(4): |
|
pgervais
2015/05/28 20:51:46
Please use an exponential backoff here.
|
| + try: |
| + return urllib2.urlopen(req).read() |
| + except urllib2.URLError: |
| + if i == 3: |
| + raise |
| + |
| + def download_base64_and_run(self, url, dest, args=None): |
| + with open(dest, 'wb') as f: |
| + f.write(base64.b64decode(self.urlfetch(url))) |
| + os.chmod(dest, 0755) |
| + cmd = [dest] |
| + if args: |
| + cmd.extend(args) |
| + try: |
| + subprocess2.check_call(cmd) |
| + except (OSError, subprocess2.CalledProcessError), e: |
| + raise Failure('Failed to run %s\n%s' % (cmd, e)) |
| def install_prerequisites(self): |
| - # First, verify the Google AppEngine SDK is available. |
| - if not os.path.isfile(self.dev_app): |
| - raise Failure( |
| - 'Install google_appengine sdk in %s or higher up' % self.base_dir) |
| + # First, install the Google AppEngine SDK. |
| + self.download_base64_and_run( |
| + INSTALL_GOOGLE_APPENGINE_URL, |
| + '/tmp/get_appengine.py', |
| + ['--dest=%s' % self.base_dir]) |
| + sdk_path = os.path.join(self.base_dir, 'google_appengine') |
| + self.dev_app = os.path.join(sdk_path, 'dev_appserver.py') |
| if os.path.isdir(os.path.join(self.rietveld, '.hg')): |
| # Left over from mercurial. Delete it. |