name : openstack.cpython-39.opt-1.pyc
a

'�Dg�l�@s6ddlZddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZddlm
Z
ddlmZe�e�Zddd�dfd	ejifd
dd�dfd�Zd
ZdZdZdZdZdZdZdZdZdZeeeeeeeefZdZ Gdd�de!�Z"Gdd�d�Z#Gdd�dej$d�Z%Gdd �d e%�Z&Gd!d"�d"e%�Z'd%d#d$�Z(dS)&�N)�net�sources�subp�
url_helper�util)�BrokenMetadata)�ec2�network_configcCs|S�N���xrr�G/usr/lib/python3.9/site-packages/cloudinit/sources/helpers/openstack.py�<lambda>�r��meta_js�authorized_keyscCs|Sr
rrrrrrr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostname�hostnameF)�instance-idZuuidT�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)
NZbgpovsZbridgeZ	cascadingZdvsZethernetZhw_vebZhypervZovsZphyZtapZ	vhostuserZvifc@seZdZdS)�NonReadableN)�__name__�
__module__�__qualname__rrrrrQsrc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�SourceMixincCs>|js
dS|j�di�}|��D]\}}||kr |Sq dS)Nzblock-device-mapping)Zec2_metadata�get�items)�self�nameZbdmZent_name�devicerrr�_ec2_name_to_deviceVs
zSourceMixin._ec2_name_to_devicecCs$d}|jdkrd}t�|j�|��S)NZpublic_keys��public-keys)�versionrZnormalize_pubkey_data�metadatar)rrrrr�get_public_ssh_keys_s
zSourceMixin.get_public_ssh_keyscCsPd}z2d|}|dkrd|}t�|�}|r4|d}WntjyJYn0|S)NzLABEL=%sZswapzTYPE=%sr)rZfind_devs_withrZProcessExecutionError)rrr ZcriteriaZdev_entriesrrr�_os_name_to_devicees
zSourceMixin._os_name_to_devicecCsV|sdS|�d�sd|}tj�|�r*|S|�tj�|��}|rRt�d||�|SdS)N�/z/dev/%szRemapped device name %s => %s)�
startswith�os�path�existsZ
_remap_device�basename�LOG�debug)rr Zremappedrrr�_validate_device_namers
z!SourceMixin._validate_device_namecCs�|sdS|g}|dkr"|�dd�|dkr4|�d�d}t�d|�|D] }|�|�}|�|�}|rHqjqH|s�t�d|�|D] }|�|�}|�|�}|r~q�q~|s�dSt�d||�|SdS)N�rootrZamiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)�insert�appendr.r/r!r0r')rr�namesr �nrrr�device_name_to_device�s2




z!SourceMixin.device_name_to_deviceN)rrrr!r&r'r0r6rrrrrUs
	
