Ë
    x[hÓm  ã                   óŒ  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ  ej                   e«      Zdd„ dfdej&                  i fd	d
„ dfdœZdZdZdZdZdZdZdZdZdZdZeeeeeeeefZdZ  G d„ de!«      Z" G d„ d«      Z# G d„ de jH                  ¬«      Z% G d„ de%«      Z& G d „ d!e%«      Z'd#d"„Z(y)$é    N)ÚnetÚsourcesÚsubpÚ
url_helperÚutil)ÚBrokenMetadata)Úec2Únetwork_configc                 ó   — | S ©N© ©Úxs    úE/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.pyú<lambda>r      s   € ¸1€ ó    Ú Úmeta_jsÚauthorized_keysc                 ó   — | S r   r   r   s    r   r   r      s   € ¸q€ r   )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                   ó   — e Zd Zy)ÚNonReadableN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r(   r(   Q   s   „ Ør   r(   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚSourceMixinc                 ó˜   — | j                   sy | j                   j                  di «      }|j                  «       D ]  \  }}||k(  sŒ|c S  y )Nzblock-device-mapping)Úec2_metadataÚgetÚitems)ÚselfÚnameÚbdmÚent_nameÚdevices        r   Ú_ec2_name_to_devicezSourceMixin._ec2_name_to_deviceV   sS   € Ø× Ò ØØ×Ñ×#Ñ#Ð$:¸BÓ?ˆØ #§	¡	£ò 	ÑˆH�fØ�xÓØ’ð	ð r   c                 ó„   — d}| j                   dk(  rd}t        j                  | j                  j	                  |«      «      S )NÚpublic_keysé   úpublic-keys)Úversionr   Únormalize_pubkey_dataÚmetadatar0   )r2   r3   s     r   Úget_public_ssh_keyszSourceMixin.get_public_ssh_keys_   s8   € ØˆØ�<‰<˜1ÒØ ˆDÜ×,Ñ,¨T¯]©]×->Ñ->¸tÓ-DÓEÐEr   c                 ó–   — d }	 d|z  }|dk(  rd|z  }t        j                  |«      }|r|d   }|S # t        j                  $ r Y |S w xY w)NzLABEL=%sÚswapzTYPE=%sr   )r   Úfind_devs_withr   ÚProcessExecutionError)r2   r3   r6   ÚcriteriaÚdev_entriess        r   Ú_os_name_to_devicezSourceMixin._os_name_to_devicee   si   € Øˆð	Ø! TÑ*ˆHØ�vŠ~Ø$¨Ñ-�Ü×-Ñ-¨hÓ7ˆKÙØ$ Q™�ð ˆøô ×)Ñ)ò 	ØØˆð	ús   „+1 ±AÁAc                 ó
  — |sy |j                  d«      sd|z  }t        j                  j                  |«      r|S | j	                  t        j                  j                  |«      «      }|rt        j                  d||«       |S y )Nú/z/dev/%szRemapped device name %s => %s)Ú
startswithÚosÚpathÚexistsÚ_remap_deviceÚbasenameÚLOGÚdebug)r2   r6   Úremappeds      r   Ú_validate_device_namez!SourceMixin._validate_device_namer   sp   € ÙØØ× Ñ  Ô%Ø Ñ'ˆFÜ�7‰7�>‰>˜&Ô!ØˆMà×%Ñ%¤b§g¡g×&6Ñ&6°vÓ&>Ó?ˆÙÜ�I‰IÐ5°v¸xÔHØˆOØr   c                 ó´  — |sy |g}|dk(  r|j                  dd«       |dk(  r|j                  d«       d }t        j                  d|«       |D ](  }| j	                  |«      }| j                  |«      }|sŒ( n |sCt        j                  d|«       |D ](  }| j                  |«      }| j                  |«      }|sŒ( n |sy t        j                  d||«       |S )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ÚappendrO   rP   r7   rR   rF   )r2   r3   Únamesr6   Úns        r   Údevice_name_to_devicez!SourceMixin.device_name_to_device€   sç   € áØà�ˆØ�6Š>Ø�L‰L˜˜EÔ"Ø�5Š=Ø�L‰L˜Ô ØˆÜ�	‰	Ð<¸eÔDØò 	ˆAØ×-Ñ-¨aÓ0ˆFØ×/Ñ/°Ó7ˆFÚÙð		ñ Ü�I‰IÐFÈÔNØò �Ø×0Ñ0°Ó3�Ø×3Ñ3°FÓ;�ÚÙð	ñ Øä�I‰IÐ.°°fÔ=ØˆMr   N)r)   r*   r+   r7   r?   rF   rR   rZ   r   r   r   r-   r-   U   s   „ òòFòòór   r-   c                   ó¸   — e Zd Zd„ Zej
                  d„ «       Zej
                  d
