+
    ˜qgj$n  ã                   ó”  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
Ht ^ RIHt ^ RIHt ]P                   ! ]4      tRRR R3R	R
]P&                  / 3RRR R3/tR#tRtRtRtRtRtRtRtRtRt]]]]]]]]3tR$t  ! R R]!4      t" ! R R4      t# ! R R] PH                  R7      t% ! R R]%4      t& ! R  R!]%4      t'R%R" lt(R# )&é    N)ÚnetÚsourcesÚsubpÚ
url_helperÚutil)ÚBrokenMetadata)Úec2zetc/network/interfacesÚnetwork_configc                 ó   € V # ©N© ©Úxs   &ÚE/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.pyÚ<lambda>r      s   € ¹1ó    Ú zmeta.jsÚmeta_jszroot/.ssh/authorized_keysÚauthorized_keysc                 ó   € V # r   r   r   s   &r   r   r      s   € ¹qr   Úlatestz
2012-08-10z
2013-04-04z
2013-10-17z
2015-10-15z
2016-06-30z
2016-10-06z
2017-02-22z
2018-08-27c                   ó   € ] tR t^QtRtR# )ÚNonReadabler   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r   r   r   Q   s   † Ûr   r   c                   ó>   a € ] tR t^Ut o R tR tR tR tR tRt	V t
R# )ÚSourceMixinc                ó¬   € V P                   '       g   R # V P                   P                  R/ 4      pVP                  4        F  w  r4W8X  g   K  Vu # 	  R # )Nzblock-device-mapping)Úec2_metadataÚgetÚitems)ÚselfÚnameÚbdmÚent_nameÚdevices   &&   r   Ú_ec2_name_to_deviceÚSourceMixin._ec2_name_to_deviceV   sM   € Ø× × Ð ÙØ×Ñ×#Ñ#Ð$:¸BÓ?ˆØ #§	¡	¦ÑˆHØÖØ’ñ !,ñ r   c                óŠ   € R pV P                   ^8X  d   Rp\        P                  ! V P                  P	                  V4      4      # )Úpublic_keysúpublic-keys)Úversionr   Únormalize_pubkey_dataÚmetadatar#   )r%   r&   s   & r   Úget_public_ssh_keysÚSourceMixin.get_public_ssh_keys_   s8   € ØˆØ�<‰<˜1ÔØ ˆDÜ×,Ò,¨T¯]©]×->Ñ->¸tÓ-DÓEÐEr   c                óÄ   € R p RV,          pVR8X  d
   RV,          p\         P                  ! V4      pV'       d
   V^ ,          pV#   \        P                   d     T# i ; i)NzLABEL=%sÚswapzTYPE=%s)r   Úfind_devs_withr   ÚProcessExecutionError)r%   r&   r)   ÚcriteriaÚdev_entriess   &&   r   Ú_os_name_to_deviceÚSourceMixin._os_name_to_devicee   si   € Øˆð	Ø! TÕ*ˆHØ�vŒ~Ø$¨Õ-�Ü×-Ò-¨hÓ7ˆKßØ$ Q��ð ˆøô ×)Ñ)ô 	ØØˆð	ús   „6A »	A ÁAÁAc                óD  € V'       g   R # VP                  R4      '       g
   RV,          p\        P                  P                  V4      '       d   V# V P	                  \        P                  P                  V4      4      pV'       d   \        P                  RW4       V# R # )NÚ/z/dev/%szRemapped device name %s => %s)Ú
