diff options
author | BubaVV <vmarkov@mirantis.com> | 2019-07-11 17:57:47 +0300 |
---|---|---|
committer | Stephen Finucane <sfinucan@redhat.com> | 2021-02-09 14:32:07 +0000 |
commit | 9919f1317c037163d0f31232991cca261881b66b (patch) | |
tree | 1009a10a55af4d5629cfe889996930c78ab81fa7 | |
parent | 4065a08ea401e0d95e8d40d9d735edf92edda861 (diff) | |
download | oslo-policy-9919f1317c037163d0f31232991cca261881b66b.tar.gz |
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
-rw-r--r-- | oslo_policy/_cache_handler.py | 29 |
1 files changed, 26 insertions, 3 deletions
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']) |