o
    .&ßa+  ã                   @   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eƒZG dd„ deƒZG dd„ deƒZdS )é    N)Ú
xform_name)ÚBotoCoreErrorÚHTTPClientErrorÚConnectionError)ÚOperationNotFoundError)ÚCachedPropertyc                   @   s   e Zd ZdS )ÚEndpointDiscoveryExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú4/usr/lib/python3/dist-packages/botocore/discovery.pyr      s    r   c                   @   ó   e Zd ZdZdZdS )ÚEndpointDiscoveryRequiredzD Endpoint 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      ó    r   c                   @   r   )Ú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   "   r   r   c                 K   s"   | j }|r| d¡rtƒ ‚d S 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   ó
   || _ d S ©N)Ú_service_model)ÚselfÚservice_modelr   r   r   Ú__init__.   ó   
zEndpointDiscoveryModel.__init__c                 C   s   | j j}t|jƒS r   )r   Úendpoint_discovery_operationr   Úname)r   Údiscovery_operationr   r   r   Údiscovery_operation_name1   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_keys6   s
   z/EndpointDiscoveryModel.discovery_operation_keysc                 C   s2   z| j  |¡}|j dd¡W S  ty   Y dS w )Nr   F)r   Úoperation_modelr   r   r   )r   Úoperation_namer,   r   r   r   Údiscovery_required_for>   s   ÿz-EndpointDiscoveryModel.discovery_required_forc                    sB   | j ‰ | d¡s| dd ¡ | dd ¡ t‡ fdd„| ¡ D ƒƒS )NÚIdentifiersÚ	Operationc                 3   s$   � | ]\}}|ˆ v r||fV  qd S r   r   ©Ú.0ÚkÚv©Ú
input_keysr   r   Ú	<genexpr>K   s   €" zDEndpointDiscoveryModel.discovery_operation_kwargs.<locals>.<genexpr>)r+   r   ÚpopÚdictÚitems©r   r   r   r5   r   Údiscovery_operation_kwargsE   s
   
z1EndpointDiscoveryModel.discovery_operation_kwargsc                 C   s   |   |j|¡S r   )Ú_gather_idsr'   ©r   Ú	operationÚparamsr   r   r   Úgather_identifiersM   ó   z)EndpointDiscoveryModel.gather_identifiersNc                 C   sb   |d u ri }|j  ¡ D ]#\}}|j d¡r|| ||< q|jdkr.||v r.|  ||| |¡ q|S )NÚendpointdiscoveryidÚ	structure)r)   r:   Úmetadatar   Ú	type_namer=   )r   Úshaper@   ÚidsÚmember_nameÚmember_shaper   r   r   r=   P   s   €z"EndpointDiscoveryModel._gather_idsr   )r	   r
   r   r!   r   r&   r+   r.   r<   rA   r=   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 u ri }|| _ i | _|d u 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_timeÚalways_discoverr   r   r   r!   ^   s   z!EndpointDiscoveryManager.__init__c                 C   s8   |d }|   ¡ }|D ]}| d¡}||d  |d< q
|S )NÚ	EndpointsÚCachePeriodInMinutesé<   Ú
Expiration)rO   r   )r   ÚresponseÚ	endpointsrX   ÚendpointÚ
cache_timer   r   r   Ú_parse_endpointsm   s   
z)EndpointDiscoveryManager._parse_endpointsc                 C   s   t |tƒrtt| ¡ ƒƒS |S r   )Ú
isinstancer9   ÚtupleÚsortedr:   )r   Úvaluer   r   r   Ú_cache_itemu   s   
z$EndpointDiscoveryManager._cache_itemc                    s0   ˆ j jdi |¤Ž}t‡ fdd„t| ¡ ƒD ƒƒS )Nc                 3   s   � | ]
\}}ˆ   |¡V  qd S r   )rg   r1   ©r   r   r   r7   }   s   € z=EndpointDiscoveryManager._create_cache_key.<locals>.<genexpr>r   )rU   r<   rd   re   r:   r;   r   rh   r   Ú_create_cache_key{   s   z*EndpointDiscoveryManager._create_cache_keyc                 C   s   | j  ||¡S r   )rU   rA   r>   r   r   r   rA      rB   z+EndpointDiscoveryManager.gather_identifiersc                 K   s*   | j di |¤Ž}|| jv r| j|= d S d S )Nr   )ri   rL   )r   r   Ú	cache_keyr   r   r   Údelete_endpoints‚   s   
ÿz)EndpointDiscoveryManager.delete_endpointsc                 K   s@   | j jdi |¤Ž}| j j}t| j|ƒ}t d|¡ |di |¤ŽS )Nz%Discovering endpoints with kwargs: %sr   )rU   r<   r&   ÚgetattrrS   ÚloggerÚdebug)r   r   r-   r%   r   r   r   Ú_describe_endpoints‡   s
   z,EndpointDiscoveryManager._describe_endpointsc                    s.   || j vrd S |  ¡ ‰ ‡ fdd„| j | D ƒS )Nc                    s   g | ]
}ˆ |d  k r|‘qS )r]   r   )r2   Úe©Únowr   r   Ú
<listcomp>”   s    zCEndpointDiscoveryManager._get_current_endpoints.<locals>.<listcomp>)rL   rO   )r   Úkeyr   rq   r   Ú_get_current_endpoints�   s   
z/EndpointDiscoveryManager._get_current_endpointsc              	   K   st   | j di |¤Ž}z| jdi |¤Ž}|  |¡}|| j|< | j |d ¡ |W S  ttfy9   |  ¡ d | j|< Y d S w )Nr\   r   )	ri   ro   rb   rL   rM   r8   r   r   rO   )r   r   rj   r^   r_   r   r   r   Ú_refresh_current_endpoints–   s   

þz3EndpointDiscoveryManager._refresh_current_endpointsc                 C   s0   || j v r|  ¡ }|| j | k rdS | j |= dS )NTF)rM   rO   )r   rj   rr   r   r   r   Ú_recently_failed¢   s   
z)EndpointDiscoveryManager._recently_failedc                 C   s   |d d S )Nr   ÚAddressr   )r   r_   r   r   r   Ú_select_endpointª   s   z)EndpointDiscoveryManager._select_endpointc                 K   sÜ   |d }| j  |¡}| js|st d| ¡ d S | jdi |¤Ž}|  |¡}|r,|  |¡S |  |¡}|sB| j	di |¤Ž}|rB|  |¡S t d|¡ | j
 |d ¡}|rV|  |¡S |rl|ri| j	di |¤Ž}|ri|  |¡S tƒ ‚d S )Nr0   zAOptional discovery disabled. Skipping discovery for Operation: %sz%Endpoint Discovery has failed for: %sr   )rU   r.   rP   rm   rn   ri   ru   ry   rw   rv   rL   r   r   )r   r   r?   Údiscovery_requiredrj   r_   Úrecently_failedÚstale_entriesr   r   r   Údescribe_endpoint­   s:   
ÿÿ





z*EndpointDiscoveryManager.describe_endpoint)NNT)r	   r
   r   r!   rb   rg   ri   rA   rk   ro   ru   rv   rw   ry   r}   r   r   r   r   rK   ]   s    
	rK   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   r   r   )Ú_manager)r   Úmanagerr   r   r   r!   Ú   r"   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)ÚregisterrA   Úregister_firstÚdiscover_endpointÚhandle_retries)r   ÚeventsÚ
service_idr   r   r   r�   Ý   s   
ÿ
ÿz!EndpointDiscoveryHandler.registerc                 K   s0   |j }|d u r	d S | j ||¡}d|i|d< d S )NÚidentifiersÚ	discovery)r   r   rA   )r   r@   r   Úcontextr   r   rH   r   r   r   rA   æ   s
   z+EndpointDiscoveryHandler.gather_identifiersc                 K   sn   |j  di ¡ d¡}|d u rd S | jj||d�}|d u r#t d¡ d S | d¡s,d| }t d|¡ ||_d S )Nrˆ   r‡   ©r0   r/   z&Failed to discover and inject endpointÚhttpzhttps://z!Injecting discovered endpoint: %s)r‰   r   r   r}   rm   rn   Ú
startswithÚurl)r   Úrequestr-   r   rH   r`   r   r   r   rƒ   î   s   ÿ


z*EndpointDiscoveryHandler.discover_endpointc           
      K   sŒ   |d u rd S |\}}|  di ¡  d¡}|  di ¡  d¡}|dkr&|dkr&d S |  di ¡}|  di ¡  d	¡}	|	d u r;d S | jj|j|	d
� dS )NÚResponseMetadataÚHTTPStatusCodeÚErrorÚCodei¥  ÚInvalidEndpointExceptionr‰   rˆ   r‡   rŠ   r   )r   r   rk   r$   )
r   Úrequest_dictr^   r?   r   Ú_ÚstatusÚ
error_coder‰   rH   r   r   r   r„   ý   s   ÿz'EndpointDiscoveryHandler.handle_retriesN)r	   r
   r   r!   r�   rA   rƒ   r„   r   r   r   r   r~   Ù   s    	r~   )rN   ÚloggingrQ   Úbotocorer   Úbotocore.exceptionsr   r   r   Úbotocore.modelr   Úbotocore.utilsr   Ú	getLoggerr	   rm   r   r   r   r   Úobjectr   rK   r~   r   r   r   r   Ú<module>   s   
0|