summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvponomaryov <vponomaryov@mirantis.com>2014-07-11 19:08:58 +0300
committervponomaryov <vponomaryov@mirantis.com>2014-07-11 19:49:45 +0300
commit2b966f94de7367b5d0915d8e301b9b0e78d8c831 (patch)
tree9ba11526cce467dba0c1c19f633c28267cb4efb5
parent569979adfd4237869bb50c7aaa02bc3fd4f0b413 (diff)
downloadoslo-incubator-2b966f94de7367b5d0915d8e301b9b0e78d8c831.tar.gz
Fix deletion of cached file for policy enforcer
Policy ENFORCER's method 'clear' does not really delete cached file as written in its docstring. This commit adds 'delete_cached_file' to fileutils and makes 'clear' method of ENFORCER use it. Change-Id: I855d5f2001ac721249217d9fbd782c64af9db874 Closes-Bug: #1340843
-rw-r--r--openstack/common/fileutils.py15
-rw-r--r--openstack/common/policy.py1
-rw-r--r--tests/unit/test_fileutils.py16
-rw-r--r--tests/unit/test_policy.py6
4 files changed, 36 insertions, 2 deletions
diff --git a/openstack/common/fileutils.py b/openstack/common/fileutils.py
index 5fc38ab4..bf7df55d 100644
--- a/openstack/common/fileutils.py
+++ b/openstack/common/fileutils.py
@@ -50,8 +50,8 @@ def read_cached_file(filename, force_reload=False):
"""
global _FILE_CACHE
- if force_reload and filename in _FILE_CACHE:
- del _FILE_CACHE[filename]
+ if force_reload:
+ delete_cached_file(filename)
reloaded = False
mtime = os.path.getmtime(filename)
@@ -66,6 +66,17 @@ def read_cached_file(filename, force_reload=False):
return (reloaded, cache_info['data'])
+def delete_cached_file(filename):
+ """Delete cached file if present.
+
+ :param filename: filename to delete
+ """
+ global _FILE_CACHE
+
+ if filename in _FILE_CACHE:
+ del _FILE_CACHE[filename]
+
+
def delete_if_exists(path, remove=os.unlink):
"""Delete a file, but ignore file not found error.
diff --git a/openstack/common/policy.py b/openstack/common/policy.py
index b2451ea1..38899150 100644
--- a/openstack/common/policy.py
+++ b/openstack/common/policy.py
@@ -216,6 +216,7 @@ class Enforcer(object):
def clear(self):
"""Clears Enforcer rules, policy's cache and policy's path."""
self.set_rules({})
+ fileutils.delete_cached_file(self.policy_path)
self.default_rule = None
self.policy_path = None
diff --git a/tests/unit/test_fileutils.py b/tests/unit/test_fileutils.py
index c82f16f9..4d9f98c7 100644
--- a/tests/unit/test_fileutils.py
+++ b/tests/unit/test_fileutils.py
@@ -74,6 +74,22 @@ class TestCachedFile(test_base.BaseTestCase):
self.assertEqual(data, fake_contents)
self.assertTrue(fresh)
+ def test_delete_cached_file(self):
+ filename = '/this/is/a/fake/deletion/of/cached/file'
+ fileutils._FILE_CACHE = {
+ filename: {"data": 1123, "mtime": 1}
+ }
+ self.assertIn(filename, fileutils._FILE_CACHE)
+ fileutils.delete_cached_file(filename)
+ self.assertNotIn(filename, fileutils._FILE_CACHE)
+
+ def test_delete_cached_file_not_exist(self):
+ # We expect that if cached file does not exist no Exception raised.
+ filename = '/this/is/a/fake/deletion/attempt/of/not/cached/file'
+ self.assertNotIn(filename, fileutils._FILE_CACHE)
+ fileutils.delete_cached_file(filename)
+ self.assertNotIn(filename, fileutils._FILE_CACHE)
+
class DeleteIfExists(test_base.BaseTestCase):
def test_file_present(self):
diff --git a/tests/unit/test_policy.py b/tests/unit/test_policy.py
index 077d966f..33345773 100644
--- a/tests/unit/test_policy.py
+++ b/tests/unit/test_policy.py
@@ -24,6 +24,7 @@ import six
import six.moves.urllib.parse as urlparse
import six.moves.urllib.request as urlrequest
+from openstack.common import fileutils
from openstack.common.fixture import config
from openstack.common.fixture import lockutils
from openstack.common import jsonutils
@@ -139,11 +140,16 @@ class EnforcerTest(PolicyBaseTestCase):
self.enforcer.set_rules,
'dummy')
+ @mock.patch.object(fileutils, 'delete_cached_file', mock.Mock())
def test_clear(self):
# Make sure the rules are reset
self.enforcer.rules = 'spam'
+ filename = self.enforcer.policy_path
self.enforcer.clear()
self.assertEqual(self.enforcer.rules, {})
+ self.assertEqual(self.enforcer.default_rule, None)
+ self.assertEqual(self.enforcer.policy_path, None)
+ fileutils.delete_cached_file.assert_called_once_with(filename)
def test_rule_with_check(self):
rules_json = """{