summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/net/netplan.py3
-rw-r--r--tests/unittests/helpers.py21
-rw-r--r--tests/unittests/test_distros/test_create_users.py30
-rw-r--r--tests/unittests/test_runs/test_simple_run.py18
4 files changed, 34 insertions, 38 deletions
diff --git a/cloudinit/net/netplan.py b/cloudinit/net/netplan.py
index 67543305..9f35b72b 100644
--- a/cloudinit/net/netplan.py
+++ b/cloudinit/net/netplan.py
@@ -209,7 +209,8 @@ class Renderer(renderer.Renderer):
# check network state for version
# if v2, then extract network_state.config
# else render_v2_from_state
- fpnplan = os.path.join(target, self.netplan_path)
+ fpnplan = os.path.join(util.target_path(target), self.netplan_path)
+
util.ensure_dir(os.path.dirname(fpnplan))
header = self.netplan_header if self.netplan_header else ""
diff --git a/tests/unittests/helpers.py b/tests/unittests/helpers.py
index 569f1aef..6691cf82 100644
--- a/tests/unittests/helpers.py
+++ b/tests/unittests/helpers.py
@@ -82,7 +82,26 @@ def retarget_many_wrapper(new_base, am, old_func):
class TestCase(unittest2.TestCase):
- pass
+ def reset_global_state(self):
+ """Reset any global state to its original settings.
+
+ cloudinit caches some values in cloudinit.util. Unit tests that
+ involved those cached paths were then subject to failure if the order
+ of invocation changed (LP: #1703697).
+
+ This function resets any of these global state variables to their
+ initial state.
+
+ In the future this should really be done with some registry that
+ can then be cleaned in a more obvious way.
+ """
+ util.PROC_CMDLINE = None
+ util._DNS_REDIRECT_IP = None
+ util._LSB_RELEASE = {}
+
+ def setUp(self):
+ super(unittest2.TestCase, self).setUp()
+ self.reset_global_state()
class CiTestCase(TestCase):
diff --git a/tests/unittests/test_distros/test_create_users.py b/tests/unittests/test_distros/test_create_users.py
index 9ded4f6c..1d02f7bd 100644
--- a/tests/unittests/test_distros/test_create_users.py
+++ b/tests/unittests/test_distros/test_create_users.py
@@ -38,6 +38,8 @@ class MyBaseDistro(distros.Distro):
raise NotImplementedError()
+@mock.patch("cloudinit.distros.util.system_is_snappy", return_value=False)
+@mock.patch("cloudinit.distros.util.subp")
class TestCreateUser(TestCase):
def setUp(self):
super(TestCase, self).setUp()
@@ -53,8 +55,7 @@ class TestCreateUser(TestCase):
logcmd[i + 1] = 'REDACTED'
return mock.call(args, logstring=logcmd)
- @mock.patch("cloudinit.distros.util.subp")
- def test_basic(self, m_subp):
+ def test_basic(self, m_subp, m_is_snappy):
user = 'foouser'
self.dist.create_user(user)
self.assertEqual(
@@ -62,8 +63,7 @@ class TestCreateUser(TestCase):
[self._useradd2call([user, '-m']),
mock.call(['passwd', '-l', user])])
- @mock.patch("cloudinit.distros.util.subp")
- def test_no_home(self, m_subp):
+ def test_no_home(self, m_subp, m_is_snappy):
user = 'foouser'
self.dist.create_user(user, no_create_home=True)
self.assertEqual(
@@ -71,8 +71,7 @@ class TestCreateUser(TestCase):
[self._useradd2call([user, '-M']),
mock.call(['passwd', '-l', user])])
- @mock.patch("cloudinit.distros.util.subp")
- def test_system_user(self, m_subp):
+ def test_system_user(self, m_subp, m_is_snappy):
# system user should have no home and get --system
user = 'foouser'
self.dist.create_user(user, system=True)
@@ -81,8 +80,7 @@ class TestCreateUser(TestCase):
[self._useradd2call([user, '--system', '-M']),
mock.call(['passwd', '-l', user])])
- @mock.patch("cloudinit.distros.util.subp")
- def test_explicit_no_home_false(self, m_subp):
+ def test_explicit_no_home_false(self, m_subp, m_is_snappy):
user = 'foouser'
self.dist.create_user(user, no_create_home=False)
self.assertEqual(
@@ -90,16 +88,14 @@ class TestCreateUser(TestCase):
[self._useradd2call([user, '-m']),
mock.call(['passwd', '-l', user])])
- @mock.patch("cloudinit.distros.util.subp")
- def test_unlocked(self, m_subp):
+ def test_unlocked(self, m_subp, m_is_snappy):
user = 'foouser'
self.dist.create_user(user, lock_passwd=False)
self.assertEqual(
m_subp.call_args_list,
[self._useradd2call([user, '-m'])])
- @mock.patch("cloudinit.distros.util.subp")
- def test_set_password(self, m_subp):
+ def test_set_password(self, m_subp, m_is_snappy):
user = 'foouser'
password = 'passfoo'
self.dist.create_user(user, passwd=password)
@@ -109,8 +105,7 @@ class TestCreateUser(TestCase):
mock.call(['passwd', '-l', user])])
@mock.patch("cloudinit.distros.util.is_group")
- @mock.patch("cloudinit.distros.util.subp")
- def test_group_added(self, m_subp, m_is_group):
+ def test_group_added(self, m_is_group, m_subp, m_is_snappy):
m_is_group.return_value = False
user = 'foouser'
self.dist.create_user(user, groups=['group1'])
@@ -121,8 +116,7 @@ class TestCreateUser(TestCase):
self.assertEqual(m_subp.call_args_list, expected)
@mock.patch("cloudinit.distros.util.is_group")
- @mock.patch("cloudinit.distros.util.subp")
- def test_only_new_group_added(self, m_subp, m_is_group):
+ def test_only_new_group_added(self, m_is_group, m_subp, m_is_snappy):
ex_groups = ['existing_group']
groups = ['group1', ex_groups[0]]
m_is_group.side_effect = lambda m: m in ex_groups
@@ -135,8 +129,8 @@ class TestCreateUser(TestCase):
self.assertEqual(m_subp.call_args_list, expected)
@mock.patch("cloudinit.distros.util.is_group")
- @mock.patch("cloudinit.distros.util.subp")
- def test_create_groups_with_whitespace_string(self, m_subp, m_is_group):
+ def test_create_groups_with_whitespace_string(
+ self, m_is_group, m_subp, m_is_snappy):
# groups supported as a comma delimeted string even with white space
m_is_group.return_value = False
user = 'foouser'
diff --git a/tests/unittests/test_runs/test_simple_run.py b/tests/unittests/test_runs/test_simple_run.py
index 31324204..55f15b55 100644
--- a/tests/unittests/test_runs/test_simple_run.py
+++ b/tests/unittests/test_runs/test_simple_run.py
@@ -16,24 +16,6 @@ class TestSimpleRun(helpers.FilesystemMockingTestCase):
self.patchOS(root)
self.patchUtils(root)
- def _pp_root(self, root, repatch=True):
- for (dirpath, dirnames, filenames) in os.walk(root):
- print(dirpath)
- for f in filenames:
- joined = os.path.join(dirpath, f)
- if os.path.islink(joined):
- print("f %s - (symlink)" % (f))
- else:
- print("f %s" % (f))
- for d in dirnames:
- joined = os.path.join(dirpath, d)
- if os.path.islink(joined):
- print("d %s - (symlink)" % (d))
- else:
- print("d %s" % (d))
- if repatch:
- self._patchIn(root)
-
def test_none_ds(self):
new_root = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, new_root)