x[hmddlZddlZddlZddlZddlZddlZddlmZmZm 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? #   Hfx  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_v2s3&-- NNdC'8  B 335626**, % .D.4:??4>>48DDE t,!">"EFF%d+D  $ 7 %::& H $"=1K *0*:*:;*G'!gr2" DT! @ /J Kz9$%@:%MNNX%'/||J'?$  @ _ IIDdAIIEtQ   !(;?C * $DqH  $=A1E  $>!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.BBcni}tjD]C}|j|j|}tj j |s?|||<E|std|jzi}tjD]I\}\}}}||vr$||} |j|} ||||<2tj|||<K|d} |d} | jd| } | r?| j!} | D cgc] } t#| r| j%d s| "c} |d<d | vr| d |d <d |d }d | vr| d |d <| jdd|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. z%s: no files foundzFailed to read: %sNrrrrr;#rr:)r<r>rz user-datarrr)FILES_V1keysrdr^rJrKrLr(r1rirrrpcopydeepcopyr0 splitlinesrrI)r2rr3rKmdkeyrdefaultcontentsrvkeydatarlinesliners rread_v1zConfigDriveReader.read_v1sMMO #D??4>>48Dww~~d#"d  #2dnnEF F 080@ 1 ,D,3 Gu}T{M#t4H)2BsG --03# 1&&'Y-++mW5 &&(E"!t9T__S%9!B}  G # ' 6B}   w  ' 1GH &kk+r: cM()=)DE1LM!(;?C!s6!E/3 F %F2/ F 8FF  F/F**F/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_cbsG 5::3;4/M#M z*  s "44)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 V &|ygdgdgdd&|jdg}|jdg}|jdg}g}i}d }d }g} |D]x} g} t&fd | jD} d | vr| d | d <d} | jd r'| jd j} | || d<| jd | | d| dd}|Dcgc]}|d| dk(s|c}D]}t&fd|jD}|jdgDcgc]$}t&fd|jD&}}|r|j d|i|ddk(r|j ddin|ddk(r|j ddin|ddvr|j d|dinh|ddvr$|j d|jddn=|ddvr6| j dd i|j d!|jdd|jdgDcgc]2}|jdgD]}|jdd"k(r|d#4}}}|jdgD]3}|jdd"k7r|d#|vr |j |d#5|r||d$<|dd%vr| j dd&i|dd'k(rd&|d'<|dd(k(rd&|d(<| j || j d)| i| dd*vri}| r| j d+| i| jD]T\}}|d,k(r |j d-sd.j|jd/d0d1}|j ||iV||z}|d0z }|j | d2d3tj| d,f| j ||d4||d <n| dd5vrv| d6d7| d8}| j || d8| d9d:|j | d6d3| d6f|j | d d;| d8z| d6f|j | d9|d<n8| dtvrtjd=| d| j d>| d?| j | |||d<{| Dcgc]}|jdd>k(sd |vs| }}|s|r|tj}|jD]6\}}|jd r|jd@|vs,||d@|d <8|D]i}|jd+} | st!dA|z| |vr:t#j$tj}| |vrt!dB|z|| |d <k|D]H\} }!}"}#t'|#t(t*fr|#D$cgc] }$|"||$d zc}$| |!<;|"||#d z| |!<Jtj,}%|%r| D]} | d |%vs |%| d | d+<dC| d<|D];}tj|} | j ddDi| j | =d0| dEScc}wcc}wcc}}wcc}wcc}$w)Fa*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_search)network destinationrrr)physicalsubnetrouteslinksnetworksserviceszbond%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 rrz#convert_net_json..ks*1aa:h;O6OArrc3:K|]\}}|dvr||fyw)rNr r s rrz#convert_net_json..rs.1Jx00Fs ipv4_dhcpdhcp4 ipv6_dhcpdhcp6) ipv6_slaaczipv6_dhcpv6-statelessipv6_dhcpv6-stateful)ipv4staticr ip_address)rr)ipv6static6z accept-raFr dnsrr)rrTrrr)bondr bond_linksr"zbond-{}bond_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)r0rr1lowerupdaterWrIformatrrrKNOWN_PHYSICAL_TYPESrOwarningrget_interfaces_by_macrrudevadm_settle isinstancerrtupleget_ib_hwaddrs_by_interface)' network_json known_macsrrr link_updates link_id_info bond_name_fmt bond_numberr.rrcfg link_mac_addrcurinforYrrrouterservicerrr rwtranslated_key link_namer3r need_names_link_idinforrfmttargetstargetib_known_hwaddrsr s' @rconvert_net_jsonrMs6   M+J0   Wb )E B/H B/HLLMK F_. #zz|   T>v,CK 88* + HH%;<BBDM'4Ld $GGFO t*L  $,GaqyDJ/FGH #G#*==?F%[[26    % F x01v+- vw/0K/ vw/0%  vwv78$66 (#*;;|#< $77 K/0 )#*;;|#<%[[26$yyR8;;v&%/ ""O#;;z26 ;;;v&%/9%8&&wy'9:  ; ,;()v"GG K./v&(!%vv&(!%v NN6 "QH #R Iw'( <8 #F M=9: 71 $\\&)&/%5%5agggq6I"6M%NNMM>1"56 7 & 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*$##% 668 j($%IA%MNN"3AfI ('3 ? "Cc7'D%=1EL;AC,v.v66Cg!6v!>>C  ?668 +C6{..%5c&k%BM"*F  + mmG$ FL)* c F ++yHRr:s0!Z2Z3)Z7Z Z!-Z!2Z!.Z&)NN))rrrrloggingrJ cloudinitrrrrrcloudinit.sourcesrcloudinit.sources.helpersr getLoggerr)rOrrrrt OS_FOLSOM OS_GRIZZLY OS_HAVANA OS_LIBERTY OS_NEWTON_ONE OS_NEWTON_TWOOS_OCATAOS_ROCKYrsr2rr(r-ABCMetar\rrrMr rrr\s  ::,)g! 0bA4>>2."3["!E                   " ' IIXA3;;AHp pf6 Z6 tT,r