blob: 4c34d9625ef25e21c5e27be4352f02c5adc1c741 [file] [log] [blame]
David James8c846492011-01-25 17:07:29 -08001#!/usr/bin/python
David Jamesb619a782012-07-25 19:37:57 -07002# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
David James8c846492011-01-25 17:07:29 -08003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Brian Harringaf019fb2012-05-10 15:06:13 -07006"""This script is used to upload host prebuilts as well as board BINHOSTS.
David James8c846492011-01-25 17:07:29 -08007
David James015af872012-06-19 15:24:36 -07008Prebuilts are uploaded using gsutil to Google Storage. After these prebuilts
9are successfully uploaded, a file is updated with the proper BINHOST version.
David James8c846492011-01-25 17:07:29 -080010
11To read more about prebuilts/binhost binary packages please refer to:
David James015af872012-06-19 15:24:36 -070012http://goto/chromeos-prebuilts
David James8c846492011-01-25 17:07:29 -080013
14Example of uploading prebuilt amd64 host files to Google Storage:
David Jamesc5cbd472012-06-19 16:25:45 -070015upload_prebuilts -p /b/cbuild/build -s -u gs://chromeos-prebuilt
David James8c846492011-01-25 17:07:29 -080016
17Example of uploading x86-dogfood binhosts to Google Storage:
David Jamesc5cbd472012-06-19 16:25:45 -070018upload_prebuilts -b x86-dogfood -p /b/cbuild/build/ -u gs://chromeos-prebuilt -g
David James8c846492011-01-25 17:07:29 -080019
David James8c846492011-01-25 17:07:29 -080020"""
21
Chris Sosa1dc96132012-05-11 15:40:50 -070022import datetime
23import multiprocessing
24import optparse
25import os
26import sys
Chris Sosa1dc96132012-05-11 15:40:50 -070027
Zdenek Behan33a34112012-09-10 21:07:51 +020028from chromite.buildbot import constants
David Jamese5867812012-10-19 12:02:20 -070029from chromite.buildbot import portage_utilities
David James6450a0a2012-12-04 07:59:53 -080030from chromite.lib import binpkg
Chris Sosa1dc96132012-05-11 15:40:50 -070031from chromite.lib import cros_build_lib
David James97d95872012-11-16 15:09:56 -080032from chromite.lib import git
Brian Harring7904b482012-08-08 02:54:12 -070033from chromite.lib import gs
Brian Harringaf019fb2012-05-10 15:06:13 -070034from chromite.lib import osutils
David James6450a0a2012-12-04 07:59:53 -080035from chromite.lib import parallel
Mike Frysinger8e727a32013-01-16 16:57:53 -050036from chromite.lib import toolchain
Chris Sosa1dc96132012-05-11 15:40:50 -070037
David James015af872012-06-19 15:24:36 -070038# How many times to retry uploads.
39_RETRIES = 10
40
41# Multiplier for how long to sleep (in seconds) between retries; will delay
42# (1*sleep) the first time, then (2*sleep), continuing via attempt * sleep.
43_SLEEP_TIME = 60
44
David James8c846492011-01-25 17:07:29 -080045_HOST_PACKAGES_PATH = 'chroot/var/lib/portage/pkgs'
David James05bcb2b2011-02-09 09:25:47 -080046_CATEGORIES_PATH = 'chroot/etc/portage/categories'
David James615e5b52011-06-03 11:10:15 -070047_PYM_PATH = 'chroot/usr/lib/portage/pym'
David James4058b0d2011-12-08 21:24:50 -080048_HOST_ARCH = 'amd64'
David James8c846492011-01-25 17:07:29 -080049_BOARD_PATH = 'chroot/build/%(board)s'
David James4058b0d2011-12-08 21:24:50 -080050_REL_BOARD_PATH = 'board/%(target)s/%(version)s'
51_REL_HOST_PATH = 'host/%(host_arch)s/%(target)s/%(version)s'
David James8c846492011-01-25 17:07:29 -080052# Private overlays to look at for builds to filter
53# relative to build path
54_PRIVATE_OVERLAY_DIR = 'src/private-overlays'
Scott Zawalskiab1bed32011-03-16 15:24:24 -070055_GOOGLESTORAGE_ACL_FILE = 'googlestorage_acl.xml'
Mike Frysinger5aba4dd2013-01-16 16:42:36 -050056_BINHOST_BASE_URL = gs.PUBLIC_BASE_HTTPS_URL + 'chromeos-prebuilt'
David James8c846492011-01-25 17:07:29 -080057_PREBUILT_BASE_DIR = 'src/third_party/chromiumos-overlay/chromeos/config/'
58# Created in the event of new host targets becoming available
59_PREBUILT_MAKE_CONF = {'amd64': os.path.join(_PREBUILT_BASE_DIR,
60 'make.conf.amd64-host')}
61_BINHOST_CONF_DIR = 'src/third_party/chromiumos-overlay/chromeos/binhost'
62
63
David James4058b0d2011-12-08 21:24:50 -080064class BuildTarget(object):
65 """A board/variant/profile tuple."""
66
67 def __init__(self, board_variant, profile=None):
68 self.board_variant = board_variant
69 self.board, _, self.variant = board_variant.partition('_')
70 self.profile = profile
71
72 def __str__(self):
73 if self.profile:
74 return '%s_%s' % (self.board_variant, self.profile)
75 else:
76 return self.board_variant
77
78 def __eq__(self, other):
79 return str(other) == str(self)
80
81 def __hash__(self):
82 return hash(str(self))
83
84
David James8c846492011-01-25 17:07:29 -080085def UpdateLocalFile(filename, value, key='PORTAGE_BINHOST'):
86 """Update the key in file with the value passed.
87 File format:
88 key="value"
89 Note quotes are added automatically
90
91 Args:
92 filename: Name of file to modify.
93 value: Value to write with the key.
94 key: The variable key to update. (Default: PORTAGE_BINHOST)
95 """
96 if os.path.exists(filename):
97 file_fh = open(filename)
98 else:
99 file_fh = open(filename, 'w+')
100 file_lines = []
101 found = False
102 keyval_str = '%(key)s=%(value)s'
103 for line in file_fh:
104 # Strip newlines from end of line. We already add newlines below.
105 line = line.rstrip("\n")
106
107 if len(line.split('=')) != 2:
108 # Skip any line that doesn't fit key=val.
109 file_lines.append(line)
110 continue
111
112 file_var, file_val = line.split('=')
113 if file_var == key:
114 found = True
David James20b2b6f2011-11-18 15:11:58 -0800115 print 'Updating %s=%s to %s="%s"' % (file_var, file_val, key, value)
David James8c846492011-01-25 17:07:29 -0800116 value = '"%s"' % value
117 file_lines.append(keyval_str % {'key': key, 'value': value})
118 else:
119 file_lines.append(keyval_str % {'key': file_var, 'value': file_val})
120
121 if not found:
Brian Harring2a014302012-05-12 00:53:33 -0700122 value = '"%s"' % value
David James8c846492011-01-25 17:07:29 -0800123 file_lines.append(keyval_str % {'key': key, 'value': value})
124
125 file_fh.close()
126 # write out new file
Brian Harringaf019fb2012-05-10 15:06:13 -0700127 osutils.WriteFile(filename, '\n'.join(file_lines) + '\n')
David James8c846492011-01-25 17:07:29 -0800128
129
Mike Frysinger5b34d732013-01-17 15:11:58 -0500130def RevGitFile(filename, data, retries=5, dryrun=False):
David James8c846492011-01-25 17:07:29 -0800131 """Update and push the git file.
132
Mike Frysinger5b34d732013-01-17 15:11:58 -0500133 Args:
134 filename: file to modify that is in a git repo already
135 data: A dict of key/values to update in |filename|
136 retries: The number of times to retry before giving up, default: 5
David James8c846492011-01-25 17:07:29 -0800137 """
138 prebuilt_branch = 'prebuilt_branch'
David James1b6e67a2011-05-19 21:32:38 -0700139 cwd = os.path.abspath(os.path.dirname(filename))
David James97d95872012-11-16 15:09:56 -0800140 commit = git.RunGit(cwd, ['rev-parse', 'HEAD']).output.rstrip()
Mike Frysinger5b34d732013-01-17 15:11:58 -0500141 description = '%s: updating %s' % (os.path.basename(filename),
142 ', '.join(data.keys()))
143 # UpdateLocalFile will print out the keys/values for us.
144 print 'Revving git file %s' % filename
David James66009462012-03-25 10:08:38 -0700145
David James8c846492011-01-25 17:07:29 -0800146 try:
David James97d95872012-11-16 15:09:56 -0800147 git.CreatePushBranch(prebuilt_branch, cwd)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500148 for key, value in data.iteritems():
149 UpdateLocalFile(filename, value, key)
David James97d95872012-11-16 15:09:56 -0800150 git.RunGit(cwd, ['add', filename])
151 git.RunGit(cwd, ['commit', '-m', description])
152 git.PushWithRetry(prebuilt_branch, cwd, dryrun=dryrun, retries=retries)
David James8c846492011-01-25 17:07:29 -0800153 finally:
David James67d73252013-09-19 17:33:12 -0700154 git.RunGit(cwd, ['checkout', commit])
David James8c846492011-01-25 17:07:29 -0800155
156
157def GetVersion():
158 """Get the version to put in LATEST and update the git version with."""
Mike Frysinger0b92cfe2012-12-13 02:13:45 -0500159 return datetime.datetime.now().strftime('%Y.%m.%d.%H%M%S')
David James8c846492011-01-25 17:07:29 -0800160
161
David James015af872012-06-19 15:24:36 -0700162def _GsUpload(local_file, remote_file, acl):
David James8c846492011-01-25 17:07:29 -0800163 """Upload to GS bucket.
164
165 Args:
David Jamesfd0b0852011-02-23 11:15:36 -0800166 args: a tuple of three arguments that contains local_file, remote_file, and
167 the acl used for uploading the file.
David James8c846492011-01-25 17:07:29 -0800168
169 Returns:
170 Return the arg tuple of two if the upload failed
171 """
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700172 CANNED_ACLS = ['public-read', 'private', 'bucket-owner-read',
173 'authenticated-read', 'bucket-owner-full-control',
174 'public-read-write']
David James9374aac2013-10-08 16:00:17 -0700175 gs_context = gs.GSContext(retries=_RETRIES, sleep=_SLEEP_TIME)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700176 if acl in CANNED_ACLS:
David James9374aac2013-10-08 16:00:17 -0700177 gs_context.Copy(local_file, remote_file, acl=acl)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700178 else:
179 # For private uploads we assume that the overlay board is set up properly
David James015af872012-06-19 15:24:36 -0700180 # and a googlestore_acl.xml is present. Otherwise, this script errors.
David James9374aac2013-10-08 16:00:17 -0700181 gs_context.Copy(local_file, remote_file, acl='private')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700182 # Apply the passed in ACL xml file to the uploaded object.
David James9374aac2013-10-08 16:00:17 -0700183 gs_context.SetACL(remote_file, acl=acl)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700184
David Jamesfd0b0852011-02-23 11:15:36 -0800185def RemoteUpload(acl, files, pool=10):
David James8c846492011-01-25 17:07:29 -0800186 """Upload to google storage.
187
188 Create a pool of process and call _GsUpload with the proper arguments.
189
190 Args:
David Jamesfd0b0852011-02-23 11:15:36 -0800191 acl: The canned acl used for uploading. acl can be one of: "public-read",
192 "public-read-write", "authenticated-read", "bucket-owner-read",
193 "bucket-owner-full-control", or "private".
David James8c846492011-01-25 17:07:29 -0800194 files: dictionary with keys to local files and values to remote path.
195 pool: integer of maximum proesses to have at the same time.
196
197 Returns:
198 Return a set of tuple arguments of the failed uploads
199 """
David James015af872012-06-19 15:24:36 -0700200 tasks = [[key, value, acl] for key, value in files.iteritems()]
David James6450a0a2012-12-04 07:59:53 -0800201 parallel.RunTasksInProcessPool(_GsUpload, tasks, pool)
David James8c846492011-01-25 17:07:29 -0800202
203
204def GenerateUploadDict(base_local_path, base_remote_path, pkgs):
205 """Build a dictionary of local remote file key pairs to upload.
206
207 Args:
208 base_local_path: The base path to the files on the local hard drive.
209 remote_path: The base path to the remote paths.
210 pkgs: The packages to upload.
211
212 Returns:
213 Returns a dictionary of local_path/remote_path pairs
214 """
215 upload_files = {}
216 for pkg in pkgs:
217 suffix = pkg['CPV'] + '.tbz2'
218 local_path = os.path.join(base_local_path, suffix)
219 assert os.path.exists(local_path)
220 remote_path = '%s/%s' % (base_remote_path.rstrip('/'), suffix)
221 upload_files[local_path] = remote_path
222
223 return upload_files
224
David Jamese5867812012-10-19 12:02:20 -0700225def GetBoardOverlay(build_path, target):
226 """Get the path to the board variant.
David James8c846492011-01-25 17:07:29 -0800227 Args:
228 build_path: The path to the root of the build directory
David Jamese5867812012-10-19 12:02:20 -0700229 target: The target board as a BuildTarget object.
David James8c846492011-01-25 17:07:29 -0800230 Returns:
David Jamese5867812012-10-19 12:02:20 -0700231 The last overlay configured for the given board as a string.
David James8c846492011-01-25 17:07:29 -0800232 """
David Jamese5867812012-10-19 12:02:20 -0700233 board = target.board_variant
234 overlays = portage_utilities.FindOverlays(constants.BOTH_OVERLAYS, board,
235 buildroot=build_path)
236 # We only care about the last entry.
237 return overlays[-1]
David James8c846492011-01-25 17:07:29 -0800238
239
240def DeterminePrebuiltConfFile(build_path, target):
241 """Determine the prebuilt.conf file that needs to be updated for prebuilts.
242
243 Args:
244 build_path: The path to the root of the build directory
245 target: String representation of the board. This includes host and board
246 targets
247
248 Returns
249 A string path to a prebuilt.conf file to be updated.
250 """
David James4058b0d2011-12-08 21:24:50 -0800251 if _HOST_ARCH == target:
David James8c846492011-01-25 17:07:29 -0800252 # We are host.
253 # Without more examples of hosts this is a kludge for now.
254 # TODO(Scottz): as new host targets come online expand this to
255 # work more like boards.
Chris Sosa471532a2011-02-01 15:10:06 -0800256 make_path = _PREBUILT_MAKE_CONF[target]
David James8c846492011-01-25 17:07:29 -0800257 else:
258 # We are a board
David Jamese5867812012-10-19 12:02:20 -0700259 board = GetBoardOverlay(build_path, target)
David James8c846492011-01-25 17:07:29 -0800260 make_path = os.path.join(board, 'prebuilt.conf')
261
262 return make_path
263
264
265def UpdateBinhostConfFile(path, key, value):
266 """Update binhost config file file with key=value.
267
268 Args:
269 path: Filename to update.
270 key: Key to update.
271 value: New value for key.
272 """
273 cwd = os.path.dirname(os.path.abspath(path))
274 filename = os.path.basename(path)
Brian Harringaf019fb2012-05-10 15:06:13 -0700275 osutils.SafeMakedirs(cwd)
David Jamesf6e8fb72013-05-10 08:58:43 -0700276 if not git.GetCurrentBranch(cwd):
277 git.CreatePushBranch(constants.STABLE_EBUILD_BRANCH, cwd, sync=False)
Brian Harring22edb442012-05-11 23:55:18 -0700278 osutils.WriteFile(path, '', mode='a')
David James8c846492011-01-25 17:07:29 -0800279 UpdateLocalFile(path, value, key)
David James67d73252013-09-19 17:33:12 -0700280 git.RunGit(cwd, ['add', filename])
Mike Frysinger109cada2013-01-17 15:50:44 -0500281 description = '%s: updating %s' % (os.path.basename(filename), key)
David James67d73252013-09-19 17:33:12 -0700282 git.RunGit(cwd, ['commit', '-m', description])
David James8c846492011-01-25 17:07:29 -0800283
284
David Jamesce093af2011-02-23 15:21:58 -0800285def _GrabAllRemotePackageIndexes(binhost_urls):
David James05bcb2b2011-02-09 09:25:47 -0800286 """Grab all of the packages files associated with a list of binhost_urls.
287
David James05bcb2b2011-02-09 09:25:47 -0800288 Args:
289 binhost_urls: The URLs for the directories containing the Packages files we
290 want to grab.
David James05bcb2b2011-02-09 09:25:47 -0800291
292 Returns:
293 A list of PackageIndex objects.
294 """
295 pkg_indexes = []
296 for url in binhost_urls:
David James32faafe2012-06-08 14:25:03 -0700297 pkg_index = binpkg.GrabRemotePackageIndex(url)
David James05bcb2b2011-02-09 09:25:47 -0800298 if pkg_index:
299 pkg_indexes.append(pkg_index)
David James05bcb2b2011-02-09 09:25:47 -0800300 return pkg_indexes
301
302
David James05bcb2b2011-02-09 09:25:47 -0800303
David Jamesc0f158a2011-02-22 16:07:29 -0800304class PrebuiltUploader(object):
305 """Synchronize host and board prebuilts."""
David James8c846492011-01-25 17:07:29 -0800306
David James615e5b52011-06-03 11:10:15 -0700307 def __init__(self, upload_location, acl, binhost_base_url,
David James32b0b2f2011-07-13 20:56:50 -0700308 pkg_indexes, build_path, packages, skip_upload,
David James4058b0d2011-12-08 21:24:50 -0800309 binhost_conf_dir, debug, target, slave_targets):
David Jamesc0f158a2011-02-22 16:07:29 -0800310 """Constructor for prebuilt uploader object.
David James8c846492011-01-25 17:07:29 -0800311
David Jamesc0f158a2011-02-22 16:07:29 -0800312 This object can upload host or prebuilt files to Google Storage.
David James8c846492011-01-25 17:07:29 -0800313
David Jamesc0f158a2011-02-22 16:07:29 -0800314 Args:
315 upload_location: The upload location.
David Jamesfd0b0852011-02-23 11:15:36 -0800316 acl: The canned acl used for uploading to Google Storage. acl can be one
317 of: "public-read", "public-read-write", "authenticated-read",
318 "bucket-owner-read", "bucket-owner-full-control", or "private". If
319 we are not uploading to Google Storage, this parameter is unused.
320 binhost_base_url: The URL used for downloading the prebuilts.
David Jamesc0f158a2011-02-22 16:07:29 -0800321 pkg_indexes: Old uploaded prebuilts to compare against. Instead of
322 uploading duplicate files, we just link to the old files.
David James615e5b52011-06-03 11:10:15 -0700323 build_path: The path to the directory containing the chroot.
324 packages: Packages to upload.
David James32b0b2f2011-07-13 20:56:50 -0700325 skip_upload: Don't actually upload the tarballs.
326 binhost_conf_dir: Directory where to store binhost.conf files.
327 debug: Don't push or upload prebuilts.
David James4058b0d2011-12-08 21:24:50 -0800328 target: BuildTarget managed by this builder.
329 slave_targets: List of BuildTargets managed by slave builders.
David Jamesc0f158a2011-02-22 16:07:29 -0800330 """
331 self._upload_location = upload_location
David Jamesfd0b0852011-02-23 11:15:36 -0800332 self._acl = acl
David Jamesc0f158a2011-02-22 16:07:29 -0800333 self._binhost_base_url = binhost_base_url
334 self._pkg_indexes = pkg_indexes
David James615e5b52011-06-03 11:10:15 -0700335 self._build_path = build_path
336 self._packages = set(packages)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500337 self._found_packages = set()
David James8ece7ee2011-06-29 16:02:30 -0700338 self._skip_upload = skip_upload
David James32b0b2f2011-07-13 20:56:50 -0700339 self._binhost_conf_dir = binhost_conf_dir
David James27fa7d12011-06-29 17:24:14 -0700340 self._debug = debug
David James4058b0d2011-12-08 21:24:50 -0800341 self._target = target
342 self._slave_targets = slave_targets
David James615e5b52011-06-03 11:10:15 -0700343
344 def _ShouldFilterPackage(self, pkg):
345 if not self._packages:
346 return False
347 pym_path = os.path.abspath(os.path.join(self._build_path, _PYM_PATH))
David James710b7dc2012-02-07 16:49:59 -0800348 sys.path.insert(0, pym_path)
David James615e5b52011-06-03 11:10:15 -0700349 import portage.versions
350 cat, pkgname = portage.versions.catpkgsplit(pkg['CPV'])[0:2]
351 cp = '%s/%s' % (cat, pkgname)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500352 self._found_packages.add(cp)
David James615e5b52011-06-03 11:10:15 -0700353 return pkgname not in self._packages and cp not in self._packages
David James8c846492011-01-25 17:07:29 -0800354
David Jamesc0f158a2011-02-22 16:07:29 -0800355 def _UploadPrebuilt(self, package_path, url_suffix):
356 """Upload host or board prebuilt files to Google Storage space.
David James8c846492011-01-25 17:07:29 -0800357
David Jamesc0f158a2011-02-22 16:07:29 -0800358 Args:
359 package_path: The path to the packages dir.
David Jamesce093af2011-02-23 15:21:58 -0800360 url_suffix: The remote subdirectory where we should upload the packages.
David Jamesa3bba142011-05-26 21:24:20 -0700361
David Jamesc0f158a2011-02-22 16:07:29 -0800362 """
David James8c846492011-01-25 17:07:29 -0800363
David Jamesc0f158a2011-02-22 16:07:29 -0800364 # Process Packages file, removing duplicates and filtered packages.
David James32faafe2012-06-08 14:25:03 -0700365 pkg_index = binpkg.GrabLocalPackageIndex(package_path)
David Jamesc0f158a2011-02-22 16:07:29 -0800366 pkg_index.SetUploadLocation(self._binhost_base_url, url_suffix)
David James615e5b52011-06-03 11:10:15 -0700367 pkg_index.RemoveFilteredPackages(self._ShouldFilterPackage)
David Jamesc0f158a2011-02-22 16:07:29 -0800368 uploads = pkg_index.ResolveDuplicateUploads(self._pkg_indexes)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500369 unmatched_pkgs = self._packages - self._found_packages
370 if unmatched_pkgs:
371 cros_build_lib.Warning('unable to match packages: %r' % unmatched_pkgs)
David James05bcb2b2011-02-09 09:25:47 -0800372
David Jamesc0f158a2011-02-22 16:07:29 -0800373 # Write Packages file.
374 tmp_packages_file = pkg_index.WriteToNamedTemporaryFile()
David James05bcb2b2011-02-09 09:25:47 -0800375
David Jamesc0f158a2011-02-22 16:07:29 -0800376 remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix)
David James015af872012-06-19 15:24:36 -0700377 assert remote_location.startswith('gs://')
David James05bcb2b2011-02-09 09:25:47 -0800378
David James015af872012-06-19 15:24:36 -0700379 # Build list of files to upload.
380 upload_files = GenerateUploadDict(package_path, remote_location, uploads)
381 remote_file = '%s/Packages' % remote_location.rstrip('/')
382 upload_files[tmp_packages_file.name] = remote_file
383
384 RemoteUpload(self._acl, upload_files)
David James8c846492011-01-25 17:07:29 -0800385
Mike Frysinger9e979b92012-11-29 02:55:09 -0500386 def _UploadSdkTarball(self, board_path, url_suffix, version, prepackaged,
387 toolchain_tarballs, toolchain_upload_path):
388 """Upload a tarball of the sdk at the specified path to Google Storage.
David James8fa34ea2011-04-15 13:00:20 -0700389
390 Args:
391 board_path: The path to the board dir.
392 url_suffix: The remote subdirectory where we should upload the packages.
Zdenek Behan5ad96c02011-06-23 01:04:06 +0200393 version: The version of the board.
Zdenek Behan62a57792012-08-31 15:09:08 +0200394 prepackaged: If given, a tarball that has been packaged outside of this
395 script and should be used.
Mike Frysinger9e979b92012-11-29 02:55:09 -0500396 toolchain_tarballs: List of toolchain tarballs to upload.
397 toolchain_upload_path: Path under the bucket to place toolchain tarballs.
David James8fa34ea2011-04-15 13:00:20 -0700398 """
399 remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix)
400 assert remote_location.startswith('gs://')
Zdenek Behan86c15e92012-10-13 00:55:47 +0200401 boardname = os.path.basename(board_path.rstrip('/'))
402 # We do not upload non SDK board tarballs,
403 assert boardname == constants.CHROOT_BUILDER_BOARD
404 assert prepackaged is not None
Zdenek Behan62a57792012-08-31 15:09:08 +0200405
Zdenek Behan86c15e92012-10-13 00:55:47 +0200406 version_str = version[len('chroot-'):]
Mike Frysinger8e727a32013-01-16 16:57:53 -0500407 remote_tarfile = toolchain.GetSdkURL(
408 for_gsutil=True, suburl='cros-sdk-%s.tar.xz' % (version_str,))
Zdenek Behan86c15e92012-10-13 00:55:47 +0200409 # For SDK, also upload the manifest which is guaranteed to exist
410 # by the builderstage.
411 _GsUpload(prepackaged + '.Manifest', remote_tarfile + '.Manifest',
412 self._acl)
413 _GsUpload(prepackaged, remote_tarfile, self._acl)
414
Mike Frysinger9e979b92012-11-29 02:55:09 -0500415 # Post the toolchain tarballs too.
416 for tarball in toolchain_tarballs:
417 target, local_path = tarball.split(':')
418 suburl = toolchain_upload_path % {'target': target}
419 remote_path = toolchain.GetSdkURL(for_gsutil=True, suburl=suburl)
420 _GsUpload(local_path, remote_path, self._acl)
421
Zdenek Behan86c15e92012-10-13 00:55:47 +0200422 # Finally, also update the pointer to the latest SDK on which polling
423 # scripts rely.
David James4bc13702013-03-26 08:08:04 -0700424 with osutils.TempDir() as tmpdir:
Zdenek Behan86c15e92012-10-13 00:55:47 +0200425 pointerfile = os.path.join(tmpdir, 'cros-sdk-latest.conf')
Mike Frysinger8e727a32013-01-16 16:57:53 -0500426 remote_pointerfile = toolchain.GetSdkURL(for_gsutil=True,
427 suburl='cros-sdk-latest.conf')
Zdenek Behan86c15e92012-10-13 00:55:47 +0200428 osutils.WriteFile(pointerfile, 'LATEST_SDK="%s"' % version_str)
429 _GsUpload(pointerfile, remote_pointerfile, self._acl)
Zdenek Behan33a34112012-09-10 21:07:51 +0200430
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700431 def _GetTargets(self):
432 """Retuns the list of targets to use."""
433 targets = self._slave_targets[:]
434 if self._target:
435 targets.append(self._target)
436
437 return targets
438
439 def SyncHostPrebuilts(self, version, key, git_sync, sync_binhost_conf):
David Jamesc0f158a2011-02-22 16:07:29 -0800440 """Synchronize host prebuilt files.
David James05bcb2b2011-02-09 09:25:47 -0800441
David Jamesc0f158a2011-02-22 16:07:29 -0800442 This function will sync both the standard host packages, plus the host
443 packages associated with all targets that have been "setup" with the
444 current host's chroot. For instance, if this host has been used to build
445 x86-generic, it will sync the host packages associated with
446 'i686-pc-linux-gnu'. If this host has also been used to build arm-generic,
447 it will also sync the host packages associated with
448 'armv7a-cros-linux-gnueabi'.
David James05bcb2b2011-02-09 09:25:47 -0800449
David Jamesc0f158a2011-02-22 16:07:29 -0800450 Args:
David Jamesc0f158a2011-02-22 16:07:29 -0800451 version: A unique string, intended to be included in the upload path,
452 which identifies the version number of the uploaded prebuilts.
453 key: The variable key to update in the git file.
454 git_sync: If set, update make.conf of target to reference the latest
455 prebuilt packages generated here.
456 sync_binhost_conf: If set, update binhost config file in
457 chromiumos-overlay for the host.
458 """
David Jamese2488642011-11-14 16:15:20 -0800459 # Slave boards are listed before the master board so that the master board
460 # takes priority (i.e. x86-generic preflight host prebuilts takes priority
461 # over preflight host prebuilts from other builders.)
462 binhost_urls = []
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700463 for target in self._GetTargets():
David James4058b0d2011-12-08 21:24:50 -0800464 url_suffix = _REL_HOST_PATH % {'version': version,
465 'host_arch': _HOST_ARCH,
466 'target': target}
David Jamese2488642011-11-14 16:15:20 -0800467 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James05bcb2b2011-02-09 09:25:47 -0800468
David James4058b0d2011-12-08 21:24:50 -0800469 if self._target == target and not self._skip_upload and not self._debug:
David Jamese2488642011-11-14 16:15:20 -0800470 # Upload prebuilts.
471 package_path = os.path.join(self._build_path, _HOST_PACKAGES_PATH)
472 self._UploadPrebuilt(package_path, packages_url_suffix)
David James8ece7ee2011-06-29 16:02:30 -0700473
David Jamese2488642011-11-14 16:15:20 -0800474 # Record URL where prebuilts were uploaded.
475 binhost_urls.append('%s/%s/' % (self._binhost_base_url.rstrip('/'),
476 packages_url_suffix.rstrip('/')))
477
David James20b2b6f2011-11-18 15:11:58 -0800478 binhost = ' '.join(binhost_urls)
David James8ece7ee2011-06-29 16:02:30 -0700479 if git_sync:
480 git_file = os.path.join(self._build_path,
David James4058b0d2011-12-08 21:24:50 -0800481 _PREBUILT_MAKE_CONF[_HOST_ARCH])
Mike Frysinger5b34d732013-01-17 15:11:58 -0500482 RevGitFile(git_file, {key: binhost}, dryrun=self._debug)
David James8ece7ee2011-06-29 16:02:30 -0700483 if sync_binhost_conf:
David James32b0b2f2011-07-13 20:56:50 -0700484 binhost_conf = os.path.join(self._build_path, self._binhost_conf_dir,
David James4058b0d2011-12-08 21:24:50 -0800485 'host', '%s-%s.conf' % (_HOST_ARCH, key))
David Jamese2488642011-11-14 16:15:20 -0800486 UpdateBinhostConfFile(binhost_conf, key, binhost)
David Jamesc0f158a2011-02-22 16:07:29 -0800487
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700488 def SyncBoardPrebuilts(self, version, key, git_sync, sync_binhost_conf,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500489 upload_board_tarball, prepackaged_board,
490 toolchain_tarballs, toolchain_upload_path):
David Jamesc0f158a2011-02-22 16:07:29 -0800491 """Synchronize board prebuilt files.
492
493 Args:
David Jamesc0f158a2011-02-22 16:07:29 -0800494 version: A unique string, intended to be included in the upload path,
495 which identifies the version number of the uploaded prebuilts.
496 key: The variable key to update in the git file.
497 git_sync: If set, update make.conf of target to reference the latest
498 prebuilt packages generated here.
499 sync_binhost_conf: If set, update binhost config file in
500 chromiumos-overlay for the current board.
David James8fa34ea2011-04-15 13:00:20 -0700501 upload_board_tarball: Include a tarball of the board in our upload.
Zdenek Behan62a57792012-08-31 15:09:08 +0200502 prepackaged_board: A tarball of the board built outside of this script.
Mike Frysinger9e979b92012-11-29 02:55:09 -0500503 toolchain_tarballs: A list of toolchain tarballs to upload.
504 toolchain_upload_path: Path under the bucket to place toolchain tarballs.
David Jamesc0f158a2011-02-22 16:07:29 -0800505 """
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700506 for target in self._GetTargets():
David Jamese2488642011-11-14 16:15:20 -0800507 board_path = os.path.join(self._build_path,
David James4058b0d2011-12-08 21:24:50 -0800508 _BOARD_PATH % {'board': target.board_variant})
David Jamese2488642011-11-14 16:15:20 -0800509 package_path = os.path.join(board_path, 'packages')
David James4058b0d2011-12-08 21:24:50 -0800510 url_suffix = _REL_BOARD_PATH % {'target': target, 'version': version}
David Jamese2488642011-11-14 16:15:20 -0800511 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700512
David James4058b0d2011-12-08 21:24:50 -0800513 if self._target == target and not self._skip_upload and not self._debug:
Mike Frysinger9e979b92012-11-29 02:55:09 -0500514 version_str = version[len('chroot-'):]
515
David Jamese2488642011-11-14 16:15:20 -0800516 # Upload board tarballs in the background.
517 if upload_board_tarball:
Mike Frysinger9e979b92012-11-29 02:55:09 -0500518 if toolchain_upload_path:
519 toolchain_upload_path %= {'version': version_str}
520 tar_process = multiprocessing.Process(
521 target=self._UploadSdkTarball,
522 args=(board_path, url_suffix, version, prepackaged_board,
523 toolchain_tarballs, toolchain_upload_path))
David Jamese2488642011-11-14 16:15:20 -0800524 tar_process.start()
David James8fa34ea2011-04-15 13:00:20 -0700525
David Jamese2488642011-11-14 16:15:20 -0800526 # Upload prebuilts.
527 self._UploadPrebuilt(package_path, packages_url_suffix)
David James8fa34ea2011-04-15 13:00:20 -0700528
David Jamese2488642011-11-14 16:15:20 -0800529 # Make sure we finished uploading the board tarballs.
530 if upload_board_tarball:
531 tar_process.join()
532 assert tar_process.exitcode == 0
533 # TODO(zbehan): This should be done cleaner.
Zdenek Behan33a34112012-09-10 21:07:51 +0200534 if target.board == constants.CHROOT_BUILDER_BOARD:
David Jamese2488642011-11-14 16:15:20 -0800535 sdk_conf = os.path.join(self._build_path, self._binhost_conf_dir,
Mike Frysinger5b34d732013-01-17 15:11:58 -0500536 'host/sdk_version.conf')
537 sdk_settings = {
Mike Frysinger9e979b92012-11-29 02:55:09 -0500538 'SDK_LATEST_VERSION': version_str,
539 'TC_PATH': toolchain_upload_path,
Mike Frysinger5b34d732013-01-17 15:11:58 -0500540 }
541 RevGitFile(sdk_conf, sdk_settings, dryrun=self._debug)
David Jamesc0f158a2011-02-22 16:07:29 -0800542
David Jamese2488642011-11-14 16:15:20 -0800543 # Record URL where prebuilts were uploaded.
544 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'),
545 packages_url_suffix.rstrip('/'))
546
547 if git_sync:
David James4058b0d2011-12-08 21:24:50 -0800548 git_file = DeterminePrebuiltConfFile(self._build_path, target)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500549 RevGitFile(git_file, {key: url_value}, dryrun=self._debug)
David Jamese2488642011-11-14 16:15:20 -0800550 if sync_binhost_conf:
551 binhost_conf = os.path.join(self._build_path, self._binhost_conf_dir,
David James4058b0d2011-12-08 21:24:50 -0800552 'target', '%s-%s.conf' % (target, key))
David Jamese2488642011-11-14 16:15:20 -0800553 UpdateBinhostConfFile(binhost_conf, key, url_value)
David James05bcb2b2011-02-09 09:25:47 -0800554
555
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700556def Usage(parser, msg):
David James8c846492011-01-25 17:07:29 -0800557 """Display usage message and parser help then exit with 1."""
558 print >> sys.stderr, msg
559 parser.print_help()
560 sys.exit(1)
561
David James4058b0d2011-12-08 21:24:50 -0800562
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700563def _AddSlaveBoard(_option, _opt_str, value, parser):
564 """Callback that adds a slave board to the list of slave targets."""
David James4058b0d2011-12-08 21:24:50 -0800565 parser.values.slave_targets.append(BuildTarget(value))
566
567
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700568def _AddSlaveProfile(_option, _opt_str, value, parser):
569 """Callback that adds a slave profile to the list of slave targets."""
David James4058b0d2011-12-08 21:24:50 -0800570 if not parser.values.slave_targets:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700571 Usage(parser, 'Must specify --slave-board before --slave-profile')
David James4058b0d2011-12-08 21:24:50 -0800572 if parser.values.slave_targets[-1].profile is not None:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700573 Usage(parser, 'Cannot specify --slave-profile twice for same board')
David James4058b0d2011-12-08 21:24:50 -0800574 parser.values.slave_targets[-1].profile = value
575
576
David Jamesc0f158a2011-02-22 16:07:29 -0800577def ParseOptions():
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700578 """Returns options given by the user and the target specified.
579
580 Returns a tuple containing a parsed options object and BuildTarget.
581 target instance is None if no board is specified.
582 """
David James8c846492011-01-25 17:07:29 -0800583 parser = optparse.OptionParser()
584 parser.add_option('-H', '--binhost-base-url', dest='binhost_base_url',
585 default=_BINHOST_BASE_URL,
586 help='Base URL to use for binhost in make.conf updates')
587 parser.add_option('', '--previous-binhost-url', action='append',
588 default=[], dest='previous_binhost_url',
589 help='Previous binhost URL')
590 parser.add_option('-b', '--board', dest='board', default=None,
591 help='Board type that was built on this machine')
Zdenek Behan62a57792012-08-31 15:09:08 +0200592 parser.add_option('-B', '--prepackaged-tarball', dest='prepackaged_tarball',
593 default=None,
594 help='Board tarball prebuilt outside of this script.')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500595 parser.add_option('--toolchain-tarball', dest='toolchain_tarballs',
596 action='append', default=[],
597 help='Redistributable toolchain tarball.')
598 parser.add_option('--toolchain-upload-path', default='',
599 help='Path to place toolchain tarballs in the sdk tree.')
David James4058b0d2011-12-08 21:24:50 -0800600 parser.add_option('', '--profile', dest='profile', default=None,
601 help='Profile that was built on this machine')
602 parser.add_option('', '--slave-board', default=[], action='callback',
603 dest='slave_targets', type='string',
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700604 callback=_AddSlaveBoard,
David James4058b0d2011-12-08 21:24:50 -0800605 help='Board type that was built on a slave machine. To '
606 'add a profile to this board, use --slave-profile.')
607 parser.add_option('', '--slave-profile', action='callback', type='string',
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700608 callback=_AddSlaveProfile,
David James4058b0d2011-12-08 21:24:50 -0800609 help='Board profile that was built on a slave machine. '
610 'Applies to previous slave board.')
David James8c846492011-01-25 17:07:29 -0800611 parser.add_option('-p', '--build-path', dest='build_path',
David James05bcb2b2011-02-09 09:25:47 -0800612 help='Path to the directory containing the chroot')
David James615e5b52011-06-03 11:10:15 -0700613 parser.add_option('', '--packages', action='append',
614 default=[], dest='packages',
615 help='Only include the specified packages. '
616 '(Default is to include all packages.)')
David James8c846492011-01-25 17:07:29 -0800617 parser.add_option('-s', '--sync-host', dest='sync_host',
618 default=False, action='store_true',
619 help='Sync host prebuilts')
620 parser.add_option('-g', '--git-sync', dest='git_sync',
621 default=False, action='store_true',
David Jamese2488642011-11-14 16:15:20 -0800622 help='Enable git version sync (This commits to a repo.) '
623 'This is used by full builders to commit directly '
624 'to board overlays.')
David James8c846492011-01-25 17:07:29 -0800625 parser.add_option('-u', '--upload', dest='upload',
626 default=None,
627 help='Upload location')
628 parser.add_option('-V', '--prepend-version', dest='prepend_version',
629 default=None,
630 help='Add an identifier to the front of the version')
631 parser.add_option('-f', '--filters', dest='filters', action='store_true',
632 default=False,
633 help='Turn on filtering of private ebuild packages')
634 parser.add_option('-k', '--key', dest='key',
635 default='PORTAGE_BINHOST',
636 help='Key to update in make.conf / binhost.conf')
David James8ece7ee2011-06-29 16:02:30 -0700637 parser.add_option('', '--set-version', dest='set_version',
638 default=None,
639 help='Specify the version string')
David James8c846492011-01-25 17:07:29 -0800640 parser.add_option('', '--sync-binhost-conf', dest='sync_binhost_conf',
641 default=False, action='store_true',
David Jamese2488642011-11-14 16:15:20 -0800642 help='Update binhost.conf in chromiumos-overlay or '
643 'chromeos-overlay. Commit the changes, but don\'t '
644 'push them. This is used for preflight binhosts.')
David James32b0b2f2011-07-13 20:56:50 -0700645 parser.add_option('', '--binhost-conf-dir', dest='binhost_conf_dir',
646 default=_BINHOST_CONF_DIR,
647 help='Directory to commit binhost config with '
648 '--sync-binhost-conf.')
David Jamesfd0b0852011-02-23 11:15:36 -0800649 parser.add_option('-P', '--private', dest='private', action='store_true',
650 default=False, help='Mark gs:// uploads as private.')
David James8ece7ee2011-06-29 16:02:30 -0700651 parser.add_option('', '--skip-upload', dest='skip_upload',
652 action='store_true', default=False,
653 help='Skip upload step.')
David James8fa34ea2011-04-15 13:00:20 -0700654 parser.add_option('', '--upload-board-tarball', dest='upload_board_tarball',
655 action='store_true', default=False,
656 help='Upload board tarball to Google Storage.')
David James27fa7d12011-06-29 17:24:14 -0700657 parser.add_option('', '--debug', dest='debug',
658 action='store_true', default=False,
659 help='Don\'t push or upload prebuilts.')
David James8c846492011-01-25 17:07:29 -0800660
661 options, args = parser.parse_args()
David James8c846492011-01-25 17:07:29 -0800662 if not options.build_path:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700663 Usage(parser, 'Error: you need provide a chroot path')
David James8ece7ee2011-06-29 16:02:30 -0700664 if not options.upload and not options.skip_upload:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700665 Usage(parser, 'Error: you need to provide an upload location using -u')
David James8ece7ee2011-06-29 16:02:30 -0700666 if not options.set_version and options.skip_upload:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700667 Usage(parser, 'Error: If you are using --skip-upload, you must specify a '
David James8ece7ee2011-06-29 16:02:30 -0700668 'version number using --set-version.')
David James9417f272011-05-26 13:24:47 -0700669 if args:
David Jamesc5cbd472012-06-19 16:25:45 -0700670 Usage(parser, 'Error: invalid arguments passed to upload_prebuilts: '
671 '%r' % args)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700672
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700673 target = None
674 if options.board:
675 target = BuildTarget(options.board, options.profile)
676
677 if target in options.slave_targets:
678 Usage(parser, 'Error: --board/--profile must not also be a slave target.')
David Jamese2488642011-11-14 16:15:20 -0800679
David James4058b0d2011-12-08 21:24:50 -0800680 if len(set(options.slave_targets)) != len(options.slave_targets):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700681 Usage(parser, 'Error: --slave-boards must not have duplicates.')
David Jamese2488642011-11-14 16:15:20 -0800682
David James4058b0d2011-12-08 21:24:50 -0800683 if options.slave_targets and options.git_sync:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700684 Usage(parser, 'Error: --slave-boards is not compatible with --git-sync')
David Jamese2488642011-11-14 16:15:20 -0800685
David James8ece7ee2011-06-29 16:02:30 -0700686 if (options.upload_board_tarball and options.skip_upload and
687 options.board == 'amd64-host'):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700688 Usage(parser, 'Error: --skip-upload is not compatible with '
David James8ece7ee2011-06-29 16:02:30 -0700689 '--upload-board-tarball and --board=amd64-host')
David James8fa34ea2011-04-15 13:00:20 -0700690
David James8ece7ee2011-06-29 16:02:30 -0700691 if (options.upload_board_tarball and not options.skip_upload and
692 not options.upload.startswith('gs://')):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700693 Usage(parser, 'Error: --upload-board-tarball only works with gs:// URLs.\n'
David James8fa34ea2011-04-15 13:00:20 -0700694 '--upload must be a gs:// URL.')
695
Zdenek Behan86c15e92012-10-13 00:55:47 +0200696 if options.upload_board_tarball and options.prepackaged_tarball is None:
697 Usage(parser, 'Error: --upload-board-tarball requires '
698 '--prepackaged-tarball.')
699
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700700 if options.private:
701 if options.sync_host:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700702 Usage(parser, 'Error: --private and --sync-host/-s cannot be specified '
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700703 'together, we do not support private host prebuilts')
704
David James8ece7ee2011-06-29 16:02:30 -0700705 if not options.upload or not options.upload.startswith('gs://'):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700706 Usage(parser, 'Error: --private is only valid for gs:// URLs.\n'
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700707 '--upload must be a gs:// URL.')
708
709 if options.binhost_base_url != _BINHOST_BASE_URL:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700710 Usage(parser, 'Error: when using --private the --binhost-base-url '
David Jamese2488642011-11-14 16:15:20 -0800711 'is automatically derived.')
David James27fa7d12011-06-29 17:24:14 -0700712
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700713 return options, target
David Jamesc0f158a2011-02-22 16:07:29 -0800714
David Jamesc5cbd472012-06-19 16:25:45 -0700715def main(_argv):
David Jamesdb401072011-06-10 12:17:16 -0700716 # Set umask to a sane value so that files created as root are readable.
Mike Frysinger60ec1012013-10-21 00:11:10 -0400717 os.umask(0o22)
David Jamesdb401072011-06-10 12:17:16 -0700718
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700719 options, target = ParseOptions()
David Jamesc0f158a2011-02-22 16:07:29 -0800720
David James05bcb2b2011-02-09 09:25:47 -0800721 # Calculate a list of Packages index files to compare against. Whenever we
722 # upload a package, we check to make sure it's not already stored in one of
723 # the packages files we uploaded. This list of packages files might contain
724 # both board and host packages.
David Jamesce093af2011-02-23 15:21:58 -0800725 pkg_indexes = _GrabAllRemotePackageIndexes(options.previous_binhost_url)
David James8c846492011-01-25 17:07:29 -0800726
David James8ece7ee2011-06-29 16:02:30 -0700727 if options.set_version:
728 version = options.set_version
729 else:
730 version = GetVersion()
David Jamesc0f158a2011-02-22 16:07:29 -0800731 if options.prepend_version:
732 version = '%s-%s' % (options.prepend_version, version)
733
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700734 acl = 'public-read'
735 binhost_base_url = options.binhost_base_url
736
David Jamesadd21432013-05-21 10:04:07 -0700737 if options.private:
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700738 binhost_base_url = options.upload
David Jamesadd21432013-05-21 10:04:07 -0700739 if target:
740 board_path = GetBoardOverlay(options.build_path, target)
741 acl = os.path.join(board_path, _GOOGLESTORAGE_ACL_FILE)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700742
743 uploader = PrebuiltUploader(options.upload, acl, binhost_base_url,
David James615e5b52011-06-03 11:10:15 -0700744 pkg_indexes, options.build_path,
David James27fa7d12011-06-29 17:24:14 -0700745 options.packages, options.skip_upload,
David Jamese2488642011-11-14 16:15:20 -0800746 options.binhost_conf_dir, options.debug,
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700747 target, options.slave_targets)
David Jamesc0f158a2011-02-22 16:07:29 -0800748
David James8c846492011-01-25 17:07:29 -0800749 if options.sync_host:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700750 uploader.SyncHostPrebuilts(version, options.key, options.git_sync,
751 options.sync_binhost_conf)
David James8c846492011-01-25 17:07:29 -0800752
Chris Sosa62c8ff52012-06-04 15:03:12 -0700753 if options.board or options.slave_targets:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700754 uploader.SyncBoardPrebuilts(version, options.key, options.git_sync,
755 options.sync_binhost_conf,
Zdenek Behan62a57792012-08-31 15:09:08 +0200756 options.upload_board_tarball,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500757 options.prepackaged_tarball,
758 options.toolchain_tarballs,
759 options.toolchain_upload_path)