U
    W+d                      @   sZ   d Z ddlZddlZddlmZ eeZdZdi iZ	G dd de
ZG dd	 d	eZdS )
zResolves regions and endpoints.

This module implements endpoint resolution, including resolving endpoints for a
given service and region and resolving the available endpoints for a service
in a specific AWS partition.
    N)NoRegionErrorz{service}.{region}.{dnsSuffix}	endpointsc                   @   s,   e Zd ZdZdddZdd Zdd	d
ZdS )BaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.Nc                 C   s   t dS )a7  Resolves an endpoint for a service and region combination.

        :type service_name: string
        :param service_name: Name of the service to resolve an endpoint for
            (e.g., s3)

        :type region_name: string
        :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
            if no region is provided, the first found partition-wide endpoint
            will be used if available.

        :rtype: dict
        :return: Returns a dict containing the following keys:
            - partition: (string, required) Resolved partition name
            - endpointName: (string, required) Resolved endpoint name
            - hostname: (string, required) Hostname to use for this endpoint
            - sslCommonName: (string) sslCommonName to use for this endpoint.
            - credentialScope: (dict) Signature version 4 credential scope
              - region: (string) region name override when signing.
              - service: (string) service name override when signing.
            - signatureVersions: (list<string>) A list of possible signature
              versions, including s3, v4, v2, and s3v4
            - protocols: (list<string>) A list of supported protocols
              (e.g., http, https)
            - ...: Other keys may be included as well based on the metadata
        NNotImplementedError)selfservice_nameregion_name r
   A/tmp/pip-unpacked-wheel-dlxw5sjy/boto/vendored/regions/regions.pyconstruct_endpoint   s    z'BaseEndpointResolver.construct_endpointc                 C   s   t dS )zLists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        Nr   )r   r
   r
   r   get_available_partitions<   s    z-BaseEndpointResolver.get_available_partitionsawsFc                 C   s   t dS )a  Lists the endpoint names of a particular partition.

        :type service_name: string
        :param service_name: Name of a service to list endpoint for (e.g., s3)

        :type partition_name: string
        :param partition_name: Name of the partition to limit endpoints to.
            (e.g., aws for the public AWS endpoints, aws-cn for AWS China
            endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.

        :type allow_non_regional: bool
        :param allow_non_regional: Set to True to include endpoints that are
             not regional endpoints (e.g., s3-external-1,
             fips-us-gov-west-1, etc).
        :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
        Nr   )r   r   partition_nameallow_non_regionalr
   r
   r   get_available_endpointsC   s    z,BaseEndpointResolver.get_available_endpoints)N)r   F)__name__
__module____qualname____doc__r   r   r   r
   r
   r
   r   r      s   
  r   c                   @   s\   e Zd ZdZdd Zdd Zddd	ZdddZdd Zdd Z	dd Z
dd Zdd Zd
S )EndpointResolverz7Resolves endpoints based on partition endpoint metadatac                 C   s   d|krt d|| _dS )zA
        :param endpoint_data: A dict of partition data.
        
partitionsz%Missing "partitions" in endpoint dataN)
ValueError_endpoint_data)r   Zendpoint_datar
   r
   r   __init__Z   s    zEndpointResolver.__init__c                 C   s&   g }| j d D ]}||d  q|S )Nr   	partitionr   append)r   resultr   r
   r
   r   r   b   s    z)EndpointResolver.get_available_partitionsr   Fc                 C   sd   g }| j d D ]P}|d |kr q|d }||kr2q|| d D ]}|sR||d kr>|| q>q|S )Nr   r   servicesr   regionsr   )r   r   r   r   r   r   r   endpoint_namer
   r
   r   r   h   s    z(EndpointResolver.get_available_endpointsNc                 C   s.   | j d D ]}| |||}|r
|  S q
d S )Nr   )r   _endpoint_for_partition)r   r   r	   r   r   r
   r
   r   r   v   s      z#EndpointResolver.construct_endpointc                 C   s   |d  |t}|d kr0d|kr*|d }nt ||d krL| ||||S | ||r| d}| dd}|r|std||| | ||||S td|| | ||||S d S )Nr   ZpartitionEndpointr   ZisRegionalizedTz'Using partition endpoint for %s, %s: %sz*Creating a regex based endpoint for %s, %s)getDEFAULT_SERVICE_DATAr   _resolve_region_matchLOGdebug)r   r   r   r	   service_dataZpartition_endpointZis_regionalizedr
   r
   r   r"   ~   sP     
   
         z(EndpointResolver._endpoint_for_partitionc                 C   s0   ||d krdS d|kr,t |d |S dS )Nr    TZregionRegexF)recompilematch)r   r   r	   r
   r
   r   r&      s
    zEndpointResolver._region_matchc                 C   s   |d  |i }|d |d< ||d< | | di | | | di | | dt}| ||d |||d< d|kr| ||d |||d< |d |d< |S )Nr   r   ZendpointNamedefaultshostnameZsslCommonName	dnsSuffix)r#   _merge_keysDEFAULT_URI_TEMPLATE_expand_template)r   r   r   r)   r!   r   r.   r
   r
   r   r%      s*         zEndpointResolver._resolvec                 C   s"   |D ]}||kr|| ||< qd S )Nr
   )r   Z	from_datar   keyr
   r
   r   r0      s    zEndpointResolver._merge_keysc                 C   s   |j |||d dS )Nr/   )ZserviceZregionr/   )format)r   r   templater   r!   r
   r
   r   r2      s
     z!EndpointResolver._expand_template)r   F)N)r   r   r   r   r   r   r   r   r"   r&   r%   r0   r2   r
   r
   r
   r   r   X   s     

r   )r   loggingr*   Z boto.vendored.regions.exceptionsr   	getLoggerr   r'   r1   r$   objectr   r   r
   r
   r
   r   <module>   s   
;