Commit 14915526 authored by Scott Moser's avatar Scott Moser

lxd: general fix after testing

A few changes:
 a.) change to using '--name=value' rather than '--name' 'value'
 b.) make sure only strings are passed to command
     (useful for storage_create_loop: which is likely an integer)
 c.) document simple working example
 d.) support installing zfs if not present and storage_backedn has it.
parent b7a6e922
......@@ -38,16 +38,36 @@ from cloudinit import util
def handle(name, cfg, cloud, log, args):
# Get config
lxd_cfg = cfg.get('lxd')
if not lxd_cfg and isinstance(lxd_cfg, dict):
if not lxd_cfg:
log.debug("Skipping module named %s, not present or disabled by cfg")
return
if not isinstance(lxd_cfg, dict):
log.warn("lxd config must be a dictionary. found a '%s'",
type(lxd_cfg))
return
init_cfg = lxd_cfg.get('init')
if not init_cfg:
init_cfg = {}
if not isinstance(init_cfg, dict):
log.warn("lxd/init config must be a dictionary. found a '%s'",
type(init_cfg))
init_cfg = {}
packages = []
if (init_cfg.get("storage_backend") == "zfs" and not util.which('zfs')):
packages.append('zfs')
# Ensure lxd is installed
if not util.which("lxd"):
packages.append('lxd')
if len(packages):
try:
cloud.distro.install_packages(("lxd",))
cloud.distro.install_packages(packages)
except util.ProcessExecutionError as e:
log.warn("no lxd executable and could not install lxd:", e)
log.warn("failed to install packages %s: %s", packages, e)
return
# Set up lxd if init config is given
......@@ -55,14 +75,11 @@ def handle(name, cfg, cloud, log, args):
'network_address', 'network_port', 'storage_backend',
'storage_create_device', 'storage_create_loop',
'storage_pool', 'trust_password')
init_cfg = lxd_cfg.get('init')
if init_cfg:
if not isinstance(init_cfg, dict):
log.warn("lxd/init config must be a dictionary. found a '%s'",
type(f))
return
cmd = ['lxd', 'init', '--auto']
for k in init_keys:
if init_cfg.get(k):
cmd.extend(["--%s" % k.replace('_', '-'), init_cfg[k]])
cmd.extend(["--%s=%s" %
(k.replace('_', '-'), str(init_cfg[k]))])
util.subp(cmd)
......@@ -19,3 +19,10 @@ lxd:
network_port: 8443
storage_backend: zfs
storage_pool: datapool
storage_create_loop: 10
# The simplist working configuration is
# lxd:
# init:
# storage_backend: dir
......@@ -43,9 +43,10 @@ class TestLxd(t_help.TestCase):
self.assertTrue(mock_util.which.called)
init_call = mock_util.subp.call_args_list[0][0][0]
self.assertEquals(init_call,
['lxd', 'init', '--auto', '--network-address',
'0.0.0.0', '--storage-backend', 'zfs',
'--storage-pool', 'poolname'])
['lxd', 'init', '--auto',
'--network-address=0.0.0.0',
'--storage-backend=zfs',
'--storage-pool=poolname'])
@mock.patch("cloudinit.config.cc_lxd.util")
def test_lxd_install(self, mock_util):
......@@ -55,4 +56,4 @@ class TestLxd(t_help.TestCase):
cc_lxd.handle('cc_lxd', self.lxd_cfg, cc, LOG, [])
self.assertTrue(cc.distro.install_packages.called)
install_pkg = cc.distro.install_packages.call_args_list[0][0][0]
self.assertEquals(install_pkg, ('lxd',))
self.assertEquals(sorted(install_pkg), ['lxd', 'zfs'])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment