U
    Ad                     @   s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ eeZdZG dd	 d	Zd
dddeeeeedddZdeeedddZdeedddZedddZdS )    )DictN)log)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac                   @   s6   e Zd ZddddeeddddZed	d
dZdS )ReadUrlRetryHandler)    i  i  
         ?)retry_codesmax_connection_errorslogging_backoffN)r   r   returnc                C   s"   || _ || _|| _d| _d| _d S )Nr   r   )r   r   r   _logging_threshold_request_count)selfr   r   r    r   >/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.py__init__   s
    zReadUrlRetryHandler.__init__r   c                 C   s   |  j d7  _ t|ts.td| tjd dS d}d}t|jtjtj	frh|  j
d8  _
| j
dk rxd}n|j| jkrxd}| j | jkr|  j| j9  _nd}|s|std| j |f tjd |S )N   z1Polling IMDS failed with unexpected exception: %rZlogger_funcFTr   z1Polling IMDS failed attempt %d with exception: %r)r   
isinstancer   r   LOGwarningcauserequestsConnectionErrorZTimeoutr   coder   r   r   info)r   Zreq_argsZ	exceptionr   Zretryr   r   r   exception_callback&   s>    
 

z&ReadUrlRetryHandler.exception_callback)__name__
__module____qualname__intfloatr   boolr"   r   r   r   r   r      s   	r   Tr      )log_responseretriestimeout)urlr*   r+   r,   r   c             
   C   sd   t  }z t| |jddid|||d}W n6 tk
r\ } ztd| tjd  W 5 d}~X Y nX |jS )zLFetch URL from IMDS.

    :raises UrlError: on error fetching metadata.
    MetadatatrueF)exception_cbheadersinfinitelog_req_respr+   r,   z&Failed to fetch metadata from IMDS: %sr   N)r   r   r"   r   r   r   r   contents)r-   r*   r+   r,   handlerresponseerrorr   r   r   
_fetch_urlM   s$    
	r8   )r-   r+   r   c              
   C   sT   t | |d}zt|W S  tk
rN } ztd| tjd  W 5 d}~X Y nX dS )zFetch IMDS metadata.

    :raises UrlError: on error fetching metadata.
    :raises ValueError: on error parsing metadata.
    r+   z&Failed to parse metadata from IMDS: %sr   N)r8   r   Z	load_json
ValueErrorr   r   r   )r-   r+   Zmetadatar7   r   r   r   _fetch_metadataj   s    	r;   )r+   r   c              
   C   st   zt d }t|| dW S  tk
rn } z:|jdkr\tdtjd t d }t|| d W Y S  W 5 d}~X Y nX dS )zFetch extended metadata, falling back to non-extended as required.

    :raises UrlError: on error fetching metadata.
    :raises ValueError: on error parsing metadata.
    z./instance?api-version=2021-08-01&extended=truer9   i  z,Falling back to IMDS api-version: 2019-06-01r   z /instance?api-version=2019-06-01N)IMDS_URLr;   r   r    r   r   r   )r+   r-   r7   r   r   r    fetch_metadata_with_api_fallback   s    
r=   r   c                  C   sR   t d } t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   )r	   r
   )r   r   r   r.   r/   TFr)   )r0   r1   r2   r3   r,   zPolled IMDS r   z time(s)r   )	r<   r   r   r"   r   r   r   debugr4   )r-   r5   r6   r   r   r   fetch_reprovision_data   s&    	r?   )r   )r   )typingr   r   Z	cloudinitr   Zloggingr   Zcloudinit.sources.helpers.azurer   Zcloudinit.url_helperr   r   Z	getLoggerr#   r   r<   r   strr(   r&   bytesr8   r;   r=   r?   r   r   r   r   <module>   s4   
;      