HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/openstack.cpython-310.pyc
o

�Ad�e�@s:ddlZddlZddlZddlZddlZddlmZddlmZm	Z	m
Z
mZmZddl
mZddlmZe�e�Zddd�d	fd
ejifddd�d	fd
�ZdZdZdZdZdZdZdZdZdZdZeeeeeeeefZ dZ!Gdd�de"�Z#Gdd�d�Z$Gdd�dej%d�Z&Gd d!�d!e&�Z'Gd"d#�d#e&�Z(d&d$d%�Z)dS)'�N)�log)�net�sources�subp�
url_helper�util)�BrokenMetadata)�ec2�network_configcC�|S�N���xr
r
�E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.py�<lambda>�r��meta_js�authorized_keyscCrrr
rr
r
rrr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-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@seZdZdS)�NonReadableN)�__name__�
__module__�__qualname__r
r
r
rr&Qsr&c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�SourceMixincCs>|jsdS|j�di�}|��D]\}}||kr|SqdS)Nzblock-device-mapping)�ec2_metadata�get�items)�self�name�bdm�ent_name�devicer
r
r�_ec2_name_to_deviceVs�zSourceMixin._ec2_name_to_devicecCs$d}|jdkr	d}t�|j�|��S)N�public_keys��public-keys)�versionr�normalize_pubkey_data�metadatar,)r.r/r
r
r�get_public_ssh_keys_s
zSourceMixin.get_public_ssh_keyscCsVd}zd|}|dkrd|}t�|�}|r|d}W|SW|Stjy*Y|Sw)NzLABEL=%s�swapzTYPE=%sr)r�find_devs_withr�ProcessExecutionError)r.r/r2�criteria�dev_entriesr
r
r�_os_name_to_devicees

���zSourceMixin._os_name_to_devicecCsV|sdS|�d�s
d|}tj�|�r|S|�tj�|��}|r)t�d||�|SdS)N�/z/dev/%szRemapped device name %s => %s)�
startswith�os�path�exists�
_remap_device�basename�LOG�debug)r.r2�remappedr
r
r�_validate_device_namers
z!SourceMixin._validate_device_namecCs�|sdS|g}|dkr|�dd�|dkr|�d�d}t�d|�|D]}|�|�}|�|�}|r4nq$|sPt�d|�|D]}|�|�}|�|�}|rOnq?|sTdSt�d||�|S)N�rootr�amiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)�insert�appendrHrIr3rKr@)r.r/�namesr2�nr
r
r�device_name_to_device�s6


�

