o
    x[h$  ã                   @   sô   d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl
mZ d dlmZ d dlmZmZ e  e¡ZdZdd	„ ZG d
d„ dƒZdddœdededededef
dd„Zdededefdd„Z	ddedee defdd„Zdefdd„ZdS )é    N)Ú	monotonic)ÚDictÚOptionalÚTypeÚUnion)Úutil)Úreport_diagnostic_event)ÚUrlErrorÚreadurlzhttp://169.254.169.254/metadatac                 C   s   dt t ¡ ƒdœS )NÚtrue)ÚMetadatazx-ms-client-request-id)ÚstrÚuuidÚuuid4)Ú_url© r   ú>/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.pyÚ
headers_cb   s   
þr   c                	   @   sL   e Zd ZdZdddddœdedee dee d	dfd
d„Zd	efdd„Z	dS )ÚReadUrlRetryHandleraK  Manager for readurl retry behavior using exception_callback().

    :param logging_backoff: Backoff to limit logging.
    :param max_connection_errors: Number of connection errors to retry on.
    :param retry_codes: Set of http codes to retry on.
    :param retry_deadline: Optional monotonic()-based deadline to retry until.
    ç      ð?N)é”  éš  é­  iô  ©Úlogging_backoffÚmax_connection_errorsÚretry_codesÚretry_deadliner   r   r   Úreturnc                C   s.   || _ || _|| _|| _d| _d| _d | _d S )Nr   r   )r   r   r   r   Ú_logging_thresholdÚ_request_countÚ_last_error)Úselfr   r   r   r   r   r   r   Ú__init__%   s   
zReadUrlRetryHandler.__init__c                 C   s@  |  j d7  _ t|tƒstd| tjd� dS d}| jd ur'tƒ | jkr'd}nd}| jd urDt|j	t
jƒrD|  jd8  _| jdkrCd}n|jd urQ|j| jvrQd}| j | jkr`|  j| j9  _nd}|jd urt| j|jkrsd}|j| _n| jd u s†t| jtƒr†t|j	| jƒsŽd}t|j	ƒ| _|s’|sžtd| j |f tjd� |S )Né   z1Polling IMDS failed with unexpected exception: %r©Úlogger_funcFTr   z1Polling IMDS failed attempt %d with exception: %r)r    Ú
isinstancer	   r   ÚLOGÚwarningr   r   r   ÚcauseÚrequestsÚConnectionErrorÚcoder   r   r   r!   Útype)r"   Ú	exceptionÚlogÚretryr   r   r   Úexception_callback:   s^   
ÿý
ÿ
€

€

þüÿýz&ReadUrlRetryHandler.exception_callback)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úfloatr   Úintr#   Úboolr2   r   r   r   r   r      s     õýüõ
ôr   Té   )Úlog_responseÚtimeoutÚurlÚretry_handlerr;   r<   r   c             
   C   sL   zt | |jtd||d�}W |jS  ty% } z
td| tjd� ‚ d}~ww )a'  Fetch URL from IMDS.

    :param url: url to fetch.
    :param log_response: log responses in readurl().
    :param retry_deadline: time()-based deadline to retry until.
    :param timeout: Read/connection timeout in seconds for readurl().

    :raises UrlError: on error fetching metadata.
    T©Úexception_cbr   ÚinfiniteÚlog_req_respr<   z&Failed to fetch metadata from IMDS: %sr%   N)r
   r2   r   r	   r   r(   r)   Úcontents)r=   r>   r;   r<   ÚresponseÚerrorr   r   r   Ú
_fetch_url{   s$   úùþ€ûrF   c             
   C   sL   t | |d�}z	t | d¡¡W S  ty% } z
td| tjd� ‚ d}~ww )zßFetch IMDS metadata.

    :param url: url to fetch.
    :param retry_deadline: time()-based deadline to retry until.

    :raises UrlError: on error fetching metadata.
    :raises ValueError: on error parsing metadata.
    ©r>   zutf-8z&Failed to parse metadata from IMDS: %sr%   N)rF   r   Ú	load_jsonÚdecodeÚ
ValueErrorr   r(   r)   )r=   r>   ÚmetadatarE   r   r   r   Ú_fetch_metadataž   s   þ€ûrL   r   r   c              
   C   s‚   t || d�}ztd }t||d�W S  ty@ } z#|jdkr;tdtjd� t || d�}td }t||d�W  Y d}~S ‚ d}~ww )	zïFetch extended metadata, falling back to non-extended as required.

    :param retry_deadline: time()-based deadline to retry until.

    :raises UrlError: on error fetching metadata.
    :raises ValueError: on error parsing metadata.
    )r   r   z./instance?api-version=2021-08-01&extended=truerG   i�  z,Falling back to IMDS api-version: 2019-06-01r%   z /instance?api-version=2019-06-01N)r   ÚIMDS_URLrL   r	   r-   r   r(   r)   )r   r   r>   r=   rE   r   r   r   Ú fetch_metadata_with_api_fallback·   s,   
þ
þþ€ôrN   c                  C   sP   t d } tddddd�}t| |jtddd	d
�}td|jd › d�tjd� |j	S )zhFetch extended metadata, falling back to non-extended as required.

    :raises UrlError: on error.
    z'/reprovisiondata?api-version=2019-06-01g       @r$   )r   r   r   Nr   TFr:   r?   zPolled IMDS z time(s)r%   )
rM   r   r
   r2   r   r   r    r(   ÚdebugrC   )r=   ÚhandlerrD   r   r   r   Úfetch_reprovision_data×   s(   ø
ú	þrQ   )N) Úloggingr   Útimer   Útypingr   r   r   r   r+   Ú	cloudinitr   Úcloudinit.sources.helpers.azurer   Úcloudinit.url_helperr	   r
   Ú	getLoggerr3   r(   rM   r   r   r   r9   r8   ÚbytesrF   rL   r7   rN   rQ   r   r   r   r   Ú<module>   sR   
cûÿýüû
ú#ÿý
üÿÿÿ
þ 