diff --git a/doc/source/api.rst b/doc/source/api.rst index 35d9338e..33593579 100644 --- a/doc/source/api.rst +++ b/doc/source/api.rst @@ -8,6 +8,11 @@ oslo_policy.policy .. automodule:: oslo_policy.policy :members: +.. autoclass:: oslo_policy.policy.AndCheck +.. autoclass:: oslo_policy.policy.NotCheck +.. autoclass:: oslo_policy.policy.OrCheck +.. autoclass:: oslo_policy.policy.RuleCheck + oslo_policy.opts ================ diff --git a/oslo_policy/policy.py b/oslo_policy/policy.py index 27ccbf29..b6967782 100644 --- a/oslo_policy/policy.py +++ b/oslo_policy/policy.py @@ -129,6 +129,13 @@ Registering New Special Checks It is also possible for additional special check types to be registered using the :func:`~oslo_policy.policy.register` function. +The following classes can be used as parents for custom special check types: + + * :class:`~oslo_policy.policy.AndCheck` + * :class:`~oslo_policy.policy.NotCheck` + * :class:`~oslo_policy.policy.OrCheck` + * :class:`~oslo_policy.policy.RuleCheck` + Policy Rule Expressions ~~~~~~~~~~~~~~~~~~~~~~~ @@ -222,6 +229,11 @@ LOG = logging.getLogger(__name__) register = _checks.register Check = _checks.Check +AndCheck = _checks.AndCheck +NotCheck = _checks.NotCheck +OrCheck = _checks.OrCheck +RuleCheck = _checks.RuleCheck + class PolicyNotAuthorized(Exception): """Default exception raised for policy enforcement failure.""" diff --git a/oslo_policy/tests/test_policy.py b/oslo_policy/tests/test_policy.py index 85cbfc9c..741a00e1 100644 --- a/oslo_policy/tests/test_policy.py +++ b/oslo_policy/tests/test_policy.py @@ -491,3 +491,23 @@ class RegisterCheckTestCase(base.PolicyBaseTestCase): policy.register('spam', TestCheck) self.assertEqual(dict(spam=TestCheck), _checks.registered_checks) + + +class BaseCheckTypesTestCase(base.PolicyBaseTestCase): + + @mock.patch.object(_checks, 'registered_checks', {}) + def test_base_check_types_are_public(self): + '''Check that those check types are part of public API. + + They are blessed to be used by library consumers. + ''' + for check_type in (policy.AndCheck, policy.NotCheck, + policy.OrCheck, policy.RuleCheck): + class TestCheck(check_type): + pass + + check_str = str(check_type) + policy.register(check_str, TestCheck) + self.assertEqual( + TestCheck, _checks.registered_checks[check_str], + message='%s check type is not public.' % check_str)