Ë
    x[hÍ(  ã                   óˆ  — 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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z  Z G d„ dej@                  ejB                  «      Z" G d„ de"«      Z#dd„Z$e#ejJ                  ffe"ejJ                  ejL                  ffgZ'd„ Z(y)é    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                   óæ   ‡ — 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„Zd„ Zd„ Zd„ Zed„ «       Zd„ Zd	„ Zd
„ Zˆ xZS )ÚDataSourceOpenStackÚ	OpenStackFc                 óö   •— t         t        | �  |||«       d | _        t	        j
                  | j                  «      | _        d | _        i | _	        t        j                  | _        t        j                  | _        y ©N)Úsuperr   Ú__init__Úmetadata_addressr   Úfetch_ssl_detailsÚpathsÚssl_detailsÚversionÚfilesr   ÚUNSETÚec2_metadataÚnetwork_json)ÚselfÚsys_cfgÚdistror   Ú	__class__s       €úG/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenStack.pyr   zDataSourceOpenStack.__init__>   s\   ø€ ÜÔ! 4Ñ1°'¸6À5ÔIØ $ˆÔÜ×1Ñ1°$·*±*Ó=ˆÔØˆŒØˆŒ
Ü#ŸM™MˆÔÜ#ŸM™MˆÕó    c                 ó‚   — t         j                  j                  | «      }|›d| j                  ›d| j                  ›d�}|S )Nz [z,ver=ú])r   Ú
DataSourceÚ__str__Údsmoder   )r   ÚrootÚmstrs      r#   r(   zDataSourceOpenStack.__str__G   s1   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ#'¨¯«°d·l³lÐCˆØˆr$   c           	      ó¸  — dj                  | j                  j                  ¬«      dg}| j                  j	                  d|«      }|D �cg c]  }t        j                  |«      sŒ|‘Œ }}t        |«      t        |«      k7  r4t        j                  dt        t        |«      t        |«      z
  «      «       t        |«      r|}nt        j                  d«       |}g }i }|D ].  }t        j                  |d«      }|j                  |«       |||<   Œ0 | j!                  «       }	t#        j$                  «       }
t        j&                  ||	j(                  |	j*                  d¬	«      \  }}|rt        j                  d
||   «       n5t        j                  d|t-        t#        j$                  «       |
z
  «      «       |j	                  |«      | _        t1        |«      S c c}w )Nz"http://[fe80::a9fe:a9fe%25{iface}])Úifacezhttp://169.254.169.254Úmetadata_urlsz,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Úgetr   Úis_resolvable_urlÚ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/   ÚxÚfilteredÚmd_urlsÚurl2baseÚurlÚmd_urlÚ
url_paramsÚ
start_timeÚ	avail_urlÚ	_responses                r#   Úwait_for_metadata_servicez-DataSourceOpenStack.wait_for_metadata_serviceL   s¥  € à0×7Ñ7Ø—k‘k×4Ñ4ð 8ó ð %ð	
ˆð �{‰{�‰˜°Ó<ˆØ#ÖA˜!¤t×'=Ñ'=¸aÕ'@’AÐAˆÐAÜˆx‹=œC ›IÒ%Ü�I‰IØ>Ü”c˜$“i¤# h£-Ñ/Ó1ôô ˆxŒ=Ø‰Dä�K‰KÐEÔFØˆDàˆØˆØò 	#ˆCÜ×+Ñ+¨C°Ó=ˆFØ�N‰N˜6Ô"Ø"ˆH�VÒð	#ð
 ×(Ñ(Ó*ˆ
Ü—^‘^Ó%ˆ
Ü)×6Ñ6ØØ×0Ñ0Ø×.Ñ.Ø"'ô	 
Ñˆ	�9ñ Ü�I‰IÐ3°X¸iÑ5HÕIä�I‰IØDØÜ”D—N‘NÓ$ zÑ1Ó2ôð !)§¡¨YÓ 7ˆÔÜ�I‹ÐùòK Bs   Á	GÁ$Gc                 óH   — t        j                  | j                  «       «      S r   )r   Úinstance_id_matches_system_uuidÚget_instance_id)r   r    s     r#   Úcheck_instance_idz%DataSourceOpenStack.check_instance_id{   s   € ä×6Ñ6°t×7KÑ7KÓ7MÓNÐNr$   c                 óÌ  — | j                   t        j                  k7  r| j                   S t        j                  | j
                  j                  dd«      «      rd| _         | j                   S | j                  t        j                  k(  rt        j                  d«       yt        j                  d«       t        j                  | j                  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_falser5   r6   r   r9   r=   r:   r   Úconvert_net_json)r   s    r#   Únetwork_configz"DataSourceOpenStack.network_config   s³   € ð ×Ñ¤7§=¡=Ò0Ø×'Ñ'Ð'ô
 �=‰=˜Ÿ™Ÿ™Ð)?ÀÓFÔGØ#'ˆDÔ Ø×'Ñ'Ð'Ø×Ñ¤§¡Ò-ä�K‰KØNôð ä�	‰	Ð<Ô=Ü(×9Ñ9Ø×Ñ¨$ô 
