Current File : //lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyo
�
oB�]c@s�dZddlmZddlmZddlZdgZeje�Z	dZ
d�Zd�Zd	�Z
d
�Zddd
�ZdS(s�
LXD
---
**Summary:** configure lxd with ``lxd init`` and optionally lxd-bridge

This module configures lxd with user specified options using ``lxd init``.
If lxd is not present on the system but lxd configuration is provided, then
lxd will be installed. If the selected storage backend is zfs, then zfs will
be installed if missing. If network bridge configuration is provided, then
lxd-bridge will be configured accordingly.

**Internal name:** ``cc_lxd``

**Module frequency:** per instance

**Supported distros:** ubuntu

**Config keys**::

    lxd:
        init:
            network_address: <ip addr>
            network_port: <port>
            storage_backend: <zfs/dir>
            storage_create_device: <dev>
            storage_create_loop: <size>
            storage_pool: <name>
            trust_password: <password>
        bridge:
            mode: <new, existing or none>
            name: <name>
            ipv4_address: <ip addr>
            ipv4_netmask: <cidr>
            ipv4_dhcp_first: <ip addr>
            ipv4_dhcp_last: <ip addr>
            ipv4_dhcp_leases: <size>
            ipv4_nat: <bool>
            ipv6_address: <ip addr>
            ipv6_netmask: <cidr>
            ipv6_nat: <bool>
            domain: <domain>
i����(tlog(tutilNtubuntutlxdbr0cCs�|jd�}|s)|jd|�dSt|t�sR|jdt|��dS|jd�}t|t�s�|jdt|��i}n|jdi�}t|t�s�|jdt|��i}ng}tjd�s�|jd�n|jd�d	kr)tjd	�r)|jd
�nt	|�ryy|j
j|�Wqytjk
ru}	|jd||	�dSXn|r
d*}
tj
dddg�dddg}xP|
D]H}|j|�r�|jd|jdd�t||�fg�q�q�Wtj
|�nd}
|r�|jdt�}tjjd�rtj|
�rt|�}yd|jd|
�djg|j�D]\}}d||f^q�d}tj
dg|�Wn%tk
r�tj|d|
�nXtjd�|jd�tj
d dd!g�q�t|�\}}td"|d#t|�d$t|�d%t|��|r�|jd&d'j|��t|�n|r�|jd(d'j|��t|�q�n|r�td)|
��ndS(+Ntlxds8Skipping module named %s, not present or disabled by cfgs-lxd config must be a dictionary. found a '%s'tinits2lxd/init config must be a dictionary. found a '%s'tbridges4lxd/bridge config must be a dictionary. found a '%s'tstorage_backendtzfsszfsutils-linuxs!failed to install packages %s: %stnetwork_addresstnetwork_porttstorage_create_devicetstorage_create_looptstorage_poolttrust_passwordt	waitreadys
--timeout=300s--autos--%s=%st_t-sdebconf-communicatetnames/etc/default/lxd-bridgesSetting lxd debconf via s
s	set %s %ssFailed to run '%s' for lxd withs Running dpkg-reconfigure for lxdsdpkg-reconfigures--frontend=noninteractivetnet_nametdid_inittcreatetattachsCreating lxd bridge: %st s!Setting up default lxd bridge: %ss*Unable to configure lxd bridge without %s.(R	R
RRRR
R( tgettdebugt
isinstancetdicttwarningttypeRtwhichtappendtlentdistrotinstall_packagestProcessExecutionErrortsubptextendtreplacetstrt_DEFAULT_NETWORK_NAMEtostpathtexiststbridge_to_debconftjointitemst	Exceptiontlogexctdel_filet
bridge_to_cmdtmaybe_cleanup_defaulttboolt_lxctRuntimeError(RtcfgtcloudRtargstlxd_cfgtinit_cfgt
bridge_cfgtpackagestexct	init_keystcmdtkt
dconf_commRtdebconftvtdatat
cmd_createt
cmd_attach((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pythandle=s�		
	
		
	%
	.	3



	
	cCs�i}|jd�dkr2d|d<d|d<n�|jd�dkrqd|d<d|d	<|jd
�|d<nn|jd�dkr�d|d<|jd
�r�|jd
�|d<n|jd�rFd|d
<|jd�|d<|jd�|d<|jd�|d<|jd�|d<|jd�|d<|jdd�|d<n|jd�r�d|d<|jd�|d<|jd�|d<|jdd�|d<n|jd �r�|jd �|d!<q�ntd"|jd���|S(#Ntmodetnonetfalseslxd/setup-bridgetslxd/bridge-nametexistingttrueslxd/use-existing-bridgeRtnewtipv4_addressslxd/bridge-ipv4slxd/bridge-ipv4-addresstipv4_netmaskslxd/bridge-ipv4-netmasktipv4_dhcp_firstslxd/bridge-ipv4-dhcp-firsttipv4_dhcp_lastslxd/bridge-ipv4-dhcp-lasttipv4_dhcp_leasesslxd/bridge-ipv4-dhcp-leasestipv4_natslxd/bridge-ipv4-nattipv6_addressslxd/bridge-ipv6slxd/bridge-ipv6-addresstipv6_netmaskslxd/bridge-ipv6-netmasktipv6_natslxd/bridge-ipv6-nattdomainslxd/bridge-domainsinvalid bridge mode "%s"(RR/(R<RC((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyR,�s:






cCs-|jd�dkrd S|jdt�}g}dd|ddg}|jd�dkred|fS|jd�d	kr�td
|jd���ndd|g}|jd�rk|jd
�rk|jd|jd�|jd
�f�|jdd�dkr|jd�n|jd�rx|jd�rxd|jd�|jd�f}|jd|�qxn
|jd�|jd�r�|jd�r�|jd|jd�|jd�f�|jdd�dkr�|jd�q�n
|jd�|jd�r#|jd|jd��n||fS(!NRIRJRtnetworksattach-profiletdefaultteth0RMROsinvalid bridge mode "%s"RRPRQsipv4.address=%s/%sRURNs
ipv4.nat=trueRRRSs%s-%ssipv4.dhcp.ranges=%ssipv4.address=noneRVRWsipv6.address=%s/%sRXRKs
ipv6.nat=truesipv6.address=noneRYs
dns.domain=%s(NN(RtNoneR(R/R(R<tbridge_nameRFRGt
dhcp_range((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyR2�sB	
	
	
cCsdidd6tjjdd�d6tjjdd�d6}tjdgt|�dgd	|�dS(
NtCtLC_ALLtHOMEs/roottUSERtroottlxcs
--force-localt
update_env(R)tenvironRRR$tlist(R@tenv((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyR5s
R[R\c
Cs-|tks|rdSd}d}|r�d}y*tdd|g�tj|||�Wq�tjk
r�}	|	jdkr�|	�ntj|||�q�Xn|r)d}y3td	d
d||g�tj||||�Wq)tjk
r%}	|	jdkr|	�ntj||||�q)XndS(s�Newer versions of lxc (3.0.1+) create a lxdbr0 network when
    'lxd init --auto' is run.  Older versions did not.

    By removing ay that lxd-init created, we simply leave the add/attach
    code in-tact.

    https://github.com/lxc/lxd/issues/4649Ns"failed. Assuming it did not exist.s
succeeded.sDeletion of lxd network '%s' %sRZtdeleteis+Removal of device '%s' from profile '%s' %stprofiletdevicetremove(R(R5tLOGRRR#t	exit_code(
RRRRRktnic_nametfail_assume_enoentt	succeededtmsgte((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyR3s,			(t__doc__t	cloudinitRtloggingRR)tdistrost	getLoggert__name__RnR(RHR,R2R5R3(((s;/usr/lib/python2.7/site-packages/cloudinit/config/cc_lxd.pyt<module>0s		f	2	2