509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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�\}	}
|	rØt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 q²X 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rÖ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|ƒ| _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 )
zÖCrawl 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:   
 ]
	
