o
    x[hÍ(  ã                   @   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  e¡ZdZd	eiZd
ZdZeegZdZdZdZdZeZe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iid-dsopenstackzinstance-idzOpenStack NovazOpenStack ComputeÚOpenTelekomCloudzSAP CCloud VMÚHUAWEICLOUDzSamsung Cloud Platformc                       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 )ÚDataSourceOpenStackÚ	OpenStackFc                    sH   t t| ƒ |||¡ d | _t | j¡| _d | _i | _	t
j| _t
j| _d S ©N)Úsuperr   Ú__init__Úmetadata_addressr   Úfetch_ssl_detailsÚpathsÚssl_detailsÚversionÚfilesr   ÚUNSETÚec2_metadataÚnetwork_json)ÚselfÚsys_cfgÚdistror   ©Ú	__class__© úG/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenStack.pyr   >   s   zDataSourceOpenStack.__init__c                 C   s"   t j | ¡}d|| j| jf }|S )Nz%s [%s,ver=%s])r   Ú
DataSourceÚ__str__Údsmoder   )r   ÚrootÚmstrr!   r!   r"   r$   G   s   zDataSourceOpenStack.__str__c                 C   s  dj | jjd�dg}| j d|¡}dd„ |D ƒ}t|ƒt|ƒkr.t dtt|ƒt|ƒ ƒ¡ t	|ƒr5|}nt 
d¡ |}g }i }|D ]}t |d	¡}| |¡ |||< qB|  ¡ }t ¡ }	tj||j|jd
d�\}
}|
rtt d||
 ¡ nt d|tt ¡ |	 ƒ¡ | |
¡| _t|
ƒS )Nz"http://[fe80::a9fe:a9fe%25{iface}])Úifacezhttp://169.254.169.254Úmetadata_urlsc                 S   s   g | ]	}t  |¡r|‘qS r!   )r   Úis_resolvable_url)Ú.0Úxr!   r!   r"   Ú
<listcomp>T   s    zADataSourceOpenStack.wait_for_metadata_service.<locals>.<listcomp>z,Removed the following from metadata urls: %sz+Empty metadata url list! using default listr   F)ÚurlsÚmax_waitÚtimeoutÚconnect_synchronouslyzUsing metadata source: '%s'z2Giving up on OpenStack md from %s after %s seconds)Úformatr   Úfallback_interfaceÚds_cfgÚgetÚsetÚLOGÚdebugÚlistÚlenÚwarningr   Úcombine_urlÚappendÚget_url_paramsÚtimeÚ	monotonicÚwait_for_urlÚmax_wait_secondsÚtimeout_secondsÚintr   Úbool)r   ÚDEF_MD_URLSr.   ÚfilteredÚmd_urlsÚurl2baseÚurlÚmd_urlÚ
url_paramsÚ
start_timeÚ	avail_urlÚ	_responser!   r!   r"   Úwait_for_metadata_serviceL   sN   ÿüþ



üýz-DataSourceOpenStack.wait_for_metadata_servicec                 C   s   t  |  ¡ ¡S r   )r   Úinstance_id_matches_system_uuidÚget_instance_id)r   r   r!   r!   r"   Úcheck_instance_id{   s   z%DataSourceOpenStack.check_instance_idc                 C   sn   | j tjkr	| j S t | j dd¡¡rd| _ | j S | jtjkr&t 	d¡ dS t 
d¡ tj| jdd�| _ | j S )z@Return a network config dict for rendering ENI or netplan files.Úapply_network_configTNz<Unexpected call to network_config when network_json is None.z(network config provided via network_json)Ú
known_macs)Ú_network_configr   r   r   Úis_falser4   r5   r   r7   r;   r8   r   Úconvert_net_json)r   r!   r!   r"   Únetwork_config   s   ÿ
ÿz"DataSourceOpenStack.network_configc              
   C   sô  | j r@zt| j| jjƒ� |  ¡ }W d  ƒ n1 sw   Y  W nA ttjfy? } zt 	t
t|ƒ¡ W Y d}~dS d}~ww z|  ¡ }W n tjyb } zt 	t
t|ƒ¡ W Y d}~dS d}~ww |  | d¡g¡| _| jtjkrudS | di ¡}t |tg¡}|| _| d¡| _| d¡| _| d¡| _|d | _| j | d	i ¡¡ | d
¡}zt |¡| _W n tyÎ } zt
 d|¡ d| _W Y d}~nd}~ww | d¡}z	t |¡| _W dS  tyù } zt
 d|¡ d| _W Y d}~dS d}~ww )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.
        NFr%   Úmetadatazec2-metadataÚnetworkdataÚuserdatar   r   Ú
