支持 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 方法将被重命名为 load。 load_json 将被弃用。
安全影响¶
在最通用的形式下,YAML 允许文档包含可执行代码,然后运行该代码。我们不希望我们的策略文件包含可执行代码。因此,我们将使用 safe_load() 而不是 load()。
性能影响¶
我不知道 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.json。 policy_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