
    x[h$                        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  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'   boolr7    r   r   r   r      sZ     "%/3
 +/8 8  (}	8 !8 
8*>t >r   r   T   )log_responsetimeouturlretry_handlerrA   rB   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_resprB   z&Failed to fetch metadata from IMDS: %sr*   N)r   r7   r   r
   r	   r-   r.   contents)rC   rD   rA   rB   responseerrors         r   
_fetch_urlrM   {   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.
    rD   zutf-8z&Failed to parse metadata from IMDS: %sr*   N)rM   r   	load_jsondecode
ValueErrorr	   r-   r.   )rC   rD   metadatarL   s       r   _fetch_metadatarT      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=truerO   i  z,Falling back to IMDS api-version: 2019-06-01r*   z /instance?api-version=2019-06-01N)r   IMDS_URLrT   r
   r2   r	   r-   r.   )r    r   rD   rC   rL   s        r    fetch_metadata_with_api_fallbackrW      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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)   )r   r   r   Nr   TFr@   rF   zPolled IMDS z time(s)r*   )
rV   r   r   r7   r   r	   r$   r-   debugrJ   )rC   handlerrK   s      r   fetch_reprovision_datar[      s    
 >
>C!

 	G //H 
w--a/09II r   )N) loggingr   timer   typingr   r   r   r   r0   	cloudinitr   cloudinit.sources.helpers.azurer	   cloudinit.url_helperr
   r   	getLoggerr8   r-   rV   r   r   r   r>   r=   bytesrM   rT   r<   rW   r[   r?   r   r   <module>rd      s   
    . .   C 2g!,\ \F  	  '  	 
    F	 ' 
	4 CG2:3-	@ r   