
    x[h$                        S SK r S SKrS SKJr  S SKJrJrJrJr  S SK	r	S SK
Jr  S SKJr  S SKJrJr  \ R"                  " \5      rSrS r " S	 S
5      rSSS.S\S\S\S\S\4
S jjrS\S\S\4S jr SS\S\\   S\4S jjrS\4S jrg)    N)	monotonic)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac                 D    S[        [        R                  " 5       5      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            	       Z    \ rS rSrSrSSSSS.S\S\\   S	\\   S
S4S jjrS
\	4S jr
Srg)ReadUrlRetryHandler   a7  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                ^    Xl         X l        X0l        X@l        SU l        SU l        S U l        g )Nr   r   )r   r   r    r!   _logging_threshold_request_count_last_error)selfr   r   r    r!   s        r   __init__ReadUrlRetryHandler.__init__%   s4      /%:"&,"%37r   c                 *   U =R                   S-  sl         [        U[        5      (       d  [        SU-  [        R
                  S9  gSnU R                  b  [        5       U R                  :  a  SnOSnU R                  bQ  [        UR                  [        R                  5      (       a(  U =R                  S-  sl        U R                  S::  a  SnO)UR                  b  UR                  U R                  ;  a  SnU R                   U R                  :  a   U =R                  U R                  -  sl        OSnUR                  b.  U R                   UR                  :w  a  SnUR                  U l        OmU R                   bD  [        U R                   ["        5      (       a%  [        UR                  U R                   5      (       d  Sn[#        UR                  5      U l        U(       d  U(       d'  [        SU R                   U4-  [        R
                  S9  U$ )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_callback&ReadUrlRetryHandler.exception_callback:   s   q )X..#CKK
 +t222EE
 %%1jOOX557
 7
 &&!+&))Q.NN&d&6&66E$"9"99##t';';;#C >>%9>>1#,>>  $d..55ioot/?/?@@C#IOO4De#C&&	23KK
 r   )r&   r$   r%   r   r   r    r!   )__name__
__module____qualname____firstlineno____doc__floatr   intr(   boolr9   __static_attributes__ r   r   r   r      sZ     "%/3
 +/8 8  (}	8 !8 
8*>t >r   r   T   )log_responsetimeouturlretry_handlerrF   rG   r"   c          	           [        U UR                  [        SUUS9nUR                  $ ! [         a!  n[	        SU-  [
        R                  S9  e SnAff = f)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_resprG   z&Failed to fetch metadata from IMDS: %sr,   N)r   r9   r   r
   r	   r/   r0   contents)rH   rI   rF   rG   responseerrors         r   
_fetch_urlrR   {   se     &99!%
   4u<	
 	s   * 
AAAc                    [        XS9n [        R                  " UR                  S5      5      $ ! [         a!  n[        SU-  [        R                  S9  e SnAff = f)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.
rI   zutf-8z&Failed to parse metadata from IMDS: %sr,   N)rR   r   	load_jsondecode
ValueErrorr	   r/   r0   )rH   rI   metadatarQ   s       r   _fetch_metadatarY      sW     #;H~~hoog677 4u<	
 	s   $0 
AAAr!   r   c                     [        UU S9n [        S-   n[        X2S9$ ! [         aO  nUR                  S:X  a9  [        S[        R                  S9  [        UU S9n[        S-   n[        X2S9s SnA$ e SnAff = f)	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=truerT   i  z,Falling back to IMDS api-version: 2019-06-01r,   z /instance?api-version=2019-06-01N)r   IMDS_URLrY   r
   r4   r	   r/   r0   )r!   r   rI   rH   rQ   s        r    fetch_metadata_with_api_fallbackr\      s     (3%MIIs@@ ::#>KK 0&;-M ??C"3DDs!    
A7AA2+A71A22A7c            	          [         S-   n [        SSSSS9n[        U UR                  [        SSS	S
9n[        SUR                  S-    S3[        R                  S9  UR                  $ )z`Fetch 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   TFrE   rK   zPolled IMDS z time(s)r,   )
r[   r   r   r9   r   r	   r%   r/   debugrO   )rH   handlerrP   s      r   fetch_reprovision_datar`      s    
 >
>C!

 	G //H 
w--a/09II r   )N) loggingr   timer   typingr   r   r   r   r2   	cloudinitr   cloudinit.sources.helpers.azurer	   cloudinit.url_helperr
   r   	getLoggerr;   r/   r[   r   r   r   rB   rA   bytesrR   rY   r@   r\   r`   rD   r   r   <module>ri      s   
    . .   C 2!,\ \F  	  '  	 
    F	 ' 
	4 CG2:3-	@ r   