
-P`&                 @   s  d  d l  Z  d  d l m 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
 d  d l m Z d  d	 l m Z e j e  Z d
 Z d Z d e i Z d Z d Z e e g Z d Z d Z e Z e e e g 7Z Gd d   d e j e j  Z Gd d   d e  Z d d d d d  Z  d d d  Z! e e j" f f e e j" e j# f f g Z$ d d   Z% d S)    N)dmi)log)EphemeralDHCPv4NoDHCPLeaseError)sources)
url_helper)util)	openstack)DataSourceOraclezhttp://169.254.169.254ziid-dsopenstackzinstance-idzOpenStack NovazOpenStack ComputeZOpenTelekomCloudzSAP CCloud VMc                   s   e  Z d  Z d Z e j Z d Z   f d d   Z d d   Z	 d d   Z
 d	 d
   Z e d d    Z d d   Z d d   Z   S)DataSourceOpenStackZ	OpenStackFc                sh   t  t |   j | | |  d  |  _ t j |  j  |  _ d  |  _ i  |  _	 t
 j |  _ t
 j |  _ d  S)N)superr   __init__metadata_addressr   Zfetch_ssl_detailspathsssl_detailsversionfilesr   UNSETec2_metadatanetwork_json)selfsys_cfgZdistror   )	__class__ G/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenStack.pyr   1   s    			zDataSourceOpenStack.__init__c             C   s/   t  j j |   } d | |  j |  j f } | S)Nz%s [%s,ver=%s])r   
DataSource__str__dsmoder   )r   rootZmstrr   r   r   r   :   s    zDataSourceOpenStack.__str__c             C   sx  |  j  j d t g  } d d   | D } t |  t |  k ri t j d t t |  t |    t |  r~ | } n t j d  t g } g  } i  } x7 | D]/ } t	 j
 | d  } | j |  | | | <q W|  j   } t j   } t	 j d | d | j d	 | j  \ }	 }
 |	 r9t j d
 | |	  n# t j d | t t j   |   | j |	  |  _ t |	  S)NZmetadata_urlsc             S   s%   g  |  ] } t  j |  r |  q Sr   )r   Zis_resolvable_url).0xr   r   r   
<listcomp>A   s   	 zADataSourceOpenStack.wait_for_metadata_service.<locals>.<listcomp>z,Removed the following from metadata urls: %sz+Empty metadata url list! using default listr	   urlsZmax_waittimeoutzUsing metadata source: '%s'z2Giving up on OpenStack md from %s after %s seconds)ds_cfgget
DEF_MD_URLsetLOGdebuglistlenwarningr   Zcombine_urlappendget_url_paramstimeZwait_for_urlZmax_wait_secondstimeout_secondsintr   bool)r   r"   ZfilteredZmd_urlsZurl2baseZurlZmd_url
url_paramsZ
start_timeZ	avail_urlZ	_responser   r   r   wait_for_metadata_service?   s4    					z-DataSourceOpenStack.wait_for_metadata_servicec             C   s   t  j |  j    S)N)r   Zinstance_id_matches_system_uuidZget_instance_id)r   r   r   r   r   check_instance_id`   s    z%DataSourceOpenStack.check_instance_idc             C   s   |  j  t j k r |  j  St j |  j j d d   rG d |  _  |  j  S|  j t j k rj t j	 d  d St j
 d  t j |  j d d |  _  |  j  S)z@Return a network config dict for rendering ENI or netplan files.Zapply_network_configFNz<Unexpected call to network_config when network_json is None.z(network config provided via network_jsonZ
known_macs)_network_configr   r   r   Zis_falser$   r%   r   r(   r,   r)   r	   Zconvert_net_json)r   r   r   r   network_configd   s    	z"DataSourceOpenStack.network_configc          ,   C   s  d |  j  j d  k } t d |  s, d S|  j r y? t |  j  ) t j d t j	 d d d |  j
  } Wd	 QRXWqt t j f k
 r } z t j t t |   d SWYd	 d	 } ~ XqXnU y |  j
   } WnB t j k
 r} z t j t t |   d SWYd	 d	 } ~ Xn X|  j | j d
  g  |  _ |  j t j k rKd S| j d i   } t j | t g  } | |  _ | j d  |  _ | j d  |  _ | j d  |  _ | d |  _ |  j j | j d i    | j d  } | |  _ y t j |  |  _ Wn> t k
 rH} z t j  d |  d	 |  _ WYd	 d	 } ~ Xn X| j d  } | |  _! y t j |  |  _" Wn> t k
 r} z t j  d |  d	 |  _" WYd	 d	 } ~ Xn Xd S)a  Crawl metadata, parse and persist that data for this instance.

        @return: True when metadata discovered indicates OpenStack datasource.
            False when unable to contact metadata service or when metadata
            format is invalid or disabled.
        ZOracleZdatasource_listaccept_oracleFZlogfuncmsgzCrawl of metadata servicefuncNr   metadatazec2-metadataZnetworkdataZuserdatar   r   Z