rc@sheZdZdd�Zejdd��Zejddd��Zejdd	��Zejd
d��Z	dd
�Z
ddd�Zdd�ZdS)�
BaseReadercCs
||_dSr
)�	base_path�rr8rrr�__init__�szBaseReader.__init__cGsdSr
r�r�base�add_onsrrr�
_path_join�szBaseReader._path_joinFcCsdSr
r�rr+�decoderrr�
_path_read�szBaseReader._path_readcCsdSr
r�rrrr�_fetch_available_versions�sz$BaseReader._fetch_available_versionscCsdSr
rrBrrr�_read_ec2_metadata�szBaseReader._read_ec2_metadatac
Cs�z|��}Wn8tyD}z t�d|j|�g}WYd}~n
d}~00dd�ttt��D�}t}|D]}||vrrqd|}q|qdt�d||�|S)Nz4Unable to read openstack versions from %s due to: %scSsg|]}|�qSrr)�.0�vrrr�
<listcomp>�rz4BaseReader._find_working_version.<locals>.<listcomp>zSelected version '%s' from %s)	rC�	Exceptionr.r/r8�reversed�list�OS_VERSIONS�	OS_LATEST)rZversions_available�eZ	supportedZselected_versionZpotential_versionrrr�_find_working_version�s,��z BaseReader._find_working_versioncCs^|�dd��d�}|�d�}dd�|D�}|s:td|��|j|jdg|�R�}|j||d�S)	NZcontent_pathrr(cSsg|]}t|�r|�qSr)�len)rE�prrrrG�rz1BaseReader._read_content_path.<locals>.<listcomp>z!Item %s has no valid content path�	openstack�r@)r�lstrip�splitrr>r8rA)r�itemr@r+Zpath_piecesZvalid_piecesrrr�_read_content_path�s
zBaseReader._read_content_pathcstjtjtttfd����fdd�}ddd�}|����}|��D]�\}\}}}��	�j
|�}d}d}z��|�}WnFty�}	z.|s�t
�d	||	�nt
�d
||	�WYd}	~	nd}	~	00d}|r�|s�td|��|�r&|�r&z||�}Wn8t�y$}	ztd
||	f�|	�WYd}	~	n
d}	~	00|rB|||<qB|d}
d|
v�r�|
d}zt�|�|
d<Wn8ttf�y�}	ztd|	�|	�WYd}	~	n
d}	~	00i}|
�dg�}
|
D]h}d|v�r��q�|d}z��|�||<Wn8t�y}	ztd||	f�|	�WYd}	~	n
d}	~	00�q�||d<|
�dd�}|�r�z�j|dd�}||d<Wn4t�y�}	ztd|	�|	�WYd}	~	n
d}	~	00z|
dd|d<Wnt�y�Yn0���|d<tD]@\}}}|�r�||
v�r�td|��||
v�r�|
�|�|
|<�q�|S)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.
        )Z
root_typescs�i}��d|d�dtjf|d<��d|d�ddd�f|d	<��d|d
�d�f|d<��d|d�d�f|d
<��d|d�d�f|d<|S)NrQzmeta_data.jsonTr%Z	user_dataFcSs|Sr
rrrrrr�rz7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>�userdatazvendor_data.jsonZ
vendordatazvendor_data2.jsonZvendordata2znetwork_data.jsonZnetworkdata)r>r�	load_json)r$�files�Zload_json_anytyperrr�	datafiles�s,�	����z%BaseReader.read_v2.<locals>.datafilesr�)rWr$NFz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %sTzMissing mandatory path: %s�Failed to process path %s: %sr%�random_seedz.Badly formatted metadata random_seed entry: %srYr+z#Failed to read provided file %s: %sr	rRz(Failed to read network configuration: %s�meta�dsmodezec2-metadatazNo '%s' entry in metadata)�	functools�partialrrX�dictrJ�strrNrr>r8rA�IOErrorr.r/rrHr�base64Z	b64decode�
ValueError�	TypeErrorrrV�KeyErrorrD�
KEY_COPIES)rr[�results�datarr+�required�
translator�foundrMr%r^rYZmetadata_filesrUZnet_item�contentZ
target_keyZ
source_keyZis_requiredrrZr�read_v2�s�	�!���
��

��

����
zBaseReader.read_v2N)F)F)
rrrr:�abc�abstractmethodr>rArCrDrNrVrqrrrrr7�s



	r7)�	metaclasscsFeZdZ�fdd�Zdd�Zddd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ConfigDriveReadercstt|��|�d|_dSr
)�superrur:�	_versionsr9��	__class__rrr:fszConfigDriveReader.__init__cGs|gt|�}tjj|�Sr
)rJr*r+�join)rr<r=�
componentsrrrr>jszConfigDriveReader._path_joinFcCs|rt�|�St�|�Sr
)rZload_text_fileZload_binary_filer?rrrrAns��zConfigDriveReader._path_readcs@|jdur:|�|jd���fdd�t���D�}t|�|_|jS)NrQcs$g|]}tj�tj����r|�qSr)r*r+�isdirrz�rE�d�r+rrrGxs�z?ConfigDriveReader._fetch_available_versions.<locals>.<listcomp>)rwr>r8r*�listdir�sorted)rrorrrrCus

