
    i                        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 j"                  e      ZdZd Z G d	 d
      Zddddededededef
dZdededefdZ	 ddedee   defdZdefdZy)    N)	monotonic)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac                 B    dt        t        j                               dS )Ntrue)Metadatazx-ms-client-request-id)struuiduuid4)_urls    >/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.py
headers_cbr      s    "%djjl"3     c            	       L    e Zd ZdZddddddedee   dee   d	dfd
Zd	efdZ	y)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                f    || _         || _        || _        || _        d| _        d| _        d | _        y )Nr   r   )r   r   r   r   _logging_threshold_request_count_last_error)selfr   r   r   r   s        r   __init__zReadUrlRetryHandler.__init__%   s<      /%:"&,"%37r   c                    | xj                   dz  c_         t        |t              st        d|z  t        j
                         yd}| j                  t               | j                  k\  rd}nd}| j                  Kt        |j                  t        j                        r'| xj                  dz  c_        | j                  dk  r)d}n&|j                  |j                  | j                  vrd}| j                   | j                  k\  r | xj                  | j                  z  c_        nd}|j                  -| j                   |j                  k7  rvd}|j                  | _        nb| j                   :t        | j                   t"              r t        |j                  | j                         sd}t#        |j                        | _        |s|s*t        d| j                   |fz  t        j
                         |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retrys       r   exception_callbackz&ReadUrlRetryHandler.exception_callback:   s   q )X.#CKK
 +t222EE
 %%1jOOX557
 &&!+&))Q.NN&d&6&66E$"9"99##t';';;#C >>%9>>1#,>>  $d..5ioot/?/?@C#IOO4De#C&&	23KK
 r   )
__name__
__module____qualname____doc__floatr   intr#   boolr3    r   r   r   r      sZ     "%/3
 +/8 8  (}	8 !8 
8*>t >r   r   T   )log_responsetimeouturlretry_handlerr=   r>   r   c                    	 t        | |j                  t        d||      }|j                  S # t        $ r$}t	        d|z  t
        j                          d}~ww xY 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errors         r   
_fetch_urlrI   {   se     &99!%
   4u<	
 	s   - 	AAAc                    t        | |      }	 t        j                  |j                  d            S # t        $ r$}t        d|z  t        j                          d}~ww xY 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)rI   r   	load_jsondecode
ValueErrorr	   r)   r*   )r?   r@   metadatarH   s       r   _fetch_metadatarP      sY     #];H~~hoog677 4u<	
 	s   #3 	A AA r   r   c                    t        ||       }	 t        dz   }t        ||      S # t        $ rX}|j                  dk(  rCt        dt        j                         t        ||       }t        dz   }t        ||      cY d}~S  d}~ww xY 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=truerK   i  z,Falling back to IMDS api-version: 2019-06-01r&   z /instance?api-version=2019-06-01N)r   IMDS_URLrP   r
   r.   r	   r)   r*   )r   r   r@   r?   rH   s        r    fetch_metadata_with_api_fallbackrS      s     (3%MIIs-@@ ::#>KK 0&;-M ??C"3mDDs!   % 	BAB:B BBc                      t         dz   } t        ddd      }t        | |j                  t        ddd	      }t        d
|j                  dz    dt        j                         |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   TFr<   rB   zPolled IMDS z time(s)r&   )
rR   r   r   r3   r   r	   r    r)   debugrF   )r?   handlerrG   s      r   fetch_reprovision_datarW      s}    
 >
>C!G
 //H 
w--a/09II r   )N) loggingr   timer   typingr   r   r   r   r,   	cloudinitr   cloudinit.sources.helpers.azurer	   cloudinit.url_helperr
   r   	getLoggerr4   r)   rR   r   r   r   r:   r9   bytesrI   rP   r8   rS   rW   r;   r   r   <module>r`      s   
    . .   C 2g!,\ \F  	  '  	 
    F	 ' 
	4 CG2:3-	@ r   