o
    <&ßa8  ã                   @   sb   d Z ddlZddlZddlmZmZ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 )
zÛResolves 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)ÚNoRegionErrorÚUnknownRegionErrorÚEndpointVariantErrorz{service}.{region}.{dnsSuffix}Ú	endpointsc                   @   s0   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   ó   t ‚)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
        ©ÚNotImplementedError)ÚselfÚservice_nameÚregion_name© r   ú2/usr/lib/python3/dist-packages/botocore/regions.pyÚconstruct_endpoint!   s   z'BaseEndpointResolver.construct_endpointc                 C   r   )z�Lists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        r   )r
   r   r   r   Úget_available_partitions>   s   z-BaseEndpointResolver.get_available_partitionsÚawsFc                 C   r   )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"]).
        r   )r
   r   Úpartition_nameÚallow_non_regionalr   r   r   Úget_available_endpointsE   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gZdd„ Zd%dd„Zd	d
„ Z			d&dd„Z	d'dd„Z				d(dd„Z
dd„ Z	d)dd„Zdd„ Z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 metadatazaws-isoz	aws-iso-bc                 C   s   d|vrt dƒ‚|| _dS )zA
        :param endpoint_data: A dict of partition data.
        Ú
partitionsz%Missing "partitions" in endpoint dataN)Ú
ValueErrorÚ_endpoint_data)r
   Úendpoint_datar   r   r   Ú__init___   s   
zEndpointResolver.__init__r   c                 C   sB   | j d D ]}|d |krq|d }||vrq|| d   S d S )Nr   Ú	partitionÚservicesr   )r   )r
   r   r   r    r!   r   r   r   Úget_service_endpoints_datag   s   úz+EndpointResolver.get_service_endpoints_datac                 C   s&   g }| j d D ]	}| |d ¡ q|S )Nr   r    )r   Úappend)r
   Úresultr    r   r   r   r   p   s   z)EndpointResolver.get_available_partitionsFNc                 C   s”   g }| j d D ]@}|d |krq|d }||vrq|| d }|D ]%}	|	|d v }
|r=|
r=|  ||	 |¡}|r<| |	¡ q!|sA|
rF| |	¡ q!q|S )Nr   r    r!   r   Úregions)r   Ú_retrieve_variant_datar#   )r
   r   r   r   Úendpoint_variant_tagsr$   r    r!   Úservice_endpointsÚendpoint_nameÚis_regional_endpointÚvariant_datar   r   r   r   v   s.   þ
€
€öz(EndpointResolver.get_available_endpointsc                 C   s\   | j d D ]&}|d |kr+|r%|  | d¡|¡}|r$d|v r$|d   S q|d   S qd S )Nr   r    ÚdefaultsÚ	dnsSuffix)r   r&   Úget)r
   r   r'   r    Úvariantr   r   r   Úget_partition_dns_suffixŽ   s   
ÿ€ùz)EndpointResolver.get_partition_dns_suffixc           	      C   s®   |dkr|r|d u rd}|d ur4d }| j d D ]
}|d |kr!|}q|d ur2|  |||||d¡}|S d S | j d D ]}|rE|d | jv rEq9|  |||||¡}|rT|  S q9d S )NÚs3z	us-east-1r   r    T)r   Ú_endpoint_for_partitionÚ!_UNSUPPORTED_DUALSTACK_PARTITIONS)	r
   r   r   r   Úuse_dualstack_endpointÚuse_fips_endpointÚvalid_partitionr    r$   r   r   r   r   ›   s<   €ýÿþÿ÷z#EndpointResolver.construct_endpointc                 C   s4   | j d D ]}|  ||¡r|d   S qt|dd�‚)Nr   r    z,No partition found for provided region_name.)r   Ú	error_msg)r   Ú_region_matchr   )r
   r   r    r   r   r   Úget_partition_for_region¼   s   ÿþz)EndpointResolver.get_partition_for_regionc                 C   s  |d }|r|| j v rd| }tdg|d�‚|d  |t¡}	|d u r.d|	v r+|	d }ntƒ ‚|||	|||dœ}
