summaryrefslogtreecommitdiff
path: root/tests/unittests
diff options
context:
space:
mode:
authorScott Moser <smoser@brickies.net>2016-10-20 22:53:17 -0400
committerScott Moser <smoser@brickies.net>2017-01-11 14:19:35 -0500
commita1b185d0cce5064e9b36b4db7b55564e2ab1d7a8 (patch)
treed3f0382f70faaa4803ee1fc9b43a6990beaf465c /tests/unittests
parent7fb6f78177b5ece10ca7c54ba3958010a9987f06 (diff)
downloadvyos-cloud-init-a1b185d0cce5064e9b36b4db7b55564e2ab1d7a8.tar.gz
vyos-cloud-init-a1b185d0cce5064e9b36b4db7b55564e2ab1d7a8.zip
Get early logging logged, including failures of cmdline url.
Failures to load the kernel command line's url (cloud-config-url=) would previously get swallowed. This should make it much more obvious when that happens. With logging going to expected places at sane levels (WARN will go to stderr by default).
Diffstat (limited to 'tests/unittests')
-rw-r--r--tests/unittests/helpers.py16
-rw-r--r--tests/unittests/test__init__.py92
2 files changed, 70 insertions, 38 deletions
diff --git a/tests/unittests/helpers.py b/tests/unittests/helpers.py
index cf3b46d2..64e56d98 100644
--- a/tests/unittests/helpers.py
+++ b/tests/unittests/helpers.py
@@ -264,16 +264,22 @@ class HttprettyTestCase(TestCase):
class TempDirTestCase(TestCase):
# provide a tempdir per class, not per test.
- def setUp(self):
- super(TempDirTestCase, self).setUp()
- self.tmp = tempfile.mkdtemp()
- self.addCleanup(shutil.rmtree, self.tmp)
+ @classmethod
+ def setUpClass(cls):
+ cls.tmpd = tempfile.mkdtemp(prefix="ci-%s." % cls.__name__)
+ return TestCase.setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ shutil.rmtree(cls.tmpd)
+ return TestCase.tearDownClass()
def tmp_path(self, path):
+ # if absolute path (starts with /), then make ./path
if path.startswith(os.path.sep):
path = "." + path
- return os.path.normpath(os.path.join(self.tmp, path))
+ return os.path.normpath(os.path.join(self.tmpd, path))
def populate_dir(path, files):
diff --git a/tests/unittests/test__init__.py b/tests/unittests/test__init__.py
index 7b6f8c4e..e6f4c318 100644
--- a/tests/unittests/test__init__.py
+++ b/tests/unittests/test__init__.py
@@ -1,16 +1,18 @@
# This file is part of cloud-init. See LICENSE file for license information.
+import logging
import os
import shutil
import tempfile
+from cloudinit.cmd import main
from cloudinit import handlers
from cloudinit import helpers
from cloudinit import settings
from cloudinit import url_helper
from cloudinit import util
-from .helpers import TestCase, ExitStack, mock
+from .helpers import TestCase, TempDirTestCase, ExitStack, mock
class FakeModule(handlers.Handler):
@@ -170,44 +172,68 @@ class TestHandlerHandlePart(TestCase):
self.data, self.ctype, self.filename, self.payload)
-class TestCmdlineUrl(TestCase):
- def test_invalid_content(self):
- url = "http://example.com/foo"
- key = "mykey"
- payload = b"0"
- cmdline = "ro %s=%s bar=1" % (key, url)
+class TestCmdlineUrl(TempDirTestCase):
+ def test_parse_cmdline_url_nokey_raises_keyerror(self):
+ self.assertRaises(
+ KeyError, main.parse_cmdline_url, 'root=foo bar single')
- with mock.patch('cloudinit.url_helper.readurl',
- return_value=url_helper.StringResponse(payload)):
- self.assertEqual(
- util.get_cmdline_url(names=[key], starts="xxxxxx",
- cmdline=cmdline),
- (key, url, None))
+ def test_parse_cmdline_url_found(self):
+ cmdline = 'root=foo bar single url=http://example.com arg1 -v'
+ self.assertEqual(
+ ('url', 'http://example.com'), main.parse_cmdline_url(cmdline))
- def test_valid_content(self):
- url = "http://example.com/foo"
- key = "mykey"
- payload = b"xcloud-config\nmydata: foo\nbar: wark\n"
+ @mock.patch('cloudinit.cmd.main.util.read_file_or_url')
+ def test_invalid_content(self, m_read):
+ key = "cloud-config-url"
+ url = 'http://example.com/foo'
cmdline = "ro %s=%s bar=1" % (key, url)
+ m_read.return_value = url_helper.StringResponse(b"unexpected blob")
- with mock.patch('cloudinit.url_helper.readurl',
- return_value=url_helper.StringResponse(payload)):
- self.assertEqual(
- util.get_cmdline_url(names=[key], starts=b"xcloud-config",
- cmdline=cmdline),
- (key, url, payload))
+ fpath = self.tmp_path("test_valid")
+ lvl, msg = main.attempt_cmdline_url(
+ fpath, network=True, cmdline=cmdline)
+ self.assertEqual(logging.WARN, lvl)
+ self.assertIn(url, msg)
+ self.assertFalse(os.path.exists(fpath))
- def test_no_key_found(self):
+ @mock.patch('cloudinit.cmd.main.util.read_file_or_url')
+ def test_valid_content(self, m_read):
url = "http://example.com/foo"
- key = "mykey"
- cmdline = "ro %s=%s bar=1" % (key, url)
-
- with mock.patch('cloudinit.url_helper.readurl',
- return_value=url_helper.StringResponse(b'')):
- self.assertEqual(
- util.get_cmdline_url(names=["does-not-appear"],
- starts="#cloud-config", cmdline=cmdline),
- (None, None, None))
+ payload = b"#cloud-config\nmydata: foo\nbar: wark\n"
+ cmdline = "ro %s=%s bar=1" % ('cloud-config-url', url)
+
+ m_read.return_value = url_helper.StringResponse(payload)
+ fpath = self.tmp_path("test_valid")
+ lvl, msg = main.attempt_cmdline_url(
+ fpath, network=True, cmdline=cmdline)
+ self.assertEqual(util.load_file(fpath, decode=False), payload)
+ self.assertEqual(logging.INFO, lvl)
+ self.assertIn(url, msg)
+
+ @mock.patch('cloudinit.cmd.main.util.read_file_or_url')
+ def test_no_key_found(self, m_read):
+ cmdline = "ro mykey=http://example.com/foo root=foo"
+ fpath = self.tmp_path("test_no_key_found")
+ lvl, msg = main.attempt_cmdline_url(
+ fpath, network=True, cmdline=cmdline)
+
+ m_read.assert_not_called()
+ self.assertFalse(os.path.exists(fpath))
+ self.assertEqual(logging.DEBUG, lvl)
+
+ @mock.patch('cloudinit.cmd.main.util.read_file_or_url')
+ def test_exception_warns(self, m_read):
+ url = "http://example.com/foo"
+ cmdline = "ro cloud-config-url=%s root=LABEL=bar" % url
+ fpath = self.tmp_path("test_no_key_found")
+ m_read.side_effect = url_helper.UrlError(
+ cause="Unexpected Error", url="http://example.com/foo")
+
+ lvl, msg = main.attempt_cmdline_url(
+ fpath, network=True, cmdline=cmdline)
+ self.assertEqual(logging.WARN, lvl)
+ self.assertIn(url, msg)
+ self.assertFalse(os.path.exists(fpath))
# vi: ts=4 expandtab