�z!SourceMixin.device_name_to_deviceN)r'r(r)r3r:r@rKrRr
r
r
rr*Us	
r*c@sheZdZdd�Zejdd��Zejddd��Zejdd	��Zejd
d��Z	dd
�Z
ddd�Zdd�ZdS)�
BaseReadercCs
||_dSr)�	base_path�r.rTr
r
r�__init__�s
zBaseReader.__init__cG�dSrr
�r.�base�add_onsr
r
r�
_path_join��zBaseReader._path_joinFcCrWrr
�r.rD�decoder
r
r�
_path_read�r\zBaseReader._path_readcCrWrr
�r.r
r
r�_fetch_available_versions�r\z$BaseReader._fetch_available_versionscCrWrr
r`r
r
r�_read_ec2_metadata�r\zBaseReader._read_ec2_metadatac
Cs�z|��}Wnty"}zt�d|j|�g}WYd}~nd}~wwdd�ttt��D�}t}|D]	}||vr9q2|}t�d||�|S)Nz4Unable to read openstack versions from %s due to: %scSsg|]}|�qSr
r
)�.0�vr
r
r�
<listcomp>�sz4BaseReader._find_working_version.<locals>.<listcomp>zSelected version '%s' from %s)	ra�	ExceptionrHrIrT�reversed�list�OS_VERSIONS�	OS_LATEST)r.�versions_available�e�	supported�selected_version�potential_versionr
r
r�_find_working_version�s0���
�z BaseReader._find_working_versioncCs^|�dd��d�}|�d�}dd�|D�}|std|��|j|jdg|�R�}|j||d�S)	N�content_pathrrAcSsg|]}t|�r|�qSr
)�len)rc�pr
r
rre�sz1BaseReader._read_content_path.<locals>.<listcomp>z!Item %s has no valid content path�	openstack�r^)r,�lstrip�splitrr[rTr_)r.�itemr^rD�path_pieces�valid_piecesr
r
r�_read_content_path�s
zBaseReader._read_content_pathcs�tjtjtttfd����fdd�}ddd�}|����}|��D]o\}\}}}��	�j
|�}d}d}z��|�}Wn#ty]}	z|sLt
�d	||	�nt
�d
||	�WYd}	~	nd}	~	wwd}|rj|sjtd|��|r�|r�z||�}Wnty�}	z	td
||	f�|	�d}	~	ww|r�|||<q!|d}
d|
vr�|
d}z	t�|�|
d<Wnttfy�}	ztd|	�|	�d}	~	wwi}|
�dg�}
|
D])}d|vr�q�|d}z	��|�||<Wq�ty�}	z	td||	f�|	�d}	~	ww||d<|
�dd�}|�rz
�j|dd�}||d<Wnt�y}	ztd|	�|	�d}	~	wwz
|
dd|d<Wn
t�y3Ynw���|d<tD] \}}}|�rO||
v�rOtd|��||
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.
        )�
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)Nrtzmeta_data.jsonTr9�	user_dataFcSrrr
rr
r
rr�rz7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>�userdatazvendor_data.json�
vendordatazvendor_data2.json�vendordata2znetwork_data.json�networkdata)r[r�	load_json)r7�files��load_json_anytyper.r
r�	datafiles�s,�	����z%BaseReader.read_v2.<locals>.datafilesr�)r~r7NFz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %sTzMissing mandatory path: %s�Failed to process path %s: %sr9�random_seedz.Badly formatted metadata random_seed entry: %sr�rDz#Failed to read provided file %s: %sr
ruz(Failed to read network configuration: %s�meta�dsmodezec2-metadatazNo '%s' entry in metadata)�	functools�partialrr��dictrh�strrpr-r[rTr_�IOErrorrHrIr&rfr�base64�	b64decode�
ValueError�	TypeErrorr,r{�KeyErrorrb�
KEY_COPIES)r.r��results�datar/rD�required�
translator�foundrlr9r�r��metadata_filesrx�net_item�content�
target_key�
source_key�is_requiredr
r�r�read_v2�s�	�!�����

���������
��������	�
�zBaseReader.read_v2N�F)
r'r(r)rV�abc�abstractmethodr[r_rarbrpr{r�r
r
r
rrS�s



	rS)�	metaclasscsFeZdZ�fdd�Zdd�Zddd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ConfigDriveReadercstt|��|�d|_dSr)�superr�rV�	_versionsrU��	__class__r
rrVfs
zConfigDriveReader.__init__cGs|gt|�}tjj|�Sr)rhrCrD�join)r.rYrZ�
componentsr
r
rr[jszConfigDriveReader._path_joinFcCstj||d�S)Nru)r�	load_filer]r
r
rr_nszConfigDriveReader._path_readcs@|jdur|�|jd���fdd�t���D�}t|�|_|jS)Nrtcs$g|]}tj�tj����r|�qSr
)rCrD�isdirr��rc�d�rDr
rrets��z?ConfigDriveReader._fetch_available_versions.<locals>.<listcomp>)r�r[rTrC�listdir�sorted)r.r�r
r�rraqs

�
z+ConfigDriveReader._fetch_available_versionsc
Cs`|�|jddd�}tj�|�siSz	t�|�|��WSty/}z	t	d||f�|�d}~ww)Nr	rzmeta-data.jsonr�)
r[rTrCrDrErr�r_rfr)r.rDrlr
r
rrb|s
�
����z$ConfigDriveReader._read_ec2_metadatacCs�i}t��D]}|�|j|�}tj�|�r|||<qt|�dkr'td|j��i}t�	�D]O\}\}}}||vru||}z|�
|�}WntyV}	ztd|�|	�d}	~	wwz||�||<Wq-t
yt}	z	td||	f�|	�d}	~	wwt�|�||<q-|d}
|d}|�d|
�}
|
r�|
��}d	d
�|D�|d<d|vr�|d|d<d|d
�}
d|vr�|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�rrr6cSs"g|]
}t|�r|�d�s|�qS)�#)rrrB)rc�liner
r
rre�s���z-ConfigDriveReader.read_v1.<locals>.<listcomp>rr5)r7r9r�z	user-datarr~r�)�FILES_V1�keysr[rTrCrDrErrr&r-r_r�rrf�copy�deepcopyr,�
splitlines)r.r�r/rD�md�keyr��default�contentsrl�keydatar�linesr�r
r
r�read_v1�s^���
����
��zConfigDriveReader.read_v1r�)
r'r(r)rVr[r_rarbr��
__classcell__r
r
r�rr�es
r�cs@eZdZd�fdd�	Zdd�Zddd	�Zd
d�Zdd
�Z�ZS)�MetadataReaderN�cs4tt|��|�||_t|�|_t|�|_d|_dSr)	r�r�rV�ssl_details�float�timeout�int�retriesr�)r.�base_urlr�r�r�r�r
rrV�s



