܍~ceddlZddlZddlZddlZddlZddlmZddlmZm Z m Z m Z m Z ddl mZddlmZejeZdddfd e jifd d dfd Zd ZdZdZdZdZdZdZdZdZdZeeeeeeeefZ dZ!Gdde"Z#GddZ$Gddej%Z&Gdd e&Z'Gd!d"e&Z(d$d#Z)dS)%N)log)netsourcessubp url_helperutil)BrokenMetadata)ec2network_configc|SNxs E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.pyrs1meta_jsauthorized_keysc|Sr rrs rrrsqr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostnamehostnameF) instance-iduuidTlatestz 2012-08-10z 2013-04-04z 2013-10-17z 2015-10-15z 2016-06-30z 2016-10-06z 2017-02-22z 2018-08-27) Nbgpovsbridge cascadingdvsethernethw_vebhypervovsphytap vhostuservifceZdZdS) NonReadableN)__name__ __module__ __qualname__rrrr)r)QsDrr)c,eZdZdZdZdZdZdZdS) SourceMixinc|jsdS|jdi}|D]\}}||kr|cSdS)Nzblock-device-mapping) ec2_metadatagetitems)selfnamebdment_namedevices r_ec2_name_to_devicezSourceMixin._ec2_name_to_deviceVse  4##$:B??"%))++   Xvx  trcxd}|jdkrd}tj|j|S)N public_keys public-keys)versionrnormalize_pubkey_datametadatar1)r3r4s rget_public_ssh_keyszSourceMixin.get_public_ssh_keys_s: <1   D,T]->->t-D-DEEErcd} d|z}|dkrd|z}tj|}|r|d}n#tj$rYnwxYw|S)NzLABEL=%sswapzTYPE=%sr)rfind_devs_withrProcessExecutionError)r3r4r7criteria dev_entriess r_os_name_to_devicezSourceMixin._os_name_to_deviceess !T*Hv~~$--h77K ($Q)    D  s.3AAc(|sdS|dsd|z}tj|r|S|tj|}|rt d|||SdS)N/z/dev/%szRemapped device name %s => %s) startswithospathexists _remap_devicebasenameLOGdebug)r3r7remappeds r_validate_device_namez!SourceMixin._validate_device_namers 4  %% ('F 7>>& ! ! M%%bg&6&6v&>&>??   II5vx H H HOtrc|sdS|g}|dkr|dd|dkr|dd}td||D]0}||}||}|rn1|sNtd||D]0}||}||}|rn1|sdStd|||S)Nrootramiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)insertappendrPrQr8rSrG)r3r4namesr7ns rdevice_name_to_devicez!SourceMixin.device_name_to_devices@ 4 6>> LLE " " " 5== LL  z4BaseReader._find_working_version..s<<<1Q<<.s#999a#a&&9999rz!Item %s has no valid content path openstackri)r1lstripsplitr rer_rj)r3itemrirL path_pieces valid_piecess r_read_content_pathzBaseReader._read_content_pathsxx++22377jjoo 99;999  O !D!MNN Ntt~{I[IIItF333rctjtjtt t ffd}ddd}|}|D]\}\}}} j |}d}d} |}d}nR#t$rE} |std || ntd || Yd} ~ nd} ~ wwxYw|r|std |z|r7|r5 ||}n(#t $r} t#d |d | | d} ~ wwxYw|r|||<|d} d| vrM| d} t%j| | d<n,#t(t*f$r} t#d| z| d} ~ wwxYwi} | dg} | D]P}d|vr|d} || |<)#t $r} t#d|d | | d} ~ wwxYw| |d<| dd}|rC |d}||d<n%#t$r} t#d| z| d} ~ wwxYw | dd|d<n#t0$rYnwxYw|d<t4D]:\}}}|r|| vrt#d|z|| vr| || |<;|S)zReads 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. ) root_typescDi}d|ddtjf|d<d|dddf|d<d|d df|d <d|d df|d <d|d df|d<|S)Nrzmeta_data.jsonTr? user_dataFc|Sr rrs rrz7BaseReader.read_v2..datafiles..s!ruserdatazvendor_data.json vendordatazvendor_data2.json vendordata2znetwork_data.json networkdata)rer load_json)r=filesload_json_anytyper3s r datafilesz%BaseReader.read_v2..datafilessE W6FGG !E*  WkBB !E*   W6HII!#E,   W6IJJ!$E-  W6IJJ!$E- Lrr)rr=NFTz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %szMissing mandatory path: %sFailed to process path : r? random_seedz.Badly formatted metadata random_seed entry: %srrLzFailed to read provided file r rz(Failed to read network configuration: %smetadsmodez ec2-metadatazNo '%s' entry in metadata) functoolspartialrrdictrwstrrr2rer_rjIOErrorrPrQr)rur base64 b64decode ValueError TypeErrorr1rKeyErrorro KEY_COPIES)r3rresultsdatar4rLrequired translatorfoundr{r?rrmetadata_filesrnet_itemcontent target_key source_key is_requiredrs` @rread_v2zBaseReader.read_v2s]&- NdC'8         B  y33556648JJLL % % 0T/D(J??4>488DDE t,,   IIDdAIIEtQ   G G!">"EFFF  %:d++DD (.;?44C % $ :& H $ $"=1K *0*:;*G*G'' *   $DqH  !gr22"  DT!!!D   ( 0 :GH      D #'"9"9";";6@ @ @ 1Z[ Oz99$%@:%MNNNX%%'/||J'?'?$sB22 D<;C<<D D++ E5E  E0FF1F,,F1G77 HHH=I I<$I77I<J JJNF) r*r+r,r`abcabstractmethodrerjrmrorrrrrrr]r]s###                    :4444GGGGGrr]) metaclassc>eZdZfdZdZddZdZdZdZxZ S) ConfigDriveReadercftt||d|_dSr )superrr` _versions)r3r_ __class__s rr`zConfigDriveReader.__init__fs- &&// :::rcN|gt|z}tjj|Sr )rwrKrLjoin)r3rcrd componentss rrezConfigDriveReader._path_joinjs#Vd7mm+ w|Z((rFc.tj||S)Nr)r load_filerhs rrjzConfigDriveReader._path_readns~d62222rc|jO||jdfdtjD}t ||_|jS)Nrcg|]@}tjtj>|ASr)rKrLisdirr)rrdrLs rrtz?ConfigDriveReader._fetch_available_versions..tsK7==d!3!344r)rrer_rKlistdirsorted)r3rrLs @rrmz+ConfigDriveReader._fetch_available_versionsqsi > !??4>;??DD))E $E]]DN~rc||jddd}tj|siS t j||S#t$r}td|d||d}~wwxYw)Nr rzmeta-data.jsonrr) rer_rKrLrMrrrjrur )r3rLr{s rroz$ConfigDriveReader._read_ec2_metadata|s NE8-=  w~~d## I ~dood&;&;<<<   $n7;ttQQ? s&A'' B 1BB ci}tD]A}||j|}tj|r|||<Bt|dkrtd|jzi}t D]\}\}}}||vr|||} | |}n%#t$r} td|z| d} ~ wwxYw ||||<a#t$r} td|d| | d} ~ wwxYwtj|||<|d} |d} | d | } | r#| } d | D|d <d | vr | d |d <d |d } d| vr | d| d<| dd| d<i| d<| S)zReads 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. rz%s: no files foundzFailed to read: %sNrrrrr<cZg|](}t||d&|)S)#)rrJ)rrlines rrtz-ConfigDriveReader.read_v1..sJ!!!t99!&*__S%9%9!!!!rrr;)r=r?rz user-datarrr)FILES_V1keysrer_rKrLrMrr)r2rjrr rucopydeepcopyr1 splitlines)r3rr4rLmdkeyrdefaultcontentsr{keydatarlinesrs rread_v1zConfigDriveReader.read_v1s[MMOO # #D??4>488Dw~~d## #"d u::??2dnEFF F 2:..2B2B 1 1 .T-CWu}}T{M#t44HHMMM()=)DEE1LM)j22BsGG (.;?44C -003&'Y-++mW55  &&((E!!!!!!B}  G # # ' 6B}    w   ' 1GH &kk+r:: s09C C1C,,C15D D)D$$D)r) r*r+r,r`rerjrmror __classcell__rs@rrres)))3333      GGGGGGGrrc:eZdZd fd ZdZd dZdZdZxZS) MetadataReaderNctt||||_t ||_t ||_d|_dSr ) rrr` ssl_detailsfloattimeoutintretriesr)r3base_urlrrrrs rr`zMetadataReader.__init__sN nd##,,X666&W~~ 7|| rc(|j|jSg}||jd}||d}|D].}|}|s||/||_|jS)NrTr)rrer_rjrstriprX)r3r version_pathrrs rrmz(MetadataReader._fetch_available_versionss > %> !t~{CC //,t/<<&&((  D::<.should_retry_cbsS 5:3;; 5z*    4s 33)rrr exception_cb)rreadurlrrrrri)r3rLrirresponses rrjzMetadataReader._path_readsh   % L(L(      %$++-- -$ $rc&tj|g|RSr )r combine_urlrbs rrezMetadataReader._path_joins%d5W5555rcNtj|j|j|jS)N)rrr)r get_instance_metadatarrrrls rroz!MetadataReader._read_ec2_metadatas,((LL    r)Nrrr) r*r+r,r`rmrjrerorrs@rrrs~   %%%%.666       rrc   |dSgdgdd |dg}|dg}|dg}g}id}d }g}|D]g} t fd D} d vr d | d <d} d r2d } | d <| d | d dd} fd|DD]z} t fd| D}| ddkr|ddin| ddkr|ddin| ddvr|d| din| ddvr,|d| ddnL| ddvrB| ddi|d| dd| ddvr| dd i| dd!krd |d!<| dd"krd |d"<| ||| d#| idd$vri}| r| |d%<D]8\}}|d&kr |d'r|||i9||z}|d(z }|| d)d*tjd&f| ||d+|| d <ndd,vrd-d.d/}| |d/d0d1|| d-d*d-f|| d d2d/zd-f| d0|d3nHdtvr!t d4d| d5| d6|| | | d <d7|D}|s|r |tj }D]C\}}|d r|d8|vr||d8|d <D|D]L}|d%}|std9|z||vrtd:|z|||d <M|D]J\} }}t|t t"frfd;|D| |<6|d z| |<Ktj}|r%|D]"} | d |vr|| d | d%<d<| d<#|D]0}|} | dd=i|| 1d(|d>S)?a)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. N)r4type mac_addresssubnetsparamsmtu) raddressnetmask broadcastmetricgateway pointopointscopedns_nameservers dns_searchroutes)physicalsubnetlinksnetworksserviceszbond%drc3:K|]\}}|dv||fVdS)r Nrrrkrs valid_keyss r z#convert_net_json..PsC  q!qJz4J/J/JQF/J/J/J/J  rr4ethernet_mac_addressidr)r4macrrc8g|]}|ddk|S)linkrr)rrrZrs rrtz$convert_net_json..fs+GGGaqyDJ/F/F/F/F/Frc3:K|]\}}|dv||fVdS)r Nrrs rrz#convert_net_json..gsC1aa:h;O6O6OA6O6O6O6Or ipv4_dhcpdhcp4 ipv6_dhcpdhcp6) ipv6_slaaczipv6_dhcpv6-statelessipv6_dhcpv6-stateful)ipv4staticr  ip_address)rr)ipv6static6z accept-raFr#)rrTrr"r)bondr bond_linksr$r;bond_interfacesz%s)rr4)vlan vlan_link.vlan_idvlan_mac_address)r4r*rz%%s.%s)rr4z9Unknown network_data link type (%s); treating as physicalr )rrcLg|]!}|ddkd|v|"S)rr r4)r1)rrrs rrtz$convert_net_json..s8QUU6]]j88V1_____rrz#No mac_address or name entry for %sz"Unable to find a system nic for %sc2g|]}|dzS)r4r)rrtargetfmt link_id_infos rrtz$convert_net_json..s5;AC,v.v66r infiniband nameserver)r=config)r1rr2lowerupdaterXrJrrKNOWN_PHYSICAL_TYPESrPwarningrget_interfaces_by_macr isinstancerwtupleget_ib_hwaddrs_by_interface)! network_json known_macsr r r  link_updates bond_name_fmt bond_numberr3rcfg link_mac_addrcurinfonetworkr rrrs link_namer4 need_names_link_idinforrrtargetsib_known_hwaddrsservicer/rr0rs! @@@@rconvert_net_jsonrLs6t       J0   Wb ) )E B//H B//HLLMK Fw.w.    #zz||      T>>v,CK 88* + + 5 HH%;<<BBDDM'4Ld $GGFOO t*L   HGGG8GGG' #' #G#*==??Fv+-- vw/0000K// vw/0000%  vwv78888$666 (#*;;|#<#< $777 K/000 )#*;;|#<#<v"GGG K.///v&((!%vv&((!%v NN6 " " " " Iw'((( <8 # #F 6(5}%  * *1 $$\\&))*MM1a&))) & 3I 1 K   %M$|"455     JJ&)<< = = ='GFOO &\X % %";///iAD JJ #I#'(:#;      k4k9J K L L L   fhi8${:KL    NN4(:#;TJJ K K K KF|#777  L JJ =II J J J c&- WT]##J?\?  244J+0022 7 7NHdxx xx*,,)$u+6V  ( (A%% &&C L !F!JKKK*$$ !E!IJJJ"3AfII&2 ? ? "Cc7'D%=11 ?ELCg!6v!>>C 688+ + +C6{...%5c&k%BM"*F  FL)*** cF + ++r)NN)*rrrrrK cloudinitrloggingrrrrrcloudinit.sourcesr cloudinit.sources.helpersr getLoggerr*rPrrrry OS_FOLSOM OS_GRIZZLY OS_HAVANA OS_LIBERTY OS_NEWTON_ONE OS_NEWTON_TWOOS_OCATAOS_ROCKYrxr6rr)r.ABCMetar]rrrLrrrr[sT  $$$$$$::::::::::::::,,,,,,))))))g!! 0bA4>2."3[["!E                    "     '   IIIIIIIIXAAAAA3;AAAAHlllll lll^6 6 6 6 6 Z6 6 6 th,h,h,h,h,h,r