Skip to content

Commit

Permalink
cc_resolv_conf: fix typos (#969)
Browse files Browse the repository at this point in the history
Add tests for cc_resolv_conf handler
  • Loading branch information
sshedi committed Aug 13, 2021
1 parent 1c3b10b commit 0404743
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 5 deletions.
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

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

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

0 comments on commit 0404743

Please sign in to comment.