o
    i                     @   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  i  i  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   	exceptionlogretryr   r   r   exception_callback:   s^   






z&ReadUrlRetryHandler.exception_callback)
__name__
__module____qualname____doc__floatr   intr   boolr.   r   r   r   r   r      s     
r   T   )log_responsetimeouturlretry_handlerr7   r8   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_respr8   z&Failed to fetch metadata from IMDS: %sr!   N)r
   r.   r   r	   r   r$   r%   contents)r9   r:   r7   r8   responseerrorr   r   r   
_fetch_url{   s$   rB   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)rB   r   	load_jsondecode
ValueErrorr   r$   r%   )r9   r:   metadatarA   r   r   r   _fetch_metadata   s   rH   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=truerC   i  z,Falling back to IMDS api-version: 2019-06-01r!   z /instance?api-version=2019-06-01N)r   IMDS_URLrH   r	   r)   r   r$   r%   )r   r   r:   r9   rA   r   r   r    fetch_metadata_with_api_fallback   s,   

rJ   c                  C   sN   t d } t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    N)r   r   r   TFr6   r;   zPolled IMDS z time(s)r!   )
rI   r   r
   r.   r   r   r   r$   debugr?   )r9   handlerr@   r   r   r   fetch_reprovision_data   s&   	rM   )N) loggingr   timer   typingr   r   r   r   r'   	cloudinitr   cloudinit.sources.helpers.azurer   cloudinit.url_helperr	   r
   	getLoggerr/   r$   rI   r   r   r   r5   r4   bytesrB   rH   r3   rJ   rM   r   r   r   r   <module>   sR   
c
#

 