startswithÚosÚpathÚexistsÚ_remap_deviceÚbasenameÚLOGÚdebug)r%   r)   Úremappeds   && r   Ú_validate_device_nameÚ!SourceMixin._validate_device_namer   st   € ßÙØ× Ñ  ×%Ò%Ø Õ'ˆFÜ�7‰7�>‰>˜&×!Ò!ØˆMà×%Ñ%¤b§g¡g×&6Ñ&6°vÓ&>Ó?ˆßÜ�I‰IÐ5°vÔHØˆOÙr   c                ó  € V'       g   R # V.pVR8X  d   VP                  ^ R4       VR8X  d   VP                  R4       R p\        P                  RV4       V F/  pV P	                  V4      pV P                  V4      pV'       g   K/   M	  V'       gL   \        P                  RV4       V F/  pV P                  V4      pV P                  V4      pV'       g   K/   M	  V'       g   R # \        P                  RW4       V# )NÚrootÚamiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)ÚinsertÚappendrD   rE   r*   rG   r:   )r%   r&   Únamesr)   Úns   &&   r   Údevice_name_to_deviceÚ!SourceMixin.device_name_to_device€   sß   € çÙà�ˆØ�6Œ>Ø�L‰L˜˜EÔ"Ø�5Œ=Ø�L‰L˜Ô ØˆÜ�	‰	Ð<¸eÔDÛˆAØ×-Ñ-¨aÓ0ˆFØ×/Ñ/°Ó7ˆFß‰vÙñ	 ÷ Ü�I‰IÐFÈÔNÛ�Ø×0Ñ0°Ó3�Ø×3Ñ3°FÓ;�ß‘6Ùñ	 ÷ Ùä�I‰IÐ.°Ô=ØˆMr   r   N)r   r   r   r   r*   r2   r:   rG   rP   r   Ú__classdictcell__©Ú__classdict__s   @r   r    r    U   s$   ø‡ € òòFòò÷ð r   r    c                   óÐ   a € ] tR t^¡t o R t]P                  R 4       t]P                  RR l4       t]P                  R 4       t	]P                  R 4       t
R tRR ltR tR	tV tR
# )Ú
BaseReaderc                ó   € Wn         R # r   ©Ú	base_path)r%   rY   s   &&r   Ú__init__ÚBaseReader.__init__¢   s   € Ø"Žr   c                ó   € R # r   r   ©r%   ÚbaseÚadd_onss   &&*r   Ú
_path_joinÚBaseReader._path_join¥   ó   € ár   c                ó   € R # r   r   ©r%   r@   Údecodes   &&&r   Ú
_path_readÚBaseReader._path_read©   rb   r   c                ó   € R # r   r   ©r%   s   &r   Ú_fetch_available_versionsÚ$BaseReader._fetch_available_versions­   rb   r   c                ó   € R # r   r   ri   s   &r   Ú_read_ec2_metadataÚBaseReader._read_ec2_metadata±   rb   r   c                óT  €  V P                  4       p\        \        \        4      4       Uu. uF  q3NK  	  pp\        pV F  pWa9  d   K  Tp M	  \        P                  RVV4       V#   \         d.   p\        P                  R T P                  T4       . p Rp?L‹Rp?ii ; iu upi )z4Unable to read openstack versions from %s due to: %sNzSelected version '%s' from %s)	rj   Ú	ExceptionrD   rE   rY   ÚreversedÚlistÚOS_VERSIONSÚ	OS_LATEST)r%   Úversions_availableÚeÚvÚ	supportedÚselected_versionÚpotential_versions   &      r   Ú_find_working_versionÚ BaseReader._find_working_versionµ   s±   € ð	$Ø!%×!?Ñ!?Ó!AÐô !)¬¬kÓ):Ô ;Ó<Ñ ;˜1’QÑ ;ˆ	Ð<Ü$Ðã!*ÐØ Ô:ÙØ0ÐÙñ	 "+ô 	�	‰	Ø+ØØô	
ð
  Ðøô1 ô 	$Ü�I‰IØFØ—‘Øôð
 "$Õûð	$üò =s   ‚A* ¬
B%Á*B"Á5#BÂB"c                óN  € VP                  R R4      P                  R4      pVP                  R4      pV Uu. uF  p\        V4      '       g   K  VNK  	  ppV'       g   \	        RV,          4      hV P
                  ! V P                  R.VO5!  pV P                  W2R7      # u upi )Úcontent_pathr   r=   z!Item %s has no valid content pathÚ	openstack©re   )r#   ÚlstripÚsplitÚlenr   r`   rY   rf   )r%   Úitemre   r@   Úpath_piecesÚpÚvalid_piecess   &&&    r   Ú_read_content_pathÚBaseReader._read_content_pathÒ   s‰   € Ø�x‰x˜¨Ó+×2Ñ2°3Ó7ˆØ—j‘j “oˆÙ#.Ó9¡;˜a´#°a·&Ÿ˜¡;ˆÐ9ßÜ Ð!DÈÕ!MÓNÐNØ�Š˜tŸ~™~¨{ÐI¸[ÓIˆØ�‰˜tˆÓ3Ð3ùò	 :s   ·B"ÁB"c                ó>  a a€ \         P                  ! \        P                  \        \
        \        3R7      oVV 3R lpRRR^/pV! S P                  4       4      pVP                  4        F†  w  pw  rVpS P                  S P                  V4      pRpRp S P                  V4      pRpV'       d   V'       g   \        RV,          4      hV'       d   V'       d
    V! V4      pV'       g   K‚  W2V&   Kˆ  	  VR,          p
