
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\men                 @   s   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 jeZdZG dd	 d	Zd
ddeeeeedddZeeedddZdeee edddZedddZdS )    N)time)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac               @   sF   e Zd ZdZdddddeee ee dd	d
dZedddZ	dS )ReadUrlRetryHandleraF  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 time()-based deadline to retry until.
    g      ?N        )logging_backoffmax_connection_errorsretry_codesretry_deadline)r   r   r   returnc            C   s.   || _ || _|| _|| _d| _d| _d | _d S )Ng      ?r   )r   r   r   r   _logging_threshold_request_count_last_error)selfr   r   r   r    r   /usr/lib/python3.6/imds.py__init__   s    zReadUrlRetryHandler.__init__)r   c             C   sP  |  j d7  _ t|ts.td| tjd dS d}| jd k	rNt | jkrNd}nd}| jd k	rt|j	t
jr|  jd8  _| jdkrd}n|jd k	r|j| jkrd}| j | jkr|  j| j9  _nd}|jd k	r| j|jkrd}|j| _n>| jd kst| jt st|j	| j r&d}t|j	| _|s4| rLt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info)r   Zreq_argsZ	exceptionlogZretryr   r   r   exception_callback2   sJ    







z&ReadUrlRetryHandler.exception_callback)r   r   r   r   )
__name__
__module____qualname____doc__floatr   intr   boolr(   r   r   r   r   r      s      	r   T   )log_responsetimeout)urlretry_handlerr1   r2   r   c            C   s\   yt | |jddid||d}W n6 tk
rT } ztd| tjd  W Y dd}~X nX |jS )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.
    MetadatatrueT)exception_cbheadersinfinitelog_req_respr2   z&Failed to fetch metadata from IMDS: %s)r   N)r
   r(   r	   r   r   r    contents)r3   r4   r1   r2   responseerrorr   r   r   
_fetch_urlp   s    
r>   )r3   r4   r   c            C   sR   t | |d}y
tj|S  tk
rL } ztd| tjd  W Y dd}~X nX dS )zFetch 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.
    )r4   z&Failed to parse metadata from IMDS: %s)r   N)r>   r   Z	load_json
ValueErrorr   r   r    )r3   r4   Zmetadatar=   r   r   r   _fetch_metadata   s    

r@   )r   r   r   c             C   s   t || d}ytd }t||dS  tk
r| } z@|jdkrjtdtjd t || d}td }t||dS  W Y dd}~X nX dS )	zFetch 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=true)r4   i  z,Falling back to IMDS api-version: 2019-06-01)r   z /instance?api-version=2019-06-01N)r   IMDS_URLr@   r	   r$   r   r   r    )r   r   r4   r3   r=   r   r   r    fetch_metadata_with_api_fallback   s"    


rB   )r   c              C   sT   t d } tddddd}t| |jd	d
i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         N)r   r   r   r   r5   r6   TFr0   )r7   r8   r9   r:   r2   zPolled IMDS z time(s))r   )rC   rD   rE   )	rA   r   r
   r(   r   r   r   debugr;   )r3   Zhandlerr<   r   r   r   fetch_reprovision_data   s&      
rG   )N)Zloggingr   Ztypingr   r   r   r   r"   Z	cloudinitr   Zcloudinit.sources.helpers.azurer   Zcloudinit.url_helperr	   r
   Z	getLoggerr)   r   rA   r   strr/   r.   bytesr>   r@   r-   rB   rG   r   r   r   r   <module>   s$   
`
