1*6777b538SAndroid Build Coastguard Worker# Copyright 2022 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport logging 6*6777b538SAndroid Build Coastguard Workerimport os 7*6777b538SAndroid Build Coastguard Workerimport subprocess 8*6777b538SAndroid Build Coastguard Workerimport sys 9*6777b538SAndroid Build Coastguard Workerimport tarfile 10*6777b538SAndroid Build Coastguard Workerimport tempfile 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workersys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 13*6777b538SAndroid Build Coastguard Worker 'test'))) 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Workerfrom common import DIR_SRC_ROOT 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Workersys.path.append(os.path.join(DIR_SRC_ROOT, 'build')) 18*6777b538SAndroid Build Coastguard Workerimport find_depot_tools 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Workerdef DownloadAndUnpackFromCloudStorage(url, output_dir): 22*6777b538SAndroid Build Coastguard Worker """Fetches a tarball from GCS and uncompresses it to |output_dir|.""" 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker # Pass the compressed stream directly to 'tarfile'; don't bother writing it 25*6777b538SAndroid Build Coastguard Worker # to disk first. 26*6777b538SAndroid Build Coastguard Worker tmp_file = 'image.tgz' 27*6777b538SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as tmp_d: 28*6777b538SAndroid Build Coastguard Worker tmp_file_location = os.path.join(tmp_d, tmp_file) 29*6777b538SAndroid Build Coastguard Worker cmd = [ 30*6777b538SAndroid Build Coastguard Worker sys.executable, 31*6777b538SAndroid Build Coastguard Worker os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, 'gsutil.py'), 'cp', url, 32*6777b538SAndroid Build Coastguard Worker tmp_file_location 33*6777b538SAndroid Build Coastguard Worker ] 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker logging.debug('Running "%s"', ' '.join(cmd)) 36*6777b538SAndroid Build Coastguard Worker task = subprocess.run(cmd, 37*6777b538SAndroid Build Coastguard Worker stderr=subprocess.PIPE, 38*6777b538SAndroid Build Coastguard Worker stdout=subprocess.PIPE, 39*6777b538SAndroid Build Coastguard Worker check=True, 40*6777b538SAndroid Build Coastguard Worker encoding='utf-8') 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker try: 43*6777b538SAndroid Build Coastguard Worker tarfile.open(name=tmp_file_location, 44*6777b538SAndroid Build Coastguard Worker mode='r|gz').extractall(path=output_dir) 45*6777b538SAndroid Build Coastguard Worker except tarfile.ReadError as exc: 46*6777b538SAndroid Build Coastguard Worker _, stderr_data = task.communicate() 47*6777b538SAndroid Build Coastguard Worker stderr_data = stderr_data.decode() 48*6777b538SAndroid Build Coastguard Worker raise subprocess.CalledProcessError( 49*6777b538SAndroid Build Coastguard Worker task.returncode, cmd, 50*6777b538SAndroid Build Coastguard Worker 'Failed to read a tarfile from gsutil.py.\n{}'.format( 51*6777b538SAndroid Build Coastguard Worker stderr_data if stderr_data else '')) from exc 52