d„«       Zej
                  d„ «       Zej
                  d„ «       Z	d„ Z
d
d„Zd„ Zy	)Ú
BaseReaderc                 ó   — || _         y r   )Ú	base_path)r2   r^   s     r   Ú__init__zBaseReader.__init__¢   s	   € Ø"ˆ�r   c                  ó   — y r   r   ©r2   ÚbaseÚadd_onss      r   Ú
_path_joinzBaseReader._path_join¥   ó   € àr   c                  ó   — y r   r   ©r2   rK   Údecodes      r   Ú
_path_readzBaseReader._path_read©   re   r   c                  ó   — y r   r   ©r2   s    r   Ú_fetch_available_versionsz$BaseReader._fetch_available_versions­   re   r   c                  ó   — y r   r   rk   s    r   Ú_read_ec2_metadatazBaseReader._read_ec2_metadata±   re   r   c                 óF  — 	 | j                  «       }t        t        t        «      «      D �cg c]  }|‘Œ }}t        }|D ]
  }||vrŒ|} n t        j                  d||«       |S # t        $ r-}t        j                  d| j                  |«       g }Y d }~Œ„d }~ww xY wc c}w )Nz4Unable to read openstack versions from %s due to: %szSelected version '%s' from %s)	rl   Ú	ExceptionrO   rP   r^   ÚreversedÚlistÚOS_VERSIONSÚ	OS_LATEST)r2   Úversions_availableÚeÚvÚ	supportedÚselected_versionÚpotential_versions          r   Ú_find_working_versionz BaseReader._find_working_versionµ   s¶   € ð	$Ø!%×!?Ñ!?Ó!AÐô !)¬¬kÓ):Ó ;Ö<˜1’QÐ<ˆ	Ð<Ü$Ðà!*ò 	ÐØ Ð(:Ñ:ØØ0ÐÙð		ô 	�	‰	Ø+ØØô	
