\`ffddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z ddlmZej eZdddfde j&ifd d dfd Zd Zd ZdZdZdZdZdZdZdZdZeeeeeeeefZdZ Gdde!Z"GddZ#GddejHZ%Gdde%Z&Gd d!e%Z'd#d"Z(y)$N)netsourcessubp url_helperutil)BrokenMetadata)ec2network_configc|SNxs E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.pyrs1meta_jsauthorized_keysc|Sr r rs 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 vhostuservifc eZdZy) NonReadableN)__name__ __module__ __qualname__r rrr(r(Qsrr(c*eZdZdZdZdZdZdZy) SourceMixinc|jsy|jjdi}|jD]\}}||k(s |cSy)Nzblock-device-mapping) ec2_metadatagetitems)selfnamebdment_namedevices r_ec2_name_to_devicezSourceMixin._ec2_name_to_deviceVsS  ##$:B?"%))+  Xvx  rcd}|jdk(rd}tj|jj |S)N public_keys public-keys)versionrnormalize_pubkey_datametadatar0)r2r3s rget_public_ssh_keyszSourceMixin.get_public_ssh_keys_s8 <<1  D,,T]]->->t-DEErcd} d|z}|dk(rd|z}tj|}|r|d}|S#tj$rY|SwxYw)NzLABEL=%sswapzTYPE=%sr)rfind_devs_withrProcessExecutionError)r2r3r6criteria dev_entriess r_os_name_to_devicezSourceMixin._os_name_to_deviceesi !T*Hv~$---h7K$Q ))    s+1AAc |sy|jdsd|z}tjj|r|S|j tjj |}|rt jd|||Sy)N/z/dev/%szRemapped device name %s => %s) startswithospathexists _remap_devicebasenameLOGdebug)r2r6remappeds r_validate_device_namez!SourceMixin._validate_device_namersp  %'F 77>>& !M%%bgg&6&6v&>?  II5vx HOrc|sy|g}|dk(r|jdd|dk(r|jdd}tjd||D](}|j |}|j |}|s(n|sCtjd||D](}|j |}|j |}|s(n|sytjd|||S)Nrootramiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)insertappendrOrPr7rRrF)r2r3namesr6ns rdevice_name_to_devicez!SourceMixin.device_name_to_devices 6> LLE " 5= LL   user_dataFc|Sr r rs rrz7BaseReader.read_v2..datafiles..s!ruserdatazvendor_data.json vendordatazvendor_data2.json vendordata2znetwork_data.json networkdata)rdr load_json)r<filesload_json_anytyper2s r datafilesz%BaseReader.read_v2..datafilessE W6FG !E*  WkB!E*   W6HI!#E,   W6IJ!$E-  W6IJ!$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: %srrKzFailed to read provided file r rz(Failed to read network configuration: %smetadsmodez ec2-metadatazNo '%s' entry in metadata) functoolspartialrrdictrrstrr{r1rdr^riIOErrorrOrPr(rprbase64 b64decode ValueError TypeErrorr0rKeyErrorrn KEY_COPIES)r2rresultsdatar3rKrequired translatorfoundrvr>rrmetadata_filesrnet_itemcontent target_key source_key is_requiredrs` @rread_v2zBaseReader.read_v2s4&-- NNdC'8  B 335648JJL % 0T/D(J??4>>48DDE t,!">"EFF%d+D  $ 7 %::& H $"=1K *0*:*:;*G'!gr2" DT!!D    sF?=HH*I I3# J? H1G??H H'H""H'*I 9II  I0I++I03 J<J  J J J NF) r)r*r+r_abcabstractmethodrdrirlrnr{rrr rrr\r\s#             :4Grr\) metaclassc>eZdZfdZdZddZdZdZdZxZ S)ConfigDriveReaderc:tt| |d|_yr )superrr_ _versions)r2r^ __class__s rr_zConfigDriveReader.__init__fs / :rcX|gt|z}tjj|Sr )rrrJrKjoin)r2rbrc componentss rrdzConfigDriveReader._path_joinjs%Vd7m+ ww||Z((rcZ|rtj|Stj|Sr )rload_text_fileload_binary_filergs rrizConfigDriveReader._path_readns1    % &&t, rcP|j|j|jd}tj|Dcgc]@}tj j tj j|r|B}}t||_|jScc}w)Nr~) rrdr^rJlistdirrKisdirrsorted)r2rKdrs rrlz+ConfigDriveReader._fetch_available_versionsus >> !??4>>;?DD)77==d!34E $E]DN~~ sAB#c|j|jddd}tjj |siS t j |j|S#t$r}td|d||d}~wwxYw)Nr rzmeta-data.jsonrr) rdr^rJrKrLrrrirpr)r2rKrvs rrnz$ConfigDriveReader._read_ec2_metadatasz NNE8-= ww~~d#I ~~dood&;<< $7;Q? s#A%% B.BBci}tjD]C}|j|j|}tj j |s?|||<Et|dk(rtd|jzi}tjD]I\}\}}}||vr$||} |j|} ||||<2tj|||<K|d} |d} | j!d | } | r?| j#} | D cgc] } t| r| j%d s| "c} |d <d | vr| d |d <d |d }d| vr| d|d<| j!dd|d<i|d<|S#t$r} td|z| d} ~ wwxYw#t$r} td|d| | d} ~ wwxYwcc} w)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;#rr:)r<r>rz user-datarrr)FILES_V1keysrdr^rJrKrLrr(r1rirrrpcopydeepcopyr0 splitlinesrI)r2rr3rKmdkeyrdefaultcontentsrvkeydatarlinesliners rread_v1zConfigDriveReader.read_v1s MMO #D??4>>48Dww~~d#"d  # u:?2dnnEF F 2:..2B 1 .T-CWu}T{M#t4H)2BsG --03# 1&&'Y-++mW5 &&(E"!t9T__S%9!B}  G # ' 6B}   w  ' 1GH &kk+r: cM()=)DE1LM!(;?C!s6-E;? F%F>; FFF F;$F66F;r) r)r*r+r_rdrirlrnr __classcell__rs@rrres")   Grrc:eZdZdfd ZdZddZdZdZxZS)MetadataReaderctt| |||_t ||_t ||_d|_yr ) rrr_ ssl_detailsfloattimeoutintretriesr)r2base_urlrrrrs rr_zMetadataReader.__init__s7 nd,X6&W~ 7| rc,|j |jSg}|j|jd}|j|d}|j D]&}|j }|s|j |(||_|jS)Nr~Tr)rrdr^rirstriprW)r2r version_pathrrs rrlz(MetadataReader._fetch_available_versionss >> %>> !t~~{C //,t/<&&( D::.should_retry_cbsD 5::3;  z*  s 11)rrr exception_cb)rreadurlrrrrrh)r2rKrhrresponses rrizMetadataReader._path_reads\ %% LL((LL(   $$++- -$$ $rc.tj|g|Sr )r combine_urlras rrdzMetadataReader._path_joins%%d5W55rcntj|j|j|jS)N)rrr)r get_instance_metadatarrrrks rrnz!MetadataReader._read_ec2_metadata s,((((LLLL  r)Nrr) r)r*r+r_rlrirdrnrrs@rrrs %.6 rrc  #|ygdgdd#|jdg}|jdg}|jdg}g}i}d}d }g} |D]} g} t#fd | jD} d | vr| d | d <d} | jd r'| jd j} | || d <| jd | | d | dd}|Dcgc]}|d| d k(s|c}D]e}t#fd|jD}|ddk(r|j ddin|ddk(r|j ddin|ddvr|j d|dinh|ddvr$|j d|jddn=|ddvr6| j ddi|j d|jdd|jdgDcgc]}|jddk(r|d }}|r||d!<|dd"vr| j dd#i|dd$k(rd#|d$<|dd%k(rd#|d%<| j |h| j d&| i| dd'vri}| r| |d(<| jD]0\}}|d)k(r |j d*s|j ||i2||z}|d+z }|j | d,d-tj| d)f| j ||d.||d <n| dd/vrv| d0d1| d2}| j || d2| d3d4|j | d0d-| d0f|j | d d5| d2z| d0f|j | d3|d6n8| dtvrtjd7| d| j d8| d9| j | |||d <| Dcgc]}|jdd8k(sd |vs| }}|s|r|tj}|jD]6\}}|jd r|jd:|vs,||d:|d <8|D]=}|jd(}|std;|z||vrtd<|z|||d <?|D]H\} }}} t| t t"fr| D!cgc] }!|||!d zc}!| |<;||| d z| |<Jtj$}"|"r| D]} | d |"vs |"| d | d(<d=| d<|D];}tj|} | j dd>i| j | =d+| d?Scc}wcc}wcc}wcc}!w)@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 superfluous keys from the network_config yaml. N)r3type mac_addresssubnetsparamsmtu) raddressnetmask broadcastmetricgateway pointopointscopedns_nameservers dns_searchroutes)physicalsubnetlinksnetworksserviceszbond%drc3<K|]\}}|dvs||fyw)rNr .0krw valid_keyss r z#convert_net_json..Ts* q!qJz4J/JQF  r3ethernet_mac_addressidr)r3macrrlinkc3<K|]\}}|dvs||fyw)rNr r s rr z#convert_net_json..ks*1aa:h;O6OAr ipv4_dhcpdhcp4 ipv6_dhcpdhcp6) ipv6_slaaczipv6_dhcpv6-statelessipv6_dhcpv6-stateful)ipv4staticr ip_address)rr)ipv6static6z accept-raFrdnsrr)rrTrrr)bondr bond_linksr r:bond_interfacesz%s)rr3)vlan vlan_link.vlan_idvlan_mac_address)r3r&rz%%s.%s)rr3z9Unknown network_data link type (%s); treating as physicalr)rrrz#No mac_address or name entry for %sz"Unable to find a system nic for %s infiniband nameserver)r<config)r0rr1lowerupdaterWrIrrKNOWN_PHYSICAL_TYPESrOwarningrget_interfaces_by_macr isinstancerrtupleget_ib_hwaddrs_by_interface)$ network_json known_macsrrr link_updates link_id_info bond_name_fmt bond_numberr*rrcfg link_mac_addrcurinforYnetworkrservicerrr rw link_namer3r need_names_link_idinforrfmttargetstargetib_known_hwaddrsr s$ @rconvert_net_jsonrFs6   J0   Wb )E B/H B/HLLMK F. #zz|   T>v,CK 88* + HH%;<BBDM'4Ld $GGFO t*L  $,GaqyDJ/FG/ #G#*==?Fv+- vw/0K/ vw/0%  vwv78$66 (#*;;|#< $77 K/0 )#*;;|#< '{{:r:;;v&%/ "O ,;()v"GG K./v&(!%vv&(!%v NN6 "_/ #` Iw'( <8 #F(5}%  *1 $\\&)MM1a&)  *& 3I 1 K   %MM$|"45   JJ&)< ='GFO &\X %";/iAD JJ #I#'(:#;    k4k9J K L   fhi8${:KL  NN4(:#;TJ KF|#77  L JJ =I J c&- WT]#.DQUU6]j8V1_J\  224J+002 7NHdxxxx*,)$u+6V  7  (A%% &C !F!JKK*$ !E!IJJ"3AfI  ('3 ? "Cc7'D%=1EL;AC,v.v66Cg!6v!>>C  ?668 +C6{..%5c&k%BM"*F  + mmG$ FL)* c F ++qH>T2s*U:/U:. U?)VVVV )NN))rrrrloggingrJ cloudinitrrrrrcloudinit.sourcesrcloudinit.sources.helpersr getLoggerr)rOrrrrt OS_FOLSOM OS_GRIZZLY OS_HAVANA OS_LIBERTY OS_NEWTON_ONE OS_NEWTON_TWOOS_OCATAOS_ROCKYrsr-rr(r-ABCMetar\rrrFr rrrUs  ::,)g! 0bA4>>2."3["!E                   " ' IIXA3;;AHp pf6 Z6 tp,r