diff options
| author | Zhongyue Luo <zhongyue.nah@intel.com> | 2013-06-10 14:43:41 +0800 |
|---|---|---|
| committer | Zhongyue Luo <zhongyue.nah@intel.com> | 2013-06-11 13:28:29 +0900 |
| commit | ab1977af316eef5375c7aaefdf364548b4fb5289 (patch) | |
| tree | abdded324a0220e9b17b78e5dc5c18c94b1f2b2d /nova/openstack | |
| parent | f85e4ec079283f4217415b4fd6a37ced189bc49a (diff) | |
| download | nova-ab1977af316eef5375c7aaefdf364548b4fb5289.tar.gz nova-ab1977af316eef5375c7aaefdf364548b4fb5289.tar.xz nova-ab1977af316eef5375c7aaefdf364548b4fb5289.zip | |
Replace functions in utils with oslo.fileutils
The following functions have moved to oslo.
remove_path_on_error
file_open
delete_if_exists
Replaced/removed overlapping functions with the ones in fileutils
Change-Id: I41a19d76a777b6f899843bb0cc0582630accbd5c
Diffstat (limited to 'nova/openstack')
| -rw-r--r-- | nova/openstack/common/fileutils.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/nova/openstack/common/fileutils.py b/nova/openstack/common/fileutils.py index b988ad03d..53e07a2a5 100644 --- a/nova/openstack/common/fileutils.py +++ b/nova/openstack/common/fileutils.py @@ -16,9 +16,18 @@ # under the License. +import contextlib import errno import os +from nova.openstack.common import excutils +from nova.openstack.common.gettextutils import _ +from nova.openstack.common import log as logging + +LOG = logging.getLogger(__name__) + +_FILE_CACHE = {} + def ensure_tree(path): """Create a directory (and any ancestor directories required) @@ -33,3 +42,69 @@ def ensure_tree(path): raise else: raise + + +def read_cached_file(filename, force_reload=False): + """Read from a file if it has been modified. + + :param force_reload: Whether to reload the file. + :returns: A tuple with a boolean specifying if the data is fresh + or not. + """ + global _FILE_CACHE + + if force_reload and filename in _FILE_CACHE: + del _FILE_CACHE[filename] + + reloaded = False + mtime = os.path.getmtime(filename) + cache_info = _FILE_CACHE.setdefault(filename, {}) + + if not cache_info or mtime > cache_info.get('mtime', 0): + LOG.debug(_("Reloading cached file %s") % filename) + with open(filename) as fap: + cache_info['data'] = fap.read() + cache_info['mtime'] = mtime + reloaded = True + return (reloaded, cache_info['data']) + + +def delete_if_exists(path): + """Delete a file, but ignore file not found error. + + :param path: File to delete + """ + + try: + os.unlink(path) + except OSError as e: + if e.errno == errno.ENOENT: + return + else: + raise + + +@contextlib.contextmanager +def remove_path_on_error(path): + """Protect code that wants to operate on PATH atomically. + Any exception will cause PATH to be removed. + + :param path: File to work with + """ + try: + yield + except Exception: + with excutils.save_and_reraise_exception(): + delete_if_exists(path) + + +def file_open(*args, **kwargs): + """Open file + + see built-in file() documentation for more details + + Note: The reason this is kept in a separate module is to easily + be able to provide a stub module that doesn't alter system + state at all (for unit tests) + """ + return file(*args, **kwargs) |
