xref: /aosp_15_r20/external/cronet/build/fuchsia/gcs_download.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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