�
܍~cJA � �T � d Z ddlZddlZddlZddlmZmZ ddlmZ ddl m
Z
mZmZm
Z
mZmZ ddlZddlmZ ddlmZ ddlmZ dd lmZ dd
lmZmZmZmZ ddlmZ ej e!� � Z"dZ#d
Z$dZ%ddddddd�Z&de'fd�Z( d4de
ee' dee'e
f fd�Z) G d� de� � Z* G d� de� � Z+ G d� de� � Z,de'de-fd�Z. G d� d ej/ � � Z0de1fd!�Z2 d5d#ej3 d$e'd%e1fd&�Z4 d5d#ej3 d$e'd%e1dej5 fd'�Z6 G d(� d)e� � Z7 G d*� d+� � Z8e$e7j9 fd,e'd-e7de-fd.�Z:e0ej; ffgZ<d/� Z=e!d0k rUddl>Z>d1Z? e>j@ e?�2� � ZAeA�B � � eC ejD e:e7j9 �3� � � � � � dS dS )6a� Datasource for LXD, reads /dev/lxd/sock representation of instance data.
Notes:
* This datasource replaces previous NoCloud datasource for LXD.
* Older LXD images may not have updates for cloud-init so NoCloud may
still be detected on those images.
* Detect LXD datasource when /dev/lxd/sock is an active socket file.
* Info on dev-lxd API: https://linuxcontainers.org/lxd/docs/master/dev-lxd
� N)�Flag�auto)�JSONDecodeError)�Any�Dict�List�Optional�Union�cast)�HTTPAdapter)�HTTPConnection)�HTTPConnectionPool)�log)�sources�subp�
url_helper�util)�find_fallback_nicz
/dev/lxd/sockz1.0z
http://lxd� user-data�network-config�vendor-data)zcloud-init.user-datazcloud-init.network-configzcloud-init.vendor-data�user.user-datazuser.network-config�user.vendor-data�returnc �f � d} t j d� � r� t j dg� � \ }}n9# t j $ r'}t � d|� � | cY d }~S d }~ww xY w|� � � dv r1t
j � � d d }|dk rdS |d k rd
S dS | S )N�eth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)�kvm�qemu�uname� �ppc64le�enp0s5�s390x�enc9�enp5s0)r �which�ProcessExecutionError�LOG�warning�stripr �system_info)�default_name� virt_type�_�err�archs �A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.py�_get_fallback_interface_namer2 . s� � ��L��z�'�(�(� � ��9�&;�%<�=�=�L�I�q�q���)� � � ��K�K�5��
�
�
�
�����������
���� �?�?��� !
�
�
� �#�%�%�g�.�q�1�D��y� � ��x������v��x��s �1 �A'� A"�A'�"A'�nicsc �� � t � � }|rt � d|� � n)t � � }t � d|� � dd|ddd�gd�gd �S )
zCReturn network config V1 dict representing instance network config.zCLXD datasource generating network from discovered active device: %szVLXD datasource generating network from systemd-detect-virt platform default device: %s� �physical�dhcpr )�type�control)r8 �name�subnets)�version�config)r r( �debugr2 )r3 �primary_nics r1 �generate_network_configr@ H s� � � $�%�%�K��
�� � �
��
�
�
�
� 3�4�4��� � �
+��
�
�
� � #�#�%+��?�?�@�
�
�
� � � � c �$ � � e Zd Z� fd�Zd� Z� xZS )�SocketHTTPConnectionc �X �� t � � � d� � || _ d S �N� localhost)�super�__init__�socket_path��selfrI � __class__s �r1 rH zSocketHTTPConnection.__init__o s) �� �
������%�%�%�&����rA c � � t j t j t j � � | _ | j � | j � � d S �N)�socket�AF_UNIX�SOCK_STREAM�sock�connectrI �rK s r1 rS zSocketHTTPConnection.connects s9 � ��M�&�.�&�2D�E�E�� �� ���$�*�+�+�+�+�+rA )�__name__�
__module__�__qualname__rH rS �
__classcell__�rL s @r1 rC rC n sG �� � � � � �'� '� '� '� '�,� ,� ,� ,� ,� ,� ,rA rC c �$ � � e Zd Z� fd�Zd� Z� xZS )�SocketConnectionPoolc �X �� || _ t � � � d� � d S rE )rI rG rH rJ s �r1 rH zSocketConnectionPool.__init__y s) �� �&���
������%�%�%�%�%rA c �* � t | j � � S rN )rC rI rT s r1 � _new_connzSocketConnectionPool._new_conn} s � �#�D�$4�5�5�5rA )rU rV rW rH r^ rX rY s @r1 r[ r[ x sG �� � � � � �&� &� &� &� &�6� 6� 6� 6� 6� 6� 6rA r[ c � � e Zd Zdd�ZdS )�LXDSocketAdapterNc �* � t t � � S rN )r[ �LXD_SOCKET_PATH)rK �url�proxiess r1 �get_connectionzLXDSocketAdapter.get_connection� s � �#�O�4�4�4rA rN )rU rV rW re � rA r1 r` r` � s( � � � � � �5� 5� 5� 5� 5� 5rA r` �
metadata_typec �6 � t |t � � r|S |�i S t j |� � }n<# t $ r/}t j d� | |�� � � � |�d}~ww xY w|�)t j d� | |�� � � � �|S )a6 Convert raw instance data from str, bytes, YAML to dict
:param metadata_type: string, one of as: meta-data, vendor-data, user-data
network-config
:param metadata_value: str, bytes or dict representing or instance-data.
:raises: InvalidMetaDataError on invalid instance-data content.
NzAInvalid {md_type}. Expected str, bytes or dict but found: {value})�md_type�valuez:Invalid {md_type} format. Expected YAML but found: {value})�
isinstance�dictr � load_yaml�AttributeErrorr �InvalidMetaDataException�format)rg �metadata_value�parsed_metadata�excs r1 �_raw_instance_data_to_dictrt � s� � � �.�$�'�'� ������ ���.��8�8����� � � ��.�
��v�m�>�v�J�J�
�
� � ���������
���.�
��v�m�>�v�J�J�
�
�
� �s �2 �
A+�*A&�&A+c �� � � e Zd ZU dZej Zeee f e
d< |