2
0

policy.py 2.5 KB

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