policy.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # Copyright 2018 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import itertools
  4. from oslo_config import cfg as conf
  5. from oslo_log import log as logging
  6. from oslo_policy import policy
  7. from coriolis import exception
  8. from coriolis import utils
  9. from coriolis.policies import base
  10. from coriolis.policies import endpoints
  11. from coriolis.policies import general
  12. from coriolis.policies import migrations
  13. from coriolis.policies import replicas
  14. from coriolis.policies import replica_schedules
  15. from coriolis.policies import replica_tasks_executions
  16. LOG = logging.getLogger(__name__)
  17. CONF = conf.CONF
  18. _ENFORCER = None
  19. DEFAULT_POLICIES_MODULES = [
  20. base, endpoints, general, migrations, replicas, replica_schedules,
  21. replica_tasks_executions]
  22. def reset():
  23. global _ENFORCER
  24. if _ENFORCER:
  25. _ENFORCER.clear()
  26. _ENFORCER = None
  27. def init():
  28. global _ENFORCER
  29. global saved_file_rules
  30. if not _ENFORCER:
  31. _ENFORCER = policy.Enforcer(CONF)
  32. register_rules(_ENFORCER)
  33. _ENFORCER.load_rules()
  34. def register_rules(enforcer):
  35. enforcer.register_defaults(itertools.chain(*[
  36. m.list_rules() for m in DEFAULT_POLICIES_MODULES]))
  37. def get_enforcer():
  38. init()
  39. return _ENFORCER
  40. def check_policy_for_context(
  41. context, action, target, exc=None, do_raise=True):
  42. """ Checks the validity of the given action of the given target based on
  43. set policies.
  44. On success, returns a value where bool(val) == True.
  45. On failure and if `do_raise` if False, returns False.
  46. Raises `exception.PolicyNotAuthorized` or `exc` if the policy is
  47. not authorized.
  48. """
  49. init()
  50. credentials = context.to_policy_values()
  51. if not exc:
  52. exc = exception.PolicyNotAuthorized
  53. try:
  54. result = _ENFORCER.authorize(
  55. action, target, credentials,
  56. do_raise=do_raise, exc=exc, action=action)
  57. except Exception as ex:
  58. LOG.debug(
  59. "Policy check for '%(action)s' with target '%(target)s' failed "
  60. "with credentials: %(credentials)s.\nException: '%(trace)s'", {
  61. 'action': action, 'target': target,
  62. 'credentials': credentials, 'trace':
  63. utils.get_exception_details()})
  64. raise exc(str(ex))
  65. return result