
    f                         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 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)time)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac            	       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)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.
          ?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        >/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.py__init__zReadUrlRetryHandler.__init__   s<      /%:"&,"%37    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   req_args	exceptionlogretrys        r   exception_callbackz&ReadUrlRetryHandler.exception_callback2   s   q )X.#CKK
 *tv9L9L/L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   boolr0    r   r   r   r      sZ     "%/3
 +/8 8  (}	8 !8 
8*; ;r   r   T   )log_responsetimeouturlretry_handlerr:   r;   r   c                    	 t        | |j                  ddi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.
    MetadatatrueTexception_cbheadersinfinitelog_req_respr;   z&Failed to fetch metadata from IMDS: %sr"   N)r   r0   r
   r	   r%   r&   contents)r<   r=   r:   r;   responseerrors         r   
_fetch_urlrI   p   sj     &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d      }t        | |j                  ddi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   r?   r@   TFr9   rA   zPolled IMDS z time(s)r"   )	rR   r   r   r0   r	   r   r%   debugrF   )r<   handlerrG   s      r   fetch_reprovision_datarW      s    
 >
>C!

 	G //V$H 
w--a/09II r   )N)loggingr   typingr   r   r   r   r(   	cloudinitr   cloudinit.sources.helpers.azurer	   cloudinit.url_helperr
   r   	getLoggerr1   r%   rR   r   strr7   r6   bytesrI   rP   r5   rS   rW   r8   r   r   <module>r`      s   
   . .   C 2g!,Y Y@  	  '  	 
    F	 ' 
	4 CG2:3-	@ r   