Home | History | Annotate | Download | only in dependency_manager
      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 
      5 class DependencyInfo(object):
      6   def __init__(self, dependency, platform, config_path, local_path_info=None,
      7                cloud_storage_info=None):
      8     """ Container for the information needed for each dependency/platform pair
      9     in the dependency_manager.
     10 
     11     Args:
     12         Required:
     13           dependency: Name of the dependency.
     14           platform: Name of the platform to be run on.
     15           config_path: Path to the config_path this information came from. Used
     16                        for error messages to improve debugging.
     17 
     18         Optional:
     19           local_paths: A list of paths to search in order for a local file.
     20           cloud_storage_info: An instance of CloudStorageInfo.
     21     """
     22     # TODO(aiolos): update the above doc string for A) the usage of zip files
     23     # and B) supporting lists of local_paths to be checked for most recently
     24     # changed files.
     25     if not dependency or not platform:
     26       raise ValueError(
     27           'Must supply both a dependency and platform to DependencyInfo')
     28 
     29     self._dependency = dependency
     30     self._platform = platform
     31     self._config_paths = [config_path]
     32     self._local_path_info = local_path_info
     33     self._cloud_storage_info = cloud_storage_info
     34 
     35   def Update(self, new_dep_info):
     36     """Add the information from |new_dep_info| to this instance.
     37     """
     38     self._config_paths.extend(new_dep_info.config_paths)
     39     if (self.dependency != new_dep_info.dependency or
     40         self.platform != new_dep_info.platform):
     41       raise ValueError(
     42           'Cannot update DependencyInfo with different dependency or platform.'
     43           'Existing dep: %s, existing platform: %s. New dep: %s, new platform:'
     44           '%s. Config_paths conflicting: %s' % (
     45               self.dependency, self.platform, new_dep_info.dependency,
     46               new_dep_info.platform, self.config_paths))
     47     if new_dep_info.has_cloud_storage_info:
     48       if self.has_cloud_storage_info:
     49         raise ValueError(
     50             'Overriding cloud storage data is not allowed when updating a '
     51             'DependencyInfo. Conflict in dependency %s on platform %s in '
     52             'config_paths: %s.' % (self.dependency, self.platform,
     53                                    self.config_paths))
     54       else:
     55         self._cloud_storage_info = new_dep_info._cloud_storage_info
     56     if not self._local_path_info:
     57       self._local_path_info = new_dep_info._local_path_info
     58     else:
     59       self._local_path_info.Update(new_dep_info._local_path_info)
     60 
     61   def GetRemotePath(self):
     62     """Gets the path to a downloaded version of the dependency.
     63 
     64     May not download the file if it has already been downloaded.
     65     Will unzip the downloaded file if specified in the config
     66     via unzipped_hash.
     67 
     68     Returns: A path to an executable that was stored in cloud_storage, or None
     69        if not found.
     70 
     71     Raises:
     72         CredentialsError: If cloud_storage credentials aren't configured.
     73         PermissionError: If cloud_storage credentials are configured, but not
     74             with an account that has permission to download the needed file.
     75         NotFoundError: If the needed file does not exist where expected in
     76             cloud_storage or the downloaded zip file.
     77         ServerError: If an internal server error is hit while downloading the
     78             needed file.
     79         CloudStorageError: If another error occured while downloading the remote
     80             path.
     81         FileNotFoundError: If the download was otherwise unsuccessful.
     82     """
     83     if self.has_cloud_storage_info:
     84       return self._cloud_storage_info.GetRemotePath()
     85     return None
     86 
     87   def GetRemotePathVersion(self):
     88     if self.has_cloud_storage_info:
     89       return self._cloud_storage_info.version_in_cs
     90     return None
     91 
     92   def GetLocalPath(self):
     93     """Gets the path to a local version of the dependency.
     94 
     95     Returns: A path to a local dependency, or None if not found.
     96 
     97     """
     98     if self.has_local_path_info:
     99       return self._local_path_info.GetLocalPath()
    100     return None
    101 
    102   @property
    103   def dependency(self):
    104     return self._dependency
    105 
    106   @property
    107   def platform(self):
    108     return self._platform
    109 
    110   @property
    111   def config_paths(self):
    112     return self._config_paths
    113 
    114   @property
    115   def local_path_info(self):
    116     return self._local_path_info
    117 
    118   @property
    119   def has_cloud_storage_info(self):
    120     return bool(self._cloud_storage_info)
    121 
    122   @property
    123   def has_local_path_info(self):
    124     return bool(self._local_path_info)
    125 
    126   @property
    127   def cloud_storage_info(self):
    128     return self._cloud_storage_info
    129