Your IP : 216.73.217.13


Current Path : /usr/lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/
Upload File :
Current File : //usr/lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/openstack.cpython-38.pyc

U

�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_configcCs|S�N���xrr�E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.py�<lambda>�r��meta_js�authorized_keyscCs|Srrr
rrrrr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostnameZhostnameF)�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__rrrrrQsrc@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�devicerrr�_ec2_name_to_deviceVs
zSourceMixin._ec2_name_to_devicecCs$d}|jdkrd}t�|j�|��S)NZpublic_keys��public-keys)�versionrZnormalize_pubkey_data�metadatar)rrrrr�get_public_ssh_keys_s
zSourceMixin.get_public_ssh_keyscCsRd}z2d|}|dkrd|}t�|�}|r4|d}Wntjk
rLYnX|S)NzLABEL=%sZswapzTYPE=%sr)rZfind_devs_withrZProcessExecutionError)rrr ZcriteriaZdev_entriesrrr�_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 Zremappedrrr�_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 �nrrr�device_name_to_device�s2




z!SourceMixin.device_name_to_deviceN)rrrr!r&r'r0r6rrrrrUs
	
rc@sheZdZdd�Zejdd��Zejddd��Zejdd	��Zejd
d��Z	dd
�Z
ddd�Zdd�ZdS)�
BaseReadercCs
||_dSr)�	base_path�rr8rrr�__init__�szBaseReader.__init__cGsdSrr�r�base�add_onsrrr�
_path_join�szBaseReader._path_joinFcCsdSrr�rr+�decoderrr�
_path_read�szBaseReader._path_readcCsdSrr�rrrr�_fetch_available_versions�sz$BaseReader._fetch_available_versionscCsdSrrrBrrr�_read_ec2_metadata�szBaseReader._read_ec2_metadatac
Cs�z|��}Wn6tk
rB}zt�d|j|�g}W5d}~XYnXdd�ttt��D�}t}|D]}||krpqb|}qzqbt�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)	rC�	Exceptionr.r/r8�reversed�list�OS_VERSIONS�	OS_LATEST)rZversions_available�eZ	supportedZselected_versionZpotential_versionrrr�_find_working_version�s,��z BaseReader._find_working_versioncCs\|�dd��d�}|�d�}dd�|D�}|s:td|��|j|jdf|��}|j||d�S)	NZcontent_pathrr(cSsg|]}t|�r|�qSr)�len)rE�prrrrG�sz1BaseReader._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_piecesrrr�_read_content_path�s
zBaseReader._read_content_pathcs�tjtjtttfd����fdd�}ddd�}|����}|��D]�\}\}}}��	�j
|�}d}d}z��|�}WnDtk
r�}	z&|s�t
�d	||	�nt
�d
||	�W5d}	~	XYnXd}|r�|s�td|��|�r"|�r"z||�}Wn6tk
�r }	ztd
||	f�|	�W5d}	~	XYnX|rB|||<qB|d}
d|
k�r�|
d}zt�|�|
d<Wn6ttfk
�r�}	ztd|	�|	�W5d}	~	XYnXi}|
�dg�}
|
D]f}d|k�r��q�|d}z��|�||<Wn6tk
�r
}	ztd||	f�|	�W5d}	~	XYnX�q�||d<|
�dd�}|�rxz�j|dd�}||d<Wn2tk
�rv}	ztd|	�|	�W5d}	~	XYnXz|
dd|d<Wntk
�r�YnX���|d<tD]@\}}}|�r�||
k�r�td|��||
k�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|Srrr
rrrr�rz7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>�userdatazvendor_data.jsonZ
vendordatazvendor_data2.jsonZvendordata2znetwork_data.jsonZnetworkdata)r>r�	load_json)r$�files�Zload_json_anytyperrr�	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+Zrequired�
translator�foundrMr%r^rYZmetadata_filesrUZnet_item�contentZ
target_keyZ
source_keyZis_requiredrrZr�read_v2�s�	�!���
��

��

����
zBaseReader.read_v2N)F)F)
rrrr:�abc�abstractmethodr>rArCrDrNrVrprrrrr7�s



	r7)�	metaclasscsFeZdZ�fdd�Zdd�Zddd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ConfigDriveReadercstt|��|�d|_dSr)�superrtr:�	_versionsr9��	__class__rrr:fszConfigDriveReader.__init__cGs|gt|�}tjj|�Sr)rJr*r+�join)rr<r=Z
componentsrrrr>jszConfigDriveReader._path_joinFcCstj||d�S)NrR)rZ	load_filer?rrrrAnszConfigDriveReader._path_readcs@|jdkr:|�|jd���fdd�t���D�}t|�|_|jS)NrQcs$g|]}tj�tj����r|�qSr)r*r+�isdirry�rE�d�r+rrrGts�z?ConfigDriveReader._fetch_available_versions.<locals>.<listcomp>)rvr>r8r*�listdir�sorted)rrnrr}rrCqs

�
z+ConfigDriveReader._fetch_available_versionsc
Csn|�|jddd�}tj�|�s"iSzt�|�|��WStk
rh}zt	d||f�|�W5d}~XYnXdS)Nr	rzmeta-data.jsonr])
r>r8r*r+r,rrXrArHr)rr+rMrrrrD|s �
��z$ConfigDriveReader._read_ec2_metadatacCs�i}t��D]&}|�|j|�}tj�|�r|||<qt|�dkrNtd|j��i}t�	�D]�\}\}}}||k�r||}z|�
|�}Wn0tk
r�}	ztd|�|	�W5d}	~	XYnXz||�||<Wn4t
k
r�}	ztd||	f�|	�W5d}	~	XYnXqZt�|�||<qZ|d}
|d}|�d|
�}
|
�rN|
��}d	d
�|D�|d<d|k�rd|d|d<d|d
�}
d|k�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�linerrrrG�s
�z-ConfigDriveReader.read_v1.<locals>.<listcomp>rr")r$r%r`z	user-datarrWrY)�FILES_V1�keysr>r8r*r+r,rOrrrArerrH�copy�deepcopyr�
splitlines)rrnrr+Zmd�keyrm�default�contentsrMZkeydatar�linesrkrrr�read_v1�sT

 
���

�
zConfigDriveReader.read_v1)F)
rrrr:r>rArCrDr��
__classcell__rrrwrrtes
rtcs@eZdZd�fdd�	Zdd�Zddd	�Zd
d�Zdd
�Z�ZS)�MetadataReaderN�cs4tt|��|�||_t|�|_t|�|_d|_dSr)	rur�r:�ssl_details�float�timeout�int�retriesrv)rZbase_urlr�r�r�rwrrr:�s


zMetadataReader.__init__cCsb|jdk	r|jSg}|�|jd�}|j|dd�}|��D]}|��}|sJq8|�|�q8||_|jS)NrQTrR)rvr>r8rAr��stripr3)rrnZversion_pathror�rrrrC�s
z(MetadataReader._fetch_available_versionsFcCs:dd�}tj||j|j|j|d�}|r0|j��S|jSdS)Nc	Ss:zt|j�}|dkrWdSWnttfk
r4YnXdS)Ni�FT)r��coderhrg)Z
_request_args�causer�rrr�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�ZresponserrrrA�s
�
zMetadataReader._path_readcGstj|f|��Sr)rZcombine_urlr;rrrr>szMetadataReader._path_joincCstj|j|j|jd�S)N)r�r�r�)r	Zget_instance_metadatar�r�r�rBrrrrDs
�z!MetadataReader._read_ec2_metadata)Nr�r�)F)	rrrr:rCrAr>rDr�rrrwrr��s

