summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/config/cc_resolv_conf.py7
-rw-r--r--cloudinit/net/networkd.py4
-rw-r--r--tests/unittests/test_handler/test_handler_resolv_conf.py105
3 files changed, 111 insertions, 5 deletions
diff --git a/cloudinit/config/cc_resolv_conf.py b/cloudinit/config/cc_resolv_conf.py
index c51967e2..648935e4 100644
--- a/cloudinit/config/cc_resolv_conf.py
+++ b/cloudinit/config/cc_resolv_conf.py
@@ -108,18 +108,19 @@ def handle(name, cfg, cloud, log, _args):
if "resolv_conf" not in cfg:
log.warning("manage_resolv_conf True but no parameters provided!")
+ return
try:
template_fn = cloud.get_template_filename(
- RESOLVE_CONFIG_TEMPLATE_MAP[cloud.distro.resolv_conf_fn])
+ RESOLVE_CONFIG_TEMPLATE_MAP[cloud.distro.resolve_conf_fn])
except KeyError:
- log.warning("No template found, not rendering /etc/resolv.conf")
+ log.warning("No template found, not rendering resolve configs")
return
generate_resolv_conf(
template_fn=template_fn,
params=cfg["resolv_conf"],
- target_fname=cloud.disro.resolve_conf_fn
+ target_fname=cloud.distro.resolve_conf_fn
)
return
diff --git a/cloudinit/net/networkd.py b/cloudinit/net/networkd.py
index 63e3a07f..a311572f 100644
--- a/cloudinit/net/networkd.py
+++ b/cloudinit/net/networkd.py
@@ -72,8 +72,8 @@ class Renderer(renderer.Renderer):
def __init__(self, config=None):
if not config:
config = {}
- self.resolved_conf = config.get('resolved_conf_fn',
- '/etc/systemd/resolved.conf')
+ self.resolve_conf_fn = config.get('resolve_conf_fn',
+ '/etc/systemd/resolved.conf')
self.network_conf_dir = config.get('network_conf_dir',
'/etc/systemd/network/')
diff --git a/tests/unittests/test_handler/test_handler_resolv_conf.py b/tests/unittests/test_handler/test_handler_resolv_conf.py
new file mode 100644
index 00000000..96139001
--- /dev/null
+++ b/tests/unittests/test_handler/test_handler_resolv_conf.py
@@ -0,0 +1,105 @@
+# This file is part of cloud-init. See LICENSE file for license information.
+
+from cloudinit.config import cc_resolv_conf
+
+from cloudinit import cloud
+from cloudinit import distros
+from cloudinit import helpers
+from cloudinit import util
+from copy import deepcopy
+
+from cloudinit.tests import helpers as t_help
+
+import logging
+import os
+import shutil
+import tempfile
+from unittest import mock
+
+LOG = logging.getLogger(__name__)
+
+
+class TestResolvConf(t_help.FilesystemMockingTestCase):
+ with_logs = True
+ cfg = {'manage_resolv_conf': True, 'resolv_conf': {}}
+
+ def setUp(self):
+ super(TestResolvConf, self).setUp()
+ self.tmp = tempfile.mkdtemp()
+ util.ensure_dir(os.path.join(self.tmp, 'data'))
+ self.addCleanup(shutil.rmtree, self.tmp)
+
+ def _fetch_distro(self, kind, conf=None):
+ cls = distros.fetch(kind)
+ paths = helpers.Paths({'cloud_dir': self.tmp})
+ conf = {} if conf is None else conf
+ return cls(kind, conf, paths)
+
+ def call_resolv_conf_handler(self, distro_name, conf, cc=None):
+ if not cc:
+ ds = None
+ distro = self._fetch_distro(distro_name, conf)
+ paths = helpers.Paths({'cloud_dir': self.tmp})
+ cc = cloud.Cloud(ds, paths, {}, distro, None)
+ cc_resolv_conf.handle('cc_resolv_conf', conf, cc, LOG, [])
+
+ @mock.patch("cloudinit.config.cc_resolv_conf.templater.render_to_file")
+ def test_resolv_conf_systemd_resolved(self, m_render_to_file):
+ self.call_resolv_conf_handler('photon', self.cfg)
+
+ assert [
+ mock.call(mock.ANY, '/etc/systemd/resolved.conf', mock.ANY)
+ ] == m_render_to_file.call_args_list
+
+ @mock.patch("cloudinit.config.cc_resolv_conf.templater.render_to_file")
+ def test_resolv_conf_no_param(self, m_render_to_file):
+ tmp = deepcopy(self.cfg)
+ self.logs.truncate(0)
+ tmp.pop('resolv_conf')
+ self.call_resolv_conf_handler('photon', tmp)
+
+ self.assertIn('manage_resolv_conf True but no parameters provided',
+ self.logs.getvalue())
+ assert [
+ mock.call(mock.ANY, '/etc/systemd/resolved.conf', mock.ANY)
+ ] not in m_render_to_file.call_args_list
+
+ @mock.patch("cloudinit.config.cc_resolv_conf.templater.render_to_file")
+ def test_resolv_conf_manage_resolv_conf_false(self, m_render_to_file):
+ tmp = deepcopy(self.cfg)
+ self.logs.truncate(0)
+ tmp['manage_resolv_conf'] = False
+ self.call_resolv_conf_handler('photon', tmp)
+ self.assertIn("'manage_resolv_conf' present but set to False",
+ self.logs.getvalue())
+ assert [
+ mock.call(mock.ANY, '/etc/systemd/resolved.conf', mock.ANY)
+ ] not in m_render_to_file.call_args_list
+
+ @mock.patch("cloudinit.config.cc_resolv_conf.templater.render_to_file")
+ def test_resolv_conf_etc_resolv_conf(self, m_render_to_file):
+ self.call_resolv_conf_handler('rhel', self.cfg)
+
+ assert [
+ mock.call(mock.ANY, '/etc/resolv.conf', mock.ANY)
+ ] == m_render_to_file.call_args_list
+
+ @mock.patch("cloudinit.config.cc_resolv_conf.templater.render_to_file")
+ def test_resolv_conf_invalid_resolve_conf_fn(self, m_render_to_file):
+ ds = None
+ distro = self._fetch_distro('rhel', self.cfg)
+ paths = helpers.Paths({'cloud_dir': self.tmp})
+ cc = cloud.Cloud(ds, paths, {}, distro, None)
+ cc.distro.resolve_conf_fn = 'bla'
+
+ self.logs.truncate(0)
+ self.call_resolv_conf_handler('rhel', self.cfg, cc)
+
+ self.assertIn('No template found, not rendering resolve configs',
+ self.logs.getvalue())
+
+ assert [
+ mock.call(mock.ANY, '/etc/resolv.conf', mock.ANY)
+ ] not in m_render_to_file.call_args_list
+
+# vi: ts=4 expandtab