ð
  Ðøô1 ò 	$Ü�I‰IØFØ—‘Øôð
 "$Õûð	$üò =s   ‚A% ¬	BÁ%	BÁ.#BÂBc                 ó(  — |j                  dd«      j                  d«      }|j                  d«      }|D �cg c]  }t        |«      sŒ|‘Œ }}|st	        d|z  «      ‚ | j
                  | j                  dg|¢­Ž }| j                  ||¬«      S c c}w )NÚcontent_pathr   rH   z!Item %s has no valid content pathÚ	openstack©rh   )r0   ÚlstripÚsplitÚlenr   rd   r^   ri   )r2   Úitemrh   rK   Úpath_piecesÚpÚvalid_piecess          r   Ú_read_content_pathzBaseReader._read_content_pathÒ   sŠ   € Ø�x‰x˜¨Ó+×2Ñ2°3Ó7ˆØ—j‘j “oˆØ#.Ö9˜a´#°aµ&šÐ9ˆÐ9ÙÜ Ð!DÈÑ!MÓNÐNØˆt�‰˜tŸ~™~¨{ÐI¸[ÒIˆØ�‰˜t¨FˆÓ3Ð3ùò	 :s   ·BÁBc                 óF  ‡ ‡— t        j                  t        j                  t        t
        t        f¬«      Šˆˆ fd„}dddœ} |‰ j                  «       «      }|j                  «       D ]d  \  }\  }}}‰ j                  ‰ j                  |«      }d}d}	 ‰ j                  |«      }d}|r|st        d|z  «      ‚|r|r		  ||«      }|sŒ`|||<   Œf |d   }
d|
v r|
d   }	 t%        j&                  |«      |
d<   i }|
j-                  dg «      }|D ]!  }d|vrŒ|d   }	 ‰ j/                  |«      ||<   Œ# ||d<   |
j-                  dd«      }|r	 ‰ j/                  |d¬«      }||d<   	 |
d   d   |d<   ‰ j3                  «       |d<   t4        D ]3  \  }}}|r||
vrt#        d|z  «      ‚||
v sŒ |
j-                  |«      |
|<   Œ5 |S # t        $ r<}	|st        j                  d	||	«       nt        j                  d
||	«       Y d}	~	�ŒYd}	~	ww xY w# t         $ r}	t#        d|›d|	›�«      |	‚d}	~	ww xY w# t(        t*        f$ r}	t#        d|	z  «      |	‚d}	~	ww xY w# t         $ r}	t#        d|›d|	›�«      |	‚d}	~	ww xY w# t        $ r}	t#        d|	z  «      |	‚d}	~	ww xY w# t0        $ r Y �Œ1w xY w)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                 ó$  •— i }‰j                  d| d«      dt        j                  f|d<   ‰j                  d| d«      dd„ f|d<   ‰j                  d| d	«      d‰f|d
<   ‰j                  d| d«      d‰f|d<   ‰j                  d| d«      d‰f|d<   |S )Nr~   zmeta_data.jsonTr>   Ú	user_dataFc                 ó   — | S r   r   r   s    r   r   z7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>õ   s   € ˜!€ r   Úuserdatazvendor_data.jsonÚ
vendordatazvendor_data2.jsonÚvendordata2znetwork_data.jsonÚnetworkdata)rd   r   Ú	load_json)r<   ÚfilesÚload_json_anytyper2   s     €€r   Ú	datafilesz%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 ú: r>   Úrandom_seedz.Badly formatted metadata random_seed entry: %sr’   rK   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{   r1   rd   r^   ri   ÚIOErrorrO   rP   r(   rp   r   Úbase64Ú	b64decodeÚ
ValueErrorÚ	TypeErrorr0   r‡   ÚKeyErrorrn   Ú
KEY_COPIES)r2   r”   ÚresultsÚdatar3   rK   ÚrequiredÚ
translatorÚfoundrv   r>   r˜   r’   Úmetadata_filesrƒ   Únet_itemÚcontentÚ
target_keyÚ
source_keyÚis_requiredr“   s   `                   @r   Úread_v2zBaseReader.read_v2Û   s3  ù€ ô &×-Ñ-Ü�N‰N¬¬d´CÐ'8ô
Ðõ	ðB Øñ
ˆñ ˜×3Ñ3Ó5Ó6ˆØ26·*±*³,ò 	%Ñ.ˆDÑ.�4˜ :Ø—?‘? 4§>¡>°4Ó8ˆDØˆDØˆEðØ—‘ tÓ,�ð �Ù¡Ü!Ð">ÀÑ"EÓFÐFÙ™ðÙ% dÓ+�Dò
 Ø $�˜’ð7	%ð: ˜:Ñ&ˆØ˜HÑ$Ø" =Ñ1ˆKðÜ*0×*:Ñ*:¸;Ó*G�˜Ñ'ð ˆØ!Ÿ™ g¨rÓ2ˆØ"ò 		ˆDØ˜TÑ!ØØ˜‘<ˆDðØ"×5Ñ5°dÓ;��d’ð		ð !ˆ�Ñð
 —<‘<Ð 0°$Ó7ˆÙðØ×1Ñ1°(À4Ð1ÓH�Ø,3�Ð(Ñ)ð	Ø (¨Ñ 0°Ñ :ˆG�HÑð
 #'×"9Ñ"9Ó";ˆ�Ñô 4>ò 	@Ñ/ˆJ˜
 KÙ˜z°Ñ9Ü$Ð%@À:Ñ%MÓNÐNØ˜XÒ%Ø'/§|¡|°JÓ'?�˜Ò$ð		@ð
 ˆøô_ ò ÙÜ—I‘IØDÀdÈAõô —I‘IØEÀtÈQôÿùðûô  !ò Ý(Ú;?ÁÐCóàðûðûô ¤	Ð*ò Ü$ØDÀqÑHóàðûðûô ò Ý$Ú=AÁ1ÐEóàðûðûô ò Ü$Ø>À!ÑDóàðûðûô ò 	Úð	úsŠ   ÂF?Â=HÃH* ÄIÅ
I3 Å#J Æ?	HÇ1G?Ç?HÈ	H'ÈH"È"H'È*IÈ9IÉIÉ	I0ÉI+É+I0É3	JÉ<JÊJÊ	J ÊJ N©F)r)   r*   r+   r_   ÚabcÚabstractmethodrd   ri   rl   rn   r{   r‡   r±   r   r   r   r\   r\   ¡   s   „ ò#ð 	×Ññó ðð 	×Ñòó ðð 	×Ññó ðð 	×Ññó ðò ó:4óGr   r\   )Ú	metaclassc                   ó>   ‡ — e Zd Zˆ fd„Zd„ Zdd„Zd„ Zd„ Zd„ Zˆ xZ	S )ÚConfigDriveReaderc                 ó:   •— t         t        | �  |«       d | _        y r   )Úsuperr·   r_   Ú	_versions)r2   r^   Ú	__class__s     €r   r_   zConfigDriveReader.__init__f  s   ø€ ÜÔ Ñ/°	Ô:Øˆ�r   c                 óX   — |gt        |«      z   }t        j                  j                  |Ž S r   )rr   rJ   rK   Újoin)r2   rb   rc   Ú
componentss       r   rd   zConfigDriveReader._path_joinj  s%   € Ø�Vœd 7›mÑ+ˆ
Ü�w‰w�|‰|˜ZÐ(Ð(r   c                 óZ   — |rt        j                  |«      S t        j                  |«      S r   )r   Úload_text_fileÚload_binary_filerg   s      r   ri   zConfigDriveReader._path_readn  s1   € ñ ô ×Ñ Ó%ð	
ô ×&Ñ& tÓ,ð	
r   c                 óP  — | j                   €Š| j                  | j                  d«      }t        j                  |«      D �cg c]@  }t        j
                  j                  t        j
                  j                  |«      «      r|‘ŒB }}t        |«      | _         | j                   S c c}w )Nr~   )	rº   rd   r^   rJ   ÚlistdirrK   Úisdirr½   Úsorted)r2   rK   Údrª   s       r   rl   z+ConfigDriveReader._fetch_available_versionsu  s�   € Ø�>‰>Ð!Ø—?‘? 4§>¡>°;Ó?ˆDô Ÿ™ DÓ)öàÜ—7‘7—=‘=¤§¡§¡¨dÓ!3Ô4ò ðˆEð ô
 $ E›]ˆDŒNØ�~‰~Ðùòs   Á AB#c                 ó  — | j                  | j                  ddd«      }t        j                  j	                  |«      si S 	 t        j                  | j                  |«      «      S # t        $ r}t        d|›d|›�«      |‚d }~ww xY w)Nr	   r   zmeta-data.jsonr–   r—   )
rd   r^   rJ   rK   rL   r   r‘   ri   rp   r   )r2   rK   rv   s      r   rn   z$ConfigDriveReader._read_ec2_metadata€  sz   € Ø�‰Ø�N‰N˜E 8Ð-=ó
ˆô �w‰w�~‰~˜dÔ#ØˆIðÜ—~‘~ d§o¡o°dÓ&;Ó<Ð<øÜò Ý$Ú7;¹QÐ?óàðûðús   Á#A% Á%	BÁ.B Â Bc                 ón  — i }t         j                  «       D ]C  }| j                  | j                  |«      }t        j
                  j                  |«      sŒ?|||<   ŒE |st        d| j                  z  «      ‚i }t         j                  «       D ]I  \  }\  }}}||v r$||   }	 | j                  |«      }	  ||«      ||<   Œ2t        j                  |«      ||<   ŒK |d   }
|d   }|j                  d|
«      }
|
r?|
j!                  «       }|D �cg c]   }t#        |«      r|j%                  d	«      s|‘Œ" c}|d<   d
|v r|d
   |d
<   d|dœ}d|v r|d   |d<   |j                  dd«      |d<   i |d<   |S # t        $ r}	t        d|z  «      |	‚d}	~	ww xY w# t        $ r}	t        d|›d|	›�«      |	‚d}	~	ww xY wc c}w )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;   ú#r   r:   )r<   r>   rš   z	user-datar   r�   r’   )ÚFILES_V1Úkeysrd   r^   rJ   rK   rL   r(   r1   ri   rŸ   r   rp   ÚcopyÚdeepcopyr0   Ú
splitlinesr‚   rI   )r2   rª   r3   rK   ÚmdÚkeyr©   ÚdefaultÚcontentsrv   Úkeydatar   ÚlinesÚliner¦   s                  r   Úread_v1z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@ò 	1Ñ,ˆDÑ,�3˜
 GØ�u‰}Ø˜T‘{�ðMØ#Ÿ™¨tÓ4�Hðñ )¨Ó2�B�s’Gô Ÿ-™-¨Ó0��3’ð#	1ð& Ð&Ñ'ˆØ�Y‘-ˆð —+‘+˜m¨WÓ5ˆÙØ×&Ñ&Ó(ˆEð "ö!àÜ�t”9 T§_¡_°SÔ%9ò ò!ˆBˆ}Ñð ˜GÑ#Ø '¨Ñ 6ˆBˆ}Ñð Øñ
ˆð �wÑØ '¨Ñ 1ˆG�HÑð &Ÿk™k¨+°rÓ:ˆ�
Ñð ˆ�Ñàˆøôc ò MÜ(Ð)=ÀÑ)DÓEÈ1ÐLûðMûô !ò Ý(Ú;?ÁÐCóàðûðüò!s6   Â!E/Â3FÄ%F2Å/	FÅ8FÆFÆ	F/ÆF*Æ*F/r²   )
r)   r*   r+   r_   rd   ri   rl   rn   rÖ   Ú__classcell__©r»   s   @r   r·   r·   e  s"   ø„ ôò)ó
ò	òöGr   r·   c                   ó:   ‡ — e Zd Zdˆ fd„	Zd„ Zdd„Zd„ Zd„ Zˆ xZS )ÚMetadataReaderc                 óˆ   •— t         t        | �  |«       || _        t	        |«      | _        t        |«      | _        d | _        y r   )	r¹   rÚ   r_   Ússl_detailsÚfloatÚtimeoutÚintÚretriesrº   )r2   Úbase_urlrÜ   rÞ   rà   r»   s        €r   r_   zMetadataReader.__init__Ù  s7   ø€ ÜŒn˜dÑ,¨XÔ6Ø&ˆÔÜ˜W“~ˆŒÜ˜7“|ˆŒØˆ�r   c                 ó,  — | j                   �| j                   S g }| j                  | j                  d«      }| j                  |d¬«      }|j	                  «       D ]&  }|j                  «       }|sŒ|j                  |«       Œ( || _         | j                   S )Nr~   Tr   )rº   rd   r^   ri   rÎ   ÚstriprW   )r2   rª   Úversion_pathr­   rÕ   s        r   rl   z(MetadataReader._fetch_available_versionsà  s‰   € à�>‰>Ð%Ø—>‘>Ð!ØˆØ—‘ t§~¡~°{ÓCˆØ—/‘/ ,°t�/Ó<ˆØ×&Ñ&Ó(ò 	ˆDØ—:‘:“<ˆDÙØØ�L‰L˜Õð		ð
 ˆŒØ�~‰~Ðr   c                 óÈ   — d„ }t        j                  || j                  | j                  | j                  |¬«      }|r|j
                  j                  «       S |j
                  S )Nc                 ón   — 	 t        | j                  «      }|dk\  r|dvryy# t        t        f$ r Y yw xY w)Ni�  )i˜  i­  iô  iö  i÷  iø  FT)rß   Úcoder£   r¢   )Úcauserç   s     r   Úshould_retry_cbz2MetadataReader._path_read.<locals>.should_retry_cbð  sG   € ðÜ˜5Ÿ:™:“�Ø˜3’; 4Ð/MÑ#MØ ð øô œzÐ*ò àØðús   ‚" ¢4³4)rà   rÜ   rÞ   Úexception_cb)r   Úreadurlrà   rÜ   rÞ   rÒ   rh   )r2   rK   rh   ré   Úresponses        r   ri   zMetadataReader._path_readï  s\   € ò	ô ×%Ñ%ØØ—L‘LØ×(Ñ(Ø—L‘LØ(ô
