
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\meW"              
   @   s   d dl Z d dlZd dlZd dlmZmZ ejeZe	ej
gZG dd dZG dd dZdd ZdddZdddZdddZdddZdS )    N)
url_helperutilc               @   s    e Zd ZdZdd Zdd ZdS )MetadataLeafDecoderz.Decodes a leaf blob into something meaningful.c             C   s,   |sdS |j  }|jdr(|jdr(dS dS )NF{}T)strip
startswithendswith)selftext r   /usr/lib/python3.6/ec2.py_maybe_json_object   s    z&MetadataLeafDecoder._maybe_json_objectc             C   s   |sdS yt j|}W n tk
r*   |S X | j|rvy
tj|S  ttfk
rt } ztj	d|| W Y d d }~X nX |j
ddkr|j S |S )N z6Field %s looked like a json object, but it was not: %s
   )r   decode_binaryUnicodeDecodeErrorr   jsonloads
ValueError	TypeErrorLOGwarningfind
splitlines)r
   fieldblober   r   r   __call__   s"    

zMetadataLeafDecoder.__call__N)__name__
__module____qualname____doc__r   r    r   r   r   r   r      s   r   c               @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )MetadataMaterializerNc             C   s4   || _ d | _|| _|| _|d kr*t | _n|| _d S )N)_blob_md	_base_url_callerr   _leaf_decoder)r
   r   base_urlcallerleaf_decoderr   r   r   __init__7   s    
zMetadataMaterializer.__init__c             C   s   i }g }t j|}|s||fS dd }dd }x|j D ]}|j }||}| s8| rZq8|dkrdq8||r||kr|j| q8|jdd}|}	t|dkr|\}
}t j|
}
|
d k	rd|
 }	|}|	||< q8W ||fS )	Nc             S   s   | j drdS dS d S )N/TF)r	   )itemr   r   r   has_childrenI   s    
z1MetadataMaterializer._parse.<locals>.has_childrenc             S   s   | j dr| jdS | S )Nr/   )r	   rstrip)r0   r   r   r   get_nameO   s    

z-MetadataMaterializer._parse.<locals>.get_namezsecurity-credentials=r   z%s/openssh-key)r   r   r   r   appendsplitlenZsafe_int)r
   r   leaveschildrenr1   r3   r   Z
field_namecontentsresourceZidentZsub_contentsr   r   r   _parseA   s6    

zMetadataMaterializer._parsec             C   s(   | j d k	r| j S | j| j| j| _ | j S )N)r'   _materializer&   r(   )r
   r   r   r   materializel   s    
z MetadataMaterializer.materializec             C   s   | j |\}}i }xD|D ]<}tj||}|jds:|d7 }| j|}| j||||< qW i }	x:|j D ].\}
}tj||}| j|}| j|
||	|
< qfW i }|j| x2|	j	 D ]&}
|
|krt
jd| q|	|
 ||
< qW |S )Nr/   z&Duplicate key found in results from %s)r<   r   combine_urlr	   r)   r=   itemsr*   updatekeysr   r   )r
   r   r+   r8   r9   Zchild_contentscZ	child_urlZ
child_blobZleaf_contentsr   r;   Zleaf_urlZ	leaf_blobZjoinedr   r   r   r=   r   s(    




z!MetadataMaterializer._materialize)N)r!   r"   r#   r.   r<   r>   r=   r   r   r   r   r%   6   s   

+r%   c             C   s
   |j | kS )z/Returns False if cause.code is in status_codes.)code)Zstatus_codesZ_request_argscauser   r   r   skip_retry_on_codes   s    rF   latesthttp://169.254.169.254   c             C   s   t j|| }t j|d}d}	y2|s.tjtt}t j|||||||d}
|
j}	W n\ t jk
r } z|j	tkrzt
jtd| W Y d d }~X n" tk
r   t
jtd| Y nX |	S )Nz	user-data    )ssl_detailstimeoutretriesexception_cb
headers_cbheaders_redactz$Failed fetching userdata from url %s)r   r?   	functoolspartialrF   SKIP_USERDATA_CODESread_file_or_urlr:   UrlErrorrD   r   logexcr   	Exception)api_versionmetadata_addressrK   rL   rM   rO   rP   rN   Zud_urlZ	user_dataresponser   r   r   r   get_instance_userdata   s,    


r[   c                s   t j||| }tjt j||||||	d  fdd}y4 |}t|j|||d}|j }t|t	shi }|S  t
k
r   tjtd| | i S X d S )N)rK   rL   rM   rO   rP   rN   c                sX   y
 | j S  tjk
rR } z* s.| r2 ntjd|  dS W Y d d }~X nX d S )Nz&Skipped retrieval of the content of %sz	(skipped))r:   r   rU   r   r   )Zurlr   )r,   retrieval_exception_ignore_cbr   r   mcaller   s    

z'_get_instance_metadata.<locals>.mcaller)r-   zFailed fetching %s from url %s)r   r?   rQ   rR   rT   r%   r:   r>   
isinstancedictrW   r   rV   r   )treerX   rY   rK   rL   rM   r-   rO   rP   rN   r\   Zmd_urlr]   rZ   ZmaterializerZmdr   )r,   r\   r   _get_instance_metadata   s*    
ra   c
       
      C   s   t d| |||||||||	dS )Nz
meta-data/)r`   rX   rY   rK   rL   rM   r-   rP   rO   rN   r\   )ra   )
rX   rY   rK   rL   rM   r-   rO   rP   rN   r\   r   r   r   get_instance_metadata   s    rb   c	       	      C   s   t d| ||||||||d
S )Nzdynamic/instance-identity)
r`   rX   rY   rK   rL   rM   r-   rP   rO   rN   )ra   )	rX   rY   rK   rL   rM   r-   rO   rP   rN   r   r   r   get_instance_identity  s    rc   )rG   rH   NrI   rI   NNN)
rG   rH   NrI   rI   NNNNN)
rG   rH   NrI   rI   NNNNN)	rG   rH   NrI   rI   NNNN)rQ   r   ZloggingZ	cloudinitr   r   Z	getLoggerr!   r   	frozensetZ	NOT_FOUNDrS   r   r%   rF   r[   ra   rb   rc   r   r   r   r   <module>	   sZ   
#T       
!         
)         
        