o
    Jh                     @   s   d dl Z d dlZd dlmZmZ d dlmZmZmZ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dZed Zee
eZG dd deZdS )    N)AnyDict)
exceptionshttpsecret_managersystemutil)PublicCloudAutoAttachInstancez169.254.169.254z[fd00:ec2::254]zhttp://{}/latest/api/tokenz0http://{}/latest/dynamic/instance-identity/pkcs7z3http://{}/latest/dynamic/instance-identity/documentz/sys/hypervisor/uuidz /sys/class/dmi/id/product_serialz/sys/class/dmi/id/product_uuid21600zX-aws-ec2-metadata-tokenz-ttl-secondsc                   @   s   e Zd ZdZdZdefddZeej	e
jg dddeeef fdd	Zej	e
jg dddefd
dZedefddZdd Zej	e
jg dddd ZedefddZedefddZdefddZdedefddZdS )AWSAutoAttachInstanceNurlc                 C   s2   t j||dd}|jdkr|jS tj|j|jd)N   )headerstimeout   codebody)r   readurlr   r   r   CloudMetadataError)selfr   r   response r   5/usr/lib/python3/dist-packages/uaclient/clouds/aws.py_get_imds_url_response   s   
z,AWSAutoAttachInstance._get_imds_url_response)g      ?r   r   )retry_sleepsreturnc                 C   s6   |   }t| j}| j||d}tj| d|iS )Nr   pkcs7)_request_imds_v2_token_headersIMDS_URLformat_ip_addressr   r   secrets
add_secret)r   r   r   imds_url_responser   r   r   identity_doc*   s
   z"AWSAutoAttachInstance.identity_docc              
   C   sf   |   }t| j}zt| j||d}W |S  tjy2 } zt	d| i W  Y d}~S d}~ww )a  
        Get the instance identity doc associated with the current instance.

        See
        https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/retrieve-iid.html
        for more context.

        @return: Dict containing the instance identity document.
        r   z-Error decoding instance identity document: %sN)
r   _IMDS_IID_URLr!   r"   jsonloadsr   JSONDecodeErrorLOGdebug)r   r   r   ii_docer   r   r   _get_ii_doc3   s   z!AWSAutoAttachInstance._get_ii_docc                 C   s0   |   }|dd}|dd}t|pt|S )a  
        Determines if the instance is likely Ubuntu Pro.

        Criteria: if any billing-product or marketplace-product-code is
        present, then is likely a Pro instance.

        @return: Boolean indicating if the instance is likely pro or not.
        billingProductsNmarketplaceProductCodes)r/   getbool)r   r-   billing_productsmarketplace_product_codesr   r   r   is_likely_proI   s   
z#AWSAutoAttachInstance.is_likely_proc                 C   s|   t D ]+}z| j|d}W n ty) } ztd|t|dd W Y d }~qd }~ww || _ | jd u r<tjd	t d|S )N)
ip_addressz*Could not reach AWS IMDS at http://%s: %s
reason z, )	addresses)
IMDS_IP_ADDRESS_get_imds_v2_token_headers	Exceptionr+   warninggetattrr"   r   AWSNoValidIMDSjoin)r   addressr   r.   r   r   r   r   X   s$   

z4AWSAutoAttachInstance._request_imds_v2_token_headers)r         c                 C   s   | j dkrd S | j rt| j iS tjt|dttidd}|jdkr2|j	| _ t
j| j  t| j iS |jdkr<d| _ d S tj|j|j	d)NIMDSv1PUTr   )methodr   r   r   i  r   )
_api_tokenAWS_TOKEN_PUT_HEADERr   r   IMDS_V2_TOKEN_URLr!   AWS_TOKEN_REQ_HEADERAWS_TOKEN_TTL_SECONDSr   r   r   r#   r$   r   r   )r   r7   r   r   r   r   r<   k   s(   




z0AWSAutoAttachInstance._get_imds_v2_token_headersc                 C      dS )Nawsr   r   r   r   r   
cloud_type      z AWSAutoAttachInstance.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 AWSInstanceec2r      TF)r   	load_fileSYS_HYPERVISOR_PRODUCT_UUIDFileNotFoundErrorDMI_PRODUCT_UUIDlowerDMI_PRODUCT_SERIAL)r   hypervisor_uuiddmi_uuid
dmi_serialr   r   r   	is_viable   s   
"zAWSAutoAttachInstance.is_viablec                 C   rM   )UnsupportedFr   rO   r   r   r   should_poll_for_pro_license   rQ   z1AWSAutoAttachInstance.should_poll_for_pro_licensewait_for_changec                C   s   t  )N)r   InPlaceUpgradeNotSupportedError)r   r`   r   r   r   is_pro_license_present   s   z,AWSAutoAttachInstance.is_pro_license_present)__name__
__module____qualname__rH   r"   strr   propertyr   retryr   r   r   r   r&   r/   r3   r6   r   r<   rP   r]   r_   rb   r   r   r   r   r      s(    
r   )r(   loggingtypingr   r   uaclientr   r   r   r   r   uaclient.cloudsr	   IMDS_IPV4_ADDRESSIMDS_IPV6_ADDRESSr;   rJ   r    r'   rU   rY   rW   rL   rI   rK   	getLoggerreplace_top_level_logger_namerc   r+   r   r   r   r   r   <module>   s&    