�
z+ConfigDriveReader._fetch_available_versionsc
Csp|�|jddd�}tj�|�s"iSzt�|�|��WStyj}zt	d||f�|�WYd}~n
d}~00dS)Nrrzmeta-data.jsonr])
r>r8r*r+r,rrXrArHr)rr+rMrrrrD�s
�
��z$ConfigDriveReader._read_ec2_metadatacCs�i}t��D]&}|�|j|�}tj�|�r|||<qt|�dkrNtd|j��i}t�	�D]�\}\}}}||v�r||}z|�
|�}Wn2ty�}	ztd|�|	�WYd}	~	n
d}	~	00z||�||<Wn8t
�y}	ztd||	f�|	�WYd}	~	n
d}	~	00qZt�|�||<qZ|d}
|d}|�d|
�}
|
�rT|
��}d	d
�|D�|d<d|v�rj|d|d<d|d
�}
d|v�r�|d|
d<|�dd�|
d<i|
d<|
S)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.
        rz%s: no files foundzFailed to read: %sNr]rrr#cSs"g|]}t|�r|�d�s|�qS)�#)rOr))rE�linerrrrG�s�z-ConfigDriveReader.read_v1.<locals>.<listcomp>rr")r$r%r`z	user-datarrWrY)�FILES_V1�keysr>r8r*r+r,rOrrrArerrH�copy�deepcopyr�
splitlines)rrorr+Zmd�keyrn�default�contentsrMZkeydatar�linesrkrrr�read_v1�sT

$
���

�
zConfigDriveReader.read_v1)F)
rrrr:r>rArCrDr��
__classcell__rrrxrrues
rucs@eZdZd�fdd�	Zdd�Zddd	�Zd
d�Zdd
�Z�ZS)�MetadataReaderN�cs4tt|��|�||_t|�|_t|�|_d|_dSr
)	rvr�r:�ssl_details�float�timeout�int�retriesrw)rZbase_urlr�r�r�rxrrr:�s


zMetadataReader.__init__cCsb|jdur|jSg}|�|jd�}|j|dd�}|��D]}|��}|sJq8|�|�q8||_|jS)NrQTrR)rwr>r8rAr��stripr3)rroZversion_pathrpr�rrrrC�s
z(MetadataReader._fetch_available_versionsFcCs:dd�}tj||j|j|j|d�}|r0|j��S|jSdS)Nc	Ss8zt|j�}|dkrWdSWnttfy2Yn0dS)Ni�FT)r��coderhrg)Z
_request_args�causer�rrr�should_retry_cb�s

z2MetadataReader._path_read.<locals>.should_retry_cb)r�r�r�Zexception_cb)rZreadurlr�r�r�r�r@)rr+r@r�ZresponserrrrA�s
�
zMetadataReader._path_readcGstj|g|�R�Sr
)rZcombine_urlr;rrrr>szMetadataReader._path_joincCstj|j|j|jd�S)N)r�r�r�)rZget_instance_metadatar�r�r�rBrrrrD	s
�z!MetadataReader._read_ec2_metadata)Nr�r�)F)	rrrr:rCrAr>rDr�rrrxrr��s

