fH rUdZddlZddlZddlmZddlmZmZddlm Z m Z m Z ddl m Z ddlmZddlmZmZdd lmZej*eZd Zd Zd gZd ddeeedededgedgdZeed<eeZdededefdZdedede de ddf dZ!d Z"d!Z#d"Z$ d%d#Z%dededeefd$Z&y)&z>LXD: configure lxd with ``lxd init`` and optionally lxd-bridgeN)dedent)ListTuple)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://documentation.ubuntu.com/lxd/en/latest/howto/initialize/#non-interactive-configuration 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_strcg}t|ts(|jdt|jdt|ts(|jdt|jdt|t s(|jdt|jd|r8|s|r4|rdgng}||rdgngz }|jddj ||rtd j |y ) 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)rrrerrors incompat_cfgs 9/usr/lib/python3/dist-packages/cloudinit/config/cc_lxd.pysupplemental_schema_validationr,s F h % h(() , j$ ' j!**+1 . k3 ' k"++,A / J'/ |R *"<   !YY|45 7 6*++rcfgcloudargsreturnc |jd}|stjd|yt|ts"t dt |jdtj||jdi}|jdd}|jdi}t|||tjds tjgd t||} t!| r |j"j%| tjgd |rtjgd |y|rd} tj(dd} |ddk(rat*j,j/d| ds>tj'dtjgdt1d| D} gd} | D]H}|j|s| j3d|j5dddt7||gJtj| d}|r|jdt8}t*j,j/d rtj|rt;|} tjd!|d"j=|j?Dcgc] \}}d#|d$|c}}d"z}tjdg|tjDd tjd&tjgd'ytG|\}}tI|tK|tK|tK|(|r0tjd)d$j=|tM||r1tjd*d$j=|tM|yy|rtd+|zy#tj$r}td |z|d}~wwxYw#tj$r!} tj'd | | Yd} ~ yd} ~ wwxYwcc}}w#t@$r!tjBtd%|zYwxYw),Nrz8Skipping module named %s, not present or disabled by cfgz*lxd config must be a dictionary. found a 'r initpreseedbridge)snapinstallrz#Failed to install lxd from snap: %sz!failed to install packages %s: %s)r waitreadyz --timeout=300)rr3z --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|] }|dk7s |yw)r=N).0keys r+ zhandle..sC3D,Ds )rr3z--autoz--_-=zdebconf-communicaterz/etc/default/lxd-bridgezSetting lxd debconf via %s zset  zFailed to run '%s' for lxd withz Running dpkg-reconfigure for lxd)zdpkg-reconfigurerz--frontend=noninteractive)net_namedid_initrGattachzCreating lxd bridge: %sz!Setting up default lxd bridge: %sz*Unable to configure lxd bridge without %s.)'getLOGdebugr!r"r(r$r%rwait_for_snap_seededr,rwhichProcessExecutionError RuntimeErrorget_required_packageslendistroinstall_packageswarning system_infoospathexiststupleextendreplacer&_DEFAULT_NETWORK_NAMEbridge_to_debconfr'items Exceptionlogexcdel_file bridge_to_cmdmaybe_cleanup_defaultbool_lxc)rr.r/r0lxd_cfgrrrepackagesexc init_keyskernelcmdk dconf_commrSdebconfvr: cmd_create cmd_attachs r+handlersggenG  F   gt $g''( +   e${{62&H++i,KXr*J"8ZE ::e   II0 1 %X{;H 8}  LL ) )( 3  II34 .[A& !!#G,Q/ % &% /F8#E F9  KKH  II (I( A||A "#))C"5s8A;7GHI  #'J>>&*?@ 77>>3 4 : ( 3G  6 CII:A--/J$!Q1-J  01= MM3 4 II8 9 IIN O&3:%> "J !!hJ'J'    3SXXj5IJZ  7*9MZ   8: E   i)) 59  ))  KK;Xs K  RK   :ZG sT O*:P4QQ #Q*P=P  PQ'QQ Q&Q;:Q;cxi}|jddk(r d|d<d|d<|S|jddk(r d|d<d|d <|jd |d<|S|jdd k(r3d|d<|jd r|jd |d<|jd r~d|d <|jd |d<|jd|d<|jd|d<|jd|d<|jd|d<|jdd|d<|jdrBd|d<|jd|d<|jd|d<|jdd|d<|jd r|jd |d!<|Std"|jdz)#Nmodenonefalsezlxd/setup-bridger5zlxd/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")rVr\)rr|s r+rjrjYsG~~f'&-"#%'!"R NO  : -&-"#-3)*%/^^F%;!"H NE  5 (&,"# >>& !)3)?G% & >>. ))/G% &1;1OG- .1;1OG- .4>NN!5G0 14>>> 4G/ 06@^^"6G1 2.8^^J-OG) * >>. ))/G% &1;1OG- .1;1OG- .-7^^G.G) * >>( #+5>>(+CG' ( N5 v8NNOOr-c|jddk(ry|jdt}g}dd|ddg}|jdd k(rd|fS|jdd k7rtd |jdzdd |g}|jd r|jdr|jd|jd d|jd|jdddk(r|jd|jdr\|jdrK|jdd|jd}|jd|zn|jd|jdrl|jdr[|jd|jdd|jd|jddk(r#|jdn|jd|jdr#|jd |jdz|jd!d"}|d"k7r|jd#|||fS)$Nrr)NNrnetworkzattach-profilerHeth0rrrrGrrz ipv4.address=/rrz ipv4.nat=truerrrOzipv4.dhcp.ranges=%szipv4.address=nonerrz ipv6.address=rz ipv6.nat=truezipv6.address=nonerz dns.domain=%smtuz bridge.mtu=)rVrir\r#)r bridge_namer~r dhcp_rangers r+roros-~~f'..)>?KJ-{IvNJ~~f+Z~~f&5 v8NNOOX{3J~~n%*..*H~~n-z~~n/M O >>*f - 7   o . >>+ , 2 01/0J   3j@ A-.~~n%*..*H~~n-z~~n/M O >>* % /   o . -.~~h/JNN8,DDE .. #C byKu-. z !!r-cdtjjddtjjddd}tjdgt |zdgz| y) NCHOMEz/rootUSERroot)LC_ALLrrrEz --force-local) update_env)rcenvironrVrlist)ryenvs r+rrrrsS vw/ vv. C  IIugS !_$55#Fr-cJ|tk7s|syd}d}|rQd} tdd||gtj||||d}tdd|gtj||||r,d } td d d ||gtj||||yy#tj $r3} | j d k7r| tj||||Yd} ~ pd} ~ wwxYw#tj $r3} | j d k7r| tj||||Yd} ~ yd} ~ wwxYw)aNewer 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' %srzdetach-profilezDeletion of lxd network '%s' %sdeletez+Removal of device '%s' from profile '%s' %sprofiledeviceremove)rirrrWrXrr[ exit_code) rSrTrGrUrnic_namefail_assume_enoent succeededmsgrts r+rprps-((=I ? 0 )-xA B IIc8Wi 8 4C )Xx0 1 IIc8Y / ; B )Xx(C D IIc8Wi 8 )) B{{a IIc8W.@ A A B)) B{{a IIc8W.@ A A Bs/'B)(CC&)CCD"/)DD"cbg}g}i}d|vr|j|d|rd|vr tj|}|jdgD](}|jds|j|d*d|vr&tjds|jdd|vr&tjds|jd d |vr&tjd s|jd |S#tjtt f$rt jdYwxYw) 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.driverzfszzfsutils-linuxrDlvcreatelvm2btrfsz mkfs.btrfsz btrfs-progs) r#rload YAMLError TypeErrorr(rWrarVrrZ)rrrustorage_drivers preseed_cfgr@s r+r]r]sH"$OKH$x(9:;+5 "-- 4K$<;   H %  " "<#9 :;  5(9()  :(>/!$**\*B & O""Iz:  KK1  sC883D.-D.)rHr)'__doc__loggingrctextwraprtypingrr cloudinitrrrcloudinit.cloudr cloudinit.configr cloudinit.config.schemar r cloudinit.settingsr getLoggerr%rWriMODULE_DESCRIPTIONrr__annotations__r"r&r,rrrjrorrrpr]rJr-r+rsKE **!#<+g!  *   H%     4 K M Gqd %wszjzx t ",", $",36",JO O 6O %O tO O d.b9"xGEK%BPDstCyr-