当收到错误的状态值时返回 400

https://blueprints.launchpad.net/nova/+spec/response-for-invalid-status

之前发现了一个错误,即向服务器列表 API 传递无效状态时,对于普通用户会返回一个空列表,但对于管理员用户会引发异常并返回 500 错误。该错误已得到修复(https://review.openstack.org/#/c/335648/),但在讨论该错误时,大家认为虽然修复异常是正确的,但有效状态值的列表很小且定义明确,因此返回空列表并不是期望的行为;相反,用户应该收到 400 Bad Request。

问题描述

当使用状态过滤器列出服务器时,如果传递了无效状态值,则会发现一个错误:https://bugs.launchpad.net/nova/+bug/1579706。这只会发生在管理员用户身上,因为会尝试获取扩展的服务器属性,而该代码期望实例存在于缓存中,并会抛出 KeyError 异常。然而,在讨论该错误时,大家认为非管理员的响应(返回空列表)也不正确,因为状态是有限且有良好文档记录的,无效状态更有可能是笔误(例如,‘EROR’ 而不是 ‘ERROR’)。在这种情况下,正确的响应应该是 400 Bad Request,以便用户意识到自己犯了错误,并有机会更正它。

用例

作为用户,如果我不小心请求 API 列出具有不存在状态的服务器,我希望知道我的请求有问题,因为这很可能是一个笔误,而不是实际请求状态为,例如,‘ACTVIE’ 的服务器,而我的意思是 ‘ACTIVE’。

提议的变更

当收到按状态过滤服务器列表的请求时,验证该状态是否是服务器的定义状态之一。如果不是,则返回 400 Bad Request。

备选方案

我们可以继续将所有状态都视为有效,并在传递无效状态时返回一个空列表,并让用户处理结果。

数据模型影响

REST API 影响

这是一个 API 的更改,需要一个新的微版本。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

<ed-leafe>

其他贡献者

<Dinesh Bhor>

工作项

  • 检查传递到服务器列表 API 的任何状态是否有效,如果无效,则返回 400 Bad Request。

依赖项

测试

将添加一个新测试,以验证服务器列表请求中的不正确状态将引发 400 Bad Request。

文档影响

无。用户不应该期望不正确的状态能够正常工作。

参考资料

原始 Bug:https://bugs.launchpad.net/nova/+bug/1579706

历史