aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/internal/util/binary_manager.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/internal/util/binary_manager.py')
-rw-r--r--catapult/telemetry/telemetry/internal/util/binary_manager.py153
1 files changed, 153 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/util/binary_manager.py b/catapult/telemetry/telemetry/internal/util/binary_manager.py
new file mode 100644
index 00000000..27f1b1d4
--- /dev/null
+++ b/catapult/telemetry/telemetry/internal/util/binary_manager.py
@@ -0,0 +1,153 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import os
+
+from py_utils import binary_manager
+from py_utils import dependency_util
+import dependency_manager
+from devil import devil_env
+
+from telemetry.core import exceptions
+from telemetry.core import util
+from telemetry.core import platform as platform_module
+
+
+TELEMETRY_PROJECT_CONFIG = os.path.join(
+ util.GetTelemetryDir(), 'telemetry', 'internal', 'binary_dependencies.json')
+
+
+CHROME_BINARY_CONFIG = os.path.join(util.GetCatapultDir(), 'common', 'py_utils',
+ 'py_utils', 'chrome_binaries.json')
+
+
+BATTOR_BINARY_CONFIG = os.path.join(util.GetCatapultDir(), 'common', 'battor',
+ 'battor', 'battor_binary_dependencies.json')
+
+
+NoPathFoundError = dependency_manager.NoPathFoundError
+CloudStorageError = dependency_manager.CloudStorageError
+
+
+_binary_manager = None
+
+
+def NeedsInit():
+ return not _binary_manager
+
+
+def InitDependencyManager(client_configs):
+ global _binary_manager
+ if _binary_manager:
+ raise exceptions.InitializationError(
+ 'Trying to re-initialize the binary manager with config %s'
+ % client_configs)
+ configs = []
+ if client_configs:
+ configs += client_configs
+ configs += [TELEMETRY_PROJECT_CONFIG, CHROME_BINARY_CONFIG]
+ _binary_manager = binary_manager.BinaryManager(configs)
+
+ devil_env.config.Initialize()
+
+
+def FetchPath(binary_name, arch, os_name, os_version=None):
+ """ Return a path to the appropriate executable for <binary_name>, downloading
+ from cloud storage if needed, or None if it cannot be found.
+ """
+ if _binary_manager is None:
+ raise exceptions.InitializationError(
+ 'Called FetchPath with uninitialized binary manager.')
+ return _binary_manager.FetchPath(binary_name, os_name, arch, os_version)
+
+
+def LocalPath(binary_name, arch, os_name, os_version=None):
+ """ Return a local path to the given binary name, or None if an executable
+ cannot be found. Will not download the executable.
+ """
+ if _binary_manager is None:
+ raise exceptions.InitializationError(
+ 'Called LocalPath with uninitialized binary manager.')
+ return _binary_manager.LocalPath(binary_name, os_name, arch, os_version)
+
+
+def FetchBinaryDependencies(platform, client_configs,
+ fetch_reference_chrome_binary):
+ """ Fetch all binary dependenencies for the given |platform|.
+
+ Note: we don't fetch browser binaries by default because the size of the
+ binary is about 2Gb, and it requires cloud storage permission to
+ chrome-telemetry bucket.
+
+ Args:
+ platform: an instance of telemetry.core.platform
+ client_configs: A list of paths (string) to dependencies json files.
+ fetch_reference_chrome_binary: whether to fetch reference chrome binary for
+ the given platform.
+ """
+ configs = [
+ dependency_manager.BaseConfig(TELEMETRY_PROJECT_CONFIG),
+ dependency_manager.BaseConfig(BATTOR_BINARY_CONFIG)
+ ]
+ dep_manager = dependency_manager.DependencyManager(configs)
+ target_platform = '%s_%s' % (platform.GetOSName(), platform.GetArchName())
+ dep_manager.PrefetchPaths(target_platform)
+
+ host_platform = None
+ fetch_devil_deps = False
+ if platform.GetOSName() == 'android':
+ host_platform = '%s_%s' % (
+ platform_module.GetHostPlatform().GetOSName(),
+ platform_module.GetHostPlatform().GetArchName())
+ dep_manager.PrefetchPaths(host_platform)
+ # TODO(aiolos): this is a hack to prefetch the devil deps.
+ if host_platform == 'linux_x86_64':
+ fetch_devil_deps = True
+ else:
+ logging.error('Devil only supports 64 bit linux as a host platform. '
+ 'Android tests may fail.')
+
+ if fetch_reference_chrome_binary:
+ _FetchReferenceBrowserBinary(platform)
+
+ # For now, handle client config separately because the BUILD.gn & .isolate of
+ # telemetry tests in chromium src failed to include the files specified in its
+ # client config.
+ # (https://github.com/catapult-project/catapult/issues/2192)
+ # For now this is ok because the client configs usually don't include cloud
+ # storage infos.
+ # TODO(nednguyen): remove the logic of swallowing exception once the issue is
+ # fixed on Chromium side.
+ if client_configs:
+ manager = dependency_manager.DependencyManager(
+ list(dependency_manager.BaseConfig(c) for c in client_configs))
+ try:
+ manager.PrefetchPaths(target_platform)
+ if host_platform is not None:
+ manager.PrefetchPaths(host_platform)
+
+ except dependency_manager.NoPathFoundError as e:
+ logging.error('Error when trying to prefetch paths for %s: %s',
+ target_platform, e.message)
+
+ if fetch_devil_deps:
+ devil_env.config.Initialize()
+ devil_env.config.PrefetchPaths(arch=platform.GetArchName())
+ devil_env.config.PrefetchPaths()
+
+
+def _FetchReferenceBrowserBinary(platform):
+ os_name = platform.GetOSName()
+ arch_name = platform.GetArchName()
+ manager = binary_manager.BinaryManager(
+ [CHROME_BINARY_CONFIG])
+ if os_name == 'android':
+ os_version = dependency_util.GetChromeApkOsVersion(
+ platform.GetOSVersionName())
+ manager.FetchPath(
+ 'chrome_stable', os_name, arch_name, os_version)
+ else:
+ manager.FetchPath(
+ 'chrome_stable', os_name, arch_name)