blob: 8b6fcbbe3611d08e4701270698b14afb8bd0eca7 [file] [log] [blame]
David James0f5252f2013-04-19 08:03:14 -07001# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Download a binpkg from Google Storage.
6
7This is needed for two reasons:
8 1) In the case where a binpkg is left over in the packages dir,
9 portage doesn't handle retries well and reports an error.
10 2) gsutil retries when a download is interrupted, but it doesn't
11 handle the case where we are unable to resume a transfer and the
12 transfer needs to be restarted from scratch. Ensuring that the
13 file is deleted between each retry helps handle that eventuality.
14"""
15
16import shutil
17
18from chromite.lib import commandline
19from chromite.lib import cros_build_lib
20from chromite.lib import gs
21from chromite.lib import osutils
22
23
24def GetParser():
25 """Creates the argparse parser."""
26 parser = commandline.ArgumentParser(description=__doc__)
Mike Frysingerc9bfb472015-05-13 23:11:58 -040027 parser.add_argument('--boto', type='path', help='Path to boto auth file.')
Mike Frysinger74c70612015-12-02 18:01:41 -050028 parser.add_argument('uri', type='gs_path',
29 help='Google Storage URI to download')
30 parser.add_argument('filename', type='path',
31 help='Location to store the file.')
David James0f5252f2013-04-19 08:03:14 -070032 return parser
33
Mike Frysinger33494002014-05-07 23:46:08 -040034
David James0f5252f2013-04-19 08:03:14 -070035def Copy(ctx, uri, filename):
36 """Run the copy using a temp file."""
37 temp_path = '%s.tmp' % filename
38 osutils.SafeUnlink(temp_path)
39 try:
Alex Kleinc0bec2e2021-10-01 11:54:41 -060040 ctx.Copy(uri, temp_path, retries=10)
David James0f5252f2013-04-19 08:03:14 -070041 shutil.move(temp_path, filename)
42 finally:
43 osutils.SafeUnlink(temp_path)
44
Mike Frysinger33494002014-05-07 23:46:08 -040045
Mike Frysinger9ad5fab2013-05-30 13:37:26 -040046def main(argv):
David James0f5252f2013-04-19 08:03:14 -070047 parser = GetParser()
Mike Frysinger9ad5fab2013-05-30 13:37:26 -040048 options = parser.parse_args(argv)
Mike Frysingerc9bfb472015-05-13 23:11:58 -040049 options.Freeze()
50 ctx = gs.GSContext(boto_file=options.boto)
David James0f5252f2013-04-19 08:03:14 -070051 try:
Mike Frysinger11291062014-08-18 00:01:11 -040052 Copy(ctx, options.uri, options.filename)
53 except gs.GSContextException as ex:
David James0f5252f2013-04-19 08:03:14 -070054 # Hide the stack trace using Die.
55 cros_build_lib.Die('%s', ex)