zMetadataReader.__init__cCsb|jdur|jSg}|�|jd�}|j|dd�}|��D]}|��}|s%q|�|�q||_|jS)NrtTru)r�r[rTr_r��striprO)r.r��version_pathr�r�r
r
rra�s
z(MetadataReader._fetch_available_versionsFcCs6dd�}tj||j|j|j|d�}|r|j��S|jS)Nc	Ss8zt|j�}|dkr
WdSWdSttfyYdSw)Ni�FT)r��coder�r�)�
_request_args�causer�r
r
r�should_retry_cb�s
���z2MetadataReader._path_read.<locals>.should_retry_cb)r�r�r��exception_cb)r�readurlr�r�r�r�r^)r.rDr^r��responser
r
rr_�s
�
zMetadataReader._path_readcGstj|g|�R�Sr)r�combine_urlrXr
r
rr[szMetadataReader._path_joincCstj|j|j|jd�S)N)r�r�r�)r	�get_instance_metadatar�r�r�r`r
r
rrbs
�z!MetadataReader._read_ec2_metadata)Nr�r�r�)	r'r(r)rVrar_r[rbr�r
r
r�rr��s
r�c
s�|durdSgd�gd�d��|�dg�}|�dg�}|�dg�}g}i�d}d	}g}|D�]��g}	t�fd
d����D��}
d�vrI�d|
d<d}��d
�r]��d
���}|��d<|
�d�|�d�dd�}�fdd�|D�D]�}
t�fdd�|
��D��}|
ddkr�|�ddi�nH|
ddkr�|�ddi�n:|
ddvr�|�d|
di�n*|
ddvr�|�d|
�d�d��n|
ddvr�|
�ddi�|�d |
�d�d��|
dd!vr�|
�dd"i�|
dd#kr�d"|d#<|
dd$kr�d"|d$<|	�|�qt|
�d%|	i��dd&v�rXi}|�r||d'<���D]\}}|d(k�r&�q|�d)��r3|�||i��q||}|d*7}|�|
d+d,t��d(�f�|
�||d-��||d<nZ�dd.v�r�d/�d0�d1f}|
�|�d1�d2d3��|�|
d0d,�d0f�|�|
dd4�d1�d0f�|��d2|d5��n�dt	v�r�t
�d6�d�|
�d7|d8��|�|
�|�|d<q-d9d�|D�}|�s�|�rE|du�r�t�
�}���D]\}}|�d��r�q�|�d:�|v�r�||d:|d<�q�|D]"}|�d'�}|�std;|��||v�rtd<|��|||d<�q�|D]'\}
}�}t|ttf��r9��fd=d�|D�|
|<�q��|d|
|<�qt��}|�re|D]}
|
d|v�rc||
d|
d'<d>|
d<�qN|D]}|}
|
�dd?i�|�|
��qgd*|d@�S)Aa)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 superflous keys from the network_config yaml.
    N)r/�type�mac_address�subnets�params�mtu)r��address�netmask�	broadcast�metric�gateway�pointopoint�scope�dns_nameservers�
dns_search�routes)�physical�subnet�links�networks�serviceszbond%drc3�(�|]\}}|�dvr||fVqdS)r�Nr
�rc�krd��
valid_keysr
r�	<genexpr>P���
�z#convert_net_json.<locals>.<genexpr>r/�ethernet_mac_address�idr�)r/�macr�r�cs g|]}|d�dkr|�qS)�linkr�r
)rcrQ)r�r
rrefs z$convert_net_json.<locals>.<listcomp>c3r�)r�Nr
r�r�r
rr�gr��	ipv4_dhcp�dhcp4�	ipv6_dhcp�dhcp6)�
ipv6_slaaczipv6_dhcpv6-stateless�ipv6_dhcpv6-stateful)�ipv4�staticr��
ip_address)r�r�)�ipv6�static6z	accept-raFr)r�r�Tr�r�r�)�bondr��
bond_linksrr5�bond_interfacesz%s)r�r/)�vlanz%s.%s�	vlan_link�vlan_id�vlan_mac_address)r/rr�z%%s.%s)r�r/z9Unknown network_data link type (%s); treating as physicalr�)r�r�cSs&g|]}|�d�dkrd|vr|�qS)r�r�r/)r,r�r
r
rre�s���r�z#No mac_address or name entry for %sz"Unable to find a system nic for %scsg|]
}��|d�qS)r/r
)rc�target)�fmt�link_id_infor
rre�s��
infiniband�
nameserver)r7�config)r,r�r-�lower�updaterOrBr�r��KNOWN_PHYSICAL_TYPESrH�warningr�get_interfaces_by_macr��
isinstancerh�tuple�get_ib_hwaddrs_by_interface)�network_json�
known_macsr�r�r��link_updates�
bond_name_fmt�bond_numberr
r��cfg�
link_mac_addr�curinfo�networkr�r�r�rd�	link_namer/�
need_names�_link_id�infor�r�r��targets�ib_known_hwaddrs�servicer
)r	r�r
r�r�convert_net_jsons�
�
������
���
����
�
�

��
r&)NN)*r�r�r�r�rC�	cloudinitr�loggingrrrrr�cloudinit.sourcesr�cloudinit.sources.helpersr	�	getLoggerr'rHr�r�r�rj�	OS_FOLSOM�
OS_GRIZZLY�	OS_HAVANA�
OS_LIBERTY�
OS_NEWTON_ONE�
OS_NEWTON_TWO�OS_OCATA�OS_ROCKYrirr�r&r*�ABCMetarSr�r�r&r
r
r
r�<module>sR

��LEo: