
    x[hm                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
Jr  S SKJr  S SKJr  \R                   " \5      rSS S4S\R&                  0 4S	S
 S4S.rSrSrSrSrSrSrSrSrSrSr\\\\\\\\4rSr  " S S\!5      r" " S S5      r# " S S\ RH                  S9r% " S S\%5      r& " S  S!\%5      r'S#S" jr(g)$    N)netsourcessubp
url_helperutil)BrokenMetadata)ec2network_configc                     U $ N xs    E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.py<lambda>r      s    1     meta_jsauthorized_keysc                     U $ r   r   r   s    r   r   r      s    qr   )zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostnamehostnameF)instance-iduuidTlatestz
2012-08-10z
2013-04-04z
2013-10-17z
2015-10-15z
2016-06-30z
2016-10-06z
2017-02-22z
2018-08-27)Nbgpovsbridge	cascadingdvsethernethw_vebhypervovsphytap	vhostuservifc                       \ rS rSrSrg)NonReadableQ   r   N)__name__
__module____qualname____firstlineno____static_attributes__r   r   r   r(   r(   Q   s    r   r(   c                   2    \ rS rSrS rS rS rS rS rSr	g)	SourceMixinU   c                     U R                   (       d  g U R                   R                  S0 5      nUR                  5        H  u  p4X:X  d  M  Us  $    g )Nzblock-device-mapping)ec2_metadatagetitems)selfnamebdment_namedevices        r   _ec2_name_to_deviceSourceMixin._ec2_name_to_deviceV   sJ      ##$:B? #		H !, r   c                     SnU R                   S:X  a  Sn[        R                  " U R                  R	                  U5      5      $ )Npublic_keys   public-keys)versionr   normalize_pubkey_datametadatar4   )r6   r7   s     r   get_public_ssh_keysSourceMixin.get_public_ssh_keys_   s8    <<1 D,,T]]->->t-DEEr   c                     S n SU-  nUS:X  a  SU-  n[         R                  " U5      nU(       a  US   nU$ ! [        R                   a     U$ f = f)NzLABEL=%sswapzTYPE=%sr   )r   find_devs_withr   ProcessExecutionError)r6   r7   r:   criteriadev_entriess        r   _os_name_to_deviceSourceMixin._os_name_to_devicee   si    	!T*Hv~$---h7K$Q  )) 		s   28 AAc                 0   U(       d  g UR                  S5      (       d  SU-  n[        R                  R                  U5      (       a  U$ U R	                  [        R                  R                  U5      5      nU(       a  [        R                  SX5        U$ g )N/z/dev/%szRemapped device name %s => %s)
startswithospathexists_remap_devicebasenameLOGdebug)r6   r:   remappeds      r   _validate_device_name!SourceMixin._validate_device_namer   st      %%'F77>>&!!M%%bgg&6&6v&>?II5vHOr   c                    U(       d  g U/nUS:X  a  UR                  SS5        US:X  a  UR                  S5        S n[        R                  SU5        U H.  nU R	                  U5      nU R                  U5      nU(       d  M.    O   U(       dJ  [        R                  SU5        U H.  nU R                  U5      nU R                  U5      nU(       d  M.    O   U(       d  g [        R                  SX5        U$ )Nrootr   amiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)insertappendrV   rW   r;   rY   rL   )r6   r7   namesr:   ns        r   device_name_to_device!SourceMixin.device_name_to_device   s    6>LLE"5=LL 		<eDA--a0F//7Fv	  IIFN00333F;6	  II.=Mr   r   N)
r*   r+   r,   r-   r;   rD   rL   rY   rb   r.   r   r   r   r0   r0   U   s    Fr   r0   c                       \ rS rSrS r\R                  S 5       r\R                  SS j5       r\R                  S 5       r	\R                  S 5       r
S rSS jrS	 rS
rg)
BaseReader   c                     Xl         g r   	base_path)r6   ri   s     r   __init__BaseReader.__init__   s    "r   c                     g r   r   r6   baseadd_onss      r   
_path_joinBaseReader._path_join       r   c                     g r   r   r6   rR   decodes      r   
_path_readBaseReader._path_read   rr   r   c                     g r   r   r6   s    r   _fetch_available_versions$BaseReader._fetch_available_versions   rr   r   c                     g r   r   ry   s    r   _read_ec2_metadataBaseReader._read_ec2_metadata   rr   r   c                 R    U R                  5       n[        [        [        5      5       Vs/ s H  o3PM     nn[        nU H  nXa;  a  M
  Un  O   [        R                  SUU5        U$ ! [         a-  n[        R                  SU R                  U5        / n S nANS nAff = fs  snf )Nz4Unable to read openstack versions from %s due to: %szSelected version '%s' from %s)	rz   	ExceptionrV   rW   ri   reversedlistOS_VERSIONS	OS_LATEST)r6   versions_availableev	supportedselected_versionpotential_versions          r   _find_working_version BaseReader._find_working_version   s    	$!%!?!?!A !)k): ;< ;1Q ;	<$!* :0	 "+ 			+	

  1  	$IIF
 "$	$ =s   A* B$*
B!4#BB!c                 <   UR                  SS5      R                  S5      nUR                  S5      nU Vs/ s H  n[        U5      (       d  M  UPM     nnU(       d  [	        SU-  5      eU R
                  " U R                  S/UQ76 nU R                  X2S9$ s  snf )Ncontent_pathr   rO   z!Item %s has no valid content path	openstackru   )r4   lstripsplitlenr   rp   ri   rv   )r6   itemru   rR   path_piecespvalid_piecess          r   _read_content_pathBaseReader._read_content_path   s    xx+2237jjo#.9;a#a&;9 !D!MNNt~~{I[It33	 :s   BBc                   ^ ^ [         R                  " [        R                  [        [
        [        4S9mUU 4S jnSSS.nU" T R                  5       5      nUR                  5        H}  u  nu  pVnT R                  T R                  U5      nSnSn T R                  U5      nSnU(       a  U(       d  [        SU-  5      eU(       a  U(       a	   U" U5      nU(       d  My  X2U'   M     US   n
SU
;   a  U
S   n [$        R&                  " U5      U
S'   0 nU
R-                  S/ 5      nU H$  nSU;  a  M  US   n T R/                  U5      X'   M&     XS'   U
R-                  SS5      nU(       a   T R/                  USS9nUUS'    U
S   S   US'   T R3                  5       US'   [4         H>  u  nnnU(       a  UU
;  a  [#        SU-  5      eUU
;   d  M*  U
R-                  U5      U
U'   M@     U$ ! [         aD  n	U(       d  [        R                  S	XY5         Sn	A	GNu[        R                  S
XY5         Sn	A	GNSn	A	ff = f! [          a  n	[#        SU< SU	< 35      U	eSn	A	ff = f! [(        [*        4 a  n	[#        SU	-  5      U	eSn	A	ff = f! [          a  n	[#        SU< SU	< 35      U	eSn	A	ff = f! [         a  n	[#        SU	-  5      U	eSn	A	ff = f! [0         a     GNOf = f)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_typesc                 $  > 0 nTR                  SU S5      S[        R                  4US'   TR                  SU S5      SS 4US'   TR                  SU S	5      ST4US
'   TR                  SU S5      ST4US'   TR                  SU S5      ST4US'   U$ )Nr   zmeta_data.jsonTrC   	user_dataFc                     U $ r   r   r   s    r   r   7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>   s    !r   userdatazvendor_data.json
vendordatazvendor_data2.jsonvendordata2znetwork_data.jsonnetworkdata)rp   r   	load_json)rA   filesload_json_anytyper6   s     r   	datafiles%BaseReader.read_v2.<locals>.datafiles   s    E W6FG!E* WkB!E* W6HI!#E, W6IJ!$E-  W6IJ!$E- 
 Lr   r      )r   rA   NFTz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %szMissing mandatory path: %sFailed to process path : rC   random_seedz.Badly formatted metadata random_seed entry: %sr   rR   zFailed to read provided file r
   r   z(Failed to read network configuration: %smetadsmodezec2-metadatazNo '%s' entry in metadata)	functoolspartialr   r   dictr   strr   r5   rp   ri   rv   IOErrorrV   rW   r(   r   r   base64	b64decode
ValueError	TypeErrorr4   r   KeyErrorr}   
KEY_COPIES)r6   r   resultsdatar7   rR   required
translatorfoundr   rC   r   r   metadata_filesr   net_itemcontent
target_key
source_keyis_requiredr   s   `                   @r   read_v2BaseReader.read_v2   s!    &--NNdC'8
	B 
 335626**,.D.4:??4>>48DDEt, !">"EFF%d+D
 u $7 3?: :&H$"=1K*0*:*:;*G' !gr2"DT!<D"55d; # !
 << 0$711(41H,3()	 ( 0 :GH
 #'"9"9"; 4>/J
Kz9$%@:%MNNX%'/||J'?$	 4>
 _  IIDd  IIEt   ! (;?C 	* $DqH  $=A1E  $>!D  		s   G,H=9I# 9J
.J0 K ,
H:6H5H55H:=
I II #J3JJ

J-J((J-0
K:K		K
KKrh   NF)r*   r+   r,   r-   rj   abcabstractmethodrp   rv   rz   r}   r   r   r   r.   r   r   r   re   re      s    # 	  	  	  	  :4Gr   re   )	metaclassc                   J   ^  \ rS rSrU 4S jrS rS	S jrS rS rS r	Sr
U =r$ )
ConfigDriveReaderie  c                 :   > [         [        U ]  U5        S U l        g r   )superr   rj   	_versions)r6   ri   	__class__s     r   rj   ConfigDriveReader.__init__f  s    /	:r   c                 Z    U/[        U5      -   n[        R                  R                  " U6 $ r   )r   rQ   rR   join)r6   rn   ro   
componentss       r   rp   ConfigDriveReader._path_joinj  s%    Vd7m+
ww||Z((r   c                 h    U(       a  [         R                  " U5      $ [         R                  " U5      $ r   )r   load_text_fileload_binary_filert   s      r   rv   ConfigDriveReader._path_readn  s1      %	
 &&t,	
r   c                 h   U R                   c  U R                  U R                  S5      n[        R                  " U5       Vs/ s HH  n[        R
                  R                  [        R
                  R                  U5      5      (       d  MF  UPMJ     nn[        U5      U l         U R                   $ s  snf )Nr   )	r   rp   ri   rQ   listdirrR   isdirr   sorted)r6   rR   dr   s       r   rz   +ConfigDriveReader._fetch_available_versionsu  s    >>!??4>>;?D D))A77==d!34 )  
 $E]DN~~s   AB/B/c                 "   U R                  U R                  SSS5      n[        R                  R	                  U5      (       d  0 $  [
        R                  " U R                  U5      5      $ ! [         a  n[        SU< SU< 35      UeS nAff = f)Nr	   r   zmeta-data.jsonr   r   )
rp   ri   rQ   rR   rS   r   r   rv   r   r   )r6   rR   r   s      r   r}   $ConfigDriveReader._read_ec2_metadata  s}    NNE8-=
 ww~~d##I~~dood&;<< $7;Q?s   $A+ +
B5B		Bc                    0 n[         R                  5        HI  nU R                  U R                  U5      n[        R
                  R                  U5      (       d  ME  X1U'   MK     U(       d  [        SU R                  -  5      e0 n[         R                  5        HI  u  nu  pVnX!;   a#  X   n U R                  U5      n U" U5      XE'   M1  [        R                  " U5      XE'   MK     US   n
US   nUR                  SU
5      n
U
(       aP  U
R!                  5       nU Vs/ s H/  n[#        U5      (       d  M  UR%                  S	5      (       a  M-  UPM1     snUS'   S
U;   a  US
   US
'   SUS.nSU;   a  US   US'   UR                  SS5      US'   0 US'   U$ ! [         a  n	[        SU-  5      U	eSn	A	ff = f! [         a  n	[        SU< SU	< 35      U	eSn	A	ff = fs  snf )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 foundzFailed to read: %sNr   r   r   r   r@   #r   r?   )rA   rC   r   z	user-datar   r   r   )FILES_V1keysrp   ri   rQ   rR   rS   r(   r5   rv   r   r   r   copydeepcopyr4   
splitlinesr   rP   )r6   r   r7   rR   mdkeyr   defaultcontentsr   keydatar   linesliner   s                  r   read_v1ConfigDriveReader.read_v1  s    MMOD??4>>48Dww~~d##"d $ 2dnnEFF080@,D,3G}{M#t4H )2BG --0# 1A& &'Y- ++mW5&&(E "!!Dt9 %)__S%9 !!B} G# ' 6B} 
 w ' 1GH &kk+r:
 c  M()=)DE1LM ! (;?C!sB   ,F>
F7G5GG
F4 F//F47
GGG)r   r   )r*   r+   r,   r-   rj   rp   rv   rz   r}   r   r.   __classcell__r   s   @r   r   r   e  s(    )
	G Gr   r   c                   H   ^  \ rS rSrSU 4S jjrS rS	S jrS rS rSr	U =r
$ )
MetadataReaderi  c                    > [         [        U ]  U5        X l        [	        U5      U l        [        U5      U l        S U l        g r   )	r   r   rj   ssl_detailsfloattimeoutintretriesr   )r6   base_urlr   r   r   r   s        r   rj   MetadataReader.__init__  s5    nd,X6&W~7|r   c                 6   U R                   b  U R                   $ / nU R                  U R                  S5      nU R                  USS9nUR	                  5        H-  nUR                  5       nU(       d  M  UR                  U5        M/     Xl         U R                   $ )Nr   Tr   )r   rp   ri   rv   r   stripr_   )r6   r   version_pathr   r   s        r   rz   (MetadataReader._fetch_available_versions  s    >>%>>!t~~{C//,t/<&&(D::<DLL	 )
 ~~r   c                     S n[         R                  " UU R                  U R                  U R                  US9nU(       a  UR
                  R                  5       $ UR
                  $ )Nc                 v     [        U R                  5      nUS:  a  US;  a  gg! [        [        4 a     gf = f)Ni  )i  i  i  i  i  i  FT)r   coder   r   )causer  s     r   should_retry_cb2MetadataReader._path_read.<locals>.should_retry_cb  sG    5::3;4/M#M   z* s   !% 88)r   r   r   exception_cb)r   readurlr   r   r   r   ru   )r6   rR   ru   r  responses        r   rv   MetadataReader._path_read  s\    	 %%LL((LL(
 $$++--$$$r   c                 0    [         R                  " U/UQ76 $ r   )r   combine_urlrm   s      r   rp   MetadataReader._path_join  s    %%d5W55r   c                 j    [         R                  " U R                  U R                  U R                  S9$ )N)r   r   r   )r	   get_instance_metadatar   r   r   ry   s    r   r}   !MetadataReader._read_ec2_metadata	  s,    ((((LLLL
 	
r   )r   r   r   r   )N   r  r   )r*   r+   r,   r-   rj   rz   rv   rp   r}   r.   r   r   s   @r   r   r     s!    %.6
 
r   r   c           
        ^& U c  g/ SQ/ SQ/ SQS.m&U R                  S/ 5      nU R                  S/ 5      nU R                  S/ 5      n/ n0 nS	nS
n/ n	U GH  n
/ n[        U&4S jU
R                  5        5       5      nSU
;   a  U
S   US'   SnU
R                  S5      (       a&  U
R                  S5      R                  5       nXU
S   '   UR                  S5      UU
S   U
S   S.nU Vs/ s H  oS   U
S   :X  d  M  UPM     sn GHF  n[        U&4S jUR                  5        5       5      nUR                  S/ 5       Vs/ s H&  n[        U&4S jUR                  5        5       5      PM(     nnU(       a  UR	                  SU05        US   S:X  a  UR	                  SS05        OUS   S:X  a  UR	                  SS05        OUS   S;   a  UR	                  SUS   05        OlUS   S;   a$  UR	                  SUR                  S5      S.5        O?US   S;   a6  UR	                  SS 05        UR	                  S!UR                  S5      S.5        UR                  S/ 5       VVs/ s H9  nUR                  S/ 5        H  nUR                  S5      S":X  d  M  US#   PM!     M;     nnnUR                  S/ 5       H9  nUR                  S5      S":w  a  M  US#   U;   a  M%  UR                  US#   5        M;     U(       a  UUS$'   US   S%;   a  UR	                  SS&05        US   S':X  a  S&US''   US   S(:X  a  S&US('   UR                  U5        GMI     UR	                  S)U05        U
S   S*;   a  0 nU(       a  UR	                  S+U05        U
R                  5        H]  u  nnUS,:X  a  M  UR                  S-5      (       d  M&  S.R                  UR                  S/S05      S1   5      nUR	                  UU05        M_     Xx-  nUS0-  nUR                  US2S3[        R                  " U
S,   5      45        UR	                  UUS4.5        UUS'   OU
S   S5;   ax  U
S6   < S7U
S8   < 3nUR	                  UU
S8   U
S9   S:.5        UR                  US6S3U
S6   45        UR                  USS;U
S8   -  U
S6   45        UR	                  U
S9   US<.5        O:U
S   [        ;  a  [        R                  S=U
S   5        UR	                  S>US?.5        U	R                  U5        XUS   '   GM     U	 Vs/ s H$  nUR                  S5      S>:X  d  M  SU;  d  M"  UPM&     nnU(       d  U(       Ga?  Uc  [        R                  " 5       nUR                  5        H@  u  nnUR                  S5      (       a  M  UR                  S@5      U;   d  M5  UUS@      US'   MB     U Hu  nUR                  S+5      n U (       d  [!        SAU-  5      eU U;  a>  ["        R$                  " 5         [        R                  " 5       nU U;  a  [!        SBU-  5      eUU    US'   Mw     U HR  u  nn!n"n#['        U#[(        [*        45      (       a!  U# V$s/ s H  n$U"UU$   S   -  PM     sn$UU!'   MD  U"UU#   S   -  UU!'   MT     [        R,                  " 5       n%U%(       a$  U	 H  nUS   U%;   d  M  U%US      US+'   SCUS'   M      U H=  n[        R                  " U5      nUR	                  SSD05        U	R                  U5        M?     S0U	SE.$ s  snf s  snf s  snnf s  snf s  sn$f )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)r7   typemac_addresssubnetsparamsmtu)
r  addressnetmask	broadcastmetricgatewaypointopointscopedns_nameservers
dns_search)networkdestinationr  r  r  )physicalsubnetrouteslinksnetworksserviceszbond%dr   c              3   D   >#    U  H  u  pUTS    ;   d  M  X4v   M     g7f)r$  Nr   .0kr   
valid_keyss      r   	<genexpr>#convert_net_json.<locals>.<genexpr>T  s&      
+tqqJz4J/JFQF|    
 r7   ethernet_mac_addressidr  )r7   macr3  r  linkc              3   D   >#    U  H  u  pUTS    ;   d  M  X4v   M     g7f)r%  Nr   r+  s      r   r/  r0  k  s&      #241a:h;O6O?r1  r&  c              3   D   >#    U  H  u  pUTS    ;   d  M  X4v   M     g7f)r&  Nr   r+  s      r   r/  r0  r  s+       -Jx00 QF -r1  	ipv4_dhcpdhcp4	ipv6_dhcpdhcp6)
ipv6_slaaczipv6_dhcpv6-statelessipv6_dhcpv6-stateful)ipv4staticr?  
ip_address)r  r  )ipv6static6z	accept-raFrB  dnsr  r   )r=  r:  Tr>  rA  r  )bondr  
bond_linksrD  zbond-{}bond_r?   bond_interfacesz%s)r  r7   )vlan	vlan_link.vlan_idvlan_mac_address)r7   rL  r  z%%s.%s)r4  r7   z9Unknown network_data link type (%s); treating as physicalr$  )r  r  r4  z#No mac_address or name entry for %sz"Unable to find a system nic for %s
infiniband
nameserver)rA   config)r4   r   r5   lowerupdater_   rP   formatr   r   r   KNOWN_PHYSICAL_TYPESrV   warningr   get_interfaces_by_macr   r   udevadm_settle
isinstancer   tupleget_ib_hwaddrs_by_interface)'network_json
known_macsr'  r(  r)  link_updateslink_id_infobond_name_fmtbond_numberrP  r5  r  cfglink_mac_addrcurinfora   r"  r%  router&  servicer   r  r-  r   translated_key	link_namer7   r   
need_names_link_idinfor4  r   fmttargetstargetib_known_hwaddrsr.  s'                                         @r   convert_net_jsonro    s   6 

 M+J0 Wb)E
B/H
B/HLLMKF 
#zz|
 
 T>v,CK88*++ HH%;<BBDM'4d$ GGFO t*L	
 $,G8ayDJ/F8GG #*==? F %[[26 7E   % 
 7   x01v+-vw/0K/vw/0 % 
 vwv78$66 (#*;;|#< $77

K/0 )#*;;|#< %[[266E$yyR8G;;v&%/ #	"8 #6   #;;z26;;v&%/9%8&&wy'9: 7 ,;() v"GG

K./v&(!%vv&(!%vNN6"Q HR 	

Iw'(<8#F

M=9:

1$\\&)) &/%5%5agggq6I"6M%NNMM>1"56 %  &3I1K
 %MM$|"45	 JJ&)<='GFO&\X%";/iADJJ #I#'(:#; k4k9J KLfhi8${:KL NN4(:#;TJKF|#77 L
 JJ
=IJc&-WT]# D aQUU6]j8V1_6   \224J +002NHdxxxx*,)$u+6V	 3 A%%&C !F!JKK*$##% 668
j($%IA%MNN"3AfI  '3"Cc7'D%=11ELEL6C,v.v66WC g!6v!>>C '3 668C6{..%5c&k%BM"*F 
 mmG$

FL)*c 
 F++y HRr:s6   )\'<\' -\,$/\1
\1
$\7\7	\70\<)NN))r   r   r   r   loggingrQ   	cloudinitr   r   r   r   r   cloudinit.sourcesr   cloudinit.sources.helpersr	   	getLoggerr*   rV   r   r   r   r   	OS_FOLSOM
OS_GRIZZLY	OS_HAVANA
OS_LIBERTYOS_NEWTON_ONEOS_NEWTON_TWOOS_OCATAOS_ROCKYr   rT  r   r(   r0   ABCMetare   r   r   ro  r   r   r   <module>r~     s        	 : : , ) !  0bA4>>2."3["!E	
 		
	

 	 "	' 	I IXA3;; AHp
 pf6
Z 6
tT,r   