summaryrefslogtreecommitdiff
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
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
-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'])