U
    ³.¬bC+  ã                   @   sÀ   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZ e  e¡ZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS )é    N)Ú
xform_name)ÚBotoCoreErrorÚConnectionErrorÚHTTPClientError)ÚOperationNotFoundError)ÚCachedPropertyc                   @   s   e Zd ZdS )ÚEndpointDiscoveryExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú6/tmp/pip-unpacked-wheel-7df6wvge/botocore/discovery.pyr      s   r   c                   @   s   e Zd ZdZdZdS )ÚEndpointDiscoveryRequiredzBEndpoint Discovery is disabled but is required for this operation.zAEndpoint Discovery is not enabled but this operation requires it.N©r	   r
   r   Ú__doc__Úfmtr   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdS )ÚEndpointDiscoveryRefreshFailedz=Endpoint Discovery failed to the refresh the known endpoints.z<Endpoint Discovery failed to refresh the required endpoints.Nr   r   r   r   r   r   #   s   r   c                 K   s   | j }|r| d¡rtƒ ‚d S )NÚrequired)Úendpoint_discoveryÚgetr   )ÚmodelÚkwargsr   r   r   r   Ú,block_endpoint_discovery_required_operations)   s    r   c                   @   sN   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	d
„ Zdd„ Z	ddd„Z
dS )ÚEndpointDiscoveryModelc                 C   s
   || _ d S ©N)Ú_service_model)ÚselfÚservice_modelr   r   r   Ú__init__0   s    zEndpointDiscoveryModel.__init__c                 C   s   | j j}t|jƒS r   )r   Úendpoint_discovery_operationr   Úname)r   Údiscovery_operationr   r   r   Údiscovery_operation_name3   s    z/EndpointDiscoveryModel.discovery_operation_namec                 C   s&   | j j}g }|jr"t|jj ¡ ƒ}|S r   )r   r   Úinput_shapeÚlistÚmembersÚkeys)r   r!   r&   r   r   r   Údiscovery_operation_keys8   s
    z/EndpointDiscoveryModel.discovery_operation_keysc                 C   s8   z| j  |¡}|j dd¡W S  tk
r2   Y dS X d S )Nr   F)r   Úoperation_modelr   r   r   )r   Úoperation_namer(   r   r   r   Údiscovery_required_for@   s    ÿz-EndpointDiscoveryModel.discovery_required_forc                    s>   | j ‰ | d¡s(| dd ¡ | dd ¡ ‡ fdd„| ¡ D ƒS )NÚIdentifiersÚ	Operationc                    s   i | ]\}}|ˆ kr||“qS r   r   ©Ú.0ÚkÚv©Z
input_keysr   r   Ú
<dictcomp>O   s       zEEndpointDiscoveryModel.discovery_operation_kwargs.<locals>.<dictcomp>)r'   r   ÚpopÚitems©r   r   r   r1   r   Údiscovery_operation_kwargsI   s
    
z1EndpointDiscoveryModel.discovery_operation_kwargsc                 C   s   |   |j|¡S r   )Ú_gather_idsr#   ©r   Ú	operationÚparamsr   r   r   Úgather_identifiersQ   s    z)EndpointDiscoveryModel.gather_identifiersNc                 C   sb   |d kri }|j  ¡ D ]F\}}|j d¡r8|| ||< q|jdkr||kr|  ||| |¡ q|S )NZendpointdiscoveryidZ	structure)r%   r4   Úmetadatar   Ú	type_namer7   )r   Úshaper:   ÚidsÚmember_nameZmember_shaper   r   r   r7   T   s    ÿÿz"EndpointDiscoveryModel._gather_ids)N)r	   r
   r   r   r   r"   r'   r*   r6   r;   r7   r   r   r   r   r   /   s   

	r   c                   @   sn   e Z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d„ Zdd„ Zdd„ Zdd„ ZdS )ÚEndpointDiscoveryManagerNTc                 C   sP   |d kri }|| _ i | _|d kr&tj}|| _|| _t |¡| _t|j	j
ƒ| _d S r   )Ú_cacheÚ_failed_attemptsÚtimeÚ_timeÚ_always_discoverÚweakrefÚproxyÚ_clientr   Úmetar   Ú_model)r   ÚclientÚcacheÚcurrent_timeZalways_discoverr   r   r   r   d   s    z!EndpointDiscoveryManager.__init__c                 C   s8   |d }|   ¡ }|D ]}| d¡}||d  |d< q|S )NZ	EndpointsZCachePeriodInMinutesé<   Ú
Expiration)rE   r   )r   ÚresponseÚ	endpointsrN   ÚendpointZ
cache_timer   r   r   Ú_parse_endpointsu   s    
z)EndpointDiscoveryManager._parse_endpointsc                 C   s"   t |tƒrtt| ¡ ƒƒS |S d S r   )Ú
isinstanceÚdictÚtupleÚsortedr4   )r   Úvaluer   r   r   Ú_cache_item}   s    
z$EndpointDiscoveryManager._cache_itemc                    s,   ˆ j jf |Ž}t‡ fdd„t| ¡ ƒD ƒƒS )Nc                 3   s   | ]\}}ˆ   |¡V  qd S r   )rZ   r-   ©r   r   r   Ú	<genexpr>…   s     z=EndpointDiscoveryManager._create_cache_key.<locals>.<genexpr>)rK   r6   rW   rX   r4   r5   r   r[   r   Ú_create_cache_keyƒ   s    z*EndpointDiscoveryManager._create_cache_keyc                 C   s   | j  ||¡S r   )rK   r;   r8   r   r   r   r;   ‡   s    z+EndpointDiscoveryManager.gather_identifiersc                 K   s"   | j f |Ž}|| jkr| j|= d S r   )r]   rB   )r   r   Ú	cache_keyr   r   r   Údelete_endpointsŠ   s    
z)EndpointDiscoveryManager.delete_endpointsc                 K   s8   | j jf |Ž}| j j}t| j|ƒ}t d|¡ |f |ŽS )Nz%Discovering endpoints with kwargs: %s)rK   r6   r"   ÚgetattrrI   ÚloggerÚdebug)r   r   r)   r!   r   r   r   Ú_describe_endpoints�   s
    z,EndpointDiscoveryManager._describe_endpointsc                    s.   || j krd S |  ¡ ‰ ‡ fdd„| j | D ƒS )Nc                    s   g | ]}ˆ |d  k r|‘qS )rP   r   )r.   Úe©Únowr   r   Ú
