blob: 272630d632a24c815a0f2ca887737dbb1c74d136 [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.
Mike Frysinger1a736a82013-12-12 01:50:59 -050087
David James8c846492011-01-25 17:07:29 -080088 File format:
89 key="value"
90 Note quotes are added automatically
91
92 Args:
93 filename: Name of file to modify.
94 value: Value to write with the key.
95 key: The variable key to update. (Default: PORTAGE_BINHOST)
96 """
97 if os.path.exists(filename):
98 file_fh = open(filename)
99 else:
100 file_fh = open(filename, 'w+')
101 file_lines = []
102 found = False
103 keyval_str = '%(key)s=%(value)s'
104 for line in file_fh:
105 # Strip newlines from end of line. We already add newlines below.
106 line = line.rstrip("\n")
107
108 if len(line.split('=')) != 2:
109 # Skip any line that doesn't fit key=val.
110 file_lines.append(line)
111 continue
112
113 file_var, file_val = line.split('=')
114 if file_var == key:
115 found = True
David James20b2b6f2011-11-18 15:11:58 -0800116 print 'Updating %s=%s to %s="%s"' % (file_var, file_val, key, value)
David James8c846492011-01-25 17:07:29 -0800117 value = '"%s"' % value
118 file_lines.append(keyval_str % {'key': key, 'value': value})
119 else:
120 file_lines.append(keyval_str % {'key': file_var, 'value': file_val})
121
122 if not found:
Brian Harring2a014302012-05-12 00:53:33 -0700123 value = '"%s"' % value
David James8c846492011-01-25 17:07:29 -0800124 file_lines.append(keyval_str % {'key': key, 'value': value})
125
126 file_fh.close()
127 # write out new file
Brian Harringaf019fb2012-05-10 15:06:13 -0700128 osutils.WriteFile(filename, '\n'.join(file_lines) + '\n')
David James8c846492011-01-25 17:07:29 -0800129
130
Mike Frysinger5b34d732013-01-17 15:11:58 -0500131def RevGitFile(filename, data, retries=5, dryrun=False):
David James8c846492011-01-25 17:07:29 -0800132 """Update and push the git file.
133
Mike Frysinger5b34d732013-01-17 15:11:58 -0500134 Args:
135 filename: file to modify that is in a git repo already
136 data: A dict of key/values to update in |filename|
137 retries: The number of times to retry before giving up, default: 5
David James8c846492011-01-25 17:07:29 -0800138 """
139 prebuilt_branch = 'prebuilt_branch'
David James1b6e67a2011-05-19 21:32:38 -0700140 cwd = os.path.abspath(os.path.dirname(filename))
David James97d95872012-11-16 15:09:56 -0800141 commit = git.RunGit(cwd, ['rev-parse', 'HEAD']).output.rstrip()
Mike Frysinger5b34d732013-01-17 15:11:58 -0500142 description = '%s: updating %s' % (os.path.basename(filename),
143 ', '.join(data.keys()))
144 # UpdateLocalFile will print out the keys/values for us.
145 print 'Revving git file %s' % filename
David James66009462012-03-25 10:08:38 -0700146
David James8c846492011-01-25 17:07:29 -0800147 try:
David James97d95872012-11-16 15:09:56 -0800148 git.CreatePushBranch(prebuilt_branch, cwd)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500149 for key, value in data.iteritems():
150 UpdateLocalFile(filename, value, key)
David James97d95872012-11-16 15:09:56 -0800151 git.RunGit(cwd, ['add', filename])
152 git.RunGit(cwd, ['commit', '-m', description])
153 git.PushWithRetry(prebuilt_branch, cwd, dryrun=dryrun, retries=retries)
David James8c846492011-01-25 17:07:29 -0800154 finally:
David James67d73252013-09-19 17:33:12 -0700155 git.RunGit(cwd, ['checkout', commit])
David James8c846492011-01-25 17:07:29 -0800156
157
158def GetVersion():
159 """Get the version to put in LATEST and update the git version with."""
Mike Frysinger0b92cfe2012-12-13 02:13:45 -0500160 return datetime.datetime.now().strftime('%Y.%m.%d.%H%M%S')
David James8c846492011-01-25 17:07:29 -0800161
162
David James015af872012-06-19 15:24:36 -0700163def _GsUpload(local_file, remote_file, acl):
David James8c846492011-01-25 17:07:29 -0800164 """Upload to GS bucket.
165
166 Args:
David Jamesfd0b0852011-02-23 11:15:36 -0800167 args: a tuple of three arguments that contains local_file, remote_file, and
168 the acl used for uploading the file.
David James8c846492011-01-25 17:07:29 -0800169
170 Returns:
171 Return the arg tuple of two if the upload failed
172 """
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700173 CANNED_ACLS = ['public-read', 'private', 'bucket-owner-read',
174 'authenticated-read', 'bucket-owner-full-control',
175 'public-read-write']
David James9374aac2013-10-08 16:00:17 -0700176 gs_context = gs.GSContext(retries=_RETRIES, sleep=_SLEEP_TIME)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700177 if acl in CANNED_ACLS:
David James9374aac2013-10-08 16:00:17 -0700178 gs_context.Copy(local_file, remote_file, acl=acl)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700179 else:
180 # For private uploads we assume that the overlay board is set up properly
David James015af872012-06-19 15:24:36 -0700181 # and a googlestore_acl.xml is present. Otherwise, this script errors.
David James9374aac2013-10-08 16:00:17 -0700182 gs_context.Copy(local_file, remote_file, acl='private')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700183 # Apply the passed in ACL xml file to the uploaded object.
David James9374aac2013-10-08 16:00:17 -0700184 gs_context.SetACL(remote_file, acl=acl)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700185
David Jamesfd0b0852011-02-23 11:15:36 -0800186def RemoteUpload(acl, files, pool=10):
David James8c846492011-01-25 17:07:29 -0800187 """Upload to google storage.
188
189 Create a pool of process and call _GsUpload with the proper arguments.
190
191 Args:
David Jamesfd0b0852011-02-23 11:15:36 -0800192 acl: The canned acl used for uploading. acl can be one of: "public-read",
193 "public-read-write", "authenticated-read", "bucket-owner-read",
194 "bucket-owner-full-control", or "private".
David James8c846492011-01-25 17:07:29 -0800195 files: dictionary with keys to local files and values to remote path.
196 pool: integer of maximum proesses to have at the same time.
197
198 Returns:
199 Return a set of tuple arguments of the failed uploads
200 """
David James015af872012-06-19 15:24:36 -0700201 tasks = [[key, value, acl] for key, value in files.iteritems()]
David James6450a0a2012-12-04 07:59:53 -0800202 parallel.RunTasksInProcessPool(_GsUpload, tasks, pool)
David James8c846492011-01-25 17:07:29 -0800203
204
205def GenerateUploadDict(base_local_path, base_remote_path, pkgs):
206 """Build a dictionary of local remote file key pairs to upload.
207
208 Args:
209 base_local_path: The base path to the files on the local hard drive.
210 remote_path: The base path to the remote paths.
211 pkgs: The packages to upload.
212
213 Returns:
214 Returns a dictionary of local_path/remote_path pairs
215 """
216 upload_files = {}
217 for pkg in pkgs:
218 suffix = pkg['CPV'] + '.tbz2'
219 local_path = os.path.join(base_local_path, suffix)
220 assert os.path.exists(local_path)
221 remote_path = '%s/%s' % (base_remote_path.rstrip('/'), suffix)
222 upload_files[local_path] = remote_path
223
224 return upload_files
225
David Jamese5867812012-10-19 12:02:20 -0700226def GetBoardOverlay(build_path, target):
227 """Get the path to the board variant.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500228
David James8c846492011-01-25 17:07:29 -0800229 Args:
230 build_path: The path to the root of the build directory
David Jamese5867812012-10-19 12:02:20 -0700231 target: The target board as a BuildTarget object.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500232
David James8c846492011-01-25 17:07:29 -0800233 Returns:
David Jamese5867812012-10-19 12:02:20 -0700234 The last overlay configured for the given board as a string.
David James8c846492011-01-25 17:07:29 -0800235 """
David Jamese5867812012-10-19 12:02:20 -0700236 board = target.board_variant
237 overlays = portage_utilities.FindOverlays(constants.BOTH_OVERLAYS, board,
238 buildroot=build_path)
239 # We only care about the last entry.
240 return overlays[-1]
David James8c846492011-01-25 17:07:29 -0800241
242
243def DeterminePrebuiltConfFile(build_path, target):
244 """Determine the prebuilt.conf file that needs to be updated for prebuilts.
245
Mike Frysinger1a736a82013-12-12 01:50:59 -0500246 Args:
247 build_path: The path to the root of the build directory
248 target: String representation of the board. This includes host and board
249 targets
David James8c846492011-01-25 17:07:29 -0800250
Mike Frysinger1a736a82013-12-12 01:50:59 -0500251 Returns:
252 A string path to a prebuilt.conf file to be updated.
David James8c846492011-01-25 17:07:29 -0800253 """
David James4058b0d2011-12-08 21:24:50 -0800254 if _HOST_ARCH == target:
David James8c846492011-01-25 17:07:29 -0800255 # We are host.
256 # Without more examples of hosts this is a kludge for now.
257 # TODO(Scottz): as new host targets come online expand this to
258 # work more like boards.
Chris Sosa471532a2011-02-01 15:10:06 -0800259 make_path = _PREBUILT_MAKE_CONF[target]
David James8c846492011-01-25 17:07:29 -0800260 else:
261 # We are a board
David Jamese5867812012-10-19 12:02:20 -0700262 board = GetBoardOverlay(build_path, target)
David James8c846492011-01-25 17:07:29 -0800263 make_path = os.path.join(board, 'prebuilt.conf')
264
265 return make_path
266
267
268def UpdateBinhostConfFile(path, key, value):
269 """Update binhost config file file with key=value.
270
271 Args:
272 path: Filename to update.
273 key: Key to update.
274 value: New value for key.
275 """
276 cwd = os.path.dirname(os.path.abspath(path))
277 filename = os.path.basename(path)
Brian Harringaf019fb2012-05-10 15:06:13 -0700278 osutils.SafeMakedirs(cwd)
David Jamesf6e8fb72013-05-10 08:58:43 -0700279 if not git.GetCurrentBranch(cwd):
280 git.CreatePushBranch(constants.STABLE_EBUILD_BRANCH, cwd, sync=False)
Brian Harring22edb442012-05-11 23:55:18 -0700281 osutils.WriteFile(path, '', mode='a')
David James8c846492011-01-25 17:07:29 -0800282 UpdateLocalFile(path, value, key)
David James67d73252013-09-19 17:33:12 -0700283 git.RunGit(cwd, ['add', filename])
Mike Frysinger109cada2013-01-17 15:50:44 -0500284 description = '%s: updating %s' % (os.path.basename(filename), key)
David James67d73252013-09-19 17:33:12 -0700285 git.RunGit(cwd, ['commit', '-m', description])
David James8c846492011-01-25 17:07:29 -0800286
287
David Jamesce093af2011-02-23 15:21:58 -0800288def _GrabAllRemotePackageIndexes(binhost_urls):
David James05bcb2b2011-02-09 09:25:47 -0800289 """Grab all of the packages files associated with a list of binhost_urls.
290
David James05bcb2b2011-02-09 09:25:47 -0800291 Args:
292 binhost_urls: The URLs for the directories containing the Packages files we
293 want to grab.
David James05bcb2b2011-02-09 09:25:47 -0800294
295 Returns:
296 A list of PackageIndex objects.
297 """
298 pkg_indexes = []
299 for url in binhost_urls:
David James32faafe2012-06-08 14:25:03 -0700300 pkg_index = binpkg.GrabRemotePackageIndex(url)
David James05bcb2b2011-02-09 09:25:47 -0800301 if pkg_index:
302 pkg_indexes.append(pkg_index)
David James05bcb2b2011-02-09 09:25:47 -0800303 return pkg_indexes
304
305
David James05bcb2b2011-02-09 09:25:47 -0800306
David Jamesc0f158a2011-02-22 16:07:29 -0800307class PrebuiltUploader(object):
308 """Synchronize host and board prebuilts."""
David James8c846492011-01-25 17:07:29 -0800309
David James615e5b52011-06-03 11:10:15 -0700310 def __init__(self, upload_location, acl, binhost_base_url,
David James32b0b2f2011-07-13 20:56:50 -0700311 pkg_indexes, build_path, packages, skip_upload,
David James4058b0d2011-12-08 21:24:50 -0800312 binhost_conf_dir, debug, target, slave_targets):
David Jamesc0f158a2011-02-22 16:07:29 -0800313 """Constructor for prebuilt uploader object.
David James8c846492011-01-25 17:07:29 -0800314
David Jamesc0f158a2011-02-22 16:07:29 -0800315 This object can upload host or prebuilt files to Google Storage.
David James8c846492011-01-25 17:07:29 -0800316
David Jamesc0f158a2011-02-22 16:07:29 -0800317 Args:
318 upload_location: The upload location.
David Jamesfd0b0852011-02-23 11:15:36 -0800319 acl: The canned acl used for uploading to Google Storage. acl can be one
320 of: "public-read", "public-read-write", "authenticated-read",
321 "bucket-owner-read", "bucket-owner-full-control", or "private". If
322 we are not uploading to Google Storage, this parameter is unused.
323 binhost_base_url: The URL used for downloading the prebuilts.
David Jamesc0f158a2011-02-22 16:07:29 -0800324 pkg_indexes: Old uploaded prebuilts to compare against. Instead of
325 uploading duplicate files, we just link to the old files.
David James615e5b52011-06-03 11:10:15 -0700326 build_path: The path to the directory containing the chroot.
327 packages: Packages to upload.
David James32b0b2f2011-07-13 20:56:50 -0700328 skip_upload: Don't actually upload the tarballs.
329 binhost_conf_dir: Directory where to store binhost.conf files.
330 debug: Don't push or upload prebuilts.
David James4058b0d2011-12-08 21:24:50 -0800331 target: BuildTarget managed by this builder.
332 slave_targets: List of BuildTargets managed by slave builders.
David Jamesc0f158a2011-02-22 16:07:29 -0800333 """
334 self._upload_location = upload_location
David Jamesfd0b0852011-02-23 11:15:36 -0800335 self._acl = acl
David Jamesc0f158a2011-02-22 16:07:29 -0800336 self._binhost_base_url = binhost_base_url
337 self._pkg_indexes = pkg_indexes
David James615e5b52011-06-03 11:10:15 -0700338 self._build_path = build_path
339 self._packages = set(packages)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500340 self._found_packages = set()
David James8ece7ee2011-06-29 16:02:30 -0700341 self._skip_upload = skip_upload
David James32b0b2f2011-07-13 20:56:50 -0700342 self._binhost_conf_dir = binhost_conf_dir
David James27fa7d12011-06-29 17:24:14 -0700343 self._debug = debug
David James4058b0d2011-12-08 21:24:50 -0800344 self._target = target
345 self._slave_targets = slave_targets
David James615e5b52011-06-03 11:10:15 -0700346
347 def _ShouldFilterPackage(self, pkg):
348 if not self._packages:
349 return False
350 pym_path = os.path.abspath(os.path.join(self._build_path, _PYM_PATH))
David James710b7dc2012-02-07 16:49:59 -0800351 sys.path.insert(0, pym_path)
David James615e5b52011-06-03 11:10:15 -0700352 import portage.versions
353 cat, pkgname = portage.versions.catpkgsplit(pkg['CPV'])[0:2]
354 cp = '%s/%s' % (cat, pkgname)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500355 self._found_packages.add(cp)
David James615e5b52011-06-03 11:10:15 -0700356 return pkgname not in self._packages and cp not in self._packages
David James8c846492011-01-25 17:07:29 -0800357
David Jamesc0f158a2011-02-22 16:07:29 -0800358 def _UploadPrebuilt(self, package_path, url_suffix):
359 """Upload host or board prebuilt files to Google Storage space.
David James8c846492011-01-25 17:07:29 -0800360
David Jamesc0f158a2011-02-22 16:07:29 -0800361 Args:
362 package_path: The path to the packages dir.
David Jamesce093af2011-02-23 15:21:58 -0800363 url_suffix: The remote subdirectory where we should upload the packages.
David Jamesc0f158a2011-02-22 16:07:29 -0800364 """
David Jamesc0f158a2011-02-22 16:07:29 -0800365 # Process Packages file, removing duplicates and filtered packages.
David James32faafe2012-06-08 14:25:03 -0700366 pkg_index = binpkg.GrabLocalPackageIndex(package_path)
David Jamesc0f158a2011-02-22 16:07:29 -0800367 pkg_index.SetUploadLocation(self._binhost_base_url, url_suffix)
David James615e5b52011-06-03 11:10:15 -0700368 pkg_index.RemoveFilteredPackages(self._ShouldFilterPackage)
David Jamesc0f158a2011-02-22 16:07:29 -0800369 uploads = pkg_index.ResolveDuplicateUploads(self._pkg_indexes)
Mike Frysingerf5f809a2013-02-12 13:47:37 -0500370 unmatched_pkgs = self._packages - self._found_packages
371 if unmatched_pkgs:
372 cros_build_lib.Warning('unable to match packages: %r' % unmatched_pkgs)
David James05bcb2b2011-02-09 09:25:47 -0800373
David Jamesc0f158a2011-02-22 16:07:29 -0800374 # Write Packages file.
375 tmp_packages_file = pkg_index.WriteToNamedTemporaryFile()
David James05bcb2b2011-02-09 09:25:47 -0800376
David Jamesc0f158a2011-02-22 16:07:29 -0800377 remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix)
David James015af872012-06-19 15:24:36 -0700378 assert remote_location.startswith('gs://')
David James05bcb2b2011-02-09 09:25:47 -0800379
David James015af872012-06-19 15:24:36 -0700380 # Build list of files to upload.
381 upload_files = GenerateUploadDict(package_path, remote_location, uploads)
382 remote_file = '%s/Packages' % remote_location.rstrip('/')
383 upload_files[tmp_packages_file.name] = remote_file
384
385 RemoteUpload(self._acl, upload_files)
David James8c846492011-01-25 17:07:29 -0800386
Mike Frysinger9e979b92012-11-29 02:55:09 -0500387 def _UploadSdkTarball(self, board_path, url_suffix, version, prepackaged,
388 toolchain_tarballs, toolchain_upload_path):
389 """Upload a tarball of the sdk at the specified path to Google Storage.
David James8fa34ea2011-04-15 13:00:20 -0700390
391 Args:
392 board_path: The path to the board dir.
393 url_suffix: The remote subdirectory where we should upload the packages.
Zdenek Behan5ad96c02011-06-23 01:04:06 +0200394 version: The version of the board.
Zdenek Behan62a57792012-08-31 15:09:08 +0200395 prepackaged: If given, a tarball that has been packaged outside of this
396 script and should be used.
Mike Frysinger9e979b92012-11-29 02:55:09 -0500397 toolchain_tarballs: List of toolchain tarballs to upload.
398 toolchain_upload_path: Path under the bucket to place toolchain tarballs.
David James8fa34ea2011-04-15 13:00:20 -0700399 """
400 remote_location = '%s/%s' % (self._upload_location.rstrip('/'), url_suffix)
401 assert remote_location.startswith('gs://')
Zdenek Behan86c15e92012-10-13 00:55:47 +0200402 boardname = os.path.basename(board_path.rstrip('/'))
403 # We do not upload non SDK board tarballs,
404 assert boardname == constants.CHROOT_BUILDER_BOARD
405 assert prepackaged is not None
Zdenek Behan62a57792012-08-31 15:09:08 +0200406
Zdenek Behan86c15e92012-10-13 00:55:47 +0200407 version_str = version[len('chroot-'):]
Mike Frysinger8e727a32013-01-16 16:57:53 -0500408 remote_tarfile = toolchain.GetSdkURL(
409 for_gsutil=True, suburl='cros-sdk-%s.tar.xz' % (version_str,))
Zdenek Behan86c15e92012-10-13 00:55:47 +0200410 # For SDK, also upload the manifest which is guaranteed to exist
411 # by the builderstage.
412 _GsUpload(prepackaged + '.Manifest', remote_tarfile + '.Manifest',
413 self._acl)
414 _GsUpload(prepackaged, remote_tarfile, self._acl)
415
Mike Frysinger9e979b92012-11-29 02:55:09 -0500416 # Post the toolchain tarballs too.
417 for tarball in toolchain_tarballs:
418 target, local_path = tarball.split(':')
419 suburl = toolchain_upload_path % {'target': target}
420 remote_path = toolchain.GetSdkURL(for_gsutil=True, suburl=suburl)
421 _GsUpload(local_path, remote_path, self._acl)
422
Zdenek Behan86c15e92012-10-13 00:55:47 +0200423 # Finally, also update the pointer to the latest SDK on which polling
424 # scripts rely.
David James4bc13702013-03-26 08:08:04 -0700425 with osutils.TempDir() as tmpdir:
Zdenek Behan86c15e92012-10-13 00:55:47 +0200426 pointerfile = os.path.join(tmpdir, 'cros-sdk-latest.conf')
Mike Frysinger8e727a32013-01-16 16:57:53 -0500427 remote_pointerfile = toolchain.GetSdkURL(for_gsutil=True,
428 suburl='cros-sdk-latest.conf')
Zdenek Behan86c15e92012-10-13 00:55:47 +0200429 osutils.WriteFile(pointerfile, 'LATEST_SDK="%s"' % version_str)
430 _GsUpload(pointerfile, remote_pointerfile, self._acl)
Zdenek Behan33a34112012-09-10 21:07:51 +0200431
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700432 def _GetTargets(self):
433 """Retuns the list of targets to use."""
434 targets = self._slave_targets[:]
435 if self._target:
436 targets.append(self._target)
437
438 return targets
439
440 def SyncHostPrebuilts(self, version, key, git_sync, sync_binhost_conf):
David Jamesc0f158a2011-02-22 16:07:29 -0800441 """Synchronize host prebuilt files.
David James05bcb2b2011-02-09 09:25:47 -0800442
David Jamesc0f158a2011-02-22 16:07:29 -0800443 This function will sync both the standard host packages, plus the host
444 packages associated with all targets that have been "setup" with the
445 current host's chroot. For instance, if this host has been used to build
446 x86-generic, it will sync the host packages associated with
447 'i686-pc-linux-gnu'. If this host has also been used to build arm-generic,
448 it will also sync the host packages associated with
449 'armv7a-cros-linux-gnueabi'.
David James05bcb2b2011-02-09 09:25:47 -0800450
David Jamesc0f158a2011-02-22 16:07:29 -0800451 Args:
David Jamesc0f158a2011-02-22 16:07:29 -0800452 version: A unique string, intended to be included in the upload path,
453 which identifies the version number of the uploaded prebuilts.
454 key: The variable key to update in the git file.
455 git_sync: If set, update make.conf of target to reference the latest
456 prebuilt packages generated here.
457 sync_binhost_conf: If set, update binhost config file in
458 chromiumos-overlay for the host.
459 """
David Jamese2488642011-11-14 16:15:20 -0800460 # Slave boards are listed before the master board so that the master board
461 # takes priority (i.e. x86-generic preflight host prebuilts takes priority
462 # over preflight host prebuilts from other builders.)
463 binhost_urls = []
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700464 for target in self._GetTargets():
David James4058b0d2011-12-08 21:24:50 -0800465 url_suffix = _REL_HOST_PATH % {'version': version,
466 'host_arch': _HOST_ARCH,
467 'target': target}
David Jamese2488642011-11-14 16:15:20 -0800468 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James05bcb2b2011-02-09 09:25:47 -0800469
David James4058b0d2011-12-08 21:24:50 -0800470 if self._target == target and not self._skip_upload and not self._debug:
David Jamese2488642011-11-14 16:15:20 -0800471 # Upload prebuilts.
472 package_path = os.path.join(self._build_path, _HOST_PACKAGES_PATH)
473 self._UploadPrebuilt(package_path, packages_url_suffix)
David James8ece7ee2011-06-29 16:02:30 -0700474
David Jamese2488642011-11-14 16:15:20 -0800475 # Record URL where prebuilts were uploaded.
476 binhost_urls.append('%s/%s/' % (self._binhost_base_url.rstrip('/'),
477 packages_url_suffix.rstrip('/')))
478
David James20b2b6f2011-11-18 15:11:58 -0800479 binhost = ' '.join(binhost_urls)
David James8ece7ee2011-06-29 16:02:30 -0700480 if git_sync:
481 git_file = os.path.join(self._build_path,
David James4058b0d2011-12-08 21:24:50 -0800482 _PREBUILT_MAKE_CONF[_HOST_ARCH])
Mike Frysinger5b34d732013-01-17 15:11:58 -0500483 RevGitFile(git_file, {key: binhost}, dryrun=self._debug)
David James8ece7ee2011-06-29 16:02:30 -0700484 if sync_binhost_conf:
David James32b0b2f2011-07-13 20:56:50 -0700485 binhost_conf = os.path.join(self._build_path, self._binhost_conf_dir,
David James4058b0d2011-12-08 21:24:50 -0800486 'host', '%s-%s.conf' % (_HOST_ARCH, key))
David Jamese2488642011-11-14 16:15:20 -0800487 UpdateBinhostConfFile(binhost_conf, key, binhost)
David Jamesc0f158a2011-02-22 16:07:29 -0800488
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700489 def SyncBoardPrebuilts(self, version, key, git_sync, sync_binhost_conf,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500490 upload_board_tarball, prepackaged_board,
491 toolchain_tarballs, toolchain_upload_path):
David Jamesc0f158a2011-02-22 16:07:29 -0800492 """Synchronize board prebuilt files.
493
494 Args:
David Jamesc0f158a2011-02-22 16:07:29 -0800495 version: A unique string, intended to be included in the upload path,
496 which identifies the version number of the uploaded prebuilts.
497 key: The variable key to update in the git file.
498 git_sync: If set, update make.conf of target to reference the latest
499 prebuilt packages generated here.
500 sync_binhost_conf: If set, update binhost config file in
501 chromiumos-overlay for the current board.
David James8fa34ea2011-04-15 13:00:20 -0700502 upload_board_tarball: Include a tarball of the board in our upload.
Zdenek Behan62a57792012-08-31 15:09:08 +0200503 prepackaged_board: A tarball of the board built outside of this script.
Mike Frysinger9e979b92012-11-29 02:55:09 -0500504 toolchain_tarballs: A list of toolchain tarballs to upload.
505 toolchain_upload_path: Path under the bucket to place toolchain tarballs.
David Jamesc0f158a2011-02-22 16:07:29 -0800506 """
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700507 for target in self._GetTargets():
David Jamese2488642011-11-14 16:15:20 -0800508 board_path = os.path.join(self._build_path,
David James4058b0d2011-12-08 21:24:50 -0800509 _BOARD_PATH % {'board': target.board_variant})
David Jamese2488642011-11-14 16:15:20 -0800510 package_path = os.path.join(board_path, 'packages')
David James4058b0d2011-12-08 21:24:50 -0800511 url_suffix = _REL_BOARD_PATH % {'target': target, 'version': version}
David Jamese2488642011-11-14 16:15:20 -0800512 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700513
David James4058b0d2011-12-08 21:24:50 -0800514 if self._target == target and not self._skip_upload and not self._debug:
Mike Frysinger9e979b92012-11-29 02:55:09 -0500515 version_str = version[len('chroot-'):]
516
David Jamese2488642011-11-14 16:15:20 -0800517 # Upload board tarballs in the background.
518 if upload_board_tarball:
Mike Frysinger9e979b92012-11-29 02:55:09 -0500519 if toolchain_upload_path:
520 toolchain_upload_path %= {'version': version_str}
521 tar_process = multiprocessing.Process(
522 target=self._UploadSdkTarball,
523 args=(board_path, url_suffix, version, prepackaged_board,
524 toolchain_tarballs, toolchain_upload_path))
David Jamese2488642011-11-14 16:15:20 -0800525 tar_process.start()
David James8fa34ea2011-04-15 13:00:20 -0700526
David Jamese2488642011-11-14 16:15:20 -0800527 # Upload prebuilts.
528 self._UploadPrebuilt(package_path, packages_url_suffix)
David James8fa34ea2011-04-15 13:00:20 -0700529
David Jamese2488642011-11-14 16:15:20 -0800530 # Make sure we finished uploading the board tarballs.
531 if upload_board_tarball:
532 tar_process.join()
533 assert tar_process.exitcode == 0
534 # TODO(zbehan): This should be done cleaner.
Zdenek Behan33a34112012-09-10 21:07:51 +0200535 if target.board == constants.CHROOT_BUILDER_BOARD:
David Jamese2488642011-11-14 16:15:20 -0800536 sdk_conf = os.path.join(self._build_path, self._binhost_conf_dir,
Mike Frysinger5b34d732013-01-17 15:11:58 -0500537 'host/sdk_version.conf')
538 sdk_settings = {
Mike Frysinger9e979b92012-11-29 02:55:09 -0500539 'SDK_LATEST_VERSION': version_str,
540 'TC_PATH': toolchain_upload_path,
Mike Frysinger5b34d732013-01-17 15:11:58 -0500541 }
542 RevGitFile(sdk_conf, sdk_settings, dryrun=self._debug)
David Jamesc0f158a2011-02-22 16:07:29 -0800543
David Jamese2488642011-11-14 16:15:20 -0800544 # Record URL where prebuilts were uploaded.
545 url_value = '%s/%s/' % (self._binhost_base_url.rstrip('/'),
546 packages_url_suffix.rstrip('/'))
547
548 if git_sync:
David James4058b0d2011-12-08 21:24:50 -0800549 git_file = DeterminePrebuiltConfFile(self._build_path, target)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500550 RevGitFile(git_file, {key: url_value}, dryrun=self._debug)
David Jamese2488642011-11-14 16:15:20 -0800551 if sync_binhost_conf:
552 binhost_conf = os.path.join(self._build_path, self._binhost_conf_dir,
David James4058b0d2011-12-08 21:24:50 -0800553 'target', '%s-%s.conf' % (target, key))
David Jamese2488642011-11-14 16:15:20 -0800554 UpdateBinhostConfFile(binhost_conf, key, url_value)
David James05bcb2b2011-02-09 09:25:47 -0800555
556
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700557def Usage(parser, msg):
David James8c846492011-01-25 17:07:29 -0800558 """Display usage message and parser help then exit with 1."""
559 print >> sys.stderr, msg
560 parser.print_help()
561 sys.exit(1)
562
David James4058b0d2011-12-08 21:24:50 -0800563
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700564def _AddSlaveBoard(_option, _opt_str, value, parser):
565 """Callback that adds a slave board to the list of slave targets."""
David James4058b0d2011-12-08 21:24:50 -0800566 parser.values.slave_targets.append(BuildTarget(value))
567
568
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700569def _AddSlaveProfile(_option, _opt_str, value, parser):
570 """Callback that adds a slave profile to the list of slave targets."""
David James4058b0d2011-12-08 21:24:50 -0800571 if not parser.values.slave_targets:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700572 Usage(parser, 'Must specify --slave-board before --slave-profile')
David James4058b0d2011-12-08 21:24:50 -0800573 if parser.values.slave_targets[-1].profile is not None:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700574 Usage(parser, 'Cannot specify --slave-profile twice for same board')
David James4058b0d2011-12-08 21:24:50 -0800575 parser.values.slave_targets[-1].profile = value
576
577
David Jamesc0f158a2011-02-22 16:07:29 -0800578def ParseOptions():
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700579 """Returns options given by the user and the target specified.
580
Mike Frysinger1a736a82013-12-12 01:50:59 -0500581 Returns:
582 A tuple containing a parsed options object and BuildTarget.
583 The target instance is None if no board is specified.
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700584 """
David James8c846492011-01-25 17:07:29 -0800585 parser = optparse.OptionParser()
586 parser.add_option('-H', '--binhost-base-url', dest='binhost_base_url',
587 default=_BINHOST_BASE_URL,
588 help='Base URL to use for binhost in make.conf updates')
589 parser.add_option('', '--previous-binhost-url', action='append',
590 default=[], dest='previous_binhost_url',
591 help='Previous binhost URL')
592 parser.add_option('-b', '--board', dest='board', default=None,
593 help='Board type that was built on this machine')
Zdenek Behan62a57792012-08-31 15:09:08 +0200594 parser.add_option('-B', '--prepackaged-tarball', dest='prepackaged_tarball',
595 default=None,
596 help='Board tarball prebuilt outside of this script.')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500597 parser.add_option('--toolchain-tarball', dest='toolchain_tarballs',
598 action='append', default=[],
599 help='Redistributable toolchain tarball.')
600 parser.add_option('--toolchain-upload-path', default='',
601 help='Path to place toolchain tarballs in the sdk tree.')
David James4058b0d2011-12-08 21:24:50 -0800602 parser.add_option('', '--profile', dest='profile', default=None,
603 help='Profile that was built on this machine')
604 parser.add_option('', '--slave-board', default=[], action='callback',
605 dest='slave_targets', type='string',
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700606 callback=_AddSlaveBoard,
David James4058b0d2011-12-08 21:24:50 -0800607 help='Board type that was built on a slave machine. To '
608 'add a profile to this board, use --slave-profile.')
609 parser.add_option('', '--slave-profile', action='callback', type='string',
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700610 callback=_AddSlaveProfile,
David James4058b0d2011-12-08 21:24:50 -0800611 help='Board profile that was built on a slave machine. '
612 'Applies to previous slave board.')
David James8c846492011-01-25 17:07:29 -0800613 parser.add_option('-p', '--build-path', dest='build_path',
David James05bcb2b2011-02-09 09:25:47 -0800614 help='Path to the directory containing the chroot')
David James615e5b52011-06-03 11:10:15 -0700615 parser.add_option('', '--packages', action='append',
616 default=[], dest='packages',
617 help='Only include the specified packages. '
618 '(Default is to include all packages.)')
David James8c846492011-01-25 17:07:29 -0800619 parser.add_option('-s', '--sync-host', dest='sync_host',
620 default=False, action='store_true',
621 help='Sync host prebuilts')
622 parser.add_option('-g', '--git-sync', dest='git_sync',
623 default=False, action='store_true',
David Jamese2488642011-11-14 16:15:20 -0800624 help='Enable git version sync (This commits to a repo.) '
625 'This is used by full builders to commit directly '
626 'to board overlays.')
David James8c846492011-01-25 17:07:29 -0800627 parser.add_option('-u', '--upload', dest='upload',
628 default=None,
629 help='Upload location')
630 parser.add_option('-V', '--prepend-version', dest='prepend_version',
631 default=None,
632 help='Add an identifier to the front of the version')
633 parser.add_option('-f', '--filters', dest='filters', action='store_true',
634 default=False,
635 help='Turn on filtering of private ebuild packages')
636 parser.add_option('-k', '--key', dest='key',
637 default='PORTAGE_BINHOST',
638 help='Key to update in make.conf / binhost.conf')
David James8ece7ee2011-06-29 16:02:30 -0700639 parser.add_option('', '--set-version', dest='set_version',
640 default=None,
641 help='Specify the version string')
David James8c846492011-01-25 17:07:29 -0800642 parser.add_option('', '--sync-binhost-conf', dest='sync_binhost_conf',
643 default=False, action='store_true',
David Jamese2488642011-11-14 16:15:20 -0800644 help='Update binhost.conf in chromiumos-overlay or '
645 'chromeos-overlay. Commit the changes, but don\'t '
646 'push them. This is used for preflight binhosts.')
David James32b0b2f2011-07-13 20:56:50 -0700647 parser.add_option('', '--binhost-conf-dir', dest='binhost_conf_dir',
648 default=_BINHOST_CONF_DIR,
649 help='Directory to commit binhost config with '
650 '--sync-binhost-conf.')
David Jamesfd0b0852011-02-23 11:15:36 -0800651 parser.add_option('-P', '--private', dest='private', action='store_true',
652 default=False, help='Mark gs:// uploads as private.')
David James8ece7ee2011-06-29 16:02:30 -0700653 parser.add_option('', '--skip-upload', dest='skip_upload',
654 action='store_true', default=False,
655 help='Skip upload step.')
David James8fa34ea2011-04-15 13:00:20 -0700656 parser.add_option('', '--upload-board-tarball', dest='upload_board_tarball',
657 action='store_true', default=False,
658 help='Upload board tarball to Google Storage.')
David James27fa7d12011-06-29 17:24:14 -0700659 parser.add_option('', '--debug', dest='debug',
660 action='store_true', default=False,
661 help='Don\'t push or upload prebuilts.')
David James8c846492011-01-25 17:07:29 -0800662
663 options, args = parser.parse_args()
David James8c846492011-01-25 17:07:29 -0800664 if not options.build_path:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700665 Usage(parser, 'Error: you need provide a chroot path')
David James8ece7ee2011-06-29 16:02:30 -0700666 if not options.upload and not options.skip_upload:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700667 Usage(parser, 'Error: you need to provide an upload location using -u')
David James8ece7ee2011-06-29 16:02:30 -0700668 if not options.set_version and options.skip_upload:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700669 Usage(parser, 'Error: If you are using --skip-upload, you must specify a '
David James8ece7ee2011-06-29 16:02:30 -0700670 'version number using --set-version.')
David James9417f272011-05-26 13:24:47 -0700671 if args:
David Jamesc5cbd472012-06-19 16:25:45 -0700672 Usage(parser, 'Error: invalid arguments passed to upload_prebuilts: '
673 '%r' % args)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700674
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700675 target = None
676 if options.board:
677 target = BuildTarget(options.board, options.profile)
678
679 if target in options.slave_targets:
680 Usage(parser, 'Error: --board/--profile must not also be a slave target.')
David Jamese2488642011-11-14 16:15:20 -0800681
David James4058b0d2011-12-08 21:24:50 -0800682 if len(set(options.slave_targets)) != len(options.slave_targets):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700683 Usage(parser, 'Error: --slave-boards must not have duplicates.')
David Jamese2488642011-11-14 16:15:20 -0800684
David James4058b0d2011-12-08 21:24:50 -0800685 if options.slave_targets and options.git_sync:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700686 Usage(parser, 'Error: --slave-boards is not compatible with --git-sync')
David Jamese2488642011-11-14 16:15:20 -0800687
David James8ece7ee2011-06-29 16:02:30 -0700688 if (options.upload_board_tarball and options.skip_upload and
689 options.board == 'amd64-host'):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700690 Usage(parser, 'Error: --skip-upload is not compatible with '
David James8ece7ee2011-06-29 16:02:30 -0700691 '--upload-board-tarball and --board=amd64-host')
David James8fa34ea2011-04-15 13:00:20 -0700692
David James8ece7ee2011-06-29 16:02:30 -0700693 if (options.upload_board_tarball and not options.skip_upload and
694 not options.upload.startswith('gs://')):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700695 Usage(parser, 'Error: --upload-board-tarball only works with gs:// URLs.\n'
David James8fa34ea2011-04-15 13:00:20 -0700696 '--upload must be a gs:// URL.')
697
Zdenek Behan86c15e92012-10-13 00:55:47 +0200698 if options.upload_board_tarball and options.prepackaged_tarball is None:
699 Usage(parser, 'Error: --upload-board-tarball requires '
700 '--prepackaged-tarball.')
701
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700702 if options.private:
703 if options.sync_host:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700704 Usage(parser, 'Error: --private and --sync-host/-s cannot be specified '
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700705 'together, we do not support private host prebuilts')
706
David James8ece7ee2011-06-29 16:02:30 -0700707 if not options.upload or not options.upload.startswith('gs://'):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700708 Usage(parser, 'Error: --private is only valid for gs:// URLs.\n'
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700709 '--upload must be a gs:// URL.')
710
711 if options.binhost_base_url != _BINHOST_BASE_URL:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700712 Usage(parser, 'Error: when using --private the --binhost-base-url '
David Jamese2488642011-11-14 16:15:20 -0800713 'is automatically derived.')
David James27fa7d12011-06-29 17:24:14 -0700714
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700715 return options, target
David Jamesc0f158a2011-02-22 16:07:29 -0800716
David Jamesc5cbd472012-06-19 16:25:45 -0700717def main(_argv):
David Jamesdb401072011-06-10 12:17:16 -0700718 # Set umask to a sane value so that files created as root are readable.
Mike Frysinger60ec1012013-10-21 00:11:10 -0400719 os.umask(0o22)
David Jamesdb401072011-06-10 12:17:16 -0700720
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700721 options, target = ParseOptions()
David Jamesc0f158a2011-02-22 16:07:29 -0800722
David James05bcb2b2011-02-09 09:25:47 -0800723 # Calculate a list of Packages index files to compare against. Whenever we
724 # upload a package, we check to make sure it's not already stored in one of
725 # the packages files we uploaded. This list of packages files might contain
726 # both board and host packages.
David Jamesce093af2011-02-23 15:21:58 -0800727 pkg_indexes = _GrabAllRemotePackageIndexes(options.previous_binhost_url)
David James8c846492011-01-25 17:07:29 -0800728
David James8ece7ee2011-06-29 16:02:30 -0700729 if options.set_version:
730 version = options.set_version
731 else:
732 version = GetVersion()
David Jamesc0f158a2011-02-22 16:07:29 -0800733 if options.prepend_version:
734 version = '%s-%s' % (options.prepend_version, version)
735
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700736 acl = 'public-read'
737 binhost_base_url = options.binhost_base_url
738
David Jamesadd21432013-05-21 10:04:07 -0700739 if options.private:
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700740 binhost_base_url = options.upload
David Jamesadd21432013-05-21 10:04:07 -0700741 if target:
742 board_path = GetBoardOverlay(options.build_path, target)
743 acl = os.path.join(board_path, _GOOGLESTORAGE_ACL_FILE)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700744
745 uploader = PrebuiltUploader(options.upload, acl, binhost_base_url,
David James615e5b52011-06-03 11:10:15 -0700746 pkg_indexes, options.build_path,
David James27fa7d12011-06-29 17:24:14 -0700747 options.packages, options.skip_upload,
David Jamese2488642011-11-14 16:15:20 -0800748 options.binhost_conf_dir, options.debug,
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700749 target, options.slave_targets)
David Jamesc0f158a2011-02-22 16:07:29 -0800750
David James8c846492011-01-25 17:07:29 -0800751 if options.sync_host:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700752 uploader.SyncHostPrebuilts(version, options.key, options.git_sync,
753 options.sync_binhost_conf)
David James8c846492011-01-25 17:07:29 -0800754
Chris Sosa62c8ff52012-06-04 15:03:12 -0700755 if options.board or options.slave_targets:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700756 uploader.SyncBoardPrebuilts(version, options.key, options.git_sync,
757 options.sync_binhost_conf,
Zdenek Behan62a57792012-08-31 15:09:08 +0200758 options.upload_board_tarball,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500759 options.prepackaged_tarball,
760 options.toolchain_tarballs,
761 options.toolchain_upload_path)