summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Watkins <oddbloke@ubuntu.com>2020-06-19 12:03:53 -0400
committerGitHub <noreply@github.com>2020-06-19 12:03:53 -0400
commit40e72860e6a7d8876731cc1cfda4e499d119f2a1 (patch)
treecdf607d7bd9242a0ac27642c8820fc6226e3b411
parentd083a0315faf67c00acdecdc3f95c700edf6ba06 (diff)
downloadvyos-cloud-init-40e72860e6a7d8876731cc1cfda4e499d119f2a1.tar.gz
vyos-cloud-init-40e72860e6a7d8876731cc1cfda4e499d119f2a1.zip
util: add ensure_dir_exists parameter to write_file (#443)
This allows us to disable the `ensure_dir` call when it isn't appropriate.
-rw-r--r--cloudinit/util.py16
-rw-r--r--tests/unittests/test_util.py11
2 files changed, 25 insertions, 2 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 23d24c4c..81369652 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -1800,7 +1800,15 @@ def chmod(path, mode):
os.chmod(path, real_mode)
-def write_file(filename, content, mode=0o644, omode="wb", preserve_mode=False):
+def write_file(
+ filename,
+ content,
+ mode=0o644,
+ omode="wb",
+ preserve_mode=False,
+ *,
+ ensure_dir_exists=True
+):
"""
Writes a file with the given content and sets the file mode as specified.
Restores the SELinux context if possible.
@@ -1811,6 +1819,9 @@ def write_file(filename, content, mode=0o644, omode="wb", preserve_mode=False):
@param omode: The open mode used when opening the file (w, wb, a, etc.)
@param preserve_mode: If True and `filename` exists, preserve `filename`s
current mode instead of applying `mode`.
+ @param ensure_dir_exists: If True (the default), ensure that the directory
+ containing `filename` exists before writing to
+ the file.
"""
if preserve_mode:
@@ -1820,7 +1831,8 @@ def write_file(filename, content, mode=0o644, omode="wb", preserve_mode=False):
except OSError:
pass
- ensure_dir(os.path.dirname(filename))
+ if ensure_dir_exists:
+ ensure_dir(os.path.dirname(filename))
if 'b' in omode.lower():
content = encode_text(content)
write_type = 'bytes'
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index 0821341f..409dba61 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -98,6 +98,17 @@ class TestWriteFile(helpers.TestCase):
self.assertTrue(os.path.isdir(dirname))
self.assertTrue(os.path.isfile(path))
+ def test_dir_is_not_created_if_ensure_dir_false(self):
+ """Verify directories are not created if ensure_dir_exists is False."""
+ dirname = os.path.join(self.tmp, "subdir")
+ path = os.path.join(dirname, "NewFile.txt")
+ contents = "Hey there"
+
+ with self.assertRaises(FileNotFoundError):
+ util.write_file(path, contents, ensure_dir_exists=False)
+
+ self.assertFalse(os.path.isdir(dirname))
+
def test_explicit_mode(self):
"""Verify explicit file mode works properly."""
path = os.path.join(self.tmp, "NewFile.txt")