
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\meT)                 @   s  d dl Z d dlZd dlmZmZmZ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 e jeZdd	gZd
ZdeiZdZdZeegZdZdZdZeZeeeeg7 ZG dd dej ej!Z"G dd de"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sources
url_helperutil)
EventScope	EventType)NoDHCPLeaseError)EphemeralDHCPv4)DataSourceOracle)	openstackzhttp://[fe80::a9fe:a9fe]zhttp://169.254.169.254ziid-dsopenstackzinstance-idzOpenStack NovazOpenStack ComputeZOpenTelekomCloudzSAP CCloud VMZHUAWEICLOUDc                   s   e Zd ZdZejZdZej	e
je
je
je
jhiZ fddZdd Zdd Zd	d
 Zedd Zdd Zdd Zdd Z  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_cfgdistror   )	__class__ )/usr/lib/python3.6/DataSourceOpenStack.pyr   =   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   F   s    zDataSourceOpenStack.__str__c             C   s  | j jdt}dd |D }t|t|krHtjdtt|t|  t|rV|}ntjd t}g }i }x*|D ]"}t	j
|d}|j| |||< qrW | j }tj }t	j||j|jdd\}	}
|	rtjd	||	  ntjd
|ttj |  |j|	| _t|	S )NZmetadata_urlsc             S   s   g | ]}t j|r|qS r   )r   Zis_resolvable_url).0xr   r   r   
<listcomp>M   s    zADataSourceOpenStack.wait_for_metadata_service.<locals>.<listcomp>z,Removed the following from metadata urls: %sz+Empty metadata url list! using default listr   F)urlsZmax_waittimeoutZconnect_synchronouslyzUsing metadata source: '%s'z2Giving up on OpenStack md from %s after %s seconds)ds_cfggetDEF_MD_URLS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_serviceK   s>    


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_idt   s    z%DataSourceOpenStack.check_instance_idc             C   sn   | j tjkr| j S tj| jjddr2d| _ | j S | jtjkrLtj	d dS tj
d tj| jdd| _ | j S )z@Return a network config dict for rendering ENI or netplan files.Zapply_network_configTNz<Unexpected call to network_config when network_json is None.z(network config provided via network_json)Z
known_macs)_network_configr   r   r   Zis_falser&   r'   r   r*   r.   r+   r   Zconvert_net_json)r   r   r   r   network_configx   s    
z"DataSourceOpenStack.network_configc          ,   C   s  | j rry2t| j| j tjtjd| jd}W dQ R X W q t	t
jfk
rn } ztjtt| dS d}~X qX n@y| j }W n2 t
jk
r } ztjtt| dS d}~X nX | j|jdg| _| jt
jkrd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|| _W n6 tk
r } ztjd| d| _W Y dd}~X nX |jd}|| _ yt
j|| _!W n6 tk
r } ztjd| d| _!W Y dd}~X nX d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Crawl of metadata service)ZlogfuncmsgfuncNFr   metadatazec2-metadataZnetworkdataZuserdatar   r   Z
vendordataz"Invalid content in vendor-data: %sZvendordata2z#Invalid content in vendor-data2: %sT)"perform_dhcp_setupr	   r   Zfallback_interfacer   log_timer*   r+   _crawl_metadatar   r   InvalidMetaDataExceptionZlogexcstrZ_determine_dsmoder'   r   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   resultseZmdZvdZvd2r   r   r   	_get_data   sR    


zDataSourceOpenStack._get_datac             C   s   y| j  stjdW n8 tk
rN } ztjdjt|dW Y dd}~X nX | j }y,tjt	j
dt| jg| j|j|jdd}W nr tjk
r } ztjt|W Y dd}~X nB tjtfk
r } z dj| jd	}tj||W Y dd}~X n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)r   retriesr%   )argskwargszBroken metadata address {addr})Zaddr)r6   r   r@   IOErrorformatrA   r0   r   r>   r*   r+   read_metadata_servicer   r   Znum_retriesr2   r   ZNonReadableZBrokenMetadata)r   rF   r5   resultr:   r   r   r   r?      s2    
 
z#DataSourceOpenStack._crawl_metadatac             C   sp   d| j jdk}tj sdS tjd}|tkr2dS tjdtkrDdS |rTtj	 rTdS tj
djdtkrldS dS )	z<Return True when a potential OpenStack platform is detected.ZOracleZdatasource_listTzsystem-product-namezchassis-asset-tag   product_nameF)r   r'   r   Zis_x86r   Zread_dmi_dataVALID_DMI_PRODUCT_NAMESVALID_DMI_ASSET_TAGSoracleZ_is_platform_viableZget_proc_envDMI_PRODUCT_NOVA)r   Zaccept_oraclerQ   r   r   r   	ds_detect   s    
zDataSourceOpenStack.ds_detect)__name__
__module____qualname__Zdsnamer   r   r8   r=   r   ZNETWORKr   ZBOOT_NEW_INSTANCEZBOOTZBOOT_LEGACYZHOTPLUGZsupported_update_eventsr   r   r6   r7   propertyr9   rG   r?   rV   __classcell__r   r   )r   r   r   +   s    
	)9*r   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)rW   rX   rY   __doc__r=   r   r   r   r   r\     s   r\      c             C   s   t j| |||d}|j S )N)r   r%   rI   )r   ZMetadataReaderZread_v2)Zbase_urlr   r%   rI   readerr   r   r   rN     s    rN   c             C   s   t j| tS )N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list"  s    ra   )Nr^   r^   ))Zloggingr1   Z	cloudinitr   r   r   r   Zcloudinit.eventr   r   Zcloudinit.net.dhcpr   Zcloudinit.net.ephemeralr	   Zcloudinit.sourcesr
   rT   Zcloudinit.sources.helpersr   Z	getLoggerrW   r*   r(   ZDEFAULT_IIDrB   rU   ZDMI_PRODUCT_COMPUTErR   ZDMI_ASSET_TAG_OPENTELEKOMZDMI_ASSET_TAG_SAPCCLOUDZDMI_ASSET_TAG_HUAWEICLOUDrS   ZSourceMixinr   r   r\   rN   ZDEP_FILESYSTEMZDEP_NETWORKr`   ra   r   r   r   r   <module>   s:   
 ]
	
