U
    Ld"                  
   @   s   d dl Z d dlZd dlmZ d dlmZmZ e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)log)
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 |  }|dr(|dr(dS dS )NF{}T)strip
startswithendswith)selftext r   ?/usr/lib/python3/dist-packages/cloudinit/sources/helpers/ec2.py_maybe_json_object   s    z&MetadataLeafDecoder._maybe_json_objectc              
   C   s   |sdS zt |}W n tk
r.   | Y S X | |r|zt|W S  ttfk
rz } zt	d|| W 5 d }~X Y nX |
ddkr| 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 |}|s||fS dd }dd }| D ]}| }||}|r6|sTq6|dkr^q6||rz||kr|| q6|dd}|}	t|dkr|\}
}t |
}
|
d k	rd|
 }	|}|	||< q6||fS )	Nc                 S   s   |  drdS dS d S )N/TF)r
   itemr   r   r   has_childrenI   s    
z1MetadataMaterializer._parse.<locals>.has_childrenc                 S   s   |  dr| dS | S )Nr0   )r
   rstripr1   r   r   r   get_nameO   s    

z-MetadataMaterializer._parse.<locals>.get_namezsecurity-credentials=   z%s/openssh-key)r   r   r   r   appendsplitlenZsafe_int)r   r   leaveschildrenr3   r5   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 S r&   )r(   _materializer'   r)   )r   r   r   r   materializel   s    
z MetadataMaterializer.materializec                 C   s   |  |\}}i }|D ]<}t||}|ds8|d7 }| |}| ||||< qi }	| D ].\}
}t||}| |}| |
||	|
< q`i }|| |		 D ]&}
|
|krt
d| q|	|
 ||
< q|S )Nr0   z&Duplicate key found in results from %s)r?   r   combine_urlr
   r*   r@   itemsr+   updatekeysr   r   )r   r   r,   r;   r<   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?   rA   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    rI   latesthttp://169.254.169.254   c              
   C   s   t || }t |d}d}	z2|s.ttt}t j|||||||d}
|
j}	W n\ t jk
r } z|j	tkrzt
td| W 5 d }~X Y n" tk
r   t
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   rB   	functoolspartialrI   SKIP_USERDATA_CODESread_file_or_urlr=   UrlErrorrG   r   logexcr   	Exception)api_versionmetadata_addressrN   rO   rP   rR   rS   rQ   Zud_urlZ	user_dataresponser   r   r   r   get_instance_userdata   s2    
 	

r^   c              	      s   t ||| }tjt j||||||	d  fdd}z6 |}t|j|||d}| }t|t	shi }|W S  t
k
r   ttd| | i  Y S X d S )N)rN   rO   rP   rR   rS   rQ   c              
      s\   z | j W S  tjk
rV } z*r,|s0 ntd|  W Y dS W 5 d }~X Y nX d S )Nz&Skipped retrieval of the content of %sz	(skipped))r=   r   rX   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   rB   rT   rU   rW   r%   r=   rA   
isinstancedictrZ   r   rY   r   )treer[   r\   rN   rO   rP   r.   rR   rS   rQ   r`   Zmd_urlra   r]   ZmaterializerZmdr   r_   r   _get_instance_metadata   s4    
   
re   c
           
      C   s   t d| |||||||||	dS )Nz
meta-data/)rd   r[   r\   rN   rO   rP   r.   rS   rR   rQ   r`   re   )
r[   r\   rN   rO   rP   r.   rR   rS   rQ   r`   r   r   r   get_instance_metadata   s    rg   c	           	      C   s   t d| ||||||||d
S )Nzdynamic/instance-identity)
rd   r[   r\   rN   rO   rP   r.   rS   rR   rQ   rf   )	r[   r\   rN   rO   rP   r.   rR   rS   rQ   r   r   r   get_instance_identity  s    rh   )rJ   rK   NrL   rL   NNN)
rJ   rK   NrL   rL   NNNNN)
rJ   rK   NrL   rL   NNNNN)	rJ   rK   NrL   rL   NNNN)rT   r   Z	cloudinitr   Zloggingr   r   Z	getLoggerr!   r   	frozensetZ	NOT_FOUNDrV   r   r%   rI   r^   re   rg   rh   r   r   r   r   <module>	   sb   
#T        
)          
4          
         