ˆñ Ø×$Ñ$×+Ñ+Ó-Ð-à×$Ñ$Ð$r   c                 ó.   — t        j                  |g|¢­Ž S r   )r   Úcombine_urlra   s      r   rd   zMetadataReader._path_join  s   € Ü×%Ñ% dÐ5¨WÒ5Ð5r   c                 ón   — t        j                  | j                  | j                  | j                  ¬«      S )N)rÜ   rÞ   rà   )r	   Úget_instance_metadatarÜ   rÞ   rà   rk   s    r   rn   z!MetadataReader._read_ec2_metadata	  s,   € Ü×(Ñ(Ø×(Ñ(Ø—L‘LØ—L‘Lô
ð 	
r   )Né   rñ   r²   )	r)   r*   r+   r_   rl   ri   rd   rn   r×   rØ   s   @r   rÚ   rÚ   Ø  s   ø„ õòó%ò.6ö
r   rÚ   c           
      óV  ‡&— | €yg d¢g d¢g d¢dœŠ&| j                  dg «      }| j                  dg «      }| j                  dg «      }g }i }d	}d
}g }	|D �]x  }
g }t        ˆ&fd„|
j                  «       D «       «      }d|
v r|
d   |d<   d}|
j                  d«      r'|
j                  d«      j                  «       }|||
d   <   |j                  d«      ||
d   |
d   dœ}|D �cg c]  }|d   |
d   k(  sŒ|‘Œ c}D �]  }t        ˆ&fd„|j                  «       D «       «      }|j                  dg «      D �cg c]$  }t        ˆ&fd„|j                  «       D «       «      ‘Œ& }}|r|j	                  d|i«       |d   dk(  r|j	                  ddi«       n¢|d   dk(  r|j	                  ddi«       n†|d   dv r|j	                  d|d   i«       nh|d   dv r$|j	                  d|j                  d«      dœ«       n=|d   dv r6|j	                  dd i«       |j	                  d!|j                  d«      dœ«       |j                  dg «      D ��cg c]2  }|j                  dg «      D ]  }|j                  d«      d"k(  r|d#   ‘Œ Œ4 }}}|j                  dg «      D ]3  }|j                  d«      d"k7  rŒ|d#   |v rŒ |j                  |d#   «       Œ5 |r||d$<   |d   d%v r|j	                  dd&i«       |d   d'k(  rd&|d'<   |d   d(k(  rd&|d(<   |j                  |«       �Œ |j	                  d)|i«       |
d   d*v rÍi }|r|j	                  d+|i«       |
j                  «       D ]T  \  }}|d,k(  rŒ|j                  d-«      sŒd.j                  |j                  d/d0«      d1   «      }|j	                  ||i«       ŒV ||z  }|d0z  }|j                  |d2d3t        j                  |
d,   «      f«       |j	                  ||d4œ«       ||d<   nµ|
d   d5v rv|
d6   ›d7|
d8   ›�}|j	                  ||
d8   |
d9   d:œ«       |j                  |d6d3|
d6   f«       |j                  |dd;|
d8   z  |
d6   f«       |j	                  |
d9   |d<œ«       n8|
d   t        vrt        j                  d=|
d   «       |j	                  d>|d?œ«       |	j                  |«       |||d   <   �Œ{ |	D �cg c]  }|j                  d«      d>k(  sŒd|vsŒ|‘Œ  }}|s|�r|€t        j                  «       }|j                  «       D ]6  \  }}|j                  d«      rŒ|j                  d@«      |v sŒ,||d@      |d<   Œ8 |D ]i  }|j                  d+«      } | st!        dA|z  «      ‚| |vr:t#        j$                  «        t        j                  «       }| |vrt!        dB|z  «      ‚||    |d<   Œk |D ]H  \  }}!}"}#t'        |#t(        t*        f«      r|#D �$cg c]  }$|"||$   d   z  ‘Œ c}$||!<   Œ;|"||#   d   z  ||!<   ŒJ t        j,                  «       }%|%r|	D ]  }|d   |%v sŒ|%|d      |d+<   dC|d<   Œ |D ];  }t        j                  |«      }|j	                  ddDi«       |	j                  |«       Œ= d0|	dEœS c c}w c c}w c c}}w c c}w c c}$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)r3   Ú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   ó<   •K  — | ]  \  }}|‰d    v sŒ||f–— Œ y­w)r  Nr   ©Ú.0Úkrw   Ú
valid_keyss      €r   ú	<genexpr>z#convert_net_json.<locals>.<genexpr>T  s*   øè ø€ ò 
Ù�q˜!¨q°J¸zÑ4JÒ/JˆQ�ŒFñ
ùó   ƒ“	r3   Úethernet_mac_addressÚidró   )r3   Úmacr  ró   Úlinkc              3   ó<   •K  — | ]  \  }}|‰d    v sŒ||f–— Œ y­w)r  Nr   r
  s      €r   r  z#convert_net_json.<locals>.<genexpr>k  s*   øè ø€ ò Ù˜1˜a°a¸:ÀhÑ;OÒ6O��A”ñùr  r  c              3   ó:   •K  — | ]  \  }}|‰d    v r||f–— Œ y­w)r  Nr   r
  s      €r   r  z#convert_net_json.<locals>.<genexpr>r  s.   øè ø€ ò á˜˜1Ø˜J xÑ0Ñ0ð ˜”Fñùs   ƒÚ	ipv4_dhcpÚdhcp4Ú	ipv6_dhcpÚdhcp6)Ú
