支持 YAML 格式的策略文件

https://blueprints.launchpad.net/oslo?searchtext=policy-yaml

JSON 格式非常适合作为传输格式,但作为配置文件来说非常糟糕。oslo.policy 可以轻松地支持 YAML 的一个安全子集。

问题描述

服务的策略文件可能很复杂且难以使用。即使要知道哪些规则保护哪些操作也很困难,因为操作名称(例如 identity:create_user)与用户执行的操作(例如 PUT /v3/users)并不相同。如果我们可以简单地在文件中添加注释来说明规则对应的用户操作,那么示例策略文件会更容易使用,但唯一允许的格式(JSON)不支持注释。

用例

作为部署者,我应该能够使用描述性注释来配置我的自定义角色和规则。

作为开发者,我应该能够提供一个自描述的示例策略文件。也就是说,在示例策略文件中添加注释。

提议的变更

oslo.policy 将不再使用 JSON 解析器来解析策略文件,而是使用 YAML 解析器(由 PyYAML 提供)。由于 JSON 是 YAML 的子集,现有的 JSON 文件将继续工作。项目和部署者可以切换到简化的 YAML 格式,并在需要时使用注释进行文档说明。

oslo.policy 将更改为使用 PyYAML 的 safe_load() 来解析策略文件,而不是 JSON 解析器(jsonutils.loads())。

出于某种原因,读取策略文件的方法名称包含格式。这本身就是不正确的,并且由于格式现在是 YAML,因此更加不准确。因此,将 load_json() 重命名为 load()(保留旧方法名称,但已弃用,使用 debtcollector)。

oslo.policy 定义了一个 policy_file 配置选项,默认值为 policy.json。因此,默认行为是查找 policy.json 文件。新的默认行为将首先查找 policy.yaml,如果不存在,则查找 policy.json。因此,将删除默认值,并在帮助文本中描述新的默认行为。

要更改的文件

  • oslo_policy/policy.py

  • oslo_policy/opts.py

  • requirements.txt

备选方案

我们可以预处理 JSON 文件以删除看起来像注释的行。但那样该格式就不是真正的 JSON,也不是标准格式。

我们可以为 JSON 和 YAML 提供单独的加载器,并根据文件扩展名使用解析器。这是可行的,但没有必要,因为 JSON 是 YAML 的子集。

Impact on Existing APIs

oslo_policy.policy.Rules 类的 load_json 方法将被重命名为 loadload_json 将被弃用。

安全影响

在最通用的形式下,YAML 允许文档包含可执行代码,然后运行该代码。我们不希望我们的策略文件包含可执行代码。因此,我们将使用 safe_load() 而不是 load()

请参阅 http://pyyaml.org/wiki/PyYAMLDocumentation#LoadingYAML

性能影响

我不知道 YAML 解析器是否慢得多,但由于它支持相同的结果的几种表示形式,因此我认为解析它需要更多的工作。策略文件在服务器启动时以及文件更改时读取(以前在每次请求时读取,但已更改为检查修改时间),因此我认为这不会被注意到。

Configuration Impact

无。

开发人员影响

不同的项目都有示例 policy.json 文件。这些文件应该重命名为 policy.yaml,格式更改为简化的 YAML,并添加注释。由于 policy.json 将继续工作,因此不必立即进行此操作。

Testing Impact

项目已经在门控测试期间加载它们的策略文件。

实现

负责人

主要负责人

blk-u

里程碑

完成目标里程碑

newton-1

工作项

  • 将 oslo.policy 更改为使用 yaml.safe_load() 而不是 json.loads()

  • 重命名 oslo_policy.policy.Rules load_json() 为 load(),使用 debtcollector 进行重命名。

  • 将 oslo.policy 更改为首先查找 policy.yaml,然后查找 policy.jsonpolicy_dirs 也将使用此功能。

  • 通常需要将对 JSON 的引用更改为 YAML:** policy_file 帮助文本。

孵化

N/A

采用

N/A

N/A

预计 API 稳定

N/A

文档影响

如果文档提到策略文件是 JSON 格式,则可以将其更改为说明 YAML 格式。任何策略示例文件都应更改为更简单的 YAML 格式,而不是 JSON。

依赖项

oslo.policy 将依赖于 PyYAML。这已经在 global-requirements 中。

参考资料

debtcollector: https://docs.openstack.org/debtcollector/latest/

JSON: https://json.js.cn/

oslo.policy: https://docs.openstack.org/oslo.policy/latest/

PyYAML: http://pyyaml.org/

YAML: http://yaml.org/

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode