trivial: Tweak docstrings

There's no functional changes here other than moving the initializer
documentation for the 'DeprecatedRule' from the '__init__' docstring to
the class' docstring. This allows us to remove '__init__' entirely since
it was just calling the superclass.

Change-Id: I7437cf00b2ba5c02926dc8c2435e237ef730f2b1
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2021-02-23 13:10:16 +00:00
parent 45249db86e
commit d8534850d9

View File

@ -391,8 +391,8 @@ def parse_file_contents(data):
yaml or json format. Both can be parsed as yaml.
:param data: A string containing the contents of a policy file.
:returns: A dict of the form {'policy_name1': 'policy1',
'policy_name2': 'policy2,...}
:returns: A dict of the form ``{'policy_name1': 'policy1',
'policy_name2': 'policy2,...}``
"""
try:
# NOTE(snikitin): jsonutils.loads() is much faster than
@ -438,7 +438,6 @@ class Rules(dict):
.. warning::
This method is deprecated as of the 1.5.0 release in favor of
:meth:`load` and may be removed in the 2.0 release.
"""
warnings.warn(
'The load_json() method is deprecated as of the 1.5.0 release in '
@ -502,24 +501,24 @@ class Enforcer(object):
"""Responsible for loading and enforcing rules.
:param conf: A configuration object.
:param policy_file: Custom policy file to use, if none is
specified, ``conf.oslo_policy.policy_file`` will be
used.
:param rules: Default dictionary / Rules to use. It will be
considered just in the first instantiation. If
:meth:`load_rules` with ``force_reload=True``,
:meth:`clear` or :meth:`set_rules` with ``overwrite=True``
is called this will be overwritten.
:param default_rule: Default rule to use, conf.default_rule will
be used if none is specified.
:param policy_file: Custom policy file to use, if none is specified,
``conf.oslo_policy.policy_file`` will be used.
:param rules: Default dictionary / Rules to use. It will be considered just
in the first instantiation. If :meth:`load_rules` with
``force_reload=True``, :meth:`clear` or :meth:`set_rules` with
``overwrite=True`` is called this will be overwritten.
:param default_rule: Default rule to use, conf.default_rule will be used if
none is specified.
:param use_conf: Whether to load rules from cache or config file.
:param overwrite: Whether to overwrite existing rules when reload rules
from config file.
"""
def __init__(self, conf, policy_file=None, rules=None,
def __init__(
self, conf, policy_file=None, rules=None,
default_rule=None, use_conf=True, overwrite=True,
fallback_to_json_file=True):
fallback_to_json_file=True,
):
self.conf = conf
opts._register(conf)
@ -552,7 +551,7 @@ class Enforcer(object):
def set_rules(self, rules, overwrite=True, use_conf=False):
"""Create a new :class:`Rules` based on the provided dict of rules.
:param dict rules: New rules to use.
:param rules: New rules to use.
:param overwrite: Whether to overwrite current rules or update them
with the new rules.
:param use_conf: Whether to reload rules from cache or config file.
@ -729,8 +728,10 @@ class Enforcer(object):
# renamed to foo:create_bar then they need to be able to see that
# before they roll out the next release. If the policy name is in
# self.file_rules, we know that it's being overridden.
if deprecated_rule.name != default.name and (
deprecated_rule.name in self.file_rules):
if (
deprecated_rule.name != default.name and
deprecated_rule.name in self.file_rules
):
if not self.suppress_deprecation_warnings:
warnings.warn(deprecated_msg)
@ -742,11 +743,12 @@ class Enforcer(object):
# we set the deprecated rule name to reference the new rule. If we
# see that the deprecated override rule is just the new rule, then
# we shouldn't mess with it.
if (self.file_rules[deprecated_rule.name].check
!= _parser.parse_rule(deprecated_rule.check_str) and
str(self.file_rules[deprecated_rule.name].check)
!= 'rule:%s' % default.name):
if default.name not in self.file_rules.keys():
file_rule = self.file_rules[deprecated_rule.name]
if (
file_rule.check != deprecated_rule.check and
str(file_rule.check) != 'rule:%s' % default.name and
default.name not in self.file_rules.keys()
):
return self.file_rules[deprecated_rule.name].check
# In this case, the default check string is changing. We need to let
@ -761,11 +763,15 @@ class Enforcer(object):
# support the new policy.
# If the enforce_new_defaults flag is True, do not add OrCheck to the
# old check_str and enforce only the new defaults.
if (not self.conf.oslo_policy.enforce_new_defaults
if (
not self.conf.oslo_policy.enforce_new_defaults
and deprecated_rule.check_str != default.check_str
and default.name not in self.file_rules):
if not (self.suppress_deprecation_warnings
or self.suppress_default_change_warnings):
and default.name not in self.file_rules
):
if not (
self.suppress_deprecation_warnings
or self.suppress_default_change_warnings
):
warnings.warn(deprecated_msg)
return OrCheck([default.check, deprecated_rule.check])
@ -773,7 +779,7 @@ class Enforcer(object):
return default.check
def _undefined_check(self, check):
'''Check if a RuleCheck references an undefined rule.'''
"""Check if a RuleCheck references an undefined rule."""
if isinstance(check, RuleCheck):
if check.match not in self.rules:
# Undefined rule
@ -789,12 +795,16 @@ class Enforcer(object):
return False
def _cycle_check(self, check, seen=None):
'''Check if RuleChecks cycle.
"""Check if RuleChecks cycle.
Looking for something like::
Looking for something like:
"foo": "rule:bar"
"bar": "rule:foo"
'''
:param check: The check to search for.
:param seen: A set of previously seen rules, else None.
"""
if seen is None:
seen = set()
@ -884,11 +894,10 @@ class Enforcer(object):
def _load_policy_file(self, path, force_reload, overwrite=True):
"""Load policy rules from the specified policy file.
:param str path: A path of the policy file to load rules from.
:param bool force_reload: Forcefully reload the policy file content.
:param bool overwrite: Replace policy rules instead of updating them.
:param path: A path of the policy file to load rules from.
:param force_reload: Forcefully reload the policy file content.
:param overwrite: Replace policy rules instead of updating them.
:return: A bool indicating whether rules have been changed or not.
:rtype: bool
"""
rules_changed = False
reloaded, data = _cache_handler.read_cached_file(
@ -906,14 +915,12 @@ class Enforcer(object):
"""Locate the policy YAML/JSON data file/path.
:param path: It's value can be a full path or related path. When
full path specified, this function just returns the full
path. When related path specified, this function will
search configuration directories to find one that exists.
full path specified, this function just returns the full path. When
related path specified, this function will search configuration
directories to find one that exists.
:returns: The policy path
:raises: ConfigFilesNotFoundError if the file/path couldn't
be located.
:raises: ConfigFilesNotFoundError if the file/path couldn't be located.
"""
policy_path = self.conf.find_file(path)
@ -922,35 +929,30 @@ class Enforcer(object):
raise cfg.ConfigFilesNotFoundError((path,))
def enforce(self, rule, target, creds, do_raise=False, exc=None,
*args, **kwargs):
def enforce(
self, rule, target, creds, do_raise=False, exc=None, *args, **kwargs,
):
"""Checks authorization of a rule against the target and credentials.
:param rule: The rule to evaluate.
:type rule: string or :class:`BaseCheck`
:param dict target: As much information about the object being
operated on as possible. The target
argument should be a dict instance or an
instance of a class that fully supports
the Mapping abstract base class.
:param dict creds: As much information about the user performing the
action as possible. This parameter can also be an
instance of ``oslo_context.context.RequestContext``.
:param rule: The rule to evaluate as a string or :class:`BaseCheck`.
:param target: As much information about the object being operated on
as possible. The target argument should be a dict instance or an
instance of a class that fully supports the Mapping abstract base
class.
:param creds: As much information about the user performing the action
as possible. This parameter can also be an instance of
``oslo_context.context.RequestContext``.
:param do_raise: Whether to raise an exception or not if check
fails.
:param exc: Class of the exception to raise if the check fails.
Any remaining arguments passed to :meth:`enforce` (both
positional and keyword arguments) will be passed to
the exception class. If not specified,
:class:`PolicyNotAuthorized` will be used.
:return: ``False`` if the policy does not allow the action and `exc` is
not provided; otherwise, returns a value that evaluates to
Any remaining arguments passed to :meth:`enforce` (both positional
and keyword arguments) will be passed to the exception class. If
not specified, :class:`PolicyNotAuthorized` will be used.
:return: ``False`` if the policy does not allow the action and ``exc``
is not provided; otherwise, returns a value that evaluates to
``True``. Note: for rules using the "case" expression, this
``True`` value will be the specified string from the
expression.
``True`` value will be the specified string from the expression.
"""
self.load_rules()
if isinstance(creds, context.RequestContext):
@ -1131,8 +1133,8 @@ class Enforcer(object):
"""
if rule not in self.registered_rules:
raise PolicyNotRegistered(rule)
return self.enforce(rule, target, creds, do_raise, exc,
*args, **kwargs)
return self.enforce(
rule, target, creds, do_raise, exc, *args, **kwargs)
class _BaseRule: