o
    ˷e}9                     @   s`   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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)EndpointVariantErrorNoRegionErrorUnknownRegionErrorz{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      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   G/var/www/ideatree/venv/lib/python3.10/site-packages/botocore/regions.pyconstruct_endpoint$   s   z'BaseEndpointResolver.construct_endpointc                 C   r   )zLists 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_partitionsA   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_endpointsH   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__c   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_datak   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   t   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   z   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      sN   	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      sX   	



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_variant7  s   z!EndpointResolver._resolve_variantc                 C   s"  | di  |i }| drtd|  | di }| di }	| ||}
|
rK| |
|||	}|i krDd| d| }t|
|d| || n|}d|vrW|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 z in region r;   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   A  s\   	
zEndpointResolver._resolvec                 C   s"   |D ]}||vr|| ||< qd S r   r   )r
   	from_datar$   keyr   r   r   rQ     s
   zEndpointResolver._merge_keysc                 C   s   |j |||dS )N)serviceregionr-   )format)r
   r    templater   r)   r-   r   r   r   rZ     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   ^   s6    
		


2
A
Br   )r   loggingrI   botocore.exceptionsr   r   r   	getLoggerr   rB   DEFAULT_URI_TEMPLATEr@   r   r   r   r   r   r   <module>   s   
=