RV
9   d$   V
R,          p \$        P&                  ! V4      V
R&   / pV
P-                  R. 4      pV F)  pRV9  d   K  VR,          p S P/                  V4      WÅ&   K+  	  WÂR&   V
P-                  RR4      pV'       d    S P/                  VRR7      pVVR&    V
R,          R,          VR&   S P3                  4       VR&   \4         FE  w  pppV'       d   VV
9  d   \#        RV,          4      hVV
9   g   K1  V
P-                  V4      V
V&   KG  	  V#   \         dF   p	T'       g   \        P                  R	YY4        Rp	?	EL¡\        P                  R
YY4        Rp	?	EL½Rp	?	ii ; i  \          d   p	\#        RT: RT	: 24      T	hRp	?	ii ; i  \(        \*        3 d   p	\#        RT	,          4      T	hRp	?	ii ; i  \          d   p	\#        RT: RT	: 24      T	hRp	?	ii ; i  \         d   p	\#        RT	,          4      T	hRp	?	ii ; i  \0         d     ELei ; i)zÄReads 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                 ó$  <€ / pSP                  R V R4      R\        P                  3VR&   SP                  R V R4      RR 3VR&   SP                  R V R4      RS3VR	&   SP                  R V R
4      RS3VR&   SP                  R V R4      RS3VR&   V# )r   zmeta_data.jsonTr1   Ú	user_dataFc                 ó   € V # 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)r`   r   Ú	load_json)r/   ÚfilesÚload_json_anytyper%   s   & €€r   Ú	datafilesÚ%BaseReader.read_v2.<locals>.datafilesè   sË   ø€ ØˆEð —‘ ¨WÐ6FÓGàä—‘ð!ˆE�*Ñð —‘ ¨W°kÓBØÙð!ˆE�*Ñð —‘ ¨WÐ6HÓIØØ!ð#ˆE�,Ñð —‘ ¨WÐ6IÓJØØ!ð$ˆE�-Ñ ð —‘ ¨WÐ6IÓJØØ!ð$ˆE�-Ñ ð
 ˆLr   r�   r   r/   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 ú: r1   Úrandom_seedz.Badly formatted metadata random_seed entry: %sr•   r@   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”   Údictrr   Ústrr{   r$   r`   rY   rf   ÚIOErrorrD   rE   r   rp   r   Úbase64Ú	b64decodeÚ
ValueErrorÚ	TypeErrorr#   rˆ   ÚKeyErrorrm   Ú
KEY_COPIES)r%   r—   ÚresultsÚdatar&   r@   ÚrequiredÚ
translatorÚfoundrv   r1   r›   r•   Úmetadata_filesr„   Únet_itemÚcontentÚ
target_keyÚ
source_keyÚis_requiredr–   s   f                   @r   Úread_v2ÚBaseReader.read_v2Û   s%  ù€ ô &×-Ò-Ü�N‰N¬¬d´CÐ'8ô
Ðö	ðB ˜Ø�qð
ˆñ ˜×3Ñ3Ó5Ó6ˆØ26·*±*¶,Ñ.ˆDÑ.�4 :Ø—?‘? 4§>¡>°4Ó8ˆDØˆDØˆEðØ—‘ tÓ,�ð �ß§Ü!Ð">ÀÕ"EÓFÐFßŸðÙ% dÓ+�D÷
 ‰uØ $˜“ñ7 3?ð: ˜:Õ&ˆØ˜HÔ$Ø" =Õ1ˆKðÜ*0×*:Ò*:¸;Ó*G�˜Ñ'ð ˆØ!Ÿ™ g¨rÓ2ˆÛ"ˆDØ˜TÔ!ÙØ˜•<ˆDðØ"×5Ñ5°dÓ;�“ñ #ð !�Ñð
 —<‘<Ð 0°$Ó7ˆßðØ×1Ñ1°(À4Ð1ÓH�Ø,3�Ð(Ñ)ð	Ø (¨Õ 0°Õ :ˆG�HÑð
 #'×"9Ñ"9Ó";ˆ�Ñ÷ 4>Ñ/ˆJ˜
 Kß˜z°Ô9Ü$Ð%@À:Õ%MÓNÐNØ˜XÖ%Ø'/§|¡|°JÓ'?�˜Ó$ñ	 4>ð
 ˆøô_ ô ßÜ—I‘IØDÀd÷ò ô —I‘IØEÀt÷ò ûðûô  !ô Ý(Û;?ÂÐCóàðûðûô ¤	Ð*ô Ü$ØDÀqÕHóàðûðûô ô Ý$Û=AÂ1ÐEóàðûðûô ô Ü$Ø>À!ÕDóàðûðûô ô 	Úð	ús�   ÂHÃI-ÄJ ÅK Æ
K' Æ#L ÈI*È%I%É	I%É%I*É-JÉ8JÊJÊJ=Ê%J8Ê8J=Ë K$ËKËK$Ë'L
Ë2LÌL
ÌLÌLrX   N©F)r   r   r   r   rZ   ÚabcÚabstractmethodr`   rf   rj   rm   r{   rˆ   r´   r   rR   rS   s   @r   rV   rV   ¡   sˆ   ø‡ € ò#ð 	×Ññó ðð 	×Ñóó ðð 	×Ññó ðð 	×Ññó ðò ô:4÷Gð Gr   rV   )Ú	metaclassc                   óT   a a€ ] tR tRt oV 3R ltR tR	R ltR tR tR t	Rt
VtV ;t# )
ÚConfigDriveReaderie  c                ó<   <€ \         \        V `  V4       R V n        R # r   )Úsuperr»   rZ   Ú	_versions)r%   rY   Ú	__class__s   &&€r   rZ   ÚConfigDriveReader.__init__f  s   ø€ ÜÔ Ñ/°	Ô:ØˆŽr   c                ód   € V.\        V4      ,           p\        P                  P                  ! V!  # r   )rr   r?   r@   Újoin)r%   r^   r_   Ú
componentss   &&* r   r`   ÚConfigDriveReader._path_joinj  s%   € Ø�Vœd 7›mÕ+ˆ
Ü�w‰w�|Š|˜ZÑ(Ð(r   c                ój   € V'       d   \         P                  ! V4      # \         P                  ! V4      # r   )r   Úload_text_fileÚload_binary_filerd   s   &&&r   rf   ÚConfigDriveReader._path_readn  s1   € ÷ ô ×Ò Ó%ð	
ô ×&Ò& tÓ,ð	
r   c                ój  € V P                   f–   V P                  V P                  R4      p\        P                  ! V4       Uu. uFI  p\        P
                  P                  \        P
                  P                  V4      4      '       g   KG  VNKK  	  pp\        V4      V n         V P                   # u upi )Nr   )	r¾   r`   rY   r?   Úlistdirr@   ÚisdirrÂ   Úsorted)r%   r@   Údr­   s   &   r   rj   Ú+ConfigDriveReader._fetch_available_versionsu  s†   € Ø�>‰>Ò!Ø—?‘? 4§>¡>°;Ó?ˆDô Ÿš DÔ)óá)�AÜ—7‘7—=‘=¤§¡§¡¨dÓ!3×4÷ �Ù)ð ð ô
 $ E›]ˆDŒNØ�~‰~Ðùòs   ÁAB0ÂB0c                ó&  € V P                  V P                  R RR4      p\        P                  P	                  V4      '       g   / #  \
        P                  ! V P                  V4      4      #   \         d   p\        RT: RT: 24      ThRp?ii ; i)r	   r   zmeta-data.jsonr™   rš   N)
r`   rY   r?   r@   rA   r   r”   rf   rp   r   )r%   r@   rv   s   &  r   rm   Ú$ConfigDriveReader._read_ec2_metadata€  s}   € Ø�‰Ø�N‰N˜E 8Ð-=ó
ˆô �w‰w�~‰~˜d×#Ò#ØˆIðÜ—~’~ d§o¡o°dÓ&;Ó<Ð<øÜô Ý$Û7;ºQÐ?óàðûðús   Á$A, Á,BÁ7BÂBc                ó  € / p\         P                  4        FJ  pV P                  V P                  V4      p\        P
                  P                  V4      '       g   KF  W1V&   KL  	  V'       g   \        RV P                  ,          4      h/ p\         P                  4        FN  w  pw  rVpW!9   d(   W,          p V P                  V4      p T! T4      YE&   K6  \        P                  ! V4      WE&   KP  	  VR,          p
VR,          pVP                  RV
4      p
V
'       dR   V
P!                  4       pV Uu. uF1  p\#        V4      '       g   K  VP%                  R	4      '       d   K/  VNK3  	  upVR&   R
V9   d   VR
,          VR
&   R^RV/pRV9   d   VR,          VR&   VP                  RR4      VR&   / VR&   V#   \         d   p	\        RT,          4      T	hRp	?	ii ; i  \         d   p	\        RT: RT	: 24      T	hRp	?	ii ; iu upi )z¢Reads 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.   Ú#úinstance-idr/   r1   r�   z	user-datar   r�   r•   )ÚFILES_V1Úkeysr`   rY   r?   r@   rA   r   r$   rf   r¢   r   rp   ÚcopyÚdeepcopyr#   Ú
splitlinesrƒ   r>   )r%   r­   r&   r@   ÚmdÚkeyr¬   ÚdefaultÚcontentsrv   Úkeydatar   ÚlinesÚliner©   s   &              r   Úread_v1ÚConfigDriveReader.read_v1Ž  s   € ð ˆÜ—M‘M–OˆDØ—?‘? 4§>¡>°4Ó8ˆDÜ�w‰w�~‰~˜d×#Ô#Ø"�d“ñ $÷ ÜÐ2°d·n±nÕEÓFÐFàˆÜ08·±Ö0@Ñ,ˆDÑ,�3 GØŒ}Ø•{�ðMØ#Ÿ™¨tÓ4�Hðñ )¨Ó2�B“Gô Ÿ-š-¨Ó0�“ñ# 1Að& Ð&Õ'ˆØ�Y•-ˆð —+‘+˜m¨WÓ5ˆßØ×&Ñ&Ó(ˆEñ "ó!á!�DÜ�t—9ô à%)§_¡_°S×%9÷ �Ù!ñ!ˆBˆ}Ñð ˜GÔ#Ø '¨Õ 6ˆBˆ}Ñð �qØ˜ð
ˆð �wÔØ '¨Õ 1ˆG�HÑð &Ÿk™k¨+°rÓ:ˆ�
Ñð ˆ�Ñàˆøôc ô MÜ(Ð)=ÀÕ)DÓEÈ1ÐLûðMûô !ô Ý(Û;?ÂÐCóàðûðüò!sB   Â7F6Ã	
GÄ1HÅ	HÅ"HÆ6GÇGÇGÇH Ç'G;Ç;H )r¾   r¶   )r   r   r   r   rZ   r`   rf   rj   rm   rà   r   rR   Ú__classcell__©r¿   rT   s   @@r   r»   r»   e  s*   ù‡ € õò)ô
ò	ò÷Gò Gr   r»   c                   óR   a a€ ] tR tRt oRV 3R lltR tR	R ltR tR tRt	Vt
V ;t# )
ÚMetadataReaderiØ  c                óˆ   <€ \         \        V `  V4       W n        \	        V4      V n        \        V4      V n        R V n        R # r   )	r½   rå   rZ   Ússl_detailsÚfloatÚtimeoutÚintÚretriesr¾   )r%   Úbase_urlrç   ré   rë   r¿   s   &&&&&€r   rZ   ÚMetadataReader.__init__Ù  s5   ø€ ÜŒn˜dÑ,¨XÔ6Ø&ÔÜ˜W“~ˆŒÜ˜7“|ˆŒØˆŽr   c                ó@  € V P                   e   V P                   # . pV P                  V P                  R4      pV P                  VRR7      pVP	                  4        F.  pVP                  4       pV'       g   K  VP                  V4       K0  	  Wn         V P                   # )Nr   Tr€   )r¾   r`   rY   rf   rØ   ÚstriprM   )r%   r­   Úversion_pathr°   rß   s   &    r   rj   Ú(MetadataReader._fetch_available_versionsà  s‚   € à�>‰>Ò%Ø—>‘>Ð!ØˆØ—‘ t§~¡~°{ÓCˆØ—/‘/ ,°t�/Ó<ˆØ×&Ñ&Ö(ˆDØ—:‘:“<ˆDßÙØ�L‰L˜Öñ	 )ð
 ŒØ�~‰~Ðr   c                óÖ   € R  p\         P                  ! VV P                  V P                  V P                  VR7      pV'       d   VP
                  P                  4       # VP
                  # )c                 ó‚   €  \        V P                  4      pVR 8¼  d
   VR9  d   R# R#   \        \        3 d     R# i ; i)i�  FT)i˜  i­  iô  iö  i÷  iø  )rê   Úcoder¦   r¥   )Úcauserô   s   & r   Úshould_retry_cbÚ2MetadataReader._path_read.<locals>.should_retry_cbð  sG   € ðÜ˜5Ÿ:™:“�Ø˜3”; 4Ð/MÔ#MÙ ñ øô œzÐ*ô àÙðús   ‚#) ©>½>)rë   rç   ré   Úexception_cb)r   Úreadurlrë   rç   ré   rÜ   re   )r%   r@   re   rö   Úresponses   &&&  r   rf   ÚMetadataReader._path_readï  s\   € ò	ô ×%Ò%ØØ—L‘LØ×(Ñ(Ø—L‘LØ(ô
ˆ÷ Ø×$Ñ$×+Ñ+Ó-Ð-à×$Ñ$Ð$r   c                ó2   € \         P                  ! V.VO5!  # r   )r   Úcombine_urlr]   s   &&*r   r`   ÚMetadataReader._path_join  s   € Ü×%Ò% dÐ5¨WÓ5Ð5r   c                óp   € \         P                  ! V P                  V P                  V P                  R 7      # ))rç   ré   rë   )r	   Úget_instance_metadatarç   ré   rë   ri   s   &r   rm   Ú!MetadataReader._read_ec2_metadata	  s,   € Ü×(Ò(Ø×(Ñ(Ø—L‘LØ—L‘Lô
ð 	
r   )r¾   rë   rç   ré   )Né   r  r¶   )r   r   r   r   rZ   rj   rf   r`   rm   r   rR   râ   rã   s   @@r   rå   rå   Ø  s#   ù‡ € ÷òô%ò.6÷
ò 
r   rå   c           
     óz  a&€ V f   R# R. R6OR. R7OR. R8O/o&V P                  R. 4      pV P                  R. 4      pV P                  R. 4      p. p/ pRp^ p. p	V EF{  p
. p\        V&3R lV
P                  4        4       4      pRV
9   d   V
R,          VR&   RpV
P                  R4      '       d+   V
P                  R4      P                  4       pWÖV
R,          &   RVP                  R4      RVRV
R,          RV
R,          /pV Uu. uF  qÿR,          V
R,          8X  g   K  VNK  	  up EF‚  p\        V&3R lVP                  4        4       4      pVP                  R. 4       Uu. uF&  p\        V&3R lVP                  4        4       4      NK(  	  ppV'       d   VP	                  RV/4       VR,          R8X  d   VP	                  RR/4       MÃVR,          R8X  d   VP	                  RR/4       M¡VR,          R99   d   VP	                  RVR,          /4       MxVR,          R:9   d&   VP	                  RRR	VP                  R4      /4       MEVR,          R;9   d8   VP	                  R R!/4       VP	                  RRR	VP                  R4      /4       VP                  R. 4       UUu. uF=  pVP                  R. 4       F$  pVP                  R4      R"8X  g   K  VR	,          NK&  	  K?  	  pppVP                  R. 4       FC  pVP                  R4      R"8w  d   K  VR	,          V9   d   K+  VP                  VR	,          4       KE  	  V'       d   VVR
&   VR,          R<9   d   VP	                  R R#/4       VR,          R8X  d   R#VR&   VR,          R8X  d   R#VR&   VP                  V4       EK…  	  VP	                  RV/4       V
R,          R=9   dù   / pV'       d   VP	                  RV/4       V
P                  4        Fc  w  ppVR%8X  d   K  VP                  R$4      '       g   K(  R&P                  VP                  R'^4      R>,          4      pVP	                  VV/4       Ke  	  VVR&   VP                  R4      f   Wx,          pVVR&   VVR&   V^,          pVP                  VR(R)\        P                  ! V
R%,          4      34       MñV
R,          R?9   d    V
R*,          : R+V
R,,          : 2pVP	                  RVR,V
R,,          RV
R-,          /4       VP                  VR*R)V
R*,          34       VP                  VRR.V
R,,          ,          V
R*,          34       VP	                  RV
R-,          RV/4       MDV
R,          \        9  d   \        P                  R/V
R,          4       VP	                  RRRV/4       V	P                  V4       WæVR,          &   EK~  	  V	 Uu. uF&  pVP                  R4      R8X  g   K  RV9  g   K$  VNK(  	  ppV'       g
   V'       Edr   Vf   \        P                  ! 4       pVP                  4        FJ  w  ppVP                  R4      '       d   K  VP                  R4      V9   g   K7  VVR,          ,          VR&   KL  	  V F„  pVP                  R4      p V '       g   \!        R0V,          4      hV V9  dD   \"        P$                  ! 4        \        P                  ! 4       pV V9  d   \!        R1V,          4      hVV ,          VR&   K†  	  V Fj  w  pp!p"p#\'        V#\(        \*        34      '       d-   V# U$u. uF  p$V"VV$,          R,          ,          NK  	  up$VV!&   KP  V"VV#,          R,          ,          VV!&   Kl  	  \        P,                  ! 4       p%V%'       d2   V	 F+  pVR,          V%9   g   K  V%VR,          ,          VR&   R2VR&   K-  	  V F=  p\        P                  ! V4      pVP	                  RR3/4       V	P                  V4       K?  	  R4^R5V	/# u upi u upi u uppi u upi u up$i )@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Úphysicalr&   ÚtypeÚmac_addressÚsubnetsÚparamsÚsubnetÚaddressÚdns_nameserversÚroutesÚlinksÚnetworksÚserviceszbond%dc              3   óN   <"  € T F  w  rVSR ,          9   g   K  W3x € K  	  R# 5i)r  Nr   ©Ú.0Úkrw   Ú
valid_keyss   &  €r   Ú	<genexpr>Ú#convert_net_json.<locals>.<genexpr>T  s&   øé € ð 
Ù+‘t�q¨q°J¸zÕ4JÑ/JŒFˆQ�F›|ùó   ƒ%š%Úethernet_mac_addressÚidÚmacÚlinkc              3   óN   <"  € T F  w  rVSR ,          9   g   K  W3x € K  	  R# 5i)r	  Nr   r  s   &  €r   r  r  k  s&   øé € ð Ù#2™4˜1°a¸:ÀhÕ;OÑ6O”�•£?ùr  c              3   óN   <"  € T F  w  rVSR ,          9   g   K  W3x € K  	  R# 5i)r  Nr   r  s   &  €r   r  r  r  s+   øé € ð á -™˜Ø˜J xÕ0Ñ0ô �Q•FÛ -ùr  Ú	ipv4_dhcpÚdhcp4Ú	ipv6_dhcpÚdhcp6Úipv4ÚstaticÚ
ip_addressÚipv6Ústatic6z	accept-raFÚdnsTÚbondÚ
bond_linkszbond-{}Úbond_Úbond_interfacesz%sÚ	vlan_linkÚ.Úvlan_idÚvlan_mac_addressz%%s.%sz9Unknown network_data link type (%s); treating as physicalz#No mac_address or name entry for %sz"Unable to find a system nic for %sÚ
infinibandÚ
nameserverr/   Úconfig)r&   r  r  r  r  Úmtu)
r  r
  ÚnetmaskÚ	broadcastÚmetricÚgatewayÚpointopointÚscoper  Ú
dns_search)ÚnetworkÚdestinationr4  r7  r6  )Ú
ipv6_slaaczipv6_dhcpv6-statelessúipv6_dhcpv6-stateful)r"  r#  )r%  r&  )r>  r   )r(  éÿÿÿÿ)Úvlan)r#   r    r$   ÚlowerÚupdaterM   r>   Úformatr‚   rÖ   r×   ÚKNOWN_PHYSICAL_TYPESrD   Úwarningr   Úget_interfaces_by_macr¥   r   Úudevadm_settleÚ
isinstancerr   ÚtupleÚget_ib_hwaddrs_by_interface)'Únetwork_jsonÚ
known_macsr  r  r  Úlink_updatesÚlink_id_infoÚbond_name_fmtÚbond_numberr2  r  r  ÚcfgÚlink_mac_addrÚcurinforO   r;  r	  Úrouter  Úservicer  r  r  rw   Útranslated_keyÚ	link_namer&   rÍ   Ú
need_namesÚ_link_idÚinfor  rÚ   ÚfmtÚtargetsÚtargetÚib_known_hwaddrsr  s'   &&                                    @r   Úconvert_net_jsonr_    sþ  ø€ ð6 ÒÙð 	ò 
ð 	ò 
ð 	ÒLð+€Jð0 ×Ñ˜W bÓ)€EØ×Ñ 
¨BÓ/€HØ×Ñ 
¨BÓ/€Hà€LØ€LØ€MØ€KØ€FÜˆØˆÜô 
Ø#Ÿz™zœ|ó
ó 
ˆð �TŒ>Ø˜v�,ˆC�‰KàˆØ�8‰8Ð*×+Ò+Ø ŸH™HÐ%;Ó<×BÑBÓDˆMØ'4˜˜d�Ñ$ð �C—G‘G˜F“OØ�=Ø�$�t•*Ø�D˜•Lð	
ˆñ $,ÓG¡8˜a°­y¸DÀ½JÑ/FŸ˜¡8ÕGˆGÜô Ø#*§=¡=¤?óó ˆFð %Ÿ[™[¨°2Ô6óñ 7�Eô ô à %§¡¤óö ñ
 7ð ð ÷ Ø—‘˜x¨Ð0Ô1à�v� +Ô-Ø—‘˜v wÐ/Õ0Ø˜• KÔ/Ø—‘˜v wÐ/Õ0Ø˜•ð %ô ð
 —‘˜v w¨v¥Ð7Õ8Ø˜•Ð$6Ô6Ø—‘à Ø! 7§;¡;¨|Ó#<ðõð ˜•Ð$7Ô7Ø—
‘
˜K¨Ð/Ô0Ø—‘à 	Ø! 7§;¡;¨|Ó#<ðôð %Ÿ[™[¨°2Ô6ôá6�EØ$Ÿy™y¨°RÖ8�GØ—;‘;˜vÓ&¨%Ñ/ô #�˜	×"Ð"á8ñ #Ù6ð ñ ð #Ÿ;™; z°2Ö6�Ø—;‘;˜vÓ&¨%Ô/ÙØ˜9Õ%¨Ô8ÙØ×&Ñ& w¨yÕ'9Ö:ñ 7÷ Ø,;�Ð(Ñ)ð �v�Ð"GÔGØ—
‘
˜K¨Ð.Ô/à�v� &Ô(Ø!%��v‘Ø�v� &Ô(Ø!%��v‘Ø�N‰N˜6×"ñQ HðR 	�
‰
�I˜wÐ'Ô(Ø��<˜8Ô#ØˆFßØ—
‘
˜M¨=Ð9Ô:ØŸ
™
ž‘��1Ø˜Ô$ÙØ—\‘\ &×)Ô)ð &/×%5Ñ%5°a·g±g¸gÀqÓ6IÈ"Õ6MÓ%N�NØ—M‘M >°1Ð"5Ö6ñ %ð #ˆC�‰Mð
 �w‰w�v‹Ò&Ø)Õ7�	Ø'��F‘Ø"+�˜‘Ø˜1ÕˆKð
 ×ÑàØ%ØÜ—M’M $ |Õ"4Ó5ð	õð �&�\˜XÔ%Ø" ;×/Ð/°°i·ÐAˆDØ�J‰Jà˜DØ˜t I�Ø! 4Ð(:Õ#;ðôð ×Ñ  k°4¸¸kÕ9JÐ KÔLØ×ÑØ�f˜h¨¨i­Õ8¸$¸{Õ:KÐLôð �N‰N˜E 4Ð(:Õ#;¸VÀTÐJÕKà�F�|Ô#7Ô7Ü—‘ð à˜•Lôð
 �J‰J˜ 
¨M¸=ÐIÔJà�‰�cÔØ&-�W˜T•]Ô#ñA ñF óÙˆa˜QŸU™U 6›]¨jÑ8Œ¸VÈ1¹_�ˆ‘6ð ð ÷ —\�\ØÒÜ×2Ò2Ó4ˆJð +×0Ñ0Ö2‰NˆH�dØ�x‰x˜×ÒÙØ�x‰x˜‹ *Ö,Ø)¨$¨u­+Õ6��V“ñ	 3ó ˆAØ—%‘%˜Ó&ˆCßÜ Ð!FÈÕ!JÓKÐKØ˜*Ô$ä×#Ò#Ô%Ü ×6Ò6Ó8�
Ø˜jÔ(Ü$Ð%IÈAÕ%MÓNÐNØ" 3�ˆAˆf‹Iñ ó '3Ñ"ˆC��c˜7Ü˜'¤D¬% =×1Ò1áELóÙEL¸6�C˜, vÕ.¨vÕ6×6Ð6ÁWñ��C“ð  ¨gÕ!6°vÕ!>Õ>��C“ñ '3ô ×6Ò6Ó8ÐßÛˆCØ�6�{Ð.Ö.Ø%5°c¸&µkÕ%B��MÑ"Ø*��F“ñ ó
 ˆÜ�mŠm˜GÓ$ˆØ�
‰
�F˜LÐ)Ô*Ø�‰�cÖñ ð
 �q˜( FÐ+Ð+ùò{ HùòùóRùòtùò:s6   Ä`#Ä`#Å!,`(Ê$-`-
