限制元数据键的有效字符¶
https://blueprints.launchpad.net/nova/+spec/lowercase-metadata-keys
更改 API 验证,要求元数据键仅为小写 ASCII 字符,并限制符号数量,以确保无论数据库后端如何,操作的一致性。
问题描述¶
Nova 中所有地方的元数据键(用于聚合、服务器、风味扩展规格)。它们以不同级别的限制存储。
聚合元数据 - ^[a-zA-Z0-9-_:. ]{1,255}$’ (允许为空) [1]
服务器元数据 - ^[a-zA-Z0-9-_:. ]{1,255}$’ [2]
风味扩展规格 - ^[a-zA-Z0-9-_:. ]{1,255}$’ [3] (但也可以转换为数字,这可能是 jsonschema 未理解造成的错误)
所有这些都导致问题,因为使用 MySQL 的默认存储是大小写不敏感的。这会导致以下类型的错误
https://bugs.launchpad.net/nova/+bug/1538011 (在聚合中看到的情况)
如果在列上存在唯一约束
向名称为 ‘foo’ 的资源添加键
向名称为 ‘Foo’ 的资源添加键 - 由于约束冲突而爆炸
或者在删除的情况下
https://bugs.launchpad.net/nova/+bug/1535224 (在服务器元数据中看到的情况)
如果列上没有唯一约束
向名称为 ‘foo’、‘Foo’、‘FOO’ 的资源添加键。
删除键 ‘foo’
所有 ‘foo’、‘Foo’、‘FOO’ 都会被删除
到目前为止,已经有一些复杂的修复,这些修复基本上是打地鼠,通过在 Python 中进行第二轮选择/删除/更新来弥补大小写不敏感的问题。
在风味扩展规格的情况下,我们得到了第三种行为
添加键 ‘foo’
添加键 ‘Foo’
向用户返回“在重试 10 次后,无法更新或创建风味 3 的扩展规格。”
用例¶
作为 Nova API 中元数据的用户,我希望获得/设置操作能够保证在任何后端数据库上都以相同的方式工作。
提议的变更¶
创建一个 API 微版本,之后元数据定义将为 ‘^[a-z0-9-_:. ]{1,255}$’,不再支持大写 ASCII 字符。
更新文档,说明仅支持这些字符。
在微版本之前的请求中,我们将不会更改行为,但是我们也会关闭所有与此相关的错误,标记为“不会修复”。
将提供一个 nova-manage 命令,用于审计和压缩现有的元数据键到新的存储格式。这将是可选的,操作员可以选择运行它,因为他们可能选择继续使用旧 API 版本的错误。
以下资源使用元数据,并且容易受到此问题的影响
聚合
风味扩展规格
实例(服务器)(所有操作,除非另有说明)
实例元数据直接设置/获取
以下 API 部分将不会更改
服务器(操作)- createImage(元数据是 glance 元数据,而不是存储在 Nova 中)
镜像代理 - 这存储在 glance 中,Nova 将不会更改这里的验证规则。
卷代理 - 这存储在 cinder 中,Nova 将不会更改这里的验证规则。
备选方案¶
糟糕透顶
只是继续添加更多的 Python 热修复来尝试近似我们想要的行为。这不太可能真正收敛到我们没有错误的地步。
强制数据库中的一致行为
我们可以强制 MySQL 大小写敏感,这将消除一类堆栈跟踪。但是,这会成为一个潜在的代价高昂的迁移,并且意味着我们必须关心所有潜在的后端是否都能正确运行
为所有资源实现 409,例如风味扩展规格
这需要进行大量的额外往返数据库操作,并且可能在同时发生更新时遇到有趣的竞争条件。
数据模型影响¶
在我们将微版本提升到旧代码不再受支持的程度之前,将不会进行任何数据模型更改。
REST API 影响¶
资源或属性不会更改,但是现在我们将通过验证框架返回 400。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
在微版本之后,将有一些元数据键无法通过 API 访问。如果其他项目(例如调度器过滤器或更高级别的编排)触发这些值,则可能需要对其进行更改。
应提供一个 nova-manage 命令来审计并将旧键折叠到这个新的键结构中。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
auggy
- 其他贡献者
sdague
工作项¶
为上述资源的新的微版本实现 jsonschema,使用新的验证规则。
编写 nova-manage 键折叠工具。(确保我们记住在过程中更新元数据配额)
依赖项¶
无
测试¶
测试将使用树内功能测试完成,因为这只是 API 和 API <-> DB 代码路径。
对 nova-manage 工具的测试将在树内完成,以确保我们可以正确地折叠数据并更新配额。
文档影响¶
API 参考站点将使用新的微版本进行更新。我们将更新默认文档,说明 API 仅支持这一组字符。这希望能够让使用旧版本的用户自行减少到这个新的字符集。
参考资料¶
邮件列表讨论此错误 - http://lists.openstack.org/pipermail/openstack-dev/2016-February/087404.html
Newton Summit 的 Etherpad - https://etherpad.openstack.org/p/newton-nova-summit-unconference
脚注
历史¶
发布名称 |
描述 |
|---|---|
Newton |
引入 |