API 一致性清理¶
https://blueprints.launchpad.net/nova/+spec/api-consistency-cleanup
此蓝图提出了一些 API 的清理工作,以提高一致性和可用性。
问题描述¶
目前,API 中存在许多不一致之处和宽松的验证。这些不一致之处是由于 v2 API 的兼容性造成的。
由于对请求体和查询参数的验证过于宽松,API 会默默地忽略未知的和无效的输入。这会给用户留下这样的印象,即请求的未知或无效输入是有效的,并且已被 Nova 处理。但 Nova 在 API 层直接忽略所有未知或无效的输入,而不会向用户发出任何警告。
服务器的表示形式在所有返回服务器信息的 API 响应体中并不一致。GET、PUT、REBUILD /servers API 返回服务器的表示形式(包含所有服务器属性)。但 PUT 和 REBUILD /servers 响应与 GET /servers API 不匹配。
这些是 API 不一致的两个例子,可能还有更多类似的例子,这些例子在“提案”部分中描述。
用例¶
作为 API 消费者,我希望以更一致的方式使用 Nova API,并进行严格的验证以提高可用性。
作为开发者,我希望提供和维护更好/更干净/更一致的 API。
对于客户端代码解析 API 响应,存在维护优势。对于开发者来说,只有当我们能够在未来提高最低微版本号时,维护才能更容易。
提议的变更¶
为 API 添加一个新的微版本,以清理多个问题和不一致之处。
提案是将所有上述清理工作放在单个微版本中完成。
清理列表
对于查询参数和请求体中的未知参数,返回 400 错误。
目前,服务器查询参数或许多其他 API 请求体中的未知参数会被默默忽略。这导致了许多不一致之处,一个很好的例子是
--deleted和--status DELETED查询参数,用于nova --list。如果您不是管理员,那么
--deleted和--status deleted的行为分别对应 200 和 403。从最终用户角度来看,这两个过滤器是相同的,但由于我们的实现,我们返回不同的行为。nova list --deleted:200,由于 additionalProperty=True 且为了向后兼容性,API 接受并忽略了无效的过滤器。--deleted是非管理员的无效过滤器nova list --status DELETED:403。--status是非管理员的有效过滤器,因此 API 不会忽略它。
我们对 status=DELETED 请求有明确的检查,如果请求者不是管理员,则返回 403。详细讨论 [1]
我们可以通过将所有 API 的查询参数和请求体的
additionalProperties: False来解决这个问题,前提是additionalProperties为 True。例如 [2] 和 [3]使所有返回完整服务器表示形式的 API 中的服务器表示形式始终一致。
GET、PUT、REBUILD /servers API 返回完整的服务器表示形式(包含所有服务器属性)。但 PUT 和 REBUILD /servers 响应与 GET /servers API 不匹配。
PUT 和 REBUILD 响应与 GET 响应之间的差异可能是由于历史原因,PUT 和 REBUILD 只返回响应中可以从请求中获取的字段,这些字段会修改服务器,但随着时间的推移,我们开始在响应中返回更多的字段,以使其与 GET 响应一致。 这样,只有新添加到 GET 响应中的字段也开始返回到 PUT 和 REBUILD 中,而旧字段却遗漏了。最终,这并没有保持 PUT 和 REBUILD 响应的原始意图,并且与 GET 响应不完全一致。
许多字段仅在 GET API 中返回,而在 PUT 或 REBUILD 中不返回。响应差异是作为扩展添加的属性
OS-EXT-AZ:availability_zone
OS-EXT-SRV-ATTR:host
OS-EXT-SRV-ATTR:hostname
OS-EXT-SRV-ATTR:hypervisor_hostname
OS-EXT-SRV-ATTR:instance_name
OS-EXT-SRV-ATTR:kernel_id
OS-EXT-SRV-ATTR:launch_index
OS-EXT-SRV-ATTR:ramdisk_id
OS-EXT-SRV-ATTR:reservation_id
OS-EXT-SRV-ATTR:root_device_name
OS-EXT-SRV-ATTR:user_data
OS-EXT-STS:power_state
OS-EXT-STS:task_state
OS-EXT-STS:vm_state
OS-SRV-USG:launched_at
OS-SRV-USG:terminated_at
os-extended-volumes:volumes_attached
需要修改的 API
PUT /servers
POST /servers/{server_id}/action {rebuild}
将风味 API 中
swap字段的默认返回值从空字符串更改为 0(整数)。目前,在创建风味时,如果您没有设置可选的
swap属性,则风味 API 响应中的swap属性值将返回一个空字符串。Bug:https://bugs.launchpad.net/nova/+bug/1815476 在 CLI 侧处理此空字符串时,它显示为空白,这令人困惑,并且与其他字段不一致,例如“OS-FLV-EXT-DATA:ephemeral”。服务器 API 响应中的风味表示形式将swap默认值设置为 0。提案使其一致,并在以下 API 中返回swap默认值 0(整数)POST /flavors
GET /flavors/detail
GET /flavors/{flavor_id}
PUT /flavors/{flavor_id}
即使超节点上没有服务器,也要始终在 GET 超节点 API 的响应中返回
servers字段目前,如果请求的超节点上没有服务器,则
servers字段将从 API 响应中省略。这是一种不一致的响应,理想情况下,所有字段都应存在于响应中,即使值为为空。提案是在以下 API 的响应中始终返回servers字段。如果没有任何服务器,servers字段将是一个空列表。GET /os-hypervisors?with_servers=True
GET /os-hypervisors/detail?with_servers=True
GET /os-hypervisors/{hypervisor_id}?with_servers=True
备选方案¶
我们可以保持 API 不变,并以当前的方式使用它们,或者我们可以选择上述列表中的一些问题一次性解决。
以下清理工作已从该提案中过滤掉
删除请求和响应字段中的扩展 (OS-) 前缀。
修复不一致/不正确的响应代码
数据模型影响¶
无
REST API 影响¶
此提案是为了修复 API 中的多个问题。我将以与上述相同的顺序列出每个问题对 REST API 的影响。
对于查询参数和请求体中的未知参数,返回 400 错误。
允许未知请求和查询参数并忽略的 API 将更改为返回 400。以下是具有
additionalProperties: True的 API,并将修改为additionalProperties: False:https://github.com/openstack/nova/search?p=1&q=additionalProperties%3A+True&unscoped_q=additionalProperties%3A+True使所有 API 中的服务器表示形式始终一致
PUT /servers/{server_id}和POST /servers/{server_id}/action {rebuild}API 响应将被修改,以添加所有丢失的字段,这些字段由GET /servers/{server_id}返回。注意:新字段将以与 GET /servers API 响应中相同的名称添加(即带有
OS-前缀)。将风味 API 中
swap字段的默认返回值从空字符串更改为 0(整数)。以下 API 响应将被更改为返回
swap默认值 0(整数)POST /flavors
GET /flavors/detail
GET /flavors/{flavor_id}
PUT /flavors/{flavor_id}
即使超节点上没有服务器,也要始终在 GET 超节点 API 的响应中返回
servers字段以下 API 响应将被更改为始终在响应体中返回
servers字段。如果没有任何服务器,servers字段将是一个空列表GET /os-hypervisors?with_servers=True
GET /os-hypervisors/detail?with_servers=True
GET /os-hypervisors/{hypervisor_id}?with_servers=True
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
python novaclient 和 openstack-client 将被更新。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
升级影响¶
无
实现¶
负责人¶
- 主要负责人
Ghanshyam Mann
工作项¶
Nova API 的单个微版本更改
添加更改的测试
python 客户端 (python-novaclient 和 python-openstackclient) 更改
依赖项¶
无
测试¶
添加相关的单元测试。
添加相关的功能测试。
Tempest 中的响应更改模式测试
文档影响¶
修改 api-ref 以反映 API 更改。
参考资料¶
PTG 协议:http://lists.openstack.org/pipermail/openstack-discuss/2019-May/005824.html
https://etherpad.openstack.org/p/nova-api-cleanup Nova API 清理列表 Etherpad
历史¶
发布名称 |
描述 |
Train |
引入 |