o
    th(                     @   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 )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})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

	