summaryrefslogtreecommitdiff
path: root/tests/unittests/config/test_cc_bootcmd.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittests/config/test_cc_bootcmd.py')
-rw-r--r--tests/unittests/config/test_cc_bootcmd.py100
1 files changed, 57 insertions, 43 deletions
diff --git a/tests/unittests/config/test_cc_bootcmd.py b/tests/unittests/config/test_cc_bootcmd.py
index 6f38f12a..6d8793b9 100644
--- a/tests/unittests/config/test_cc_bootcmd.py
+++ b/tests/unittests/config/test_cc_bootcmd.py
@@ -2,11 +2,14 @@
import logging
import tempfile
+from cloudinit import subp, util
from cloudinit.config.cc_bootcmd import handle, schema
-from cloudinit import (subp, util)
from tests.unittests.helpers import (
- CiTestCase, mock, SchemaTestCaseMixin, skipUnlessJsonSchema)
-
+ CiTestCase,
+ SchemaTestCaseMixin,
+ mock,
+ skipUnlessJsonSchema,
+)
from tests.unittests.util import get_cloud
LOG = logging.getLogger(__name__)
@@ -16,7 +19,8 @@ class FakeExtendedTempFile(object):
def __init__(self, suffix):
self.suffix = suffix
self.handle = tempfile.NamedTemporaryFile(
- prefix="ci-%s." % self.__class__.__name__, delete=False)
+ prefix="ci-%s." % self.__class__.__name__, delete=False
+ )
def __enter__(self):
return self.handle
@@ -30,8 +34,9 @@ class TestBootcmd(CiTestCase):
with_logs = True
- _etmpfile_path = ('cloudinit.config.cc_bootcmd.temp_utils.'
- 'ExtendedTemporaryFile')
+ _etmpfile_path = (
+ "cloudinit.config.cc_bootcmd.temp_utils.ExtendedTemporaryFile"
+ )
def setUp(self):
super(TestBootcmd, self).setUp()
@@ -42,21 +47,23 @@ class TestBootcmd(CiTestCase):
"""When the provided config doesn't contain bootcmd, skip it."""
cfg = {}
mycloud = get_cloud()
- handle('notimportant', cfg, mycloud, LOG, None)
+ handle("notimportant", cfg, mycloud, LOG, None)
self.assertIn(
"Skipping module named notimportant, no 'bootcmd' key",
- self.logs.getvalue())
+ self.logs.getvalue(),
+ )
def test_handler_invalid_command_set(self):
"""Commands which can't be converted to shell will raise errors."""
- invalid_config = {'bootcmd': 1}
+ invalid_config = {"bootcmd": 1}
cc = get_cloud()
with self.assertRaises(TypeError) as context_manager:
- handle('cc_bootcmd', invalid_config, cc, LOG, [])
- self.assertIn('Failed to shellify bootcmd', self.logs.getvalue())
+ handle("cc_bootcmd", invalid_config, cc, LOG, [])
+ self.assertIn("Failed to shellify bootcmd", self.logs.getvalue())
self.assertEqual(
"Input to shellify was type 'int'. Expected list or tuple.",
- str(context_manager.exception))
+ str(context_manager.exception),
+ )
@skipUnlessJsonSchema()
def test_handler_schema_validation_warns_non_array_type(self):
@@ -65,14 +72,15 @@ class TestBootcmd(CiTestCase):
Schema validation is not strict, so bootcmd attempts to shellify the
invalid content.
"""
- invalid_config = {'bootcmd': 1}
+ invalid_config = {"bootcmd": 1}
cc = get_cloud()
with self.assertRaises(TypeError):
- handle('cc_bootcmd', invalid_config, cc, LOG, [])
+ handle("cc_bootcmd", invalid_config, cc, LOG, [])
self.assertIn(
- 'Invalid config:\nbootcmd: 1 is not of type \'array\'',
- self.logs.getvalue())
- self.assertIn('Failed to shellify', self.logs.getvalue())
+ "Invalid config:\nbootcmd: 1 is not of type 'array'",
+ self.logs.getvalue(),
+ )
+ self.assertIn("Failed to shellify", self.logs.getvalue())
@skipUnlessJsonSchema()
def test_handler_schema_validation_warns_non_array_item_type(self):
@@ -82,54 +90,58 @@ class TestBootcmd(CiTestCase):
invalid content.
"""
invalid_config = {
- 'bootcmd': ['ls /', 20, ['wget', 'http://stuff/blah'], {'a': 'n'}]}
+ "bootcmd": ["ls /", 20, ["wget", "http://stuff/blah"], {"a": "n"}]
+ }
cc = get_cloud()
with self.assertRaises(TypeError) as context_manager:
- handle('cc_bootcmd', invalid_config, cc, LOG, [])
+ handle("cc_bootcmd", invalid_config, cc, LOG, [])
expected_warnings = [
- 'bootcmd.1: 20 is not valid under any of the given schemas',
- 'bootcmd.3: {\'a\': \'n\'} is not valid under any of the given'
- ' schema'
+ "bootcmd.1: 20 is not valid under any of the given schemas",
+ "bootcmd.3: {'a': 'n'} is not valid under any of the given schema",
]
logs = self.logs.getvalue()
for warning in expected_warnings:
self.assertIn(warning, logs)
- self.assertIn('Failed to shellify', logs)
+ self.assertIn("Failed to shellify", logs)
self.assertEqual(
- ("Unable to shellify type 'int'. Expected list, string, tuple. "
- "Got: 20"),
- str(context_manager.exception))
+ "Unable to shellify type 'int'. Expected list, string, tuple. "
+ "Got: 20",
+ str(context_manager.exception),
+ )
def test_handler_creates_and_runs_bootcmd_script_with_instance_id(self):
"""Valid schema runs a bootcmd script with INSTANCE_ID in the env."""
cc = get_cloud()
- out_file = self.tmp_path('bootcmd.out', self.new_root)
+ out_file = self.tmp_path("bootcmd.out", self.new_root)
my_id = "b6ea0f59-e27d-49c6-9f87-79f19765a425"
- valid_config = {'bootcmd': [
- 'echo {0} $INSTANCE_ID > {1}'.format(my_id, out_file)]}
+ valid_config = {
+ "bootcmd": ["echo {0} $INSTANCE_ID > {1}".format(my_id, out_file)]
+ }
with mock.patch(self._etmpfile_path, FakeExtendedTempFile):
- with self.allow_subp(['/bin/sh']):
- handle('cc_bootcmd', valid_config, cc, LOG, [])
- self.assertEqual(my_id + ' iid-datasource-none\n',
- util.load_file(out_file))
+ with self.allow_subp(["/bin/sh"]):
+ handle("cc_bootcmd", valid_config, cc, LOG, [])
+ self.assertEqual(
+ my_id + " iid-datasource-none\n", util.load_file(out_file)
+ )
def test_handler_runs_bootcmd_script_with_error(self):
"""When a valid script generates an error, that error is raised."""
cc = get_cloud()
- valid_config = {'bootcmd': ['exit 1']} # Script with error
+ valid_config = {"bootcmd": ["exit 1"]} # Script with error
with mock.patch(self._etmpfile_path, FakeExtendedTempFile):
- with self.allow_subp(['/bin/sh']):
+ with self.allow_subp(["/bin/sh"]):
with self.assertRaises(subp.ProcessExecutionError) as ctxt:
- handle('does-not-matter', valid_config, cc, LOG, [])
+ handle("does-not-matter", valid_config, cc, LOG, [])
self.assertIn(
- 'Unexpected error while running command.\n'
- "Command: ['/bin/sh',",
- str(ctxt.exception))
+ "Unexpected error while running command.\nCommand: ['/bin/sh',",
+ str(ctxt.exception),
+ )
self.assertIn(
- 'Failed to run bootcmd module does-not-matter',
- self.logs.getvalue())
+ "Failed to run bootcmd module does-not-matter",
+ self.logs.getvalue(),
+ )
@skipUnlessJsonSchema()
@@ -141,12 +153,14 @@ class TestSchema(CiTestCase, SchemaTestCaseMixin):
def test_duplicates_are_fine_array_array(self):
"""Duplicated commands array/array entries are allowed."""
self.assertSchemaValid(
- ["byebye", "byebye"], 'command entries can be duplicate')
+ ["byebye", "byebye"], "command entries can be duplicate"
+ )
def test_duplicates_are_fine_array_string(self):
"""Duplicated commands array/string entries are allowed."""
self.assertSchemaValid(
- ["echo bye", "echo bye"], "command entries can be duplicate.")
+ ["echo bye", "echo bye"], "command entries can be duplicate."
+ )
# vi: ts=4 expandtab