From 9919f1317c037163d0f31232991cca261881b66b Mon Sep 17 00:00:00 2001 From: BubaVV Date: Thu, 11 Jul 2019 17:57:47 +0300 Subject: Correctly handle IO errors at policy file load For now, policy file unaccessible due to access permission leads to silent failure without any notifictaion. Side effects of it are also affected by policy caching and might be quite confusing, like periodic disappearing of Horizon panels. Proposed patch added handling of such errors. Closes-bug: #1836390 Change-Id: I0d67b6e7c2dcaa63d6bb807f013e5e7334efc715 --- oslo_policy/_cache_handler.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'oslo_policy') diff --git a/oslo_policy/_cache_handler.py b/oslo_policy/_cache_handler.py index ab90684..fd34915 100644 --- a/oslo_policy/_cache_handler.py +++ b/oslo_policy/_cache_handler.py @@ -13,9 +13,12 @@ # License for the specific language governing permissions and limitations # under the License. +import errno import logging import os +from oslo_config import cfg + LOG = logging.getLogger(__name__) @@ -33,13 +36,33 @@ def read_cached_file(cache, filename, force_reload=False): delete_cached_file(cache, filename) reloaded = False - mtime = os.path.getmtime(filename) + try: + mtime = os.path.getmtime(filename) + except OSError as err: + msg = err.strerror + LOG.error('Config file not found %(filename)s: %(msg)s', + {'filename': filename, 'msg': msg}) + return True, {} + cache_info = 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() + try: + with open(filename) as fap: + cache_info['data'] = fap.read() + except IOError as err: + msg = err.strerror + err_code = err.errno + LOG.error('IO error loading %(filename)s: %(msg)s', + {'filename': filename, 'msg': msg}) + if err_code == errno.EACCES: + raise cfg.ConfigFilesPermissionDeniedError((filename,)) + except OSError as err: + msg = err.strerror + LOG.error('Config file not found %(filename)s: %(msg)s', + {'filename': filename, 'msg': msg}) + raise cfg.ConfigFilesNotFoundError((filename,)) cache_info['mtime'] = mtime reloaded = True return (reloaded, cache_info['data']) -- cgit v1.2.1