
    x[hM"                        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      Z G d d      Zd Z	 	 dddddddd	d
Z	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 ddZy)    N)
url_helperutilc                       e Zd ZdZd Zd Zy)MetadataLeafDecoderz.Decodes a leaf blob into something meaningful.c                 p    |sy|j                         }|j                  d      r|j                  d      ryy)NF{}T)strip
startswithendswith)selftexts     ?/usr/lib/python3/dist-packages/cloudinit/sources/helpers/ec2.py_maybe_json_objectz&MetadataLeafDecoder._maybe_json_object   s0    zz|??3DMM#$6    c                 V   |sy	 t        j                  |      }| j                  |      r	 t	        j
                  |      S |j                  d      dk7  r|j                         S |S # t        $ r |cY S w xY w# t        t        f$ r!}t        j                  d||       Y d }~bd }~ww xY w)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es       r   __call__zMetadataLeafDecoder.__call__   s    	%%d+D ""4(zz$'' 99T?b ??$$ " 	K	 	* L s(   A' A8 'A54A58B(B##B(N)__name__
__module____qualname____doc__r   r#    r   r   r   r      s    8r   r   c                   &    e Zd ZddZd Zd Zd Zy)MetadataMaterializerNc                 n    || _         d | _        || _        || _        |t	               | _        y || _        y N)_blob_md	_base_url_callerr   _leaf_decoder)r   r!   base_urlcallerleaf_decoders        r   __init__zMetadataMaterializer.__init__7   s7    
!!4!6D!-Dr   c                    i }g }t        j                  |      }|s||fS d }d }|j                         D ]  }|j                         } ||      }|r|s |dk(  r& ||      r||vs3|j	                  |       E|j                  dd      }|}	t        |      dkD  r#|\  }
}t        j                  |
      }
|
d|
z  }	|}|	||<    ||fS )Nc                 (    | j                  d      ryy)N/TF)r   items    r   has_childrenz1MetadataMaterializer._parse.<locals>.has_childrenI   s    }}S!r   c                 J    | j                  d      r| j                  d      S | S )Nr8   )r   rstripr9   s    r   get_namez-MetadataMaterializer._parse.<locals>.get_nameO   s"    }}S!{{3''Kr   zsecurity-credentials=   z%s/openssh-key)r   r   r   r
   appendsplitlensafe_int)r   r!   leaveschildrenr;   r>   r    
field_namecontentsresourceidentsub_contentss               r   _parsezMetadataMaterializer._parseA   s    !!$'H%%		
 __& 	.EKKME!%J
33E"X-OOJ/ ;;sA.%x=1$,4)UL MM%0E(#3u#=%1
%-z"+	., !!r   c                     | j                   | j                   S | j                  | j                  | j                        | _         | j                   S r,   )r.   _materializer-   r/   )r   s    r   materializez MetadataMaterializer.materializel   s:    8888O$$TZZ@xxr   c                 &   | j                  |      \  }}i }|D ]T  }t        j                  ||      }|j                  d      s|dz  }| j	                  |      }| j                  ||      ||<   V i }	|j                         D ]A  \  }
}t        j                  ||      }| j	                  |      }| j                  |
|      |	|
<   C i }|j                  |       |	j                         D ]%  }
|
|v rt        j                  d|       |	|
   ||
<   ' |S )Nr8   z&Duplicate key found in results from %s)rL   r   combine_urlr   r0   rN   itemsr1   updatekeysr   r   )r   r!   r2   rE   rF   child_contentsc	child_url
child_blobleaf_contentsr    rI   leaf_url	leaf_blobjoineds                  r   rN   z!MetadataMaterializer._materializer   s)   ![[. 	IA"..x;I%%c*S 	i0J $ 1 1*i HN1	I %||~ 	HOE8!--hAHX.I#'#5#5eY#GM% 	H n%"'') 	5EDhO -e 4u		5
 r   r,   )r$   r%   r&   r5   rL   rO   rN   r(   r   r   r*   r*   6   s    .)"Vr   r*   c                     |j                   | vS )z/Returns False if cause.code is in status_codes.)code)status_codescauses     r   skip_retry_on_codesra      s    ::\))r      ssl_detailstimeoutretries
headers_cbheaders_redactexception_cbc          	         t        j                  ||       }t        j                  |d      }d}		 |st        j                  t        t
              }t        j                  |||||||      }
|
j                  }	|	S # t         j                  $ r8}|j                  t
        vrt        j                  t        d|       Y d }~|	S d }~wt        $ r t        j                  t        d|       Y |	S w xY w)Nz	user-datar   )rd   re   rf   ri   rg   rh   z$Failed fetching userdata from url %s)r   rQ   	functoolspartialra   SKIP_USERDATA_CODESread_file_or_urlrH   UrlErrorr^   r   logexcr   	Exception)api_versionmetadata_addressrd   re   rf   rg   rh   ri   ud_url	user_dataresponser"   s               r   get_instance_userdatarw      s     ##$4kBF##FK8FII %,,#%8L ..#%!)
 %%	   M66,,KKCVL   IC?HIs   AA: :C+-C  'C+*C+c           	      z  
 t        j                  |||       }t        j                  t         j                  ||||||	      
fd}	  |      }t        |j                  |||      }|j                         }t        |t              si }|S # t        $ r! t        j                  t        d| |       i cY S w xY w)Nrc   c                     	  |       j                   S # t        j                  $ r+}r |      s t        j	                  d|        Y d }~yd }~ww xY w)Nz&Skipped retrieval of the content of %sz	(skipped))rH   r   ro   r   r   )urlr"   r3   retrieval_exception_ignore_cbs     r   mcallerz'_get_instance_metadata.<locals>.mcaller   sN    
	##;'''"" 	#14Q7DcJ"	#s    A!AA)r4   zFailed fetching %s from url %s)r   rQ   rk   rl   rn   r*   rH   rO   
isinstancedictrq   r   rp   r   )treerr   rs   rd   re   rf   r4   rg   rh   ri   r{   md_urlr|   rv   materializermdr3   s             `     @r   _get_instance_metadatar      s     ##$4k4HF##%!F#&>+vw\
 %%'"t%B	 C94H	s   AB 'B:9B:c
                 .    t        d| |||||||||	      S )Nz
meta-data/)r   rr   rs   rd   re   rf   r4   rh   rg   ri   r{   r   )
rr   rs   rd   re   rf   r4   rg   rh   ri   r{   s
             r   get_instance_metadatar      s2     ")!%!&C r   c	                 ,    t        d| ||||||||
      S )Nzdynamic/instance-identity)
r   rr   rs   rd   re   rf   r4   rh   rg   ri   r   )	rr   rs   rd   re   rf   r4   rg   rh   ri   s	            r   get_instance_identityr     s/     "()!%! r   )latesthttp://169.254.169.254)
r   r   Nrb   rb   NNNNN)	r   r   Nrb   rb   NNNN)rk   r   logging	cloudinitr   r   	getLoggerr$   r   	frozenset	NOT_FOUNDrm   r   r*   ra   rw   r   r   r   r(   r   r   <module>r      s       &g!!5!5 67  FQ Qh* -% %T -"&0h -"&< -r   