policy.py 2.3 KB

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