
    x[h5              
          % S r SSKrSSKrSSKJrJr  SSKrSSKJrJ	r	  SSK
Jr  SSKJr  SSKJr  SSKJr  \R$                  " \5      rS	rS
S/\S/S.r\\S'   S rS rS\S\S\S\SS4
S jrS rS rS r SS jr S\!S\S\\   4S jr"g)z>LXD: configure lxd with ``lxd init`` and optionally lxd-bridge    N)ListTuple)subputil)Cloud)Config)
MetaSchema)PER_INSTANCElxdbr0cc_lxdubuntulxd)iddistros	frequencyactivate_by_schema_keysmetac                 \   / n[        U [        5      (       d(  UR                  S[        U 5      R                   S35        [        U[        5      (       d(  UR                  S[        U5      R                   S35        [        U[
        5      (       d(  UR                  S[        U5      R                   S35        U(       aK  U (       d  U(       a=  U (       a  S/O/ nXA(       a  S/O/ -  nUR                  SSR                  U5       35        U(       a  [        S	R                  U5      5      eg
)z}Validate user-provided lxd network and bridge config option values.

@raises: ValueError describing invalid values provided.
z/lxd.init config must be a dictionary. found a ''z1lxd.bridge config must be a dictionary. found a 'z.lxd.preseed config must be a string. found a 'zlxd.initz
lxd.bridgezMUnable to configure LXD. lxd.preseed config can not be provided with key(s): z, z. N)
isinstancedictappendtype__name__strjoin
ValueError)init_cfg
bridge_cfgpreseed_strerrorsincompat_cfgs        9/usr/lib/python3/dist-packages/cloudinit/config/cc_lxd.pysupplemental_schema_validationr$   !   s   
 Fh%%h((),	

 j$''j!**+1.	

 k3''k"++,A/	
 J'/
|R*"<!YY|457	
 6*++     c           
         Sn/ SQnU HP  nU R                  U5      (       d  M  UR                  SUR                  SS5      < S[        X   5      < 3/5        MR      [        R                  " U5        g! [        R
                   a    U S   S:w  a  e [        R                  S	5        [        R                  " / S
Q5        U Vs/ s H  oDR                  S5      (       a  M  UPM     Os  snf nn[        R                  " U5         gf = f)zSet up lxd if init config is given.

:param init_cfg: dict of lxd init configuration options to provide
    to `lxd init --auto`
)network_addressnetwork_portstorage_backendstorage_create_devicestorage_create_loopstorage_pooltrust_password)r   initz--autoz--_-=r)   lvmzqCloud-init doesn't use thinpool by default on Ubuntu due to LP #1982780. This behavior will change in the future.)lxcstoragecreatedefaultr2   zlvm.use_thinpool=falsez--storage-backendN)	getextendreplacer   r   ProcessExecutionErrorLOGinfo
startswith)r   	init_keyscmdkxnew_cmds         r#   handle_init_cfgrC   D   s    "I $C<<??JJQYYsC%8#hk:JKLM 		#%% %&%/D	
 					
 "Kc6I)J1cKK 			'3s%   A5 5ADC(!C('DDnamecfgcloudargsreturnc           
         UR                  S5      nU(       d  [        R                  SU 5        g [        U[        5      (       d"  [        S[        U5      R                   S35      e[        R                  " U5        UR                  S0 5      nUR                  SS5      nUR                  S0 5      n[        XWU5        [        R                  " S5      (       d   [        R                  " / S	Q5        [        XV5      n	[!        U	5      (       a   UR"                  R%                  U	5        [        R                  " / SQ5        U(       a  [        R                  " / SQUS9  g U(       a  [)        U5        SnU(       Ga  UR                  S[*        5      n[,        R.                  R1                  S5      (       a  [        R                  " U5      (       a  [3        U5      n [        R                  SU5        SR5                  UR7                  5        VVs/ s H  u  pSU< SU< 3PM     snn5      S-   n[        R                  " S/US9  [        R<                  " S5        [        R                  S5        [        R                  " / SQ5        g [?        U5      u  nn[A        U[C        U5      [C        U5      [C        U5      S9  U(       a0  [        R                  SSR5                  U5      5        [E        U5        U(       a1  [        R                  SSR5                  U5      5        [E        U5        g g U(       a  [        SU-   5      eg ! [        R                   a  n[        S
U-  5      UeS nAff = f! [        R                   a   n
[        R'                  SX5         S n
A
g S n
A
ff = fs  snnf ! [8         a"    [        R:                  " [        SU-  5         GNf = f)Nr   z8Skipping module named %s, not present or disabled by cfgz*lxd config must be a dictionary. found a 'r   r.   preseed bridge)snapinstallr   z#Failed to install lxd from snap: %sz!failed to install packages %s: %s)r   	waitreadyz--timeout=300)r   r.   z	--preseed)datazdebconf-communicaterD   z/etc/default/lxd-bridgezSetting lxd debconf via %s
zset  zFailed to run '%s' for lxd withz Running dpkg-reconfigure for lxd)zdpkg-reconfigurer   z--frontend=noninteractive)net_namedid_initr5   attachzCreating lxd bridge: %sz!Setting up default lxd bridge: %sz*Unable to configure lxd bridge without %s.)#r7   r;   debugr   r   r   r   r   r   wait_for_snap_seededr$   r   whichr:   RuntimeErrorget_required_packageslendistroinstall_packageswarningrC   _DEFAULT_NETWORK_NAMEospathexistsbridge_to_debconfr   items	Exceptionlogexcdel_filebridge_to_cmdmaybe_cleanup_defaultbool_lxc)rD   rE   rF   rG   lxd_cfgr   r    r   epackagesexc
dconf_commrS   debconfr@   vrP   
cmd_create
cmd_attachs                      r#   handleru   x   s+   ggenG		F	
 	gt$$g''(+
 	

 	e${{62&H++i,KXr*J"8E::e	II01
 %X;H
8}}	LL))(3
 	II34		.[A! 'J>>&*?@77>>344:
 :

 (
3G		6
CII:A--/J/$!Q1-/J   		01= MM34 II89IINO &3:%>"J
!!hJ'J'	 		3SXXj5IJZ 		7*9M Z 	  
8:E
 	
 
O )) 	59	 )) 	KK;XK	8 K
  :ZGsT   M M3 4N0 N*
(!N0 M0M++M03N'N""N'*N0 0(OOc                    0 nU R                  S5      S:X  a  SUS'   SUS'   U$ U R                  S5      S:X  a   SUS'   SUS	'   U R                  S
5      US'   U$ U R                  S5      S:X  GaG  SUS'   U R                  S
5      (       a  U R                  S
5      US'   U R                  S5      (       a~  SUS'   U R                  S5      US'   U R                  S5      US'   U R                  S5      US'   U R                  S5      US'   U R                  S5      US'   U R                  SS5      US'   U R                  S5      (       aB  SUS'   U R                  S5      US'   U R                  S5      US'   U R                  SS5      US'   U R                  S 5      (       a  U R                  S 5      US!'   U$ [        S"U R                  S5      -  5      e)#Nmodenonefalsezlxd/setup-bridgerK   zlxd/bridge-nameexistingtruezlxd/use-existing-bridgerD   newipv4_addresszlxd/bridge-ipv4zlxd/bridge-ipv4-addressipv4_netmaskzlxd/bridge-ipv4-netmaskipv4_dhcp_firstzlxd/bridge-ipv4-dhcp-firstipv4_dhcp_lastzlxd/bridge-ipv4-dhcp-lastipv4_dhcp_leaseszlxd/bridge-ipv4-dhcp-leasesipv4_natzlxd/bridge-ipv4-natipv6_addresszlxd/bridge-ipv6zlxd/bridge-ipv6-addressipv6_netmaskzlxd/bridge-ipv6-netmaskipv6_natzlxd/bridge-ipv6-natdomainzlxd/bridge-domaininvalid bridge mode "%s")r7   rY   )r   rq   s     r#   rc   rc      s   G~~f'&-"#%'!"R NO 
	:	-&-"#-3)*%/^^F%;!"H NE 
	5	(&,"#>>&!!)3)?G%&>>.)))/G%&1;1OG-.1;1OG-.4>NN!5G01 4>>> 4G/0 6@^^"6G12 .8^^J-OG)*>>.)))/G%&1;1OG-.1;1OG-.-7^^G.G)* >>(##+5>>(+CG'(
 N 5
v8NNOOr%   c                    U R                  S5      S:X  a  gU R                  S[        5      n/ nSSUSS/nU R                  S5      S	:X  a  S U4$ U R                  S5      S
:w  a  [        SU R                  S5      -  5      eSSU/nU R                  S5      (       a  U R                  S5      (       a  UR                  SU R                  S5      < SU R                  S5      < 35        U R                  SS5      S:X  a  UR                  S5        U R                  S5      (       aQ  U R                  S5      (       a;  U R                  S5      < SU R                  S5      < 3nUR                  SU-  5        OUR                  S5        U R                  S5      (       at  U R                  S5      (       a^  UR                  SU R                  S5      < SU R                  S5      < 35        U R                  S5      S:X  a  UR                  S5        OUR                  S5        U R                  S5      (       a#  UR                  S U R                  S5      -  5        U R                  S!S"5      nUS":w  a  UR                  S#U 35        X#4$ )$Nrw   rx   )NNrD   networkzattach-profiler6   eth0rz   r|   r   r5   r}   r~   zipv4.address=/r   r{   zipv4.nat=truer   r   r0   zipv4.dhcp.ranges=%szipv4.address=noner   r   zipv6.address=r   zipv6.nat=truezipv6.address=noner   zdns.domain=%smtuzbridge.mtu=)r7   r_   rY   r   )r   bridge_namers   rt   
dhcp_ranger   s         r#   rh   rh     sD   ~~f'..)>?KJ-{IvNJ~~f+Z~~f&5
v8NNOOX{3J~~n%%*..*H*H~~n-z~~n/MO	

 >>*f-7o.>>+,,2
 2
 01/0J 3j@A-.~~n%%*..*H*H~~n-z~~n/MO	

 >>*%/o. 	-.~~h/JNN8,DDE ..
#C
byKu-.!!r%   c                     S[         R                  R                  SS5      [         R                  R                  SS5      S.n[        R                  " S/[	        U 5      -   S/-   US	9  g )
NCHOMEz/rootUSERroot)LC_ALLr   r   r3   z--force-local)
update_env)r`   environr7   r   list)r?   envs     r#   rk   rk   J  sS    

vw/

vv.C
 	IIugS	!_$55#Fr%   c                 \   U [         :w  d  U(       d  gSnSnU(       aM  Sn [        SSX/5        [        R                  XXG5        Sn[        SSU /5        [        R                  XU5        U(       a)  S
n [        SSSXE/5        [        R                  XXG5        gg! [        R
                   a2  n	U	R                  S	:w  a  U	e[        R                  XXF5         Sn	A	NrSn	A	ff = f! [        R
                   a2  n	U	R                  S	:w  a  U	e[        R                  XXF5         Sn	A	gSn	A	ff = f)zNewer versions of lxc (3.0.1+) create a lxdbr0 network when
'lxd init --auto' is run.  Older versions did not.

By removing any that lxd-init created, we simply leave the add/attach
code intact.

https://github.com/canonical/lxd/issues/4649Nz"failed. Assuming it did not exist.z
succeeded.z/Detach of lxd network '%s' from profile '%s' %sr   zdetach-profilezDeletion of lxd network '%s' %sdelete   z+Removal of device '%s' from profile '%s' %sprofiledeviceremove)r_   rk   r;   rV   r   r:   	exit_code)
rS   rT   r5   rU   r   nic_namefail_assume_enoent	succeededmsgrm   s
             r#   ri   ri   S  s    ((=I?
	0)-xABIIcW8 4C)Xx01IIcY/;	B)XxCDIIcW8	  )) 	B{{aIIcWAA	B )) 	B{{aIIcWAA	Bs/   $B 5%C% C"0(CC"%D+9(D&&D+r   r    c                    / n/ n0 nSU ;   a  UR                  U S   5        U(       a  SU;   a   [        R                  " U5      nUR                  S/ 5       H/  nUR                  S5      (       d  M  UR                  US   5        M1     SU;   a,  [        R                  " S5      (       d  UR                  S5        SU;   a,  [        R                  " S5      (       d  UR                  S	5        S
U;   a,  [        R                  " S5      (       d  UR                  S5        U$ ! [        R                  [        [
        4 a    [        R                  S5         GNf = f)z&identify required packages for installr)   storage_poolsz|lxd.preseed string value is not YAML.  Unable to determine required storage driver packages to support storage_pools config.driverzfszzfsutils-linuxr2   lvcreatelvm2btrfsz
mkfs.btrfszbtrfs-progs)r   yaml	safe_load	YAMLError	TypeErrorr   r;   r^   r7   r   rX   )r   r    rn   storage_driverspreseed_cfgr,   s         r#   rZ   rZ   {  s"   H "$OKH$x(9:;+5	..5K $<H%%""<#9: = 

5(9(9()

:(>(>/!$**\*B*B&O 	:6 	KK1	s   D" "4EE)r6   r   )#__doc__loggingr`   typingr   r   r   	cloudinitr   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar	   cloudinit.settingsr
   	getLoggerr   r;   r_   r   __annotations__r$   rC   r   r   ru   rc   rh   rk   ri   r   rZ    r%   r#   <module>r      s    E  	     ! # . +!   z %w	j  ,F1hb
 b
6 b
% b
t b
 b
J.b9"xG EK%BPD s tCy r%   