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
This commit is contained in:
BubaVV 2019-07-11 17:57:47 +03:00 committed by Stephen Finucane
parent 4065a08ea4
commit 9919f1317c

View File

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