diff options
author | vponomaryov <vponomaryov@mirantis.com> | 2014-07-11 19:08:58 +0300 |
---|---|---|
committer | vponomaryov <vponomaryov@mirantis.com> | 2014-07-11 19:49:45 +0300 |
commit | 2b966f94de7367b5d0915d8e301b9b0e78d8c831 (patch) | |
tree | 9ba11526cce467dba0c1c19f633c28267cb4efb5 | |
parent | 569979adfd4237869bb50c7aaa02bc3fd4f0b413 (diff) | |
download | oslo-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.py | 15 | ||||
-rw-r--r-- | openstack/common/policy.py | 1 | ||||
-rw-r--r-- | tests/unit/test_fileutils.py | 16 | ||||
-rw-r--r-- | tests/unit/test_policy.py | 6 |
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 = """{ |