
"T`"                 @   s>  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z e j e  Z	 e
 e j g  Z Gd d   d e  Z Gd d   d e  Z d	 d
   Z d d d d d d d d d d  Z d d d d d d d d d d d 	 Z d d d d d d d d d d d 	 Z d d d d d d d d 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| j    } | j d  r8 | j d  r8 d Sd S)NF{}T)strip
startswithendswith)selftext r   5/usr/lib/python3/dist-packages/cloudinit/ec2_utils.py_maybe_json_object   s    z&MetadataLeafDecoder._maybe_json_objectc             C   s   | s
 d Sy t  j |  } Wn t k
 r5 | SYn X|  j |  r y t j |  SWn> t t f k
 r } z t j	 d | |  WYd  d  } ~ Xn 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               @   sC   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d S)
MetadataMaterializerNc             C   sL   | |  _  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__5   s    				zMetadataMaterializer.__init__c             C   s/  i  } g  } t  j |  } | s+ | | f Sd d   } d d   } x | j   D] } | j   } | |  } | sP | r qP | d k r qP | |  r | | k r!| j |  qP | j d d  } | }	 t |  d k r| \ }
 } t  j |
  }
 |
 d  k	 rd |
 }	 | } |	 | | <qP W| | f S)	Nc             S   s   |  j  d  r d Sd Sd  S)N/TF)r
   )itemr   r   r   has_childrenG   s    z1MetadataMaterializer._parse.<locals>.has_childrenc             S   s    |  j  d  r |  j d  S|  S)Nr0   )r
   rstrip)r1   r   r   r   get_nameM   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childrenr2   r4   r   Z
field_namecontentsresourceZidentZsub_contentsr   r   r   _parse?   s6    

zMetadataMaterializer._parsec             C   s8   |  j  d  k	 r |  j  S|  j |  j |  j  |  _  |  j  S)N)r(   _materializer'   r)   )r   r   r   r   materializej   s    z MetadataMaterializer.materializec             C   s1  |  j  |  \ } } i  } x^ | D]V } t j | |  } | j d  sS | d 7} |  j |  } |  j | |  | | <q" Wi  }	 xQ | j   D]C \ }
 } t j | |  } |  j |  } |  j |
 |  |	 |
 <q Wi  } | j |  xA |	 j	   D]3 }
 |
 | k rt
 j d |  q |	 |
 | |
 <q W| S)Nr0   z&Duplicate key found in results from %s)r=   r   combine_urlr
   r*   r>   itemsr+   updatekeysr   r   )r   r   r,   r9   r:   Zchild_contentscZ	child_urlZ
child_blobZleaf_contentsr   r<   Zleaf_urlZ	leaf_blobZjoinedr   r   r   r>   p   s*    
	
z!MetadataMaterializer._materialize)r"   r#   r$   r/   r=   r?   r>   r   r   r   r   r&   4   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    rG   Zlatestzhttp://169.254.169.254   c             C   s   t  j | |   } t  j | d  } d }	 yX | sE t j t t  } t  j | d | d | d | d | d | d | }
 |
 j }	 Wnn t  j k
 r } z' | j	 t k r t
 j t d	 |  WYd  d  } ~ Xn% t k
 r t
 j t d	 |  Yn X|	 S)
Nz	user-datar   ssl_detailstimeoutretriesexception_cb
headers_cbheaders_redactz$Failed fetching userdata from url %s)r   r@   	functoolspartialrG   SKIP_USERDATA_CODESread_file_or_urlr;   ZUrlErrorrE   r   logexcr   	Exception)api_versionmetadata_addressrI   rJ   rK   rM   rN   rL   Zud_urlZ	user_dataresponser    r   r   r   get_instance_userdata   s$    			%rX   c
                s   t  j | | |   }
 t j t  j d | d | d | d | d | d |	     f d d   } yP   |
  } t | j |
 | d	 | } | j   } t | t	  s i  } | SWn, t
 k
 r t j t d
 |  |
  i  SYn Xd  S)NrI   rJ   rK   rM   rN   rL   c                s     |   j  S)N)r;   )Zurl)r-   r   r   mcaller   s    z'_get_instance_metadata.<locals>.mcallerr.   zFailed fetching %s from url %s)r   r@   rO   rP   rR   r&   r;   r?   
isinstancedictrT   r   rS   r   )treerU   rV   rI   rJ   rK   r.   rM   rN   rL   Zmd_urlrY   rW   ZmaterializerZmdr   )r-   r   _get_instance_metadata   s&    				r]   c	       	      C   sC   t  d d d |  d | d | d | d | d | d	 | d
 | d |  
S)Nr\   z
meta-data/rU   rV   rI   rJ   rK   r.   rN   rM   rL   )r]   )	rU   rV   rI   rJ   rK   r.   rM   rN   rL   r   r   r   get_instance_metadata   s    r^   c	       	      C   sC   t  d d d |  d | d | d | d | d | d	 | d
 | d |  
S)Nr\   zdynamic/instance-identityrU   rV   rI   rJ   rK   r.   rN   rM   rL   )r]   )	rU   rV   rI   rJ   rK   r.   rM   rN   rL   r   r   r   get_instance_identity   s    r_   )rO   r   Z	cloudinitr   Zloggingr   r   Z	getLoggerr"   r   	frozensetZ	NOT_FOUNDrQ   objectr   r&   rG   rX   r]   r^   r_   r   r   r   r   <module>	   s@    U				