
    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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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http://[fe80::a9fe:a9fe]zhttp://169.254.169.254z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__F   s1    !!))$/#'dllCr$   c           	      x   | j                   j                  dt              }|D cg c]  }t        j                  |      s| }}t        |      t        |      k7  r4t        j                  dt        t        |      t        |      z
               t        |      r|}nt        j                  d       t        }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                  |
      | _        t+        |
      S c c}w )	N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)ds_cfggetDEF_MD_URLSr   is_resolvable_urlsetLOGdebuglistlenwarningr   combine_urlappendget_url_paramstimewait_for_urlmax_wait_secondstimeout_secondsintr   bool)r   r.   xfilteredmd_urlsurl2baseurlmd_url
url_params
start_time	avail_url	_responses               r#   wait_for_metadata_servicez-DataSourceOpenStack.wait_for_metadata_serviceK   su   {{<#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	#
 ((*
YY[
)6600.."'	 
	9 II3Xi5HIIIDDIIK*,- !)Y 7IK Bs   F7 F7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_idt   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_falser2   r3   r   r7   r;   r8   r   convert_net_json)r   s    r#   network_configz"DataSourceOpenStack.network_configx   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        j8                  |      | _        |j                  d      }|| _         	 t        j8                  |      | _!        y# 1 sw Y   rx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!   fallback_interfacer   log_timer7   r8   _crawl_metadatar	   r   InvalidMetaDataExceptionlogexcstr_determine_dsmoder3   r)   DSMODE_DISABLEDmergemanydictDEFAULT_METADATAr_   r   r   userdata_rawr   r   updatevendordata_pureconvert_vendordatavendordata_raw
ValueErrorr;   vendordata2_purevendordata2_raw)r   resultsemdvdvd2s         r#   	_get_datazDataSourceOpenStack._get_data   sQ    ""$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 
 ]  %g&F&FG CQ( 33 CQ((  	'KK<a@"&D	'  	(KK=qA#'D  		(sv   *G& 1G)G& 3H/ I2 >J% G#G& &H,?#H''H,/I/#I**I/2	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   retriesr0   )argskwargszBroken metadata address {addr})addr)rO   r   rh   IOErrorformatrj   r>   r   rf   r7   r8   read_metadata_servicer   r   num_retriesrB   r   NonReadableBrokenMetadata)r   rx   rK   resultr]   s        r#   rg   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    r3   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   rW   rd   r   NETWORKr   BOOT_NEW_INSTANCEBOOTBOOT_LEGACYHOTPLUGsupported_update_eventsr   r(   rO   rS   propertyrZ   r|   rg   r   __classcell__)r"   s   @r#   r   r   +   s    FmmO  	''NN!!	
*
'RO $ $09v(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__rd    r$   r#   r   r   	  s     r$   r   c                 T    t        j                  | |||      }|j                         S )N)r   r0   r   )r   MetadataReaderread_v2)base_urlr   r0   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   ))loggingr?   	cloudinitr   r   r   r   cloudinit.eventr   r   cloudinit.net.dhcpr	   cloudinit.net.ephemeralr
   cloudinit.sourcesr   r   cloudinit.sources.helpersr   	getLoggerr   r7   r4   DEFAULT_IIDrn   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! *+CD; 
 $ ) +-@A .  * ) .    [)//1C1C [|	2 	  6 68971173F3FGH;r$   