vendordataz"Invalid content in vendor-data: %sZvendordata2z#Invalid content in vendor-data2: %sT)#r   r%   detect_openstackperform_dhcp_setupr   Zfallback_interfacer   log_timer(   r)   _crawl_metadatar   r   InvalidMetaDataExceptionZlogexcstrZ_determine_dsmoder   ZDSMODE_DISABLEDZmergemanydictDEFAULT_METADATAr;   r   r   Zuserdata_rawr   r   updateZvendordata_pureZconvert_vendordataZvendordata_raw
ValueErrorr,   Zvendordata2_pureZvendordata2_raw)r   Zoracle_consideredZresultseZmdZvdZvd2r   r   r   	_get_dataz   sV    					zDataSourceOpenStack._get_datac          !   C   sU  y |  j    s t j d   WnF t k
 rg } z& t j d j d t |     WYd d } ~ Xn X|  j   } yI t j t	 j
 d t d |  j g d d |  j d	 | j d
 | j i } Wn t j k
 r } z t j t |    WYd d } ~ XnU t j t f k
 rP} z, d j d |  j  } t j |  |  WYd d } ~ Xn X| S)zCrawl metadata service when available.

        @returns: Dictionary with all metadata discovered for this datasource.
        @raise: InvalidMetaDataException on unreadable or broken
            metadata.
        z No active metadata service foundz,IOError contacting metadata service: {error}errorNz#Crawl of openstack metadata serviceargskwargsr   retriesr#   zBroken metadata address {addr}Zaddr)r4   r   r@   IOErrorformatrA   r.   r   r>   r(   r)   read_metadata_servicer   r   Znum_retriesr0   r	   ZNonReadableZBrokenMetadata)r   rE   r3   resultr9   r   r   r   r?      s.    	%			'	%z#DataSourceOpenStack._crawl_metadata)__name__
__module____qualname__Zdsnamer   r   r6   r=   r   r   r4   r5   propertyr7   rF   r?   r   r   )r   r   r   (   s   		!9r   c               @   s   e  Z d  Z d Z d Z d S)DataSourceOpenStackLocalau  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)rO   rP   rQ   __doc__r=   r   r   r   r   rS      s   rS      c             C   s+   t  j |  d | d | d | } | j   S)Nr   r#   rJ   )r	   ZMetadataReaderZread_v2)Zbase_urlr   r#   rJ   readerr   r   r   rM      s    rM   Fc             C   s   t  j   s d St j d  } | t k r/ d St j d  t k rH d S|  r^ t j   r^ d St  j d  j	 d  t
 k r d Sd S)z<Return True when a potential OpenStack platform is detected.Tzsystem-product-namezchassis-asset-tag   product_nameF)r   Zis_x86r   Zread_dmi_dataVALID_DMI_PRODUCT_NAMESVALID_DMI_ASSET_TAGSoracleZ_is_platform_viableZget_proc_envr%   DMI_PRODUCT_NOVA)r8   rX   r   r   r   r<      s    r<   c             C   s   t  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list   s    r^   )&r/   Z	cloudinitr   r   ZloggingZcloudinit.net.dhcpr   r   r   r   r   Zcloudinit.sources.helpersr	   Zcloudinit.sourcesr
   r[   Z	getLoggerrO   r(   r&   ZDEFAULT_IIDrB   r\   ZDMI_PRODUCT_COMPUTErY   ZDMI_ASSET_TAG_OPENTELEKOMZDMI_ASSET_TAG_SAPCCLOUDrZ   ZSourceMixinr   r   rS   rM   r<   ZDEP_FILESYSTEMZDEP_NETWORKr]   r^   r   r   r   r   <module>   s6   