Viewing File: /usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyo


oB]c@sddlZddlZddlZddlZddlZddlZddlmZddlmZ	ddlm
Z
ddlmZddlmZddlm
Z
ddlmZe	jeZid	d
dfd6d
e
jifd6dddfd6ZddefddeffZdZdZdZdZdZdZdZdZdZ eeeeeeee fZ!d5Z#d*e$fd+YZ%d,e&fd-YZ'ej(ej)d.e&fd/YZ*d0e*fd1YZ+d2e*fd3YZ,ddd4Z-dS(6iN(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.pyRVstSourceMixincBs5eZdZdZdZdZdZRS(cCsS|js
dS|jjdi}x*|jD]\}}||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|jds&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|jddn|dkrN|jdnd}tjd|x6|D].}|j|}|j|}|rkPqkqkW|stjd|x9|D].}|j|}|j|}|rPqqWn|sdStjd|||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_devices2	

(RRR(R-R3R>RE(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRZs
				
	t
BaseReadercBszeZdZejdZejedZejdZejdZ	dZ
edZdZ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_joinscCsdS(N((R#R7tdecode((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt
_path_readscCsdS(N((R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_fetch_available_versionsscCsdS(N((R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt_read_ec2_metadatascCsy|j}Wn/tk
rA}tjd|j|g}nXgtttD]}|^qU}t}x'|D]}||krqtn|}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_versions 	

%
cCs|jddjd}|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_paths%cs{tjtjdttftjfd}idd6dd6}|j}x |j	D]\}\}}}j
j|}d}t
}yj|}WnBtk
r}	|stjd||	qtjd||	nXt}|r|rtd	|n|ri|riy||}Wqitk
re}	td
||	fqiXn|rj|||<qjqjW|d}
d|
kr|
d}ytj||
d<Wqttfk
r}	td
|	qXni}|
jdg}
xm|
D]e}d|krqn|d}yj|||<Wqtk
ri}	td||	fqXqW||d<|
jdd}|ry#j|dt}||d<Wqtk
r}	td|	qXny|
dd|d<Wntk
rnXj|d<x^tD]V\}}}|rQ||
krQtd|n||
kr|
j||
|<qqW|S(sReads 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_typescsi}jd|dttjf|d<jd|dtdf|d<jd|dtf|d<jd|d	tf|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	datafiless

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_v2s	
"	
	






(
RRRHtabctabstractmethodRKRmRMRNROR[ReR(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRFs			tConfigDriveReadercBsAeZdZdZedZdZdZdZRS(cCs#tt|j|d|_dS(N(tsuperRRHR 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](
RR RKRGR6tlistdirR7tisdirRtsorted(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||fnXdS(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}xHtjD]:}|j|j|}tjj|r|||<qqWt|dkrytd|jni}xtj	D]\}\}}}||kr1||}y|j
|}Wn!tk
rtd|nXy||||<WqDt
k
r-}	td||	fqDXqtj|||<qW|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(sReads 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#RR$R7tmdtkeyRtdefaulttcontentsRVtkeydataRtlinestlR((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.pyRZs				tMetadataReadercBsAeZddddZdZedZdZdZRS(icCsJtt|j|||_t||_t||_d|_	dS(N(
RRRHtssl_detailstfloatttimeouttinttretriesR R(R#tbase_urlRRR((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRHs
	cCs|jdk	r|jSg}|j|jd}|j|dt}x9|jD]+}|j}|sqqSn|j|qSW||_|jS(NR]RL(	RR RKRGRMRkRtstripRB(R#Rtversion_pathRtline((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRNs	c
CsWd}tj|d|jd|jd|jd|}|rL|jjS|jSdS(NcSsAy#t|j}|dkr"tSWnttfk
r<nXtS(Ni(RtcodeRmR}R|Rk(t
_request_argstcauseR((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytshould_retry_cbsRRRtexception_cb(RtreadurlRRRRRL(R#R7RLRtresponse((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRMs	
				
cGstj||S(N(Rtcombine_url(R#RIRJ((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRKscCs%tjd|jd|jd|jS(NRRR(Rtget_instance_metadataRRR(R#((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyROs	N(	RRR RHRNRmRMRKRO(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyRs
		c"s'|d<krd<Siddddddgd6ddd	d
ddd
ddddgd6|jdg}|jdg}|jdg}g}i}d}d}g}	x@|D]8}
g}tfd|
jD}d|
kr|
d|d<nd<}
|
jdr8|
jdj}
|
||
d<ni|jdd6|
d6|
dd6|
dd6}xug|D] }|d|
dkru|^quD]F}tfd|jD}|ddkr|jidd6n|dd kr|jid!d6nb|dd=kr:|ji|dd6n7|dd>krq|jid'd6|jd(d6n|dd?kr|jitd)6n|dd%krt|d%<n|dd&krt|d&<n|j|qW|ji|d6|
dd@kri}|
r |
|d<nxR|
jD]D\}}|d+krKq-q-|jd*r-|ji||6q-q-W||}|d,7}|j|d-d.t	j
|
d+f|ji|d6|d6||d<n|
ddAkrd0|
d1|
d2f}|ji|d6|
d2d26|
d3d6|j|d1d.|
d1f|j|dd4|
d2|
d1f|ji|
d3d6|d6nB|
dtkrtj
d5|
dn|jidd6|
d6|	j||||d<qWg|	D]-}|jddkrd|kr|^q}|s4|r|d<krOtj}nxY|jD]K\}}|jdr}q\n|jd|kr\||d|d<q\q\Wxc|D][}|jd}|std6|n||krtd7|n|||d<qWxt|D]i\}}}}t|ttfrkg|D]}|||d^qF||<q|||d||<qWntj} | rx@|	D]5}|d| kr| |d|d<d8|d<qqWnx5|D]-}!|!}|jid9d6|	j|qWid,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(RN((t.0tkRW(t
valid_keys(sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pys	<genexpr>6s	tethernet_mac_addresstidtmactlinkc3s1|]'\}}|dkr||fVqdS(RN((RRRW(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(Rsipv6_dhcpv6-statelesssipv6_dhcpv6-stateful(RR(sipv6_dhcpv6-statefulR(R(R(R R!RvR"tlowertupdateRkRBR5RRtKNOWN_PHYSICAL_TYPESR;twarningRtget_interfaces_by_macR|t
isinstanceRRttupletget_ib_hwaddrs_by_interface("tnetwork_jsont
known_macsRRRtlink_updatestlink_id_infot
bond_name_fmttbond_numberRRRtcfgt
link_mac_addrtcurinfoRDtnetworkRRRRWt	link_nameR$Rt
need_namest_link_idtinfoRRtfmtttargetRtib_known_hwaddrstservice((RsG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pytconvert_net_jsons


"$"		




	
		

-
,

(NRRRRRRRRRRR(.RRzRRtR6Rwt	cloudinitRRtloggingRRRRtcloudinit.sourcesRt	getLoggerRR;RlRRmRkRRTt	OS_FOLSOMt
OS_GRIZZLYt	OS_HAVANAt
OS_LIBERTYt
OS_NEWTON_ONEt
OS_NEWTON_TWOtOS_OCATAtOS_ROCKYRSR RRyRtobjectRt
add_metaclasstABCMetaRFRRR(((sG/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/openstack.pyt<module>	sn	Lc7
Back to Directory File Manager