vendordataz"Invalid content in vendor-data: %sÚvendordata2z#Invalid content in vendor-data2: %sT)Úperform_dhcp_setupr	   r   r3   Ú_crawl_metadatar   r   ÚInvalidMetaDataExceptionr   Úlogexcr7   ÚstrÚ_determine_dsmoder5   r%   ÚDSMODE_DISABLEDÚmergemanydictÚDEFAULT_METADATArZ   r   r   Úuserdata_rawr   r   ÚupdateÚconvert_vendordataÚvendordata_rawÚ
ValueErrorr;   Úvendordata2_raw)r   ÚresultsÚeÚmdÚvdÚvd2r!   r!   r"   Ú	_get_data˜   sb   
ÿ
ý€€þ€þ

€þ
ü€üzDataSourceOpenStack._get_datac              
   C   sÌ   z|   ¡ s
t d¡‚W n ty" } zt djt|ƒd�¡‚d}~ww |  ¡ }zt| j| j	|j
|jd�}W |S  tjyJ } zt t|ƒ¡‚d}~w tjtfye } zdj| jd�}t |¡|‚d}~ww )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})ÚerrorN)r   Úretriesr0   zBroken metadata address {addr})Úaddr)rP   r   ra   ÚIOErrorr2   rc   r>   Úread_metadata_servicer   r   Únum_retriesrC   r   ÚNonReadableÚBrokenMetadata)r   ro   rL   ÚresultÚmsgr!   r!   r"   r`   Í   sB   ÿÿÿÿ€ÿüù€ÿ€üz#DataSourceOpenStack._crawl_metadatac                 C   sp   d| j  d¡v }t ¡ sdS t d¡}|tv rdS t d¡tv r"dS |r*t 	¡ r*dS t 
d¡ d¡tkr6dS dS )	z<Return True when a potential OpenStack platform is detected.ÚOracleÚdatasource_listTzsystem-product-namezchassis-asset-tagé   Úproduct_nameF)r   r5   r   Úis_x86r   Úread_dmi_dataÚVALID_DMI_PRODUCT_NAMESÚVALID_DMI_ASSET_TAGSÚoracleÚ_is_platform_viableÚget_proc_envÚDMI_PRODUCT_NOVA)r   Úaccept_oracler�   r!   r!   r"   Ú	ds_detectò   s   
zDataSourceOpenStack.ds_detect)Ú__name__Ú
__module__Ú__qualname__Údsnamer   r   rV   r_   r   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚHOTPLUGÚsupported_update_eventsr   r$   rP   rS   ÚpropertyrY   rs   r`   r‹   Ú__classcell__r!   r!   r   r"   r   ,   s(    üÿ		/
5%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)rŒ   r�   rŽ   Ú__doc__r_   r!   r!   r!   r"   r˜     s    r˜   é   c                 C   s   t j| |||d�}| ¡ S )N)r   r0   ru   )r   ÚMetadataReaderÚread_v2)Úbase_urlr   r0   ru   Úreaderr!   r!   r"   rx     s   ÿrx   c                 C   s   t  | t¡S r   )r   Úlist_from_dependsÚdatasources)Údependsr!   r!   r"   Úget_datasource_list   s   r¢   )Nrš   rš   ))Úloggingr?   Ú	cloudinitr   r   r   r   Úcloudinit.eventr   r   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr	   Úcloudinit.sourcesr
   r†   Úcloudinit.sources.helpersr   Ú	getLoggerrŒ   r7   ÚDEFAULT_IIDrg   r‰   ÚDMI_PRODUCT_COMPUTEr„   ÚDMI_ASSET_TAG_OPENTELEKOMÚDMI_ASSET_TAG_SAPCCLOUDÚDMI_ASSET_TAG_HUAWEICLOUDÚ"DMI_ASSET_TAG_SAMSUNGCLOUDPLATFORMr…   ÚSourceMixinr#   r   r˜   rx   ÚDEP_FILESYSTEMÚDEP_NETWORKr    r¢   r!   r!   r!   r"   Ú<module>   sD   
ÿü Z

	þ