Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions cloudinit/config/cc_resolv_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment thread
sshedi marked this conversation as resolved.

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])
Comment thread
sshedi marked this conversation as resolved.
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

Expand Down
4 changes: 2 additions & 2 deletions cloudinit/net/networkd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/')

Expand Down
105 changes: 105 additions & 0 deletions tests/unittests/test_handler/test_handler_resolv_conf.py
Original file line number Diff line number Diff line change
@@ -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