summaryrefslogtreecommitdiff
path: root/tests/unittests
diff options
context:
space:
mode:
authorScott Moser <smoser@brickies.net>2017-05-16 13:43:55 -0400
committerScott Moser <smoser@brickies.net>2017-05-16 15:34:21 -0400
commit4bcc947301bedc5ebf430cfaf6e4597bfb174aa7 (patch)
tree166aacb426f156147d5e8f7cc693c1b99e8c3861 /tests/unittests
parent9d437489b8ce1f8cd9d34cd9ff4994ca18bd2d78 (diff)
downloadvyos-cloud-init-4bcc947301bedc5ebf430cfaf6e4597bfb174aa7.tar.gz
vyos-cloud-init-4bcc947301bedc5ebf430cfaf6e4597bfb174aa7.zip
Improve detection of snappy to include os-release and kernel cmdline.
Recent core snap images (edge channel revision 1886) do not contain the previously known files used to detect that a system is ubuntu core. The changes here are to look in 2 additional locations to determine if a system is snappy. LP: #1689944
Diffstat (limited to 'tests/unittests')
-rw-r--r--tests/unittests/helpers.py7
-rw-r--r--tests/unittests/test_util.py69
2 files changed, 72 insertions, 4 deletions
diff --git a/tests/unittests/helpers.py b/tests/unittests/helpers.py
index a711404c..d24f817d 100644
--- a/tests/unittests/helpers.py
+++ b/tests/unittests/helpers.py
@@ -106,7 +106,7 @@ class CiTestCase(TestCase):
return os.path.normpath(os.path.abspath(os.path.join(dir, path)))
-class ResourceUsingTestCase(TestCase):
+class ResourceUsingTestCase(CiTestCase):
def setUp(self):
super(ResourceUsingTestCase, self).setUp()
self.resource_path = None
@@ -229,8 +229,7 @@ class FilesystemMockingTestCase(ResourceUsingTestCase):
def reRoot(self, root=None):
if root is None:
- root = tempfile.mkdtemp()
- self.addCleanup(shutil.rmtree, root)
+ root = self.tmp_dir()
self.patchUtils(root)
self.patchOS(root)
return root
@@ -256,7 +255,7 @@ def populate_dir(path, files):
os.makedirs(path)
ret = []
for (name, content) in files.items():
- p = os.path.join(path, name)
+ p = os.path.sep.join([path, name])
util.ensure_dir(os.path.dirname(p))
with open(p, "wb") as fp:
if isinstance(content, six.binary_type):
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index 189caca8..490760d1 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -712,4 +712,73 @@ class TestProcessExecutionError(helpers.TestCase):
)).format(description=self.empty_description,
empty_attr=self.empty_attr))
+
+class TestSystemIsSnappy(helpers.FilesystemMockingTestCase):
+ def test_id_in_os_release_quoted(self):
+ """os-release containing ID="ubuntu-core" is snappy."""
+ orcontent = '\n'.join(['ID="ubuntu-core"', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ def test_id_in_os_release(self):
+ """os-release containing ID=ubuntu-core is snappy."""
+ orcontent = '\n'.join(['ID=ubuntu-core', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_bad_content_in_os_release_no_effect(self, m_cmdline):
+ """malformed os-release should not raise exception."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ orcontent = '\n'.join(['IDubuntu-core', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot()
+ self.assertFalse(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_snap_core_in_cmdline_is_snappy(self, m_cmdline):
+ """The string snap_core= in kernel cmdline indicates snappy."""
+ cmdline = (
+ "BOOT_IMAGE=(loop)/kernel.img root=LABEL=writable "
+ "snap_core=core_x1.snap snap_kernel=pc-kernel_x1.snap ro "
+ "net.ifnames=0 init=/lib/systemd/systemd console=tty1 "
+ "console=ttyS0 panic=-1")
+ m_cmdline.return_value = cmdline
+ self.assertTrue(util.system_is_snappy())
+ self.assertTrue(m_cmdline.call_count > 0)
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_nothing_found_is_not_snappy(self, m_cmdline):
+ """If no positive identification, then not snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ self.reRoot()
+ self.assertFalse(util.system_is_snappy())
+ self.assertTrue(m_cmdline.call_count > 0)
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_channel_ini_with_snappy_is_snappy(self, m_cmdline):
+ """A Channel.ini file with 'ubuntu-core' indicates snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ root_d = self.tmp_dir()
+ content = '\n'.join(["[Foo]", "source = 'ubuntu-core'", ""])
+ helpers.populate_dir(
+ root_d, {'etc/system-image/channel.ini': content})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_system_image_config_dir_is_snappy(self, m_cmdline):
+ """Existence of /etc/system-image/config.d indicates snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ root_d = self.tmp_dir()
+ helpers.populate_dir(
+ root_d, {'etc/system-image/config.d/my.file': "_unused"})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
# vi: ts=4 expandtab