1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import os
6
7from catapult_base import binary_manager
8from dependency_manager import base_config
9from dependency_manager import exceptions as dependency_manager_exceptions
10from devil import devil_env
11
12from telemetry.core import exceptions
13from telemetry.core import util
14
15
16TELEMETRY_PROJECT_CONFIG = os.path.join(
17    util.GetTelemetryDir(), 'telemetry', 'internal', 'binary_dependencies.json')
18
19
20CHROME_BINARY_CONFIG = os.path.join(util.GetCatapultDir(), 'catapult_base',
21                                    'catapult_base', 'chrome_binaries.json')
22
23
24NoPathFoundError = dependency_manager_exceptions.NoPathFoundError
25CloudStorageError = dependency_manager_exceptions.CloudStorageError
26
27
28_binary_manager = None
29
30
31def NeedsInit():
32  return not _binary_manager
33
34
35def InitDependencyManager(environment_config):
36  global _binary_manager
37  if _binary_manager:
38    raise exceptions.InitializationError(
39        'Trying to re-initialize the binary manager with config %s'
40        % environment_config)
41  configs = [base_config.BaseConfig(TELEMETRY_PROJECT_CONFIG),
42             base_config.BaseConfig(CHROME_BINARY_CONFIG)]
43  if environment_config:
44    configs.insert(0, base_config.BaseConfig(environment_config))
45  _binary_manager = binary_manager.BinaryManager(configs)
46
47  devil_env.config.Initialize()
48
49
50def FetchPath(binary_name, arch, os_name, os_version=None):
51  """ Return a path to the appropriate executable for <binary_name>, downloading
52      from cloud storage if needed, or None if it cannot be found.
53  """
54  if _binary_manager is None:
55    raise exceptions.InitializationError(
56        'Called FetchPath with uninitialized binary manager.')
57  return _binary_manager.FetchPath(binary_name, arch, os_name, os_version)
58
59
60def LocalPath(binary_name, arch, os_name, os_version=None):
61  """ Return a local path to the given binary name, or None if an executable
62      cannot be found. Will not download the executable.
63      """
64  if _binary_manager is None:
65    raise exceptions.InitializationError(
66        'Called LocalPath with uninitialized binary manager.')
67  return _binary_manager.LocalPath(binary_name, arch, os_name, os_version)
68