3 \men @ s d dl Z d dlmZ d dlmZmZmZmZ d dlZd dlm Z d dl mZ d dlm Z mZ e jeZdZG dd d Zd ddeeeeed ddZeeedddZdeee edddZedddZdS ) N)time)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatac @ sF e Zd ZdZdddddeee ee dd d dZedd dZ dS )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. g ?N )logging_backoffmax_connection_errorsretry_codesretry_deadline)r r r returnc C s. || _ || _|| _|| _d| _d| _d | _d S )Ng ?r )r r r r _logging_threshold_request_count_last_error)selfr r r r r /usr/lib/python3.6/imds.py__init__ s zReadUrlRetryHandler.__init__)r c C sP | j d7 _ t|ts.td| tjd dS d}| jd k rNt | jkrNd}nd}| jd k rt|j t jr| jd8 _| jdkrd}n|jd k r|j| j krd}| j | jkr| j| j9 _nd}|jd k r| j|jkrd}|j| _n>| jd kst| jt st|j | j r&d}t|j | _|s4| rLtd| j |f tjd |S )N z1Polling IMDS failed with unexpected exception: %r)logger_funcFTr z1Polling IMDS failed attempt %d with exception: %r)r isinstancer r LOGwarningr r r causerequestsConnectionErrorcoder r r r typeinfo)r Zreq_argsZ exceptionlogZretryr r r exception_callback2 sJ z&ReadUrlRetryHandler.exception_callback)r r r r ) __name__ __module____qualname____doc__floatr intr boolr( r r r r r s r T )log_responsetimeout)url retry_handlerr1 r2 r c C s\ yt | |jddid||d}W n6 tk rT } ztd| tjd W Y dd}~X nX |jS )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. MetadatatrueT)exception_cbheadersinfinitelog_req_respr2 z&Failed to fetch metadata from IMDS: %s)r N)r r( r r r r contents)r3 r4 r1 r2 responseerrorr r r _fetch_urlp s r> )r3 r4 r c C sR t | |d}y tj|S tk rL } ztd| tjd W Y dd}~X nX dS )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. )r4 z&Failed to parse metadata from IMDS: %s)r N)r> r Z load_json ValueErrorr r r )r3 r4 Zmetadatar= r r r _fetch_metadata s r@ )r r r c C s t || d}ytd }t||dS tk r| } z@|jdkrjtdtjd t || d}td }t||dS W Y dd}~X nX dS ) 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=true)r4 i z,Falling back to IMDS api-version: 2019-06-01)r z /instance?api-version=2019-06-01N)r IMDS_URLr@ r r$ r r r )r r r4 r3 r= r r r fetch_metadata_with_api_fallback s" rB )r c C sT t d } tddddd}t| |jd d iddd d}td|jd dtjd |jS )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 r r5 r6 TFr0 )r7 r8 r9 r: r2 zPolled IMDS z time(s))r )rC rD rE ) rA r r r( r r r debugr; )r3 Zhandlerr<