Current File : //usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyo
�
oB�]c@sddlZddlZddlZddlZddlZddlZddlmZddlmZ	ddlm
Z
ddlmZddlmZddlm
Z
ddlmZe	je�Zid	d
�dfd6d
e
jifd6dd�dfd6ZddefddeffZdZdZdZdZdZdZdZdZdZ eeeeeeee fZ!d5Z#d*e$fd+��YZ%d,e&fd-��YZ'ej(ej)�d.e&fd/��Y�Z*d0e*fd1��YZ+d2e*fd3��YZ,ddd4�Z-dS(6i����N(t	ec2_utils(tlog(tnet(tsources(t
url_helper(tutil(tBrokenMetadatatnetwork_configcCs|S(N((tx((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt<lambda> stsetc/network/interfacestmeta_jssmeta.jstauthorized_keyscCs|S(N((R((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyR	"ssroot/.ssh/authorized_keysslocal-hostnamethostnamesinstance-idtuuidtlatests
2012-08-10s
2013-04-04s
2013-10-17s
2015-10-15s
2016-06-30s
2016-10-06s
2017-02-22s
2018-08-27tbgpovstbridgetdvstethernetthw_vebthypervtovstphyttapt	vhostusertviftNonReadablecBseZRS((t__name__t
__module__(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRVstSourceMixincBs5eZd�Zd�Zd�Zd�Zd�ZRS(cCsS|js
dS|jjdi�}x*|j�D]\}}||kr/|Sq/WdS(Nsblock-device-mapping(tec2_metadatatNonetgettitems(tselftnametbdmtent_nametdevice((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_ec2_name_to_device[s	cCs7d}|jdkrd}ntj|jj|��S(Ntpublic_keysispublic-keys(tversionRtnormalize_pubkey_datatmetadataR!(R#R$((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytget_public_ssh_keysds	cCsjd}yId|}|dkr,d|}ntj|�}|rN|d}nWntjk
renX|S(NsLABEL=%stswapsTYPE=%si(R Rtfind_devs_withtProcessExecutionError(R#R$R'tcriteriatdev_entries((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_os_name_to_devicejs

cCsx|s
dS|jd�s&d|}ntjj|�r<|S|jtjj|��}|rttjd||�|SdS(Nt/s/dev/%ssRemapped device name %s => %s(	R t
startswithtostpathtexistst
_remap_devicetbasenametLOGtdebug(R#R'tremapped((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_validate_device_namews
cCs|s
dS|g}|dkr2|jdd�n|dkrN|jd�nd}tjd|�x6|D].}|j|�}|j|�}|rkPqkqkW|s�tjd|�x9|D].}|j|�}|j|�}|r�Pq�q�Wn|s�dStjd||�|SdS(Ntrootitamis(Using ec2 style lookup to find device %ss.Using openstack style lookup to find device %ssMapped %s to device %s(R tinserttappendR;R<R(R>R3(R#R$tnamesR'tn((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytdevice_name_to_device�s2	

(RRR(R-R3R>RE(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRZs
				
	t
BaseReadercBszeZd�Zejd��Zejed��Zejd��Zejd��Z	d�Z
ed�Zd�ZRS(cCs
||_dS(N(t	base_path(R#RG((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt__init__�scGsdS(N((R#tbasetadd_ons((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt
_path_join�scCsdS(N((R#R7tdecode((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt
_path_read�scCsdS(N((R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_fetch_available_versions�scCsdS(N((R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_read_ec2_metadata�scCs�y|j�}Wn/tk
rA}tjd|j|�g}nXgttt��D]}|^qU}t}x'|D]}||kr�qtn|}PqtWtjd||�|S(Ns4Unable to read openstack versions from %s due to: %ssSelected version '%s' from %s(	RNt	ExceptionR;R<RGtreversedtlisttOS_VERSIONSt	OS_LATEST(R#tversions_availabletetvt	supportedtselected_versiontpotential_version((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_find_working_version�s 	

%
cCs�|jdd�jd�}|jd�}g|D]}t|�r1|^q1}|shtd|��n|j|jd|�}|j|d|�S(Ntcontent_pathR
R4s!Item %s has no valid content patht	openstackRL(R!tlstriptsplittlenRRKRGRM(R#titemRLR7tpath_piecestptvalid_pieces((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_read_content_path�s%cs{tjtjdttftj����fd�}idd6dd6}|�j��}x |j	�D]\}\}}}�j
�j|�}d}t
}y�j|�}WnBtk
r�}	|s�tjd||	�q�tjd||	�nXt}|r|rtd	|��n|ri|riy||�}Wqitk
re}	td
||	f��qiXn|rj|||<qjqjW|d}
d|
kr�|
d}ytj|�|
d<Wq�ttfk
r�}	td
|	��q�Xni}|
jdg�}
xm|
D]e}d|krqn|d}y�j|�||<Wqtk
ri}	td||	f��qXqW||d<|
jdd�}|r�y#�j|dt�}||d<Wq�tk
r�}	td|	��q�Xny|
dd|d<Wntk
rnX�j�|d<x^tD]V\}}}|rQ||
krQtd|��n||
kr|
j|�|
|<qqW|S(s�Reads a version 2 formatted location.

        Return a dict with metadata, userdata, ec2-metadata, dsmode,
        network_config, files and version (2).

        If not a valid location, raise a NonReadable exception.
        t
root_typescs�i}�jd|d�ttjf|d<�jd|d�td�f|d<�jd|d�t�f|d<�jd|d	�t�f|d
<|S(NR]smeta_data.jsonR,t	user_datacSs|S(N((R((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyR	�stuserdatasvendor_data.jsont
vendordatasnetwork_data.jsontnetworkdata(RKtTrueRt	load_jsontFalse(R*tfiles(tload_json_anytypeR#(sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt	datafiles�s

R
RhiR*s*Failed reading optional path %s due to: %ss+Failed reading mandatory path %s due to: %ssMissing mandatory path: %ssFailed to process path %s: %sR,trandom_seeds.Badly formatted metadata random_seed entry: %sRnR7s#Failed to read provided file %s: %sRRLs(Failed to read network configuration: %stmetatdsmodesec2-metadatasNo '%s' entry in metadataN(t	functoolstpartialRRltdictRRtsixtstring_typesR[R"RKRGR RmRMtIOErrorR;R<RkRRPRtbase64t	b64decodet
ValueErrort	TypeErrorR!RetKeyErrorROt
KEY_COPIES(R#RptresultstdataR$R7trequiredt
translatortfoundRVR,RqRntmetadata_filesRatnet_itemtcontentt
target_keyt
source_keytis_required((RoR#sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytread_v2�s�	
"	
	






(
RRRHtabctabstractmethodRKRmRMRNROR[ReR�(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRF�s			tConfigDriveReadercBsAeZd�Zd�Zed�Zd�Zd�Zd�ZRS(cCs#tt|�j|�d|_dS(N(tsuperR�RHR t	_versions(R#RG((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRH[scGs#|gt|�}tjj|�S(N(RRR6R7tjoin(R#RIRJt
components((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRK_scCstj|d|�S(NRL(Rt	load_file(R#R7RL((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRMcscCs}|jdkrv|j|jd�}gtj|�D]*}tjjtjj|��r4|^q4}t	|�|_n|jS(NR](
R�R RKRGR6tlistdirR7tisdirR�tsorted(R#R7tdR�((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRNfs*cCs{|j|jddd�}tjj|�s1iSytj|j|��SWn)tk
rv}t	d||f��nXdS(Ntec2Rsmeta-data.jsonsFailed to process path %s: %s(
RKRGR6R7R8RRlRMRPR(R#R7RV((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyROnscCs.i}xHtj�D]:}|j|j|�}tjj|�r|||<qqWt|�dkrytd|j��ni}x�tj	�D]�\}\}}}||kr1||}y|j
|�}Wn!tk
r�td|��nXy||�||<WqDt
k
r-}	td||	f��qDXq�tj|�||<q�W|d}
|d}|jd|
�}
|
r�|
j�}g|D](}
t|
�r�|
jd�r�|
^q�|d<nd	|kr�|d	|d	<nid
d6|d6}d
|kr
|d
|d
<n|jdd�|d<i|d<|S(s�Reads a version 1 formatted location.

        Return a dict with metadata, userdata, dsmode, files and version (1).

        If not a valid path, raise a NonReadable exception.
        is%s: no files foundsFailed to read: %ssFailed to process path %s: %sRRspublic-keyst#sinstance-idiR*R,Rss	user-dataR
RhRn(tFILES_V1tkeysRKRGR6R7R8R`RR"RMRyRRPtcopytdeepcopyR!t
splitlinesR5(R#R�R$R7tmdtkeyR�tdefaulttcontentsRVtkeydataRtlinestlR�((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytread_v1zsL"




/

(	RRRHRKRmRMRNROR�(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyR�Zs				tMetadataReadercBsAeZdddd�Zd�Zed�Zd�Zd�ZRS(icCsJtt|�j|�||_t|�|_t|�|_d|_	dS(N(
R�R�RHtssl_detailstfloatttimeouttinttretriesR R�(R#tbase_urlR�R�R�((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRH�s
	cCs�|jdk	r|jSg}|j|jd�}|j|dt�}x9|j�D]+}|j�}|sqqSn|j|�qSW||_|jS(NR]RL(	R�R RKRGRMRkR�tstripRB(R#R�tversion_pathR�tline((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRN�s	c
CsWd�}tj|d|jd|jd|jd|�}|rL|jj�S|jSdS(NcSsAy#t|j�}|dkr"tSWnttfk
r<nXtS(Ni�(R�tcodeRmR}R|Rk(t
_request_argstcauseR�((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytshould_retry_cb�sR�R�R�texception_cb(RtreadurlR�R�R�R�RL(R#R7RLR�tresponse((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRM�s	
				
cGstj||�S(N(Rtcombine_url(R#RIRJ((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRK�scCs%tjd|jd|jd|j�S(NR�R�R�(Rtget_instance_metadataR�R�R�(R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRO�s	N(	RRR RHRNRmRMRKRO(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyR��s
		c"s'|d<krd<Siddddddgd6ddd	d
ddd
ddddgd6�|jdg�}|jdg�}|jdg�}g}i}d}d}g}	x@|D]8}
g}t�fd�|
j�D��}d|
kr�|
d|d<nd<}
|
jd�r8|
jd�j�}
|
||
d<ni|jd�d6|
d6|
dd6|
dd6}xug|D] }|d|
dkru|^quD]F}t�fd�|j�D��}|ddkr�|jidd6�n�|dd kr|jid!d6�nb|dd=kr:|ji|dd6�n7|dd>krq|jid'd6|jd(�d6�n|dd?kr�|jitd)6�n|dd%kr�t|d%<n|dd&kr�t|d&<n|j|�q�W|ji|d6�|
dd@kr�i}|
r |
|d<nxR|
j�D]D\}}|d+krKq-q-|jd*�r-|ji||6�q-q-W||}|d,7}|j|d-d.t	j
|
d+�f�|ji|d6|d6�||d<n�|
ddAkr�d0|
d1|
d2f}|ji|d6|
d2d26|
d3d6�|j|d1d.|
d1f�|j|dd4|
d2|
d1f�|ji|
d3d6|d6�nB|
dtkr�tj
d5|
d�n|jidd6|
d6�|	j|�|||d<q�Wg|	D]-}|jd�dkr�d|kr�|^q�}|s4|r�|d<krOtj�}nxY|j�D]K\}}|jd�r}q\n|jd�|kr\||d|d<q\q\Wxc|D][}|jd�}|s�td6|��n||kr�td7|��n|||d<q�Wxt|D]i\}}}}t|ttf�rkg|D]}|||d^qF||<q|||d||<qWntj�} | r�x@|	D]5}|d| kr�| |d|d<d8|d<q�q�Wnx5|D]-}!|!}|jid9d6�|	j|�q�Wid,d:6|	d;6S(Bs)Return a dictionary of network_config by parsing provided
       OpenStack ConfigDrive NetworkData json format

    OpenStack network_data.json provides a 3 element dictionary
      - "links" (links are network devices, physical or virtual)
      - "networks" (networks are ip network configurations for one or more
                    links)
      -  services (non-ip services, like dns)

    networks and links are combined via network items referencing specific
    links via a 'link_id' which maps to a links 'id' field.

    To convert this format to network_config yaml, we first iterate over the
    links and then walk the network list to determine if any of the networks
    utilize the current link; if so we generate a subnet entry for the device

    We also need to map network_data.json fields to network_config fields. For
    example, the network_data links 'id' field is equivalent to network_config
    'name' field for devices.  We apply more of this mapping to the various
    link types that we encounter.

    There are additional fields that are populated in the network_data.json
    from OpenStack that are not relevant to network_config yaml, so we
    enumerate a dictionary of valid keys for network_yaml and apply filtering
    to drop these superflous keys from the network_config yaml.
    R$ttypetmac_addresstsubnetstparamstmtutphysicaltaddresstnetmaskt	broadcasttmetrictgatewaytpointopointtscopetdns_nameserverst
dns_searchtroutestsubnettlinkstnetworkstservicessbond%dic3s1|]'\}}|�dkr||fVqdS(R�N((t.0tkRW(t
valid_keys(sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pys	<genexpr>6s	tethernet_mac_addresstidtmactlinkc3s1|]'\}}|�dkr||fVqdS(R�N((R�R�RW(R�(sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pys	<genexpr>Is	t	ipv4_dhcptdhcp4t	ipv6_dhcptdhcp6t
ipv6_slaacsipv6_dhcpv6-statelesssipv6_dhcpv6-statefultipv4tipv6tstatict
ip_addresss	accept-ratbondt
bond_linksitbond_interfacess%stvlans%s.%st	vlan_linktvlan_idtvlan_mac_addresss%%s.%ss9Unknown network_data link type (%s); treating as physicals#No mac_address or name entry for %ss"Unable to find a system nic for %st
infinibandt
nameserverR*tconfigN(R�sipv6_dhcpv6-statelesssipv6_dhcpv6-stateful(R�R�(sipv6_dhcpv6-statefulR�(R�(R�(R R!RvR"tlowertupdateRkRBR5R�R�tKNOWN_PHYSICAL_TYPESR;twarningRtget_interfaces_by_macR|t
isinstanceRRttupletget_ib_hwaddrs_by_interface("tnetwork_jsont
known_macsR�R�R�tlink_updatestlink_id_infot
bond_name_fmttbond_numberR�R�R�tcfgt
link_mac_addrtcurinfoRDtnetworkR�R�R�RWt	link_nameR$R�t
need_namest_link_idtinfoR�R�tfmtttargetR�tib_known_hwaddrstservice((R�sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytconvert_net_json�s�


"$"		




	
		

-
,

(NRRRRRRRRRRR(.R�RzR�RtR6Rwt	cloudinitRRtloggingRRRRtcloudinit.sourcesRt	getLoggerRR;RlR�RmRkRRTt	OS_FOLSOMt
OS_GRIZZLYt	OS_HAVANAt
OS_LIBERTYt
OS_NEWTON_ONEt
OS_NEWTON_TWOtOS_OCATAtOS_ROCKYRSR R�RyRtobjectRt
add_metaclasstABCMetaRFR�R�R(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt<module>	sn	L�c7