
    Xi.                     H   S r SSKrSSKJr  SSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSK
Jr  SSK
Jr  SSK
Jr  \R                  " \5      r\R$                  " \R&                  S5      r\(       d  \R$                  " \R*                  S5      rS	R-                  \5      rS
R-                  \R$                  " \R0                  S5      5      rSrSr\\0r \" \R$                  " SS5      5      rSr Sr!S r"S r#\S4S jr$\SSSSS4S jr%S r&S r'SS jr(SS jr)g! \ a    Sr N7f = f)zProvides helper methods for talking to the Compute Engine metadata server.

See https://cloud.google.com/compute/docs/metadata for more details.
    N)urljoin)_helpers)environment_vars)
exceptions)metricszmetadata.google.internalzhttp://{}/computeMetadata/v1/z	http://{}z169.254.169.254zmetadata-flavorGoogleGCE_METADATA_TIMEOUT   z/sys/class/dmi/id/product_namec                 b    [        U 5      (       a  g[        R                  S:X  a  g[        5       $ )zChecks to see if the code runs on Google Compute Engine

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.

Returns:
    bool: True if the code runs on Google Compute Engine, False otherwise.
TntF)pingosnamedetect_gce_residency_linuxrequests    O/app/.venv/lib/python3.13/site-packages/google/auth/compute_engine/_metadata.py	is_on_gcer   B   s)     G}}	ww$ &''    c                       [        [        S5       n U R                  5       R                  5       nSSS5        WR                  [        5      $ ! , (       d  f       N#= f! [         a     gf = f)zDetect Google Compute Engine residency by smbios check on Linux

Returns:
    bool: True if the GCE product name file is detected, False otherwise.
rNF)open_GCE_PRODUCT_NAME_FILEreadstrip	Exception
startswith_GOOGLE)file_objcontents     r   r   r   W   s\    (#.(mmo++-G / g&& /.  s-   A AA 
AA A 
A,+A,c                    Sn[         R                  5       n[        R                  " 5       U[        R                  '   X2:  aY   U " [
        SXAS9nUR                  R                  [        5      nUR                  [        R                  :H  =(       a	    U[        :H  $ g! [        R                   a*  n[        R!                  SUS-   UU5        US-  n SnAOSnAff = fX2:  a  M  NJ)a  Checks to see if the metadata server is available.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.
    timeout (int): How long to wait for the metadata server to respond.
    retry_count (int): How many times to attempt connecting to metadata
        server using above timeout.

Returns:
    bool: True if the metadata server is reachable, False otherwise.
r   GET)urlmethodheaderstimeoutJCompute Engine Metadata server unavailable on attempt %s of %s. Reason: %s   NF)_METADATA_HEADERScopyr   mds_pingAPI_CLIENT_HEADER_METADATA_IP_ROOTr%   get_METADATA_FLAVOR_HEADERstatushttp_clientOK_METADATA_FLAVOR_VALUEr   TransportError_LOGGERwarning)r   r&   retry_countretriesr%   responsemetadata_flavores           r   r   r   g   s    & G$$&G)0)9)9);GG%%&

	%eWH '..223JKO;>>1 >#'==  (( 	OO/! qLG	 
s   AB C0 CCF   c                 $   [        X!5      nUc  0 OUn	[        R                  5       n
U(       a  U
R                  U5        U(       a  SU	S'   [        R
                  " X5      nSnX:  a
   U " USU
S9nO%[        R                  " S	R                  U5      5      e[        R                  " UR                  5      nUR                  [        R                  :X  a  U(       a  [        R!                  S
UU5        gUR                  [        R"                  :X  a@  [        R$                  " UR&                  S   5      S:X  a   [(        R*                  " U5      $ U$ [        R                  " SR                  XR                  UR                  5      U5      e! [        R                   a*  n[        R                  SUS-   UU5        US-  n SnAOSnAff = fX:  a  GMn  GNf! [,         a-  n[        R                  " SR                  U5      5      nUUeSnAff = f)a  Fetch a resource from the metadata server.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.
    path (str): The resource to retrieve. For example,
        ``'instance/service-accounts/default'``.
    root (str): The full path to the metadata server root.
    params (Optional[Mapping[str, str]]): A mapping of query parameter
        keys to values.
    recursive (bool): Whether to do a recursive query of metadata. See
        https://cloud.google.com/compute/docs/metadata#aggcontents for more
        details.
    retry_count (int): How many times to attempt connecting to metadata
        server using above timeout.
    headers (Optional[Mapping[str, str]]): Headers for the request.
    return_none_for_not_found_error (Optional[bool]): If True, returns None
        for 404 error instead of throwing an exception.

Returns:
    Union[Mapping, str]: If the metadata server returns JSON, a mapping of
        the decoded JSON is return. Otherwise, the response content is
        returned as a string.

Raises:
    google.auth.exceptions.TransportError: if an error occurred while
        retrieving metadata.
Ntrue	recursiver   r"   )r#   r$   r%   r'   r(   zqFailed to retrieve {} from the Google Compute Engine metadata service. Compute Engine Metadata server unavailablezBCompute Engine Metadata server call to %s returned 404, reason: %szcontent-typezapplication/jsonzMReceived invalid JSON from the Google Compute Engine metadata service: {:.20}z^Failed to retrieve {} from the Google Compute Engine metadata service. Status: {} Response:
{})r   r)   r*   updater   update_queryr   r4   r5   r6   format
from_bytesdatar0   r1   	NOT_FOUNDinfor2   parse_content_typer%   jsonloads
ValueError)r   pathrootparamsr?   r7   r%   return_none_for_not_found_errorbase_urlquery_paramsheaders_to_user#   r8   r9   r;   r    
caught_excnew_excs                     r   r.   r.      s   L t"H2VL&++-Ng&$*[!



7CG

	3unMH ''KKQ6RU;
 	

 !!(--0G+///4SP	

 +..(''(8(8(HI!".zz'** N

#
#	55;V(--6
 	 S (( 	OO/! qLG	 

J  .$33//5vg :-.s0   )F :G G! GG
H"(H

Hc                     [        U S5      $ )a+  Get the Google Cloud Project ID from the metadata server.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.

Returns:
    str: The project ID

Raises:
    google.auth.exceptions.TransportError: if an error occurred while
        retrieving metadata.
zproject/project-idr.   r   s    r   get_project_idrV     s     w,--r   c                 ,    [        U SSS9nU(       d  gU$ )a  Get the universe domain value from the metadata server.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.

Returns:
    str: The universe domain value. If the universe domain endpoint is not
    not found, return the default value, which is googleapis.com

Raises:
    google.auth.exceptions.TransportError: if an error other than
        404 occurs while retrieving metadata.
zuniverse/universe_domainT)rN   zgoogleapis.comrU   )r   universe_domains     r   get_universe_domainrY     s$     +TO r   c                 <    SR                  U5      n[        XSS0S9$ )a  Get information about a service account from the metadata server.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.
    service_account (str): The string 'default' or a service account email
        address. The determines which service account for which to acquire
        information.

Returns:
    Mapping: The service account's information, for example::

        {
            'email': '...',
            'scopes': ['scope', ...],
            'aliases': ['default', '...']
        }

Raises:
    google.auth.exceptions.TransportError: if an error occurred while
        retrieving metadata.
zinstance/service-accounts/{0}/r?   r>   )rM   )rB   r.   )r   service_accountrK   s      r   get_service_account_infor\   )  s(    . ,22?CD wk6%:;;r   c                 R   U(       a+  [        U[        5      (       d  SR                  U5      nSU0nOSn[        R                  [        R
                  " 5       0nSR                  U5      n[        XX4S9n[        R                  " 5       [        R                  " US   S9-   nUS   U4$ )	ag  Get the OAuth 2.0 access token for a service account.

Args:
    request (google.auth.transport.Request): A callable used to make
        HTTP requests.
    service_account (str): The string 'default' or a service account email
        address. The determines which service account for which to acquire
        an access token.
    scopes (Optional[Union[str, List[str]]]): Optional string or list of
        strings with auth scopes.
Returns:
    Tuple[str, datetime]: The access token and its expiration.

Raises:
    google.auth.exceptions.TransportError: if an error occurred while
        retrieving metadata.
,scopesNz#instance/service-accounts/{0}/token)rM   r%   
expires_in)secondsaccess_token)
isinstancestrjoinr   r,   token_request_access_token_mdsrB   r.   r   utcnowdatetime	timedelta)r   r[   r_   rM   metrics_headerrK   
token_jsontoken_expirys           r   get_service_account_tokenrm   F  s    $ &#&&XXf%FF# 	!!7#I#I#KN 177HDW6JJ??$x'9'9<(( L n%|33r   )default)rn   N)*__doc__rh   http.clientclientr1   rH   loggingr   urllib.parser   google.authr   r   r   r   	getLogger__name__r5   getenvGCE_METADATA_HOST_GCE_METADATA_HOSTGCE_METADATA_ROOTrB   _METADATA_ROOTGCE_METADATA_IPr-   r/   r3   r)   int_METADATA_DEFAULT_TIMEOUTrJ   r   r   r   r   r   r.   rV   rY   r\   rm    r   r   <module>r      sO  
  !   	     ( " 


H
% YY/AA4H **,F 1778JK  &&II..0AB  , ! ,.DE " #BII.Da$H I
 9 (*'  4 -f 
$)gT.".<:"4Y  " !"s   D D! D!