
    }f)                        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eZeeeegz  Z G d dej>                  ej@                        Z! G d de!      Z"ddZ#e"ejH                  ffe!ejH                  ejJ                  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HUAWEICLOUDc                        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'65I $11$**=
#MM#MM    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__E   s1    !!))$/#'dll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_serviceJ   s   077kk44 8  %	
 {{<#A!t'='=a'@AAAx=CI%II>c$i#h-/1 x=DKKEFD 	#C++C=FNN6""HV	#
 ((*
^^%
)6600.."'	 
	9 II3Xi5HIIIDDNN$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_idy   s    66t7K7K7M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 '''-KKN 		<=(99$ 
 ###r$   c                    | j                   re	 t        | j                  | j                  j                        5  t	        j
                  t        j                  d| 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
   | _        | j2                  j5                  |j                  di              |j                  d      }	 t        j6                  |      | _        |j                  d      }	 t        j6                  |      | _        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# t:        $ r'}t        j=                  d|       d| _        Y d}~d}~ww xY w# t:        $ r'}t        j=                  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.
        zCrawl of metadata service)logfuncmsgfuncNFr)   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   r   log_timer9   r:   _crawl_metadatar	   r   InvalidMetaDataExceptionlogexcstr_determine_dsmoder6   r)   DSMODE_DISABLEDmergemanydictDEFAULT_METADATArc   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   sA    ""$KK!?!?  #mm #		7!11G..0
 ,,gkk(.C-DE;;'111[[R(%5 67#KK7#KK6#KK
3y)

'++gr23[[&	'")"<"<R"@D
 kk-(	(#*#=#=c#BD 
 Y  %g&F&FG CQ( 33 CQ(&  	'KK<a@"&D	'  	(KK=qA#'D  		(sv   *G 1G)G 3H! I$ 0J GG H1#HH!I!4#II!$	J-JJ	K KKc           
         	 | j                         st        j                  d      	 | j                         }	 t        j                  t        j                  dt        | j                  g| j                  |j                  |j                  d      }|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)
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   retriesr1   )argskwargszBroken metadata address {addr})addr)rS   r   rk   IOErrorr3   rm   r@   r   ri   r9   r:   read_metadata_servicer   r   num_retriesrE   r   NonReadableBrokenMetadata)r   ry   rO   resultra   s        r#   rj   z#DataSourceOpenStack._crawl_metadata   sD   
	113666  4 ((*
	?]]		5%++,#'#3#3)55)99
F$ 9  	22>EEa& F  	* $$ 	;223q6::(('2 	?299** : C 2237Q>		?s;   %B AC 	C.CCE&DE 2EE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     DLL$4$45F$GG{{}(()>?22237KKv99;q!%%n59IIr$   )__name__
__module____qualname__dsnamer   r   r[   rh   r   NETWORKr   BOOT_NEW_INSTANCEBOOTBOOT_LEGACYHOTPLUGsupported_update_eventsr   r(   rS   rW   propertyr^   r}   rj   r   __classcell__)r"   s   @r#   r   r   *   s    FmmO  	''NN!!	
*
-^O $ $07r(T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__rh    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*    %%k7GF >>r$   c                 6    t        j                  | t              S r   )r   list_from_dependsdatasources)dependss    r#   get_datasource_listr   '  s    $$Wk::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_IIDrq   r   DMI_PRODUCT_COMPUTEr   DMI_ASSET_TAG_OPENTELEKOMDMI_ASSET_TAG_SAPCCLOUDDMI_ASSET_TAG_HUAWEICLOUDr   SourceMixinr'   r   r   r   DEP_FILESYSTEMDEP_NETWORKr   r   r   r$   r#   <module>r      s      4 4 1 / 3 8 /g!  ; 
 $ ) +-@A .  * ) .    _)//1C1C _D	2 	  6 68971173F3FGH;r$   