||	d v rE| jdi |
¤ŽS |  ||¡sM|r|	 d¡}|	 d	d
¡}|rp|spt d|||¡ ||
d< | jdi |
¤ŽS t d||¡ | jdi |
¤ŽS d S )Nr    z@Dualstack endpoints are currently not supported for %s partitionÚ	dualstack©Útagsr7   r!   ÚpartitionEndpoint)r    r   Úservice_datar)   r4   r5   r   ÚisRegionalizedTz'Using partition endpoint for %s, %s: %sr)   z*Creating a regex based endpoint for %s, %sr   )	r3   r   r.   ÚDEFAULT_SERVICE_DATAr   Ú_resolver8   ÚLOGÚdebug)r
   r    r   r   r4   r5   Úforce_partitionr   r7   r>   Úresolve_kwargsÚpartition_endpointÚis_regionalizedr   r   r   r2   Å   sJ   
ÿÿ
ú

ÿÿõz(EndpointResolver._endpoint_for_partitionc                 C   s0   ||d v rdS d|v rt  |d ¡ |¡S dS )Nr%   TÚregionRegexF)ÚreÚcompileÚmatch)r
   r    r   r   r   r   r8   ô   s
   zEndpointResolver._region_matchc                 C   s>   |  dg ¡}|D ]}t|d ƒt|ƒkr| ¡ }|  S qd S )NÚvariantsr<   )r.   ÚsetÚcopy)r
   r   r<   rL   r/   r$   r   r   r   r&   û   s   þÿz'EndpointResolver._retrieve_variant_datac                 C   s$   g }|r	|  d¡ |r|  d¡ |S )Nr:   Úfips)r#   )r
   r4   r5   r<   r   r   r   Ú_create_tag_list  s   

z!EndpointResolver._create_tag_listc                 C   s4   i }|||fD ]}|   ||¡}|r|  ||¡ q|S r   )r&   Ú_merge_keys)r
   r<   r   Úservice_defaultsÚpartition_defaultsr$   rL   r/   r   r   r   Ú_resolve_variant
  s   ÿ€z!EndpointResolver._resolve_variantc                 C   s  |  di ¡  |i ¡}|  d¡rt d| ¡ |  di ¡}|  di ¡}	|  ||¡}
|
rC|  |
|||	¡}|i krBd||f }t|
|d�‚n|}d|vrO|d |d< |d |d< ||d	< |  ||¡ |  |	|¡ |  ||d
 |||d ¡|d
< d|v r‡|  ||d |||d ¡|d< |S )Nr   Ú
deprecatedz5Client is configured with the deprecated endpoint: %sr,   z+Endpoint does not exist for %s in region %sr;   r-   r    ÚendpointNameÚhostnameÚsslCommonName)r.   rB   ÚwarningrP   rT   r   rQ   Ú_expand_template)r
   r    r   r>   r)   r4   r5   r   rR   rS   r<   r$   r7   r   r   r   rA     sP   
ÿÿÿþÿüþ
þzEndpointResolver._resolvec                 C   s"   |D ]}||vr|| ||< qd S r   r   )r
   Ú	from_datar$   Úkeyr   r   r   rQ   F  s
   €þzEndpointResolver._merge_keysc                 C   s   |j |||d�S )N)ÚserviceÚregionr-   )Úformat)r
   r    Útemplater   r)   r-   r   r   r   rZ   K  s   þz!EndpointResolver._expand_template)r   )r   FNr   )NNFF)F)r   r   r   r   r3   r   r"   r   r   r0   r   r9   r2   r8   r&   rP   rT   rA   rQ   rZ   r   r   r   r   r   Z   s4    
	
þ
ÿ
þ!
þ/
2r   )r   ÚloggingrI   Úbotocore.exceptionsr   r   r   Ú	getLoggerr   rB   ÚDEFAULT_URI_TEMPLATEr@   Úobjectr   r   r   r   r   r   Ú<module>   s   
;