<listcomp>œ   s      zCEndpointDiscoveryManager._get_current_endpoints.<locals>.<listcomp>)rB   rE   )r   Úkeyr   re   r   Ú_get_current_endpoints˜   s    
z/EndpointDiscoveryManager._get_current_endpointsc              	   K   sr   | j f |Ž}z4| jf |Ž}|  |¡}|| j|< | j |d ¡ |W S  ttfk
rl   |  ¡ d | j|< Y d S X d S )NrO   )	r]   rc   rT   rB   rC   r3   r   r   rE   )r   r   r^   rQ   rR   r   r   r   Ú_refresh_current_endpointsž   s    

z3EndpointDiscoveryManager._refresh_current_endpointsc                 C   s0   || j kr,|  ¡ }|| j | k r$dS | j |= dS )NTF)rC   rE   )r   r^   rf   r   r   r   Ú_recently_failedª   s    
z)EndpointDiscoveryManager._recently_failedc                 C   s   |d d S )Nr   ZAddressr   )r   rR   r   r   r   Ú_select_endpoint²   s    z)EndpointDiscoveryManager._select_endpointc                 K   sÐ   |d }| j  |¡}| js0|s0t d| ¡ d S | jf |Ž}|  |¡}|rT|  |¡S |  |¡}|s|| j	f |Ž}|r||  |¡S t d|¡ | j
 |d ¡}|r¤|  |¡S |rÌ|rÆ| j	f |Ž}|rÆ|  |¡S tƒ ‚d S )Nr,   zAOptional discovery disabled. Skipping discovery for Operation: %sz%Endpoint Discovery has failed for: %s)rK   r*   rF   ra   rb   r]   ri   rl   rk   rj   rB   r   r   )r   r   r9   Zdiscovery_requiredr^   rR   Zrecently_failedZstale_entriesr   r   r   Údescribe_endpointµ   s:    
ÿÿ





z*EndpointDiscoveryManager.describe_endpoint)NNT)r	   r
   r   r   rT   rZ   r]   r;   r_   rc   ri   rj   rk   rl   rm   r   r   r   r   rA   c   s        ÿ
	rA   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚEndpointDiscoveryHandlerc                 C   s
   || _ d S r   )Ú_manager)r   Úmanagerr   r   r   r   â   s    z!EndpointDiscoveryHandler.__init__c                 C   s:   |  d| | j¡ | d| | j¡ |  d| | j¡ d S )Nzbefore-parameter-build.%szrequest-created.%szneeds-retry.%s)Úregisterr;   Zregister_firstÚdiscover_endpointÚhandle_retries)r   ÚeventsZ
service_idr   r   r   rq   å   s     ÿ ÿz!EndpointDiscoveryHandler.registerc                 K   s0   |j }|d krd S | j ||¡}d|i|d< d S )NÚidentifiersÚ	discovery)r   ro   r;   )r   r:   r   Úcontextr   r   r?   r   r   r   r;   î   s
    z+EndpointDiscoveryHandler.gather_identifiersc                 K   sn   |j  di ¡ d¡}|d kr d S | jj||d�}|d krFt d¡ d S | d¡sXd| }t d|¡ ||_d S )Nrv   ru   ©r,   r+   z&Failed to discover and inject endpointÚhttpzhttps://z!Injecting discovered endpoint: %s)rw   r   ro   rm   ra   rb   Ú
startswithÚurl)r   Úrequestr)   r   r?   rS   r   r   r   rr   ö   s     ÿ

z*EndpointDiscoveryHandler.discover_endpointc           
      K   sŒ   |d krd S |\}}|  di ¡  d¡}|  di ¡  d¡}|dkrL|dkrLd S |  di ¡}|  di ¡  d	¡}	|	d krvd S | jj|j|	d
� dS )NZResponseMetadataZHTTPStatusCodeÚErrorZCodei¥  ZInvalidEndpointExceptionrw   rv   ru   rx   r   )r   ro   r_   r    )
r   Zrequest_dictrQ   r9   r   Ú_ÚstatusZ
error_coderw   r?   r   r   r   rs     s      ÿz'EndpointDiscoveryHandler.handle_retriesN)r	   r
   r   r   rq   r;   rr   rs   r   r   r   r   rn   á   s
   	rn   )ÚloggingrD   rG   Zbotocorer   Zbotocore.exceptionsr   r   r   Zbotocore.modelr   Zbotocore.utilsr   Ú	getLoggerr	   ra   r   r   r   r   r   rA   rn   r   r   r   r   Ú<module>   s   
4~