U
    Ӈg                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZ e eZddiZd	Zd
Zd
ZG dd dejZG dd deZeejffeejejffgZdd ZdS )    N)net)sourcesutil)NoDHCPLeaseError)EphemeralDHCPv4)upcloudmetadata_urlz'http://169.254.169.254/metadata/v1.json      c                   @   sH   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	e
dd ZdS )DataSourceUpCloudUpCloudFc                 C   s   t j| ||| || _t | _tt|ddgi t	g| _
| j
d | _| j
dt| _| j
dt| _| j
dt| _d | _d | _d S )NZ
datasourcer   r   retriestimeout
wait_retry)r   
DataSource__init__distrodictmetadatar   ZmergemanydictZget_cfg_by_pathBUILTIN_DS_CONFIGZds_cfgmetadata_addressget
MD_RETRIESr   
MD_TIMEOUTr   MD_WAIT_RETRYr   _network_configmetadata_full)selfsys_cfgr   paths r    E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceUpCloud.pyr   "   s    zDataSourceUpCloud.__init__c                 C   s   t  S N)	uc_helperZread_sysinfor   r    r    r!   _get_sysinfo3   s    zDataSourceUpCloud._get_sysinfoc                 C   s   t j| j| j| j| jdS )N)r   Zsec_betweenr   )r#   Zread_metadatar   r   r   r   r$   r    r    r!   _read_metadata6   s    z DataSourceUpCloud._read_metadatac              
   C   s  |   \}}|sdS td| | jrzBtd t }td| t| j| | 	 }W 5 Q R X W n> t
tjfk
r } zttt| W Y dS d }~X Y nX n`ztd | 	 }W nH tjk
r } z&ttt| td| W Y dS d }~X Y nX || _|d|| jd< |d	| jd
< |d| jd< |d| jd< |dd| jd< |dd | _|dd | _dS )NFz"Running on UpCloud. server_uuid=%szFinding a fallback NICz*Discovering metadata via DHCP interface %sz7Discovering metadata without DHCP-configured networkingzENo DHCP-enabled interfaces available, unable to fetch metadata for %sZinstance_idzinstance-idZhostnamezlocal-hostnamenetworkZpublic_keyszpublic-keysZregiondefaultZavailability_zoneZvendor_dataZ	user_dataT)r%   LOGinfoperform_dhcp_setupdebugcloudnetZfind_fallback_nicr   r   r&   r   r   ZInvalidMetaDataExceptionr   Zlogexcstrr   r   r   Zvendordata_rawZuserdata_raw)r   Z
is_upcloudZserver_uuidZnicZmder    r    r!   	_get_data>   sF    
zDataSourceUpCloud._get_datac                 C   s   t |  S r"   )r   Zinstance_id_matches_system_uuidZget_instance_id)r   r   r    r    r!   check_instance_idk   s    z#DataSourceUpCloud.check_instance_idc                 C   s6   | j r| j S | jd}|s$tdt|| _ | j S )z
        Configure the networking. This needs to be done each boot,
        since the IP and interface information might have changed
        due to reconfiguration.
        r'   z/Unable to get network meta-data from server....)r   r   r   RuntimeErrorr#   Zconvert_network_config)r   Zraw_network_configr    r    r!   network_confign   s    z DataSourceUpCloud.network_configN)__name__
__module____qualname__Zdsnamer+   r   r%   r&   r0   r1   propertyr3   r    r    r    r!   r      s   -r   c                   @   s   e Zd ZdZdZdS )DataSourceUpCloudLocalaz  
    Run in init-local using a DHCP discovery prior to metadata crawl.

    In init-local, no network is available. This subclass sets up minimal
    networking with dhclient on a viable nic so that it can talk to the
    metadata service. If the metadata service provides network configuration
    then render the network configuration for that instance based on metadata.
    TN)r4   r5   r6   __doc__r+   r    r    r    r!   r8      s   	r8   c                 C   s   t | tS r"   )r   Zlist_from_dependsdatasources)Zdependsr    r    r!   get_datasource_list   s    r;   )ZloggingZ	cloudinitr   r-   r   r   Zcloudinit.net.dhcpr   Zcloudinit.net.ephemeralr   Zcloudinit.sources.helpersr   r#   Z	getLoggerr4   r)   r   r   r   r   r   r   r8   ZDEP_FILESYSTEMZDEP_NETWORKr:   r;   r    r    r    r!   <module>   s    
k
