Support for uploading SDK board overlays.

This extends cbuildbot's prebuilts module and the upload_prebuilts.py
script to facilitate uploading of board-specific SDK overlays. This is
generally analogous to cross toolchain package uploads, so limited
refactoring was made to maintain uniformity and reduce code duplication.

BUG=brillo:918
TEST=Unit tests

Change-Id: I12a55484e58de6621fd69c21236d4a5a710a8a5d
Reviewed-on: https://chromium-review.googlesource.com/273602
Reviewed-by: Gilad Arnold <garnold@chromium.org>
Commit-Queue: Gilad Arnold <garnold@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
diff --git a/scripts/upload_prebuilts_unittest.py b/scripts/upload_prebuilts_unittest.py
index 9a75328..1d8afe5 100644
--- a/scripts/upload_prebuilts_unittest.py
+++ b/scripts/upload_prebuilts_unittest.py
@@ -393,7 +393,8 @@
           self.upload_location, 'public-read', self.binhost, [],
           self.build_path, [], False, 'foo', False, target, slave_targets,
           self.version)
-      uploader.SyncBoardPrebuilts(self.key, True, True, True, None, None, None)
+      uploader.SyncBoardPrebuilts(self.key, True, True, True, None, None, None,
+                                  None, None)
     determine_mock.assert_has_calls([
         mock.call(self.build_path, slave_targets[0]),
         mock.call(self.build_path, target),
@@ -428,6 +429,8 @@
     options.git_sync = True
     options.upload_board_tarball = True
     options.prepackaged_tarball = None
+    options.board_overlay_tarballs = []
+    options.board_overlay_upload_path = ''
     options.toolchain_tarballs = []
     options.toolchain_upload_path = ''
     options.upload = 'gs://upload/'
@@ -464,7 +467,8 @@
                                       mock.ANY)
     board_mock.assert_called_once_with(
         options.key, options.git_sync,
-        options.sync_binhost_conf, options.upload_board_tarball, None, [], '')
+        options.sync_binhost_conf, options.upload_board_tarball, None,
+        [], '', [], '')
     host_mock.assert_called_once_with(
         options.key, options.git_sync, options.sync_binhost_conf)
 
@@ -486,7 +490,8 @@
         'gs://foo', self.acl, 'prebuilt', [], '/', [],
         False, 'foo', False, 'x86-foo', [], 'chroot-1234')
 
-  def testSdkUpload(self, tc_tarballs=(), tc_upload_path=None):
+  def testSdkUpload(self, bo_tarballs=(), bo_upload_path=None,
+                    tc_tarballs=(), tc_upload_path=None):
     """Make sure we can upload just an SDK tarball"""
     tar = 'sdk.tar.xz'
     ver = '1234'
@@ -497,6 +502,10 @@
                   'gs://chromiumos-sdk/%s.Manifest' % vtar),
         mock.call(tar, 'gs://chromiumos-sdk/%s' % vtar),
     ]
+    for bo in bo_tarballs:
+      bo = bo.split(':')
+      calls.append(mock.call(
+          bo[1], ('gs://chromiumos-sdk/' + bo_upload_path) % {'board': bo[0]}))
     for tc in tc_tarballs:
       tc = tc.split(':')
       calls.append(mock.call(
@@ -505,14 +514,24 @@
         mock.ANY, 'gs://chromiumos-sdk/cros-sdk-latest.conf'))
 
     self.uploader._UploadSdkTarball('amd64-host', '',
-                                    tar, tc_tarballs, tc_upload_path)
+                                    tar, bo_tarballs, bo_upload_path,
+                                    tc_tarballs, tc_upload_path)
     self.upload_mock.assert_has_calls(calls)
 
-  def testTarballUpload(self):
-    """Make sure processing of toolchain tarballs works"""
+  def testBoardOverlayTarballUpload(self):
+    """Make sure processing of board-specific overlay tarballs works."""
+    bo_tarballs = (
+        'x86-alex:/some/built-sdk-overlay-x86-alex.tar.xz',
+        'daisy:/some/built-sdk-overlay-daisy.tar.xz',
+    )
+    bo_upload_path = '1994/04/cros-sdk-overlay-%(board)s-1994.04.02.tar.xz'
+    self.testSdkUpload(bo_tarballs=bo_tarballs, bo_upload_path=bo_upload_path)
+
+  def testToolchainTarballUpload(self):
+    """Make sure processing of toolchain tarballs works."""
     tc_tarballs = (
         'i686:/some/i686.tar.xz',
         'arm-none:/some/arm.tar.xz',
     )
     tc_upload_path = '1994/04/%(target)s-1994.04.02.tar.xz'
-    self.testSdkUpload(tc_tarballs, tc_upload_path)
+    self.testSdkUpload(tc_tarballs=tc_tarballs, tc_upload_path=tc_upload_path)