Home | History | Annotate | Download | only in gslib
      1 # -*- coding: utf-8 -*-
      2 # Copyright 2013 Google Inc. All Rights Reserved.
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #     http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 """API map classes used with the CloudApiDelegator class."""
     16 
     17 from __future__ import absolute_import
     18 
     19 from gslib.boto_translation import BotoTranslation
     20 from gslib.gcs_json_api import GcsJsonApi
     21 
     22 
     23 class ApiSelector(object):
     24   """Enum class for API."""
     25   XML = 'XML'
     26   JSON = 'JSON'
     27 
     28 
     29 class ApiMapConstants(object):
     30   """Enum class for API map entries."""
     31   API_MAP = 'apiclass'
     32   SUPPORT_MAP = 'supported'
     33   DEFAULT_MAP = 'default'
     34 
     35 
     36 class GsutilApiClassMapFactory(object):
     37   """Factory for generating gsutil API class maps.
     38 
     39   A valid class map is defined as:
     40     {
     41       (key) Provider prefix used in URI strings.
     42       (value) {
     43         (key) ApiSelector describing the API format.
     44         (value) CloudApi child class that implements this API.
     45       }
     46     }
     47   """
     48 
     49   @classmethod
     50   def GetClassMap(cls):
     51     """Returns the default gsutil class map."""
     52     gs_class_map = {
     53         ApiSelector.XML: BotoTranslation,
     54         ApiSelector.JSON: GcsJsonApi
     55     }
     56     s3_class_map = {
     57         ApiSelector.XML: BotoTranslation
     58     }
     59     class_map = {
     60         'gs': gs_class_map,
     61         's3': s3_class_map
     62     }
     63     return class_map
     64 
     65 
     66 class GsutilApiMapFactory(object):
     67   """Factory the generates the default gsutil API map.
     68 
     69     The API map determines which Cloud API implementation is used for a given
     70     command.  A valid API map is defined as:
     71     {
     72       (key) ApiMapConstants.API_MAP : (value) Gsutil API class map (as
     73           described in GsutilApiClassMapFactory comments).
     74       (key) ApiMapConstants.SUPPORT_MAP : (value) {
     75         (key) Provider prefix used in URI strings.
     76         (value) list of ApiSelectors supported by the command for this provider.
     77       }
     78       (key) ApiMapConstants.DEFAULT_MAP : (value) {
     79         (key) Provider prefix used in URI strings.
     80         (value) Default ApiSelector for this command and provider.
     81       }
     82     }
     83   """
     84 
     85   @classmethod
     86   def GetApiMap(cls, gsutil_api_class_map_factory, support_map, default_map):
     87     """Creates a GsutilApiMap for use by the command from the inputs.
     88 
     89     Args:
     90       gsutil_api_class_map_factory: Factory defining a GetClassMap() function
     91                                     adhering to GsutilApiClassMapFactory
     92                                     semantics.
     93       support_map: Entries for ApiMapConstants.SUPPORT_MAP as described above.
     94       default_map: Entries for ApiMapConstants.DEFAULT_MAP as described above.
     95 
     96     Returns:
     97       GsutilApiMap generated from the inputs.
     98     """
     99     return {
    100         ApiMapConstants.API_MAP: gsutil_api_class_map_factory.GetClassMap(),
    101         ApiMapConstants.SUPPORT_MAP: support_map,
    102         ApiMapConstants.DEFAULT_MAP: default_map
    103     }
    104