From d9003d137558ac460d0c349c3d083d59a40d666b Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 26 Jan 2017 15:15:40 -0500 Subject: [PATCH] Make sure the parent dir of a file path exists before writing the file Fixes when the `extra_ca_certs` directory doesn't exist when using the new custom certs tool --- util/config/provider/fileprovider.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/util/config/provider/fileprovider.py b/util/config/provider/fileprovider.py index b2cd57eba..fdaf860b0 100644 --- a/util/config/provider/fileprovider.py +++ b/util/config/provider/fileprovider.py @@ -6,6 +6,16 @@ from util.config.provider.baseprovider import (BaseProvider, import_yaml, export logger = logging.getLogger(__name__) +def _ensure_parent_dir(filepath): + """ Ensures that the parent directory of the given file path exists. """ + try: + parentpath = os.path.abspath(os.path.join(filepath, os.pardir)) + if not os.path.isdir(parentpath): + os.makedirs(parentpath) + except IOError as ioe: + raise CannotWriteConfigException(str(ioe)) + + class FileConfigProvider(BaseProvider): """ Implementation of the config provider that reads the data from the file system. """ def __init__(self, config_volume, yaml_filename, py_filename): @@ -54,8 +64,13 @@ class FileConfigProvider(BaseProvider): def write_volume_file(self, filename, contents): filepath = os.path.join(self.config_volume, filename) - with open(filepath, mode='w') as f: - f.write(contents) + _ensure_parent_dir(filepath) + + try: + with open(filepath, mode='w') as f: + f.write(contents) + except IOError as ioe: + raise CannotWriteConfigException(str(ioe)) return filepath @@ -75,6 +90,9 @@ class FileConfigProvider(BaseProvider): def save_volume_file(self, filename, flask_file): filepath = os.path.join(self.config_volume, filename) + _ensure_parent_dir(filepath) + + # Write the file. try: flask_file.save(filepath) except IOError as ioe: