
"T`                 @   s   d  d l  m Z d  d l  m Z d  d l  m Z d  d l  m Z d  d l m Z m	 Z	 d  d l
 m Z e j e  Z d d i Z d	 Z d
 Z d
 Z Gd d   d e j  Z Gd d   d e  Z e e j f f e e j e j f f g Z d d   Z d S)    )log)sources)util)net)EphemeralDHCPv4NoDHCPLeaseError)upcloudmetadata_urlz'http://169.254.169.254/metadata/v1.json      c               @   sj   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 j |  | | |  | |  _ t   |  _ t j t j | d d g i   t	 g  |  _
 |  j
 d |  _ |  j
 j d t  |  _ |  j
 j d t  |  _ |  j
 j d t  |  _ 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)selfsys_cfgr   paths r    E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceUpCloud.pyr   #   s    	zDataSourceUpCloud.__init__c             C   s
   t  j   S)N)	uc_helperZread_sysinfo)r   r    r    r!   _get_sysinfo3   s    zDataSourceUpCloud._get_sysinfoc             C   s+   t  j |  j d |  j d |  j d |  j S)Nr   Zsec_betweenr   )r"   Zread_metadatar   r   r   r   )r   r    r    r!   _read_metadata6   s
    			z DataSourceUpCloud._read_metadatac             C   s  |  j    \ } } | s d St j d |  |  j r ye t j d  t j   } t j d |  t |  ) t j	 d t j d d d |  j
  } Wd  QRXWqrt t j f k
 r } z t j t t |   d SWYd  d  } ~ XqrXn y5 t j d	  t j	 d t j d d d |  j
  } WnR t j k
 rq} z/ t j t t |   t j d
 |  d SWYd  d  } ~ Xn X| |  _ | j d |  |  j d <| j d  |  j d <| j d  |  j d <| j d  |  j d <| j d d  |  j d <| j d d   |  _ | j d d   |  _ d S)NFz"Running on UpCloud. server_uuid=%szFinding a fallback NICz*Discovering metadata via DHCP interface %sZlogfuncmsgzReading from metadata servicefuncz7Discovering 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   Zlog_timer$   r   r   ZInvalidMetaDataExceptionZlogexcstrZmetadata_fullr   r   Zvendordata_rawZuserdata_raw)r   Z
is_upcloudZserver_uuidZnicZmder    r    r!   	_get_data>   sN    						zDataSourceUpCloud._get_datac             C   s   t  j |  j    S)N)r   Zinstance_id_matches_system_uuidZget_instance_id)r   r   r    r    r!   check_instance_ids   s    z#DataSourceUpCloud.check_instance_idc             C   sM   |  j  r |  j  S|  j j d  } | s4 t d   t j |  |  _  |  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   	Exceptionr"   Zconvert_network_config)r   Zraw_network_configr    r    r!   network_configv   s    	z DataSourceUpCloud.network_configN)__name__
__module____qualname__Zdsnamer+   r   r#   r$   r0   r1   propertyr3   r    r    r    r!   r      s   5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  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr    r    r!   get_datasource_list   s    r;   N)Z	cloudinitr   Zloggingr   r   r   r-   Zcloudinit.net.dhcpr   r   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   p