r�cs*|dkrdSddddddgddd	d
ddd
ddddgd��|�dg�}|�dg�}|�dg�}g}i�d}d}g}|D�]4�g}	t�fdd����D��}
d�kr��d|
d<d}��d�rԈ�d���}|��d<|
�d�|�d�dd�}�fdd�|D�D�](}
t�fdd�|
��D��}|
dd k�r@|�dd!i�n�|
dd"k�r^|�dd#i�nz|
dd$k�r�|�d|
di�nX|
dd%k�r�|�d&|
�d'�d(��n2|
dd)k�r�|
�d*d+i�|�d,|
�d'�d(��|
dd-k�r�|
�d*d.i�|
dd/k�r
d.|d/<|
dd0k�r d.|d0<|	�|��q|
�d|	i��dd1k�r�i}|�r\||d<���D]4\}}|d2k�r|�qdn|�d3��rd|�||i��qd||}|d47}|�|
d5d6t��d2�f�|
�||d7��||d<n��dd8k�rfd9�d:�d;f}|
�|�d;�d<d=��|�|
d:d6�d:f�|�|
dd>�d;�d:f�|��d<|d?��n.�dt	k�r�t
�d@�d�|
�dA|dB��|�|
�|�|d<qtdCd�|D�}|�s�|�r�|dk�r�t�
�}���D]:\}}|�d��r��q�|�dD�|k�r�||dD|d<�q�|D]D}|�d�}|�s@tdE|��||k�rVtdF|��|||d<�q |D]L\}
}�}t|ttf��r���fdGd�|D�|
|<n��|d|
|<�qjt��}|�r�|D],}
|
d|k�r�||
d|
d<dH|
d<�q�|D]"}|}
|
�ddIi�|�|
��q�d4|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 superflous keys from the network_config yaml.
    Nr�type�mac_address�subnets�paramsZmtu�addressZnetmaskZ	broadcastZmetricZgatewayZpointopointZscopeZdns_nameserversZ
dns_searchZroutes)�physical�subnet�links�networks�serviceszbond%drc3s&|]\}}|�dkr||fVqdS)r�Nr�rE�krF��
valid_keysrr�	<genexpr>Psz#convert_net_json.<locals>.<genexpr>Zethernet_mac_address�id)r�macr�r�cs g|]}|d�dkr|�qS)�linkr�r)rEr5)r�rrrGfsz$convert_net_json.<locals>.<listcomp>c3s&|]\}}|�dkr||fVqdS)r�Nrr�r�rrr�gsZ	ipv4_dhcpZdhcp4�	ipv6_dhcpZdhcp6)Z
ipv6_slaaczipv6_dhcpv6-stateless�ipv6_dhcpv6-stateful)�ipv4�staticr�Z
ip_address)r�r�)�ipv6�static6z	accept-raFr�)r�r�Tr�r�)�bondZ
bond_linksr�r"Zbond_interfacesz%s)r�r)Zvlanz%s.%sZ	vlan_link�vlan_idZvlan_mac_address)rr�r�z%%s.%s)r�rz9Unknown network_data link type (%s); treating as physicalr�)r�r�cSs&g|]}|�d�dkrd|kr|�qS)r�r�r)rr{rrrrG�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_inforrrG�sZ
infinibandZ
nameserver)r$�config)rrcr�lower�updater3r)r�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_addrZcurinfoZnetworkr�r�r�rFZ	link_namerZ
need_namesZ_link_id�infor|r�r�ZtargetsZib_known_hwaddrs�servicer)r�r�r�r�r�convert_net_jsons2�	��
�
������
��
����
�


�r�)NN)*rqrfr�rar*Z	cloudinitrZloggingrrrrrZcloudinit.sourcesrZcloudinit.sources.helpersr	Z	getLoggerrr.rXr�rjrLZ	OS_FOLSOMZ
OS_GRIZZLYZ	OS_HAVANAZ
OS_LIBERTYZ
OS_NEWTON_ONEZ
OS_NEWTON_TWOZOS_OCATAZOS_ROCKYrKr�rerr�ABCMetar7rtr�r�rrrr�<module>	sP

��LEo: