o
    f.                     @   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 st| jtrt|j	| jsd}t|j	| _|s|st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"   req_args	exceptionlogretryr   r   r   exception_callback:   s^   






z&ReadUrlRetryHandler.exception_callback)
__name__
__module____qualname____doc__floatr   intr#   boolr3   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
   r3   r   r	   r   r(   r)   contents)r>   r?   r<   r=   responseerrorr   r   r   
_fetch_url{   s$   rG   c             
   C   sL   t | |d}z	t|dW S  ty% } z
td| tjd  d}~ww )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.
    r?   zutf-8z&Failed to parse metadata from IMDS: %sr%   N)rG   r   	load_jsondecode
ValueErrorr   r(   r)   )r>   r?   metadatarF   r   r   r   _fetch_metadata   s   rM   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 )	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=truerH   i  z,Falling back to IMDS api-version: 2019-06-01r%   z /instance?api-version=2019-06-01N)r   IMDS_URLrM   r	   r-   r   r(   r)   )r   r   r?   r>   rF   r   r   r    fetch_metadata_with_api_fallback   s,   

rO   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%   )
rN   r   r
   r3   r   r   r    r(   debugrD   )r>   handlerrE   r   r   r   fetch_reprovision_data   s(   
	rR   )N) loggingr   timer   typingr   r   r   r   r+   	cloudinitr   cloudinit.sources.helpers.azurer   cloudinit.url_helperr	   r
   	getLoggerr4   r(   rN   r   r   r   r:   r9   bytesrG   rM   r8   rO   rR   r   r   r   r   <module>   sR   
c
#

 