o
                         @   s   d Z ddlZddlZddlZddlZddlmZ ddlmZ	 ddl
mZ ddl
mZ ddl
mZ ded	d
ZddiZedfddZdddZdddZdS )zProvides helper methods for talking to the Compute Engine metadata server.

See https://cloud.google.com/compute/docs/metadata
    N)http_client)parse)_helpers)client)utilzhttp://{}/computeMetadata/v1/GCE_METADATA_ROOTzmetadata.google.internalzMetadata-FlavorGooglec                 C   sl   t ||}t|d|}| |td\}}|jtjkr-t	|}|d dkr+t
|S |S td||)a	  Fetch a resource from the metadata server.

    Args:
        path: A string indicating the resource to retrieve. For example,
            'instance/service-accounts/defualt'
        http_request: A callable that matches the method
            signature of httplib2.Http.request. Used to make the request to the
            metadataserver.
        root: A string indicating the full path to the metadata server root.
        recursive: A boolean indicating whether to do a recursive query of
            metadata. See
            https://cloud.google.com/compute/docs/metadata#aggcontents

    Returns:
        A dictionary if the metadata server returns JSON, otherwise a string.

    Raises:
        httplib2.Httplib2Error if an error corrured while retrieving metadata.
    	recursive)headerszcontent-typezapplication/jsonzTFailed to retrieve {0} from the Google Compute Enginemetadata service. Response:
{1})urlparseurljoinr   _add_query_parameterMETADATA_HEADERSstatusr   OKr   _from_bytesjsonloadshttplib2HttpLib2Errorformat)http_requestpathrootr	   urlresponsecontentdecoded r   G/tmp/google-cloud-sdk/lib/third_party/oauth2client/contrib/_metadata.pyget&   s   


r    defaultc                 C   s   t | d|ddS )a  Get information about a service account from the metadata server.

    Args:
        service_account: An email specifying the service account for which to
            look up information. Default will be information for the "default"
            service account of the current compute engine instance.
        http_request: A callable that matches the method
            signature of httplib2.Http.request. Used to make the request to the
            metadata server.
    Returns:
         A dictionary with information about the specified service account,
         for example:

            {
                'email': '...',
                'scopes': ['scope', ...],
                'aliases': ['default', '...']
            }
    zinstance/service-accounts/{0}/T)r	   )r    r   )r   service_accountr   r   r   get_service_account_infoN   s
   r#   c                 C   s4   t | d|}t tj|d d }|d |fS )a  Fetch an oauth token for the

    Args:
        service_account: An email specifying the service account this token
            should represent. Default will be a token for the "default" service
            account of the current compute engine instance.
        http_request: A callable that matches the method
            signature of httplib2.Http.request. Used to make the request to the
            metadataserver.

    Returns:
         A tuple of (access token, token expiration), where access token is the
         access token as a string and token expiration is a datetime object
         that indicates when the access token will expire.
    z#instance/service-accounts/{0}/token
expires_in)secondsaccess_token)r    r   r   _UTCNOWdatetime	timedelta)r   r"   
token_jsontoken_expiryr   r   r   	get_tokenh   s   
r,   )r!   )__doc__r(   r   osr   	six.movesr   six.moves.urllibr   r   oauth2clientr   r   r   r   getenvMETADATA_ROOTr   r    r#   r,   r   r   r   r   <module>   s"   

(