summaryrefslogtreecommitdiff
path: root/oslo_policy
diff options
context:
space:
mode:
authorBubaVV <vmarkov@mirantis.com>2019-07-11 17:57:47 +0300
committerStephen Finucane <sfinucan@redhat.com>2021-02-09 14:32:07 +0000
commit9919f1317c037163d0f31232991cca261881b66b (patch)
tree1009a10a55af4d5629cfe889996930c78ab81fa7 /oslo_policy
parent4065a08ea401e0d95e8d40d9d735edf92edda861 (diff)
downloadoslo-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
Diffstat (limited to 'oslo_policy')
-rw-r--r--oslo_policy/_cache_handler.py29
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'])