�
�f7D � �b � d Z ddlZddlZddlZddlZddlZddlmZmZ ddl m
Z
ddlmZm
Z
mZmZmZmZmZ ddlZddlmZ ddlmZ ddlmZ dd lmZmZmZmZmZ dd
l m!Z! ejD e#� Z$dZ%dZ&d
Z'ddddddd�Z(de)fd�Z* d2deee) de
e)ef fd�Z+ G d� de� Z, G d� de� Z- G d� de� Z.de)de/fd�Z0 G d� dejb � Z2de3fd �Z4 d3d!ejj d"e)d#e3fd$�Z6 d3d!ejj d"e)d#e3dejn fd%�Z8 G d&� d'e� Z9 G d(� d)� Z:e&e9jv fd*e)d+e9de/fd,�Z<e2ejz ffgZ>d-� Z?e#d.k( rSddl@Z@d/ZA e@j� eA�0� ZCeCj� � eE ej� e<e9jv �1� � � yy)4a� 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://documentation.ubuntu.com/lxd/en/latest/dev-lxd/
� N)�Flag�auto)�JSONDecodeError)�Any�Dict�List�Optional�Tuple�Union�cast)�HTTPAdapter)�HTTPConnection)�HTTPConnectionPool)�
atomic_helper�sources�subp�
url_helper�util)�find_fallback_nicz
/dev/lxd/sockz1.0z
http://lxd� user-data�network-config�vendor-data)�cloud-init.user-datazcloud-init.network-config�cloud-init.vendor-data�user.user-datazuser.network-config�user.vendor-data�returnc �J � d} t j d� rS t j dg� \ }}|j � dv r't
j � d d }|dk( ry|d k( ry
y| S # t j $ r"}t j d|� | cY d }~S d }~ww xY w)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_namer5 / s� � ��L��z�z�'�(� ��9�9�&;�%<�=�L�I�q� �?�?�� !
�
� �#�#�%�g�.�q�1�D��y� ����������% �)�)� ��K�K�5��
�
���
�s �A- �-B"� B�B"�B"�nicsc � � t � }|rt j d|� n t � }t j 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)r; �name�subnets)�version�config)r r+ �debugr5 )r6 �primary_nics r4 �generate_network_configrC I sm � � $�%�K��� � �
��
� 3�4��� � �
+��
� � #�#�%+��?�@�
�
� � � c �$ � � e Zd Z� fd�Zd� Z� xZS )�SocketHTTPConnectionc �2 �� t �| � d� || _ y �N� localhost)�super�__init__�socket_path��selfrL � __class__s �r4 rK zSocketHTTPConnection.__init__p s �� �
����%�&��rD c � � t j t j t j � | _ | j j | j
� y �N)�socket�AF_UNIX�SOCK_STREAM�sock�connectrL �rN s r4 rV zSocketHTTPConnection.connectt s6 � ��M�M�&�.�.�&�2D�2D�E�� �� � ���$�*�*�+rD )�__name__�
__module__�__qualname__rK rV �
__classcell__�rO s @r4 rF rF o s
�� �'�,rD rF c �$ � � e Zd Z� fd�Zd� Z� xZS )�SocketConnectionPoolc �2 �� || _ t �| � d� y rH )rL rJ rK rM s �r4 rK zSocketConnectionPool.__init__z s �� �&���
����%rD c �, � t | j � S rQ )rF rL rW s r4 � _new_connzSocketConnectionPool._new_conn~ s � �#�D�$4�$4�5�5rD )rX rY rZ rK ra r[ r\ s @r4 r^ r^ y s
�� �&�6rD r^ c � � e Zd Zdd�Zy)�LXDSocketAdapterNc � � t t � S rQ )r^ �LXD_SOCKET_PATH)rN �url�proxiess r4 �get_connectionzLXDSocketAdapter.get_connection� s
� �#�O�4�4rD rQ )rX rY rZ rh � rD r4 rc rc � s � �5rD rc �
metadata_typec � � t |t � r|S |�i S t j |� }|�&t j dj | |�� � �|S # t $ r,}t j dj | |�� � |�d}~ww xY w)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)rj �metadata_value�parsed_metadata�excs r4 �_raw_instance_data_to_dictrw � s� � � �.�$�'������ ���.�.��8�� ���.�.�
��v�m�>�v�J�
�
� ��� � ��.�.�
��v�m�>�v�J�
� � ���s �A � B� 'B�Bc � � � e Zd ZU dZej
Zeee f e
d< |