o
    K&b                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 dZdZeefZdZd	Zd
ZdZdZdZdZed ZG dd de
ZdS )    N)AnyDict)	HTTPError)
exceptionsutil)AutoAttachCloudInstancez169.254.169.254z[fd00:ec2::254]zhttp://{}/latest/api/tokenz0http://{}/latest/dynamic/instance-identity/pkcs7z/sys/hypervisor/uuidz /sys/class/dmi/id/product_serialz/sys/class/dmi/id/product_uuidZ21600zX-aws-ec2-metadata-tokenz-ttl-secondsc                   @   s   e Zd ZdZdZdd Zeeje	g ddde
eef fddZd	d
 Zeje	g dddd ZedefddZedefddZdS )UAAutoAttachAWSInstanceNc                 C   s    |   }tjt| j|ddS )N   )headerstimeout)_request_imds_v2_token_headersr   readurlIMDS_URLformat_ip_address)selfr
    r   5/usr/lib/python3/dist-packages/uaclient/clouds/aws.py_get_imds_url_response   s   z.UAAutoAttachAWSInstance._get_imds_url_response)r	         )Zretry_sleepsreturnc                 C   s   |   \}}d|iS )NZpkcs7)r   )r   response_headersr   r   r   identity_doc%   s   z$UAAutoAttachAWSInstance.identity_docc                 C   s   t D ]=}z| j|d}W n/ ty } z|d }~w ty; } zdj|t|ddd}t| W Y d }~qd }~ww || _ | jd u rOt	
ddt  |S )N)
ip_addressz8Could not reach AWS IMDS at http://{endpoint}: {reason}
reason )Zendpointr   z6No valid AWS IMDS endpoint discovered at addresses: %sz, )IMDS_IP_ADDRESS_get_imds_v2_token_headersr   	Exceptionr   getattrloggingdebugr   r   ZUserFacingErrorjoin)r   Zaddressr
   emsgr   r   r   r   +   s0   	
z6UAAutoAttachAWSInstance._request_imds_v2_token_headersc              
   C   s   | j dkrd S | j rt| j iS ztjt|dttidd\}}W n ty= } z|j	dkr8d| _ W Y d }~d S  d }~ww || _ t| j iS )NZIMDSv1ZPUTr	   )methodr
   r   i  )

_api_tokenAWS_TOKEN_PUT_HEADERr   r   IMDS_V2_TOKEN_URLr   AWS_TOKEN_REQ_HEADERAWS_TOKEN_TTL_SECONDSr   code)r   r   r   r   r%   r   r   r   r   C   s(   



z2UAAutoAttachAWSInstance._get_imds_v2_token_headersc                 C   s   dS )NZawsr   )r   r   r   r   
cloud_typeZ   s   z"UAAutoAttachAWSInstance.cloud_typec                 C   s   zt t}d|dd krW dS W n	 ty   Y nw t t }t t }d|dd   kr=|dd kr@dS  dS dS )z$This machine is a viable AWSInstanceZec2r      TF)r   Z	load_fileSYS_HYPERVISOR_PRODUCT_UUIDFileNotFoundErrorDMI_PRODUCT_UUIDlowerDMI_PRODUCT_SERIAL)r   Zhypervisor_uuidZdmi_uuidZ
dmi_serialr   r   r   	is_viable^   s   
"z!UAAutoAttachAWSInstance.is_viable)__name__
__module____qualname__r(   r   r   propertyr   Zretryr   r   strr   r   r   r   r.   boolr5   r   r   r   r   r      s    
r   )r"   typingr   r   Zurllib.errorr   Zuaclientr   r   Zuaclient.cloudsr   ZIMDS_IPV4_ADDRESSZIMDS_IPV6_ADDRESSr   r*   r   r0   r4   r2   r,   r)   r+   r   r   r   r   r   <module>   s"    