ˆÔð ×#Ñ#Ð#r$   c                 óT  — | j                   rE	 t        | j                  | j                  j                  «      5  | j	                  «       }ddd«       n	 | j	                  «       }| j                  j                  d«      g«      | _        | j                  t        j                  k(  ry|j                  di «      }t        j                   |t"        g«      }|| _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |d   | _        | j.                  j1                  |j                  d	i «      «       |j                  d
«      }	 t        j2                  |«      | _        |j                  d«      }	 t        j2                  |«      | _        y# 1 sw Y   �ŒdxY w# t
        t        j                  f$ r-}t        j                  t        t        |«      «       Y d}~yd}~ww xY w# t        j                  $ r-}t        j                  t        t        |«      «       Y d}~yd}~ww xY w# t6        $ r'}t        j9                  d|«       d| _        Y d}~Œñd}~ww xY w# t6        $ r'}t        j9                  d|«       d| _        Y d}~yd}~ww xY 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!   r4   Ú_crawl_metadatar	   r   ÚInvalidMetaDataExceptionr   Úlogexcr9   ÚstrÚ_determine_dsmoder6   r)   ÚDSMODE_DISABLEDÚmergemanydictÚDEFAULT_METADATAr`   r   r   Úuserdata_rawr   r   ÚupdateÚconvert_vendordataÚvendordata_rawÚ
