o x[h$ @sddlZddlZddlmZddlmZmZmZmZddl Z ddl m Z ddl m Z ddlmZmZeeZdZdd ZGd d d Zd d ddededededef ddZdededefddZ ddedeedefddZdefddZdS)N) monotonic)DictOptionalTypeUnion)util)report_diagnostic_event)UrlErrorreadurlzhttp://169.254.169.254/metadatacCsdttdS)Ntrue)Metadatazx-ms-client-request-id)struuiduuid4)_urlr>/usr/lib/python3/dist-packages/cloudinit/sources/azure/imds.py headers_cbs rc @sLeZdZdZddddddedeedeed dfd d Zd efd d Z dS)ReadUrlRetryHandleraKManager 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)ilogging_backoffmax_connection_errors retry_codesretry_deadlinerrrreturncCs.||_||_||_||_d|_d|_d|_dS)Nrr)rrrr_logging_threshold_request_count _last_error)selfrrrrrrr__init__%s  zReadUrlRetryHandler.__init__cCs@|jd7_t|tstd|tjddSd}|jdur't|jkr'd}nd}|jdurDt|j t j rD|jd8_|jdkrCd}n |j durQ|j |j vrQd}|j|jkr`|j|j9_nd}|j durt|j|j krsd}|j |_n|jdust|jtrt|j |jsd}t|j |_|s|std|j|ftjd|S)Nz1Polling IMDS failed with unexpected exception: %r logger_funcFTrz1Polling IMDS failed attempt %d with exception: %r)r isinstancer rLOGwarningrrrcauserequestsConnectionErrorcoderrrr!type)r" exceptionlogretryrrrexception_callback:s^              z&ReadUrlRetryHandler.exception_callback) __name__ __module__ __qualname____doc__floatrintr#boolr2rrrrrs    rT) log_responsetimeouturl retry_handlerr;r<rc CsLzt||jtd||d}W|jSty%}z td|tjdd}~ww)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_cbrinfinite log_req_respr<z&Failed to fetch metadata from IMDS: %sr%N)r r2rr rr(r)contents)r=r>r;r<responseerrorrrr _fetch_url{s$rFc CsLt||d}z t|dWSty%}z td|tjdd}~ww)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>zutf-8z&Failed to parse metadata from IMDS: %sr%N)rFr load_jsondecode ValueErrorrr(r))r=r>metadatarErrr_fetch_metadatas rLrrc Cst||d}z td}t||dWSty@}z#|jdkr;tdtjdt||d}td}t||dWYd}~Sd}~ww) 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. )rrz./instance?api-version=2021-08-01&extended=truerGiz,Falling back to IMDS api-version: 2019-06-01r%z /instance?api-version=2019-06-01N)rIMDS_URLrLr r-rr(r))rrr>r=rErrr fetch_metadata_with_api_fallbacks,  rNcCsPtd}tddddd}t||jtddd d }td |jdd tjd |j S)zhFetch extended metadata, falling back to non-extended as required. :raises UrlError: on error. z'/reprovisiondata?api-version=2019-06-01g@r$)rrrNrTFr:r?z Polled IMDS z time(s)r%) rMrr r2rrr r(debugrC)r=handlerrDrrrfetch_reprovision_datas(  rQ)N) loggingrtimertypingrrrrr+ cloudinitrcloudinit.sources.helpers.azurercloudinit.url_helperr r getLoggerr3r(rMrrr r9r8bytesrFrLr7rNrQrrrrsR    c #