o
    w7e                     @   s   d dl m Z  d dlmZ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dedededef
ddZdededefddZdedefddZdefddZdS )    )time)DictOptionalN)log)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac                	   @   sH   e Zd ZdZddddddeded	ee d
dfddZd
ef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.
          ?
   )    i  i  Nlogging_backoffmax_connection_errorsretry_codesretry_deadliner   r   r   returnc                C   s(   || _ || _|| _|| _d| _d| _d S )Nr   r   )r   r   r   r   _logging_threshold_request_count)selfr   r   r   r    r   >/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.py__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}t|jt	j
r?|  jd8  _| jdk r>d}n|jd urL|j| jvrLd}| j | jkr[|  j| j9  _nd}|sa|smt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   causerequestsConnectionErrorr   coder   r   r   info)r   req_args	exceptionr   retryr   r   r   exception_callback1   s@   


z&ReadUrlRetryHandler.exception_callback)
__name__
__module____qualname____doc__floatintr   r   boolr)   r   r   r   r   r
      s     
r
   T   )log_responsetimeouturlr   r2   r3   r   c             
   C   sZ   t |d}zt| |jddi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.
    r   MetadatatrueTexception_cbheadersinfinitelog_req_respr3   z&Failed to fetch metadata from IMDS: %sr   N)r
   r	   r)   r   r   r   r    contents)r4   r   r2   r3   handlerresponseerrorr   r   r   
_fetch_url\   s&   
rA   c              
   C   sF   t | |d}zt|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.
    r5   z&Failed to parse metadata from IMDS: %sr   N)rA   r   	load_json
ValueErrorr   r   r    )r4   r   metadatar@   r   r   r   _fetch_metadata   s   rE   c              
   C   sj   zt d }t|| dW S  ty4 } z|jdkr/tdtj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.
    z./instance?api-version=2021-08-01&extended=truer5   i  z,Falling back to IMDS api-version: 2019-06-01r   z /instance?api-version=2019-06-01N)IMDS_URLrE   r   r$   r   r   r    )r   r4   r@   r   r   r    fetch_metadata_with_api_fallback   s   
rG   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   )r   r   Nr   r6   r7   TFr1   r8   zPolled IMDS r   z time(s)r   )	rF   r
   r	   r)   r   r   r   debugr=   )r4   r>   r?   r   r   r   fetch_reprovision_data   s(   		rI   )r   typingr   r   r"   	cloudinitr   loggingr   cloudinit.sources.helpers.azurer   cloudinit.url_helperr   r	   	getLoggerr*   r   rF   r
   strr.   r0   r/   bytesrA   rE   rG   rI   r   r   r   r   <module>   s@   
L
%