ipv6_slaaczipv6_dhcpv6-statelessúipv6_dhcpv6-stateful)Úipv4Ústaticr  Ú
ip_address)ró   rø   )Úipv6Ústatic6z	accept-raFr   Údnsrø   rÿ   )r  r  Tr  r  rõ   )Úbondrô   Ú
bond_linksr"  zbond-{}Úbond_r:   éÿÿÿÿÚbond_interfacesz%s)rö   r3   )ÚvlanÚ	vlan_linkú.Úvlan_idÚvlan_mac_address)r3   r*  rô   z%%s.%s)r  r3   z9Unknown network_data link type (%s); treating as physicalr  )ró   rô   r  z#No mac_address or name entry for %sz"Unable to find a system nic for %sÚ
infinibandÚ
nameserver)r<   Úconfig)r0   r�   r1   ÚlowerÚupdaterW   rI   Úformatr�   rÌ   rÍ   ÚKNOWN_PHYSICAL_TYPESrO   Ú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_numberr.  r  rõ   ÚcfgÚlink_mac_addrÚcurinforY   r  r  Úrouter  Úservicerÿ   rö   r  rw   Útranslated_keyÚ	link_namer3   rÆ   Ú
need_namesÚ_link_idÚinfor  rÐ   ÚfmtÚtargetsÚtargetÚib_known_hwaddrsr  s'                                         @r   Úconvert_net_jsonrM    sÎ  ø€ ð6 ÐØò
ò
ò Mñ+€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ˆL˜˜d™Ñ$ð —G‘G˜F“OØ Ø�t‘*Ø˜‘Lñ	
ˆð $,ÖG˜a¨q°©y¸DÀ¹JÓ/FšÒGó H	#ˆGÜó Ø#*§=¡=£?ôó ˆFð %Ÿ[™[¨°2Ó6öð ô ó à %§¡£ôõ ðˆFð ñ Ø—‘˜x¨Ð0Ô1à�v‰ +Ò-Ø—‘˜v wÐ/Õ0Ø˜‘ KÒ/Ø—‘˜v wÐ/Õ0Ø˜‘ð %ñ ð
 —‘˜v w¨v¡Ð7Õ8Ø˜‘Ð$6Ñ6Ø—‘à (Ø#*§;¡;¨|Ó#<ñõð ˜‘Ð$7Ñ7Ø—
‘
˜K¨Ð/Ô0Ø—‘à )Ø#*§;¡;¨|Ó#<ñôð %Ÿ[™[¨°2Ó6÷àØ$Ÿy™y¨°RÓ8òð Ø—;‘;˜vÓ&¨%Ò/ð ˜	Ó"ðØ"ðˆOñ ð #Ÿ;™; z°2Ó6ò ;�Ø—;‘;˜vÓ&¨%Ò/ØØ˜9Ñ%¨Ñ8ØØ×&Ñ& w¨yÑ'9Õ:ð;ñ Ø,;�Ð(Ñ)ð �v‰Ð"GÑGØ—
‘
˜K¨Ð.Ô/à�v‰ &Ò(Ø!%��v‘Ø�v‰ &Ò(Ø!%��v‘Ø�N‰N˜6Ö"ðQH	#ðR 	�
‰
�I˜wÐ'Ô(Ø�‰<˜8Ñ#ØˆFÙØ—
‘
˜M¨=Ð9Ô:ØŸ
™
›ò 7‘��1Ø˜Ò$ØØ—\‘\ &Õ)ð &/×%5Ñ%5°a·g±g¸gÀqÓ6IÈ"Ñ6MÓ%N�NØ—M‘M >°1Ð"5Õ6ð7ð  &¨Ñ3ˆIØ˜1ÑˆKð
 ×ÑàØ%ØÜ—M‘M $ |Ñ"4Ó5ð	ôð �J‰J &°)Ñ<Ô=à'ˆG�FŠOØ�&‰\˜XÑ%Ø" ;Ó/°°i²ÐAˆDØ�J‰Jà Ø# I™Ø#'Ð(:Ñ#;ñôð ×Ñ  k°4¸¸kÑ9JÐ KÔLØ×ÑØ�f˜h¨¨i©Ñ8¸$¸{Ñ:KÐLôð �N‰N 4Ð(:Ñ#;ÀTÑJÕKà�F‰|Ô#7Ñ7Ü—‘ð à˜‘Lôð
 �J‰J 
¸=ÑIÔJà�‰�cÔØ&-ˆ�W˜T‘]Ó#ð_.ðD öØ˜QŸU™U 6›]¨jÓ8¸VÈ1º_Šð€Jð ñ ’\ØÐÜ×2Ñ2Ó4ˆJð +×0Ñ0Ó2ò 	7‰NˆH�dØ�x‰x˜ÔØØ�x‰x˜‹ *Ò,Ø)¨$¨u©+Ñ6��V’ð		7ð ò 
	(ˆ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àELöØ;A�C˜, vÑ.¨vÑ6Ó6ò��C’ð  ¨gÑ!6°vÑ!>Ñ>��C’ð	?ô ×6Ñ6Ó8ÐÙØò 	+ˆCØ�6‰{Ð.Ò.Ø%5°c¸&±kÑ%B��MÑ"Ø*��F’ð	+ð
 ò ˆÜ�m‰m˜GÓ$ˆØ�
‰
�F˜LÐ)Ô*Ø�‰�cÕðð
  FÑ+Ð+ùòy HùòùóRùòrùò:s0   Ã!ZÃ2ZÄ3)ZÉ7Z
ÓZ!Ó-Z!Ó2Z!×.Z&)NN))r³   r    rÌ   r›   ÚloggingrJ   Ú	cloudinitr   r   r   r   r   Úcloudinit.sourcesr   Úcloudinit.sources.helpersr	   Ú	getLoggerr)   rO   r‘   rÊ   r¥   rt   Ú	OS_FOLSOMÚ
OS_GRIZZLYÚ	OS_HAVANAÚ
OS_LIBERTYÚOS_NEWTON_ONEÚOS_NEWTON_TWOÚOS_OCATAÚOS_ROCKYrs   r2  rŸ   r(   r-   ÚABCMetar\   r·   rÚ   rM  r   r   r   ú<module>r\     s  ðó Û Û Û Û Û 	ç :Õ :Ý ,Ý )ð €g×Ñ˜Ó!€ð  0±¸bÐAØ˜4Ÿ>™>¨2Ð.Ø"3±[À"Ð!Eñ	€ð€
ð €	Ø€	Ø€
Ø€	Ø€
à€à€à€à€ð
 ØØØØØØØð	€ðÐ ô"	�'ô 	÷Iñ IôXA˜3Ÿ;™;õ AôHp˜
ô pôf6
�Zô 6
ôtT,r   