
    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'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__G   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_serviceL   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_id{   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                 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.    ""$KK!?!? 5 #224G5..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 
 Q5 5 %g&F&FG CQ( 33 CQ(&  	'KK<a@"&D	'  	(KK=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)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   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23q6::(('2 	?299** : C 2237Q>		?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     DLL$4$45F$GG{{}(()>?22237KKv99;q!%%n59I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mmO  	''NN!!	
*
-^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*    %%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_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)//1C1C Vr	2 	  6 68971173F3FGH;r$   