r�c 
s�|durdSgd�gd�gd�d��|�dg�}|�dg�}|�dg�}g}i�d	}d
}g}|D�]�g}	t�fdd����D��}
d
�vr��d
|
d
<d}��d�r���d���}|��d<|
�d
�|�d�dd�}�fdd�|D�D�]�}
t�fdd�|
��D��}�fdd�|
�dg�D�}|�r<|�d|i�|
ddk�rZ|�ddi�n�|
ddk�rx|�ddi�nz|
ddv�r�|�d|
di�nX|
ddv�r�|�d|
�d�d��n2|
dd v�r�|
�d!d"i�|�d#|
�d�d��d$d�|
�dg�D�}|
�dg�D]:}|�d�d%k�r,�q|d&|v�r>�q|�|d&��q|�r^||d'<|
dd(v�rz|
�d!d)i�|
dd*k�r�d)|d*<|
dd+k�r�d)|d+<|	�|�q�|
�d,|	i��dd-v�r�i}|�r�|
�d.|i����D]J\}}|d/k�r�q�n0|�d0��r�d1�|�d2d3�d4�}|�||i��q�||}|d37}|�|
d5d6t	�
�d/�f�|
�||d7��||d
<n��dd8v�rd9�d:�d;f}|
�|�d;d<��|�|
d:d6�d:f�|�|
d
d=�d;�d:f�|��d>|d?��n.�dtv�rt�
d@�d�|
�dA|dB��|�|
�|�|d<q`dCd�|D�}|�s`|�rR|du�rrt��}���D]:\}}|�d
��r��qz|�dD�|v�rz||dD|d
<�qz|D]D}|�d.�}|�s�tdE|��||v�r�tdF|��|||d
<�q�|D]L\}
}�}t|ttf��r:��fdGd�|D�|
|<n��|d
|
|<�qt��}|�r�|D],}
|
d
|v�rd||
d
|
d.<dH|
d<�qd|D](}t	�
|�}
|
�ddIi�|�|
��q�d3|dJ�S)Ka*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)r�type�mac_address�subnets�paramsZmtu)
r��address�netmask�	broadcast�metric�gatewayZpointopointZscope�dns_nameserversZ
dns_search)�networkZdestinationr�r�r�)�physical�subnet�routes�links�networks�serviceszbond%drc3s&|]\}}|�dvr||fVqdS)r�Nr�rE�krF��
valid_keysrr�	<genexpr>Tsz#convert_net_json.<locals>.<genexpr>rZethernet_mac_address�idr�)r�macr�r�cs g|]}|d�dkr|�qS)�linkr�r)rEr5)r�rrrGjrz$convert_net_json.<locals>.<listcomp>c3s&|]\}}|�dvr||fVqdS)r�Nrr�r�rrr�kscs&g|]}t�fdd�|��D���qS)c3s&|]\}}|�dvr||fVqdS)r�Nrr�r�rrr�rs�z.convert_net_json.<locals>.<listcomp>.<genexpr>)rcr)rE�router�rrrGqs��r�Z	ipv4_dhcpZdhcp4�	ipv6_dhcpZdhcp6)Z
ipv6_slaaczipv6_dhcpv6-stateless�ipv6_dhcpv6-stateful)�ipv4�staticr��
ip_address)r�r�)�ipv6�static6z	accept-raFr�cSs4g|],}|�dg�D]}|�d�dkr|d�qqS)r�r��dnsr��r)rEr��servicerrrrG�s�r�r�r�)r�r�Tr�r�r�)�bondr�Z
bond_linksr�zbond-{}Zbond_r"���Zbond_interfacesz%s)r�r)Zvlanz%s.%sZ	vlan_link�vlan_id)rr�z%%s.%sZvlan_mac_address)r�rz9Unknown network_data link type (%s); treating as physicalr�)r�r�cSs&g|]}|�d�dkrd|vr|�qS)r�r�rr�r}rrrrG�sr�z#No mac_address or name entry for %sz"Unable to find a system nic for %scsg|]}��|d�qS)rr)rE�target)�fmt�link_id_inforrrGsZ
infinibandZ
nameserver)r$�config)rrcr�lower�updater3r)�formatrTr�r��KNOWN_PHYSICAL_TYPESr.ZwarningrZget_interfaces_by_macrg�
isinstancerJ�tupleZget_ib_hwaddrs_by_interface) Znetwork_jsonZ
known_macsr�r�r�Zlink_updatesZ
bond_name_fmtZbond_numberr�r�ZcfgZ
link_mac_addrZcurinfor�r�r�r�r�r�r�rFZtranslated_keyZ	link_namerZ
need_namesZ_link_id�infor~r�r��targetsZib_known_hwaddrsr)r�r�r�r�r�convert_net_jsons2�
�
��

�	����

�
��
����
�


�
r�)NN))rrrfr�raZloggingr*Z	cloudinitrrrrrZcloudinit.sourcesrZcloudinit.sources.helpersrZ	getLoggerrr.rXr�rjrLZ	OS_FOLSOMZ
OS_GRIZZLYZ	OS_HAVANAZ
OS_LIBERTYZ
OS_NEWTON_ONEZ
OS_NEWTON_TWOZOS_OCATAZOS_ROCKYrKr�rerr�ABCMetar7rur�r�rrrr�<module>	sP

��LEs:

© 2025 Cubjrnet7