ValueErrorr=   Úvendordata2_raw)r   ÚresultsÚeÚmdÚvdÚvd2s         r#   Ú	_get_datazDataSourceOpenStack._get_data˜   s.  € ð ×"Ò"ðä$Ø—K‘K §¡×!?Ñ!?óñ 5ð #×2Ñ2Ó4�G÷5øðØ×.Ñ.Ó0�ð
 ×,Ñ,¨g¯k©k¸(Ó.CÐ-DÓEˆŒØ�;‰;œ'×1Ñ1Ò1ØØ�[‰[˜ RÓ(ˆÜ×Ñ Ô%5Ð 6Ó7ˆØˆŒØ#ŸK™K¨Ó7ˆÔØ#ŸK™K¨Ó6ˆÔØ#ŸK™K¨
Ó3ˆÔØ˜yÑ)ˆŒØ�
‰
×Ñ˜'Ÿ+™+ g¨rÓ2Ô3à�[‰[˜Ó&ˆð	'Ü")×"<Ñ"<¸RÓ"@ˆDÔð
 �k‰k˜-Ó(ˆð	(Ü#*×#=Ñ#=¸cÓ#BˆDÔ ð
 ÷Q5ñ 5ûô %¤g×&FÑ&FÐGò Ü—‘œC¤ Q£Ô(Üûðûô ×3Ñ3ò Ü—‘œC¤ Q£Ô(Üûðûô& ò 	'Ü�K‰KÐ<¸aÔ@Ø"&ˆD×Ñûð	'ûô ò 	(Ü�K‰KÐ=¸qÔAØ#'ˆD× Ð àûð		(úsv   Ž*F8 ¸F+Á	F8 ÁH Å$I ÆI7 Æ+F5Æ0F8 Æ8G>Ç#G9Ç9G>ÈIÈ#H<È<IÉ	I4ÉI/É/I4É7	J'Ê J"Ê"J'c                 óp  — 	 | j                  «       st        j                  d«      ‚	 | j                  «       }	 t        | j                  | j                  |j                  |j                  ¬«      }|S # t        $ r3}t        j                  dj	                  t        |«      ¬«      «      ‚d}~ww xY w# t        j                  $ r#}t        j                  t        |«      «      ‚d}~wt        j                  t        f$ r7}dj	                  | j                  ¬«      }t        j                  |«      |‚d}~ww xY 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   Úretriesr1   zBroken metadata address {addr})Úaddr)rS   r   rg   ÚIOErrorr3   ri   r@   Úread_metadata_servicer   r   Únum_retriesrE   r   ÚNonReadableÚBrokenMetadata)r   ru   rO   ÚresultÚmsgs        r#   rf   z#DataSourceOpenStack._crawl_metadataÍ   s+  € ð
	Ø×1Ñ1Ô3Ü×6Ñ6Ø6óð ð 4ð ×(Ñ(Ó*ˆ
ð	?Ü*Ø×%Ñ%Ø ×,Ñ,Ø"×.Ñ.Ø"×2Ñ2ô	ˆFð ˆøô/ ò 	Ü×2Ñ2Ø>×EÑEÜ˜a›&ð Fó óð ûð	ûô  ×$Ñ$ò 	;Ü×2Ñ2´3°q³6Ó:Ð:ûÜ×(Ñ(¬'Ð2ò 	?Ø2×9Ñ9Ø×*Ñ*ð :ó ˆCô ×2Ñ2°3Ó7¸QÐ>ûð		?ús:   ‚%A2 ¹7B1 Á2	B.Á;.B)Â)B.Â1D5ÃC"Ã"D5Ã>2D0Ä0D5c                 ób  — d| j                   j                  d«      v }t        j                  «       syt	        j
                  d«      }|t        v ryt	        j
                  d«      t        v ry|rt        j                  «       ryt        j                  d«      j                  d«      t        k(  ryy)	z<Return True when a potential OpenStack platform is detected.ÚOracleÚdatasource_listTzsystem-product-namezchassis-asset-tagé   Úproduct_nameF)r    r6   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‰   s      r#   Ú	ds_detectzDataSourceOpenStack.ds_detectò   s“   € à  D§L¡L×$4Ñ$4Ð5FÓ$GÐGˆÜ�{‰{Œ}àä×(Ñ(Ð)>Ó?ˆØÔ2Ñ2ØÜ×ÑÐ2Ó3Ô7KÑKØÙœv×9Ñ9Ô;ØÜ×Ñ˜qÓ!×%Ñ% nÓ5Ô9IÒIØØr$   )Ú__name__Ú
__module__Ú__qualname__Údsnamer   r   r[   re   r   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚHOTPLUGÚsupported_update_eventsr   r(   rS   rW   Úpropertyr^   ry   rf   r“   Ú__classcell__)r"   s   @r#   r   r   ,   sŽ   ø„ à€Fà—m‘m€Oð Ðð 	×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!Ø×Ñð	
ðÐô*òò
-ò^Oð ñ$ó ð$ò03òj#öJr$   r   c                   ó   — e Zd ZdZdZy)Ú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__re   © r$   r#   r¡   r¡     s   „ ñð Ñr$   r¡   c                 óT   — t        j                  | |||¬«      }|j                  «       S )N)r   r1   r|   )r   ÚMetadataReaderÚread_v2)Úbase_urlr   r1   r|   Úreaders        r#   r   r     s*   € Ü×%Ñ%Ø˜k°7ÀGô€Fð �>‰>ÓÐr$   c                 ó6   — t        j                  | t        «      S r   )r   Úlist_from_dependsÚdatasources)Údependss    r#   Úget_datasource_listr­      s   € Ü×$Ñ$ W¬kÓ:Ð:r$   )Né   r®   ))ÚloggingrA   Ú	cloudinitr   r   r   r   Úcloudinit.eventr   r   Úcloudinit.net.dhcpr	   Úcloudinit.net.ephemeralr
   Úcloudinit.sourcesr   rŽ   Úcloudinit.sources.helpersr   Ú	getLoggerr”   r9   ÚDEFAULT_IIDrm   r‘   ÚDMI_PRODUCT_COMPUTErŒ   ÚDMI_ASSET_TAG_OPENTELEKOMÚDMI_ASSET_TAG_SAPCCLOUDÚDMI_ASSET_TAG_HUAWEICLOUDÚ"DMI_ASSET_TAG_SAMSUNGCLOUDPLATFORMr�   ÚSourceMixinr'   r   r¡   r   ÚDEP_FILESYSTEMÚDEP_NETWORKr«   r­   r£   r$   r#   ú<module>rÀ      s  ðó Û ç 4Ó 4ß 1Ý /Ý 3Ý 8Ý /à€g×Ñ˜Ó!€ð  €à�;ðÐ ð
 $Ð Ø)Ð Ø+Ð-@ÐAÐ Ø.Ð ð *Ð Ø)Ð Ø%=Ð "Ø.Ð Ø ØØØ&Øð	ñ Ð ôV˜)×/Ñ/°×1CÑ1Cô Vôr	Ð2ô 	óð  × 6Ñ 6Ð8Ð9Ø˜7×1Ñ1°7×3FÑ3FÐGÐHð€ó;r$   