a '¡Dgæ5ã@søUdZddlZddlZddlmZmZddlZddlmZm Z ddl m Z ddl m Z ddlmZddlmZe e¡Zd Zd d ged gd œZeed<dd„Zdd„Zee e eddœdd„Zdd„Zdd„Zdd„Zd#dd„Z e!eeed œd!d"„Z"dS)$z>LXD: configure lxd with ``lxd init`` and optionally lxd-bridgeéN)ÚListÚTuple)ÚsubpÚutil)ÚCloud)ÚConfig)Ú MetaSchema)Ú PER_INSTANCEZlxdbr0Zcc_lxdZubuntuÚlxd)ÚidZdistrosZ frequencyZactivate_by_schema_keysÚmetacCsÂg}t|tƒs&| dt|ƒj›d¡t|tƒsH| dt|ƒj›d¡t|tƒsj| dt|ƒj›d¡|r¬|sv|r¬|r€dgng}||rdgng7}| dd |¡›¡|r¾td  |¡ƒ‚d S) 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 'zlxd.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ÚerrorsZ incompat_cfg©rú;/usr/lib/python3.9/site-packages/cloudinit/config/cc_lxd.pyÚsupplemental_schema_validation!s: ÿÿ ÿÿ ÿÿ ÿÿrcCsªd}gd¢}|D]2}| |¡r| d| dd¡t||ƒfg¡qzt |¡WnRtjy¤|ddkrp‚t d¡t gd ¢¡d d „|Dƒ}t |¡Yn0d S) zSet up lxd if init config is given. :param init_cfg: dict of lxd init configuration options to provide to `lxd init --auto` )Únetwork_addressZ network_portÚstorage_backendZstorage_create_deviceZstorage_create_loopÚ storage_poolZtrust_password)r Úinitz--autoz--%s=%sÚ_ú-rÚlvmzqCloud-init doesn't use thinpool by default on Ubuntu due to LP #1982780. This behavior will change in the future.)ÚlxcZstorageÚcreateÚdefaultr#zlvm.use_thinpool=falsecSsg|]}| d¡s|‘qS)z--storage-backend)Ú startswith)Ú.0ÚxrrrÚ qóz#handle_init_cfg..N)ÚgetÚextendÚreplacerrÚProcessExecutionErrorÚLOGÚinfo)rZ init_keysÚcmdÚkZnew_cmdrrrÚhandle_init_cfgDs$  & ÿÿr4)ÚnameÚcfgÚcloudÚargsÚreturnc Csž| d¡}|st d|¡dSt|tƒs>tdt|ƒj›dƒ‚t  |¡| di¡}| dd¡}| di¡}t |||ƒt   d¡sÊzt   gd ¢¡Wn4t j yÈ}ztd |ƒ|‚WYd}~n d}~00t||ƒ} t| ƒr(z|j | ¡Wn8t j y&} zt d | | ¡WYd} ~ dSd} ~ 00t   gd ¢¡|rRt j gd ¢|ddS|r`t|ƒd} |rˆ| dt¡} tj d¡rt   | ¡rt|ƒ} z.zFailed to run '%s' for lxd withz Running dpkg-reconfigure for lxd)zdpkg-reconfigurer z--frontend=noninteractive)Únet_nameÚdid_initr%ÚattachzCreating lxd bridge: %sú z!Setting up default lxd bridge: %sz*Unable to configure lxd bridge without %s.)#r,r0ÚdebugrrrrrrZwait_for_snap_seededrrÚwhichr/Ú RuntimeErrorÚget_required_packagesÚlenZdistroZinstall_packagesÚwarningr4Ú_DEFAULT_NETWORK_NAMEÚosÚpathÚexistsÚbridge_to_debconfrÚitemsÚ ExceptionZlogexcZdel_fileÚ bridge_to_cmdÚmaybe_cleanup_defaultÚboolÚ_lxc)r5r6r7r8Zlxd_cfgrrrÚeÚpackagesÚexcZ dconf_commr?Údebconfr<Ú cmd_createÚ cmd_attachrrrÚhandlexs¢ ÿ ÿÿ      ÿþ   ÿ ÿýÿÿ    ü ÿ ÿrZcCs`i}| d¡dkr&d|d<d|d<n6| d¡dkrVd|d<d|d <| d ¡|d<n| d¡d krJd|d<| d ¡r†| d ¡|d<| d ¡rîd|d <| d ¡|d<| d¡|d<| d¡|d<| d¡|d<| d¡|d<| dd¡|d<| d¡r.d|d<| d¡|d<| d¡|d<| dd¡|d<| d ¡r\| d ¡|d!<ntd"| d¡ƒ‚|S)#NÚmodeÚnoneZfalsezlxd/setup-bridger:zlxd/bridge-nameÚexistingÚtruezlxd/use-existing-bridger5ÚnewÚ ipv4_addresszlxd/bridge-ipv4zlxd/bridge-ipv4-addressÚ ipv4_netmaskzlxd/bridge-ipv4-netmaskÚipv4_dhcp_firstzlxd/bridge-ipv4-dhcp-firstÚipv4_dhcp_lastzlxd/bridge-ipv4-dhcp-lastZipv4_dhcp_leaseszlxd/bridge-ipv4-dhcp-leasesÚipv4_natzlxd/bridge-ipv4-natÚ ipv6_addresszlxd/bridge-ipv6zlxd/bridge-ipv6-addressÚ ipv6_netmaskzlxd/bridge-ipv6-netmaskÚipv6_natzlxd/bridge-ipv6-natÚdomainzlxd/bridge-domainúinvalid bridge mode "%s")r,rE)rrWrrrrMÝsJ   ÿÿÿ ÿ rMcCs¬| d¡dkrdS| dt¡}g}dd|ddg}| d¡d krFd|fS| d¡d krftd | d¡ƒ‚dd |g}| d ¡rø| d¡rø| d| d ¡| d¡f¡| dd¡dkr¼| d¡| d¡rö| d¡röd| d¡| d¡f}| d|¡n | d¡| d¡rT| d¡rT| d| d¡| d¡f¡| d¡dkr^| d¡n | d¡| d¡r~| d| d¡¡| d d!¡}|d!kr¤| d"|›¡||fS)#Nr[r\)NNr5Únetworkzattach-profiler&Úeth0r]r_rir%r`razipv4.address=%s/%srdr^z ipv4.nat=truerbrcz%s-%szipv4.dhcp.ranges=%szipv4.address=nonererfzipv6.address=%s/%srgz ipv6.nat=truezipv6.address=nonerhz dns.domain=%sÚmtuéÿÿÿÿz bridge.mtu=)r,rIrEr)rZ bridge_namerXrYZ dhcp_rangerlrrrrPsT  ÿÿ ÿþ ÿÿ     rPcCsBdtj dd¡tj dd¡dœ}tjdgt|ƒdg|d dS) NÚCÚHOMEz/rootÚUSERÚroot)ÚLC_ALLrorpr$z --force-local)Z update_env)rJÚenvironr,rÚlist)r2ÚenvrrrrSJs   ýrSr&rkc Cs&|tks |sdSd}d}|rªd}z$tdd||gƒt ||||¡WnDtjyˆ} z*| jdkrd| ‚t ||||¡WYd} ~ n*d} ~ 00d}tdd |gƒt |||¡|r"d }z&td d d ||gƒt ||||¡WnFtjy } z*| jdkrü| ‚t ||||¡WYd} ~ n d} ~ 00dS)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' %srjzdetach-profileézDeletion of lxd network '%s' %sÚdeletez+Removal of device '%s' from profile '%s' %sÚprofileZdeviceÚremove)rIrSr0rCrr/Z exit_code) r?r@r%rArxZnic_nameZfail_assume_enoentZ succeededÚmsgrTrrrrQSs2  & rQ)rrr9c Csäg}g}i}d|vr"| |d¡|rbd|vrbzt |¡}Wn$tjttfy`t d¡Yn0| dg¡D]}| d¡rn| |d¡qnd|vr¨t   d¡s¨| d¡d|vrÄt   d¡sÄ| d ¡d |vràt   d ¡sà| d ¡|S) z&identify required packages for installrZ storage_poolsz|lxd.preseed string value is not YAML. Unable to determine required storage driver packages to support storage_pools config.ZdriverZzfszzfsutils-linuxr#ZlvcreateZlvm2Zbtrfsz mkfs.btrfsz btrfs-progs) rÚyamlZ safe_loadZ YAMLErrorÚ TypeErrorrr0rHr,rrD)rrrUZstorage_driversZ preseed_cfgrrrrrF{s, ÿ     rF)r&rk)#Ú__doc__ZloggingrJÚtypingrrr{Z cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.settingsr Z getLoggerrr0rIr Ú__annotations__rr4rrtrZrMrPrSrQrrFrrrrÚs2     ü#4e1< ÿ (