def PrepareBinhostUploads(input_proto, output_proto, config): """Return a list of files to upload to the binhost. See BinhostService documentation in api/proto/binhost.proto. Args: input_proto (PrepareBinhostUploadsRequest): The input proto. output_proto (PrepareBinhostUploadsResponse): The output proto. config (api_config.ApiConfig): The API call config. """ if input_proto.sysroot.build_target.name: build_target_msg = input_proto.sysroot.build_target else: build_target_msg = input_proto.build_target sysroot_path = input_proto.sysroot.path if not sysroot_path and not build_target_msg.name: cros_build_lib.Die('Sysroot.path is required.') build_target = controller_util.ParseBuildTarget(build_target_msg) chroot = controller_util.ParseChroot(input_proto.chroot) if not sysroot_path: sysroot_path = build_target.root sysroot = sysroot_lib.Sysroot(sysroot_path) uri = input_proto.uri # For now, we enforce that all input URIs are Google Storage buckets. if not gs.PathIsGs(uri): raise ValueError('Upload URI %s must be Google Storage.' % uri) if config.validate_only: return controller.RETURN_CODE_VALID_INPUT parsed_uri = urllib.parse.urlparse(uri) upload_uri = gs.GetGsURL(parsed_uri.netloc, for_gsutil=True).rstrip('/') upload_path = parsed_uri.path.lstrip('/') # Read all packages and update the index. The index must be uploaded to the # binhost for Portage to use it, so include it in upload_targets. uploads_dir = binhost.GetPrebuiltsRoot(chroot, sysroot, build_target) index_path = binhost.UpdatePackageIndex(uploads_dir, upload_uri, upload_path, sudo=True) upload_targets = binhost.GetPrebuiltsFiles(uploads_dir) assert index_path.startswith(uploads_dir), ( 'expected index_path to start with uploads_dir') upload_targets.append(index_path[len(uploads_dir):]) output_proto.uploads_dir = uploads_dir for upload_target in upload_targets: output_proto.upload_targets.add().path = upload_target.strip('/')
def testUpdatePackageIndex(self): """UpdatePackageIndex writes updated file to disk.""" packages_content = """\ ARCH: amd64 TTL: 0 CPV: package/prebuilt """ osutils.WriteFile(os.path.join(self.root, 'Packages'), packages_content) binhost.UpdatePackageIndex(self.root, 'gs://chromeos-prebuilt', 'target/') actual = binpkg.GrabLocalPackageIndex(self.root) self.assertEqual(actual.header['URI'], 'gs://chromeos-prebuilt') self.assertEqual(int(actual.header['TTL']), 60 * 60 * 24 * 365) self.assertEqual(actual.packages, [{ 'CPV': 'package/prebuilt', 'PATH': 'target/package/prebuilt.tbz2' }])
def testAbsoluteUploadPath(self): """Test UpdatePackageIndex raises an error for absolute paths.""" with self.assertRaises(AssertionError): binhost.UpdatePackageIndex(self.root, 'gs://chromeos-prebuilt', '/target')