o
    =Wbv                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZmZmZ d dlmZ ddd	d
ZddddddZg dZG dd deZdee fddZeddeddeee ee f fddZdejfddZdS )    N)Enum)	lru_cache)DictOptionalTupleType)clouds
exceptionsutil)apply_config_settings_overrideazureawsgcp)ZazurenetZec2gceZAWSz	AWS ChinazAWS GovZAzureZGCP)r   	aws-chinaaws-govr   r   r   r   r   c                   @   s   e Zd ZdZdZdS )NoCloudTypeReasonr      N)__name__
__module____qualname__NO_CLOUD_DETECTEDCLOUD_ID_ERROR r   r   :/usr/lib/python3/dist-packages/uaclient/clouds/identity.pyr      s    r   returnc                  C   s@   zt g d\} }|  W S  tjy   Y nw td dS )z%Query cloud instance-id from cmdline.)z
cloud-initZqueryZinstance_idz'Unable to determine current instance-idN)r
   subpstripr	   ProcessExecutionErrorloggingZwarningoutZ_errr   r   r   get_instance_id   s   

r#   )maxsize
cloud_typec                  C   sR   t dr$zt dg\} }|  d fW S  tjy#   d tjf Y S w d tjfS )Nzcloud-id)	r
   whichr   r   r	   r   r   r   r   r!   r   r   r   get_cloud_type(   s   

r'   c                  C   sx   ddl m} m}m} | j| j| j|j|jd}t \}}|s#t	||
|}|s/t|| }|js:t||S )a  
    :raises CloudFactoryError: if no cloud instance object can be constructed
    :raises CloudFactoryNoCloudError: if no cloud instance object can be
        constructed because we are not on a cloud
    :raises CloudFactoryUnsupportedCloudError: if no cloud instance object can
        be constructed because we don't have a class for the cloud we're on
    :raises CloudFactoryNonViableCloudError: if no cloud instance object can be
        constructed because we explicitly do not support the cloud we're on
    r   r   )r   r   r   r   r   )Zuaclient.cloudsr   r   r   ZUAAutoAttachAWSInstanceZUAAutoAttachAzureInstanceZUAAutoAttachGCPInstancer'   r	   ZCloudFactoryNoCloudErrorgetZ!CloudFactoryUnsupportedCloudErrorZ	is_viableZCloudFactoryNonViableCloudError)r   r   r   Zcloud_instance_mapr%   _clsinstancer   r   r   cloud_instance_factory6   s"   





r,   )r    enumr   	functoolsr   typingr   r   r   r   Zuaclientr   r	   r
   Zuaclient.configr   ZDATASOURCE_TO_CLOUD_IDZCLOUD_TYPE_TO_TITLEZ
PRO_CLOUDSr   strr#   r'   ZAutoAttachCloudInstancer,   r   r   r   r   <module>   s(    "