܍~cG UdZddlZddlmZddlmZddlmZmZddl m Zddl m Z m Z m Z ddlmZdd lmZdd lmZmZdd lmZejeZd Zd ZdgZdddeeedededgedgdZeed<eeZdedede fdZ!de dededed e"d!df d"Z#d#Z$d$Z%d%Z& d*d(Z'dede d!ee fd)Z(dS)+z>LXD: configure lxd with ``lxd init`` and optionally lxd-bridgeN)Logger)dedent)ListTuple)log)safeyamlsubputil)Cloud)Config) MetaSchema get_meta_doc) PER_INSTANCElxdbr0aeThis 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 userspace utility is not installed, it will be installed. If network bridge configuration is provided, then lxd-bridge will be configured accordingly. ubuntucc_lxdLXDz9Configure LXD with ``lxd init`` and optionally lxd-bridgez # Simplest working directory backed LXD configuration lxd: init: storage_backend: dir a # LXD init showcasing cloud-init's LXD config options lxd: init: network_address: 0.0.0.0 network_port: 8443 storage_backend: zfs storage_pool: datapool storage_create_loop: 10 bridge: mode: new mtu: 1500 name: lxdbr0 ipv4_address: 10.0.8.1 ipv4_netmask: 24 ipv4_dhcp_first: 10.0.8.2 ipv4_dhcp_last: 10.0.8.3 ipv4_dhcp_leases: 250 ipv4_nat: true ipv6_address: fd98:9e0:3744::1 ipv6_netmask: 64 ipv6_nat: true domain: lxd a # For more complex non-iteractive LXD configuration of networks, # storage_pools, profiles, projects, clusters and core config, # `lxd:preseed` config will be passed as stdin to the command: # lxd init --preseed # See https://linuxcontainers.org/lxd/docs/master/preseed/ or # run: lxd init --dump to see viable preseed YAML allowed. # # Preseed settings configuring the LXD daemon for HTTPS connections # on 192.168.1.1 port 9999, a nested profile which allows for # LXD nesting on containers and a limited project allowing for # RBAC approach when defining behavior for sub projects. lxd: preseed: | config: core.https_address: 192.168.1.1:9999 networks: - config: ipv4.address: 10.42.42.1/24 ipv4.nat: true ipv6.address: fd42:4242:4242:4242::1/64 ipv6.nat: true description: "" name: lxdbr0 type: bridge project: default storage_pools: - config: size: 5GiB source: /var/snap/lxd/common/lxd/disks/default.img description: "" name: default driver: zfs profiles: - config: {} description: Default LXD profile devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: default type: disk name: default - config: {} security.nesting: true devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: default type: disk name: nested projects: - config: features.images: true features.networks: true features.profiles: true features.storage.volumes: true description: Default LXD project name: default - config: features.images: false features.networks: true features.profiles: false features.storage.volumes: false description: Limited Access LXD project name: limited lxd)idnametitle descriptiondistrosexamples frequencyactivate_by_schema_keysmetainit_cfg bridge_cfg preseed_strcVg}t|ts+|dt|jdt|ts+|dt|jdt|t s+|dt|jd|r@|s|r<|rdgng}||rdgngz }|dd||r"td |d S) zValidate 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 'zlxd.initz lxd.bridgezMUnable to configure LXD. lxd.preseed config can not be provided with key(s): z, z. N) isinstancedictappendtype__name__strjoin ValueError)rrr errors incompat_cfgs 9/usr/lib/python3/dist-packages/cloudinit/config/cc_lxd.pysupplemental_schema_validationr.sF h % %   ,h( , , ,   j$ ' '   .j!!* . . .   k3 ' '   /k""+ / / /     J '/7 ||R *<"<   7!YY|44 7 7   ,6**+++,,rcfgcloudrargsreturnc |d}|s|d|dSt|ts%t dt |jd|di}|dd}|di}t|||t||} t| rP |j | n4#tj $r"} |d | | Yd} ~ dSd} ~ wwxYwtj gd |rtj gd | dS|r d } tjdd} |ddkrgt"jd| dsD|dtj gdt)d| D} gd} | D]Z}||rC| d|dddt/||g[tj | d}|r|dt0}t"jdrtj|rt5|} |d|zd d!|Dd z}tj dg|n(#t:$rtj|d"|zYnwxYwtjd|d#tj gd$dStA|\}}tC|tE|tE|tE|%|r:|d&d'|ztG||r<|d(d'|ztG|dSdS|rtId)|zdS)*Nrz8Skipping module named %s, not present or disabled by cfgz*lxd config must be a dictionary. found a 'r"initpreseedbridgez!failed to install packages %s: %s)r waitreadyz --timeout=300)rr5z --preseed)data)network_address network_portstorage_backendstorage_create_devicestorage_create_loop storage_pooltrust_passwordunamer=lvmz /lib/modules/z"/kernel/drivers/md/dm-thin-pool.kozqcloud-init doesn't use thinpool by default on Ubuntu due to LP #1982780. This behavior will change in the future.)lxcstoragecreatedefaultrDzlvm.use_thinpool=falsec3&K|] }|dk|V dS)r=N).0keys r- zhandle..s6C3D,D,D,D,D,D,Dr/)rr5z--autoz--_-=zdebconf-communicaterz/etc/default/lxd-bridgezSetting lxd debconf via  c$g|] \}}d|d|S)zset  rJ)rKkvs r- zhandle..,s)JJJ$!QQ11-JJJr/zFailed to run '%s' for lxd withz Running dpkg-reconfigure for lxd)zdpkg-reconfigurerz--frontend=noninteractive)net_namedid_initrGattachzCreating lxd bridge: %srSz!Setting up default lxd bridge: %sz*Unable to configure lxd bridge without %s.)%getdebugr#r$r*r&r'r.get_required_packageslendistroinstall_packagesr ProcessExecutionErrorwarningr system_infoospathexiststupleextendreplacer(_DEFAULT_NETWORK_NAMEwhichbridge_to_debconfr)items Exceptionlogexcdel_file bridge_to_cmdmaybe_cleanup_defaultbool_lxc RuntimeError)rr0r1rr2lxd_cfgrr rpackagesexc init_keyskernelcmdrT dconf_commrWdebconfr: cmd_create cmd_attachs r-handlersDggennG  F     gt $ $  +g' + + +   {{62&&H++i,,KXr**J"8ZEEE$X{;;H 8}}  L ) )( 3 3 3 3)    KK;Xs K K K FFFFF  I333444 ...[AAAA/& !##G,Q/ % &% / / FF F F F9 9 / KKH    I   (I(''  A||A  "#))C"5"5"5"5s8A;7G7G7GHI #'J4 >>&*?@@ 7>>3 4 4- ! : : - ! ( 33G  4zABBBIIJJ'--//JJJ  0148888    :ZG  M3 4 4 4 II8 9 9 9 INNN O O O O O&3:%>%> "J !!hJ''J''       ! 3chhz6J6JJKKKZ    ! 7#((::N:NNZ      ! !   8: E     s+C88D)D$$D) A"L00"MMc(i}|ddkr d|d<d|d<n|ddkr$d|d<d|d <|d |d<n|dd krnd|d<|d r|d |d<|d rd|d <|d |d<|d|d<|d|d<|d|d<|d|d<|dd|d<|drNd|d<|d|d<|d|d<|dd|d<|d r|d |d!<n%td"|dz|S)#Nmodenonefalsezlxd/setup-bridger7zlxd/bridge-nameexistingtruezlxd/use-existing-bridgernew ipv4_addresszlxd/bridge-ipv4zlxd/bridge-ipv4-address ipv4_netmaskzlxd/bridge-ipv4-netmaskipv4_dhcp_firstzlxd/bridge-ipv4-dhcp-firstipv4_dhcp_lastzlxd/bridge-ipv4-dhcp-lastipv4_dhcp_leaseszlxd/bridge-ipv4-dhcp-leasesipv4_natzlxd/bridge-ipv4-nat ipv6_addresszlxd/bridge-ipv6zlxd/bridge-ipv6-address ipv6_netmaskzlxd/bridge-ipv6-netmaskipv6_natzlxd/bridge-ipv6-natdomainzlxd/bridge-domaininvalid bridge mode "%s")rZrm)rr|s r-rkrkUsOG~~f''&-"#%'!""   : - -&-"#-3)*%/^^F%;%;!""   5 ( (&,"# >>& ! ! @)3)?)?G% & >>. ) ) P)/G% &1;1O1OG- .1;1O1OG- .4>NN!55G0 14>>> 44G/ 06@^^"66G1 2.8^^J-O-OG) * >>. ) ) )/G% &1;1O1OG- .1;1O1OG- .-7^^G..G) * >>( # # D+5>>(+C+CG' (2Z^^F5K5KKLLL Nr/c|ddkrdS|dt}g}dd|ddg}|dd krd|fS|dd kr%td |dzdd |g}|d r|dr|d|d d|d|dddkr|d|drZ|drE|dd|d}|d|zn|d|dr|drq|d|dd|d|dddkr|dn|d|d r+|d!|d z|d"d#}|d#kr|d$|||fS)%Nrr)NNrnetworkzattach-profilerHeth0rrrrGrrz ipv4.address=/rrz ipv4.nat=truerrrOzipv4.dhcp.ranges=%szipv4.address=nonerrz ipv6.address=rrz ipv6.nat=truezipv6.address=nonerz dns.domain=%smtuz bridge.mtu=)rZrirmr%)r bridge_namer}r~ dhcp_rangers r-rprps~~f''z..)>??KJ-{IvNJ~~f++Z~~f&&2Z^^F5K5KKLLLX{3J~~n%%/*..*H*H/~~n----z~~n/M/M/M O   >>*f - - 7 7   o . . . >>+ , , B 2 2  B01111/000J   3j@ A A A-...~~n%% /*..*H*H /~~n----z~~n/M/M/M O   >>*g . .& 8 8   o . . . -...~~hF/JNN8,D,DDEEE .. # #C byy---... z !!r/cdtjddtjddd}tjdgt |zdgz| dS) NCHOMEz/rootUSERroot)LC_ALLrrrEz --force-local) update_env)rcenvironrZr list)rzenvs r-rsrssi vw// vv..  C  IugS !_$55#FFFFFFr/rHrc|tks|sdSd}d}|rd} tdd||gt||||d}tdd|gt|||nF#tj$r4} | jd kr| t||||Yd} ~ nd} ~ wwxYw|r}d } td d d ||gt||||dS#tj$r5} | jd kr| t||||Yd} ~ dSd} ~ wwxYwdS)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/lxc/lxd/issues/4649Nz"failed. Assuming it did not exist.z succeeded.z/Detach of lxd network '%s' from profile '%s' %srzdetach-profilezDeletion of lxd network '%s' %sdeletez+Removal of device '%s' from profile '%s' %sprofiledeviceremove)rirsLOGr[r r` exit_code) rWrXrGrYrnic_namefail_assume_enoent succeededmsges r-rqrqs((((=I 0? 0 )-xA B B B IIc8Wi 8 8 8 4C )Xx0 1 1 1 IIc8Y / / / /) B B B{a IIc8W.@ A A A A A A A A BB; B )Xx(C D D D IIc8Wi 8 8 8 8 8) B B B{a IIc8W.@ A A A A A A A A A B BBs/0A::B= *B88B=1C88D<*D77D<cg}tjds|dg}i}d|vr||d|rVd|vrR tj|}n<#tjt tf$rt dYnwxYw| dgD]2}| dr||d3d|vr)tjds|dd|vr)tjd s|d d |vr)tjd s|d |S)z&identify required packages for installrr= storage_poolsz|lxd.preseed string value is not YAML. Unable to determine required storage driver packages to support storage_pools config.driverzfszzfsutils-linuxrDlvcreatelvm2btrfsz mkfs.btrfsz btrfs-progs) r rjr%rload YAMLError TypeErrorr*rrarZ)rr rvstorage_drivers preseed_cfgr@s r-r\r\sH :e  "$OKH$$x(9:;;; +55 "- 44KK"Iz:    KK1       $<<;;   H % % ;  " "<#9 : : :  5(9(9()))  :(>(>/!!$*\*B*B! &&& OsA++6B$#B$)rHr))__doc__rcloggingrtextwraprtypingrr cloudinitrrr r cloudinit.cloudr cloudinit.configr cloudinit.config.schemar rcloudinit.settingsr getLoggerr'rriMODULE_DESCRIPTIONrr__annotations__r$r(r.rrrkrprsrqr\rJr/r-rsEDD $$$$$$**********!!!!!!######<<<<<<<<++++++g!!  *   H%       4 K M M Gqd %wszzjzzzx ,t  ",", $",36",",",",JJ J J #(J /5J =AJ  J J J J Z...b9"9"9"xGGGEK%B%B%B%BPDstCyr/