Ë
    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   € àÜ"%¤d§j¡j£lÓ"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ØñäŸK™Kõð
 àˆà×ÑÐ+Ü“˜t×2Ñ2Ò2à‰EàˆEð
 ×%Ñ%Ð1´jØ�O‰OœX×5Ñ5ô7
ð ×&Ò&¨!Ñ+Õ&Ø×)Ñ)¨QÒ.Ø‘à�N‰NÐ&Ø—‘ d×&6Ñ&6Ñ6àˆEà×Ñ $×"9Ñ"9Ò9Ø×#Ò# t×';Ñ';Ñ;Ö#àˆCð �>‰>Ð%à×Ñ 9§>¡>Ò1Ø�Ø#,§>¡>�Õ ð ×ÑÐ$ä˜d×.Ñ.´Ô5ä˜iŸo™o¨t×/?Ñ/?Ô@àˆCÜ# I§O¡OÓ4ˆDÔá‘eÜ#ØCØ×&Ñ&¨	Ð2ñ3äŸK™Kõð
 ˆ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Ü!ØØ%Øô
ˆð ×ÑÐøô ò ÜØ4°uÑ<ÜŸ™õ	
ð 	ûðús   ‚- ­	A¶AÁAc                óÆ   — t        | |¬«      }	 t        j                  |j                  d«      «      S # t        $ r$}t        d|z  t        j                  ¬«       ‚ d}~ww xY w)zßFetch 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ðÜ�~‰~˜hŸo™o¨gÓ6Ó7Ð7øÜò ÜØ4°uÑ<ÜŸ™õ	
ð 	ûðú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)	zïFetch 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°-Ô@Ð@øÜò Ø�:‰:˜ÒÜ#Ø>ÜŸK™Kõô 0Ø&;Ø-ôˆMô Ð?Ñ?ˆCÜ" 3°mÔ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Ü—I‘Iõð ×ÑÐ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   