Ë`-
×`3×9`3Ø`3Ý `8))zlocal-hostnameÚhostnameF)rÓ   ÚuuidT)NÚbgpovsÚbridgeÚ	cascadingÚdvsÚethernetÚhw_vebÚhypervÚovsÚphyÚtapÚ	vhostuserÚvif)NN))r·   r£   rÖ   rž   Úloggingr?   Ú	cloudinitr   r   r   r   r   Úcloudinit.sourcesr   Úcloudinit.sources.helpersr	   Ú	getLoggerr   rD   r”   rÔ   r¨   rt   Ú	OS_FOLSOMÚ
OS_GRIZZLYÚ	OS_HAVANAÚ
OS_LIBERTYÚOS_NEWTON_ONEÚOS_NEWTON_TWOÚOS_OCATAÚOS_ROCKYrs   rD  r¢   r   r    ÚABCMetarV   r»   rå   r_  r   r   r   Ú<module>r|     s  ðó Û Û Û Û Û 	ç :Õ :Ý ,Ý )ð ×Ò˜Ó!€ð Ð/±¸bÐAØ�	˜4Ÿ>™>¨2Ð.ØÐ"3±[À"Ð!Eð	€ð€
ð €	Ø€	Ø€
Ø€	Ø€
à€à€à€à€ð
 ØØØØØØØð	€ðÐ ô"	�'ô 	÷Iñ IôXA˜3Ÿ;™;õ AôHp˜
ô pôf6
�Zô 6
ötU,r   