U
    Ӈg                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZ e	e
ZdgZdZdZG dd dejZed	d
dZedddZeejejffgZdd ZdS )    N)Optional)dmisources
url_helperutilzhttp://169.254.169.254   CloudCIXc                       sl   e Zd ZdZdZdZdZ fddZdd Ze	dd	d
Z
ee dddZedd Zedd Z  ZS )DataSourceCloudCIXr         c                    s$   t t| ||| d | _d | _d S N)superr	   __init___metadata_url_net_cfg)selfZsys_cfgZdistropaths	__class__ F/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudCIX.pyr      s    zDataSourceCloudCIX.__init__c              
   C   sb   z|   }W n6 tjk
rB } ztd| W Y dS d}~X Y nX |d | _t|d | _dS )z6
        Fetch the user data and the metadata
        z0Failed to read data from CloudCIX datasource: %sFN	meta-data	user-dataT)	crawl_metadata_servicer   InvalidMetaDataExceptionLOGerrormetadatar   Zdecode_binaryZuserdata_raw)r   Zcrawled_datar   r   r   r   	_get_data   s     
zDataSourceCloudCIX._get_datareturnc                 C   s,   |   }|d krtdt||  }|S )Nz Could not determine metadata URL)determine_md_urlr   r   read_metadataget_url_params)r   Zmd_urldatar   r   r   r   /   s    z)DataSourceCloudCIX.crawl_metadata_servicec                 C   s   | j r| j S |  }tjt|j|jd\}}|s4d S ttddD ]}t	|d
|d}ztj|| jd}W n: tjk
r } ztd|| W Y q@W 5 d }~X Y nX | rt	|d
|| _  qq@td| q@| j S )	N)Zmax_waittimeoutr   zv{0}r   )r%   zURL %s raised exception %szNo metadata found at URL %s)r   r#   r   Zwait_for_urlMETADATA_URLSZmax_wait_secondstimeout_secondsrangeMETADATA_VERSIONcombine_urlformatreadurlZurl_timeoutUrlErrorr   debugok)r   
url_paramsbase_url_versionurlresponseer   r   r   r!   9   s:    
   z#DataSourceCloudCIX.determine_md_urlc                   C   s   t  S r   )is_platform_viabler   r   r   r   	ds_detect\   s    zDataSourceCloudCIX.ds_detectc                 C   s(   | j r| j S | jsd S | jd | _ | j S )NZnetwork)r   r   )r   r   r   r   network_config`   s    z!DataSourceCloudCIX.network_config)__name__
__module____qualname__ZdsnameZurl_retriesZurl_timeout_secondsZurl_sec_between_retriesr   r   dictr   r   strr!   staticmethodr9   propertyr:   __classcell__r   r   r   r   r	      s   
#
r	   r   c                   C   s   t dtkS )Nzsystem-product-name)r   Zread_dmi_dataCLOUDCIX_DMI_NAMEr   r   r   r   r8   k   s    r8   )r2   c           
      C   s"  i }ddt jfddt jff}|D ]\}}}z$tjt| ||j|j|jd}W nF tj	k
r } z&t
d| d|  d| d| W 5 d	}~X Y nX | st
d
| d|  d| d|j z||j||< W q  tjjk
r }	 z"t
d|  d| d|	 |	W 5 d	}	~	X Y q X q |S )a;  
    Read metadata from metadata server at base_url

    :returns: dictionary of retrieved metadata and user data containing the
              following keys: meta-data, user-data
    :param: base_url: meta data server's base URL
    :param: url_params: dictionary of URL retrieval parameters. Valid keys are
            `retries`, `sec_between` and `timeout`.
    :raises: InvalidMetadataException upon network error connecting to metadata
             URL, error response from meta data server or failure to
             decode/parse metadata and userdata payload.
    r   r   Zuserdatar   )r5   ZretriesZsec_betweenr%   zFailed to fetch IMDS z: /Nz	No valid z found. URL z returned code zInvalid JSON at )r   Z	load_jsonZmaybe_b64decoder   r-   r+   Znum_retriesZsec_between_retriesr(   r.   r   r   r0   codecontentsjsondecoderZJSONDecodeError)
r2   r1   ZmdZleaf_key_format_callbackZurl_leafZnew_keyZformat_callbackr6   r   excr   r   r   r"   o   s:    



r"   c                 C   s   t | tS r   )r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list   s    rK   )rG   Zloggingtypingr   Z	cloudinitr   r   r   r   Z	getLoggerr;   r   r'   r*   rC   Z
DataSourcer	   boolr8   r?   r"   ZDEP_FILESYSTEMZDEP_NETWORKrJ   rK   r   r   r   r   <module>   s   
Z2