列出内省状态¶
用户目前无法从 ironic inspector 服务获取所有内省状态的列表,只能先从 ironic 服务获取节点列表。ironic inspector 缺少一个 API 端点来提供这些信息。本规范的目的是描述这样一个端点。
问题描述¶
用户应该能够通过一个专用的 API 端点获取 ironic inspector 管理的内省状态列表。内省状态列表项应提供特定节点内省状态的基本状态信息,以及指向完整内省状态端点的链接。状态项列表应进行分页。应该能够根据 started_at、finished_at 和 state 节点内省状态属性来过滤状态列表。
提议的变更¶
端点应位于 GET@/v1/introspection 路径,以 JSON 格式提供内省状态列表。端点应考虑这些查询,以影响列表的分页和过滤
分页¶
?marker=<uuid>&limit=<number> limit 查询的默认值和最大值可配置为 CONF.api_max_limit = 1000。分页的资源默认排序基于 started_at, uuid 元组,较新的项目优先。为了避免耗尽服务器资源,始终启用分页。如果没有指定 marker,用户始终接收前 CONF.api_max_limit 个状态。可以通过查询 ?sort=<key[:asc|desc]>[,<key[:asc|desc]>...] 更改排序键。键可以是 started_at, finished_at, state, error, uuid 属性中的任何一个。可以通过 排序方向 通过 [:asc|desc] 排序键查询方向后缀进行更改。
状态查询¶
?state=<op>:<state_name>[,<state_name>...] 仅返回匹配指定状态的项目;充当一个集合。允许的操作符:=in: =nin: 后者表示不在其中。认可的状态名称值与 HA Inspector 规范 以及通过 内省状态补丁 进一步修订的一致:starting, waiting, processing, finished, reapplying, enrolling, error。仅考虑 state 查询字符串字段的第一个出现,忽略任何重复项。
时间查询¶
?started_at=<op>:<time>[&started_at=...]?finished_at=(<op>:<time>)|null[&finished_at=...]
仅返回指定时间间隔内的项目。值是 ISO8601 时间戳。默认值 finished_at=null 表示未完成的内省。允许的操作符是:=gt: =ge: =lt: =le: 另请参见 API 工作组过滤规范。
状态项¶
端点提供的节点内省状态的基本信息,编码在一个 JSON 字典中,包含以下项目
uuid: <node_uuid>finished: true|falsestarted_at: <time>finished_at: <time>|null后者表示未完成state: <state_name>links: 一个包含以下项目的字典href: <introspection_url>rel: self
备选方案¶
保持从 ironic 服务获取所有节点,然后访问 inspector 服务中的每个节点以获取节点内省状态的现状。
数据模型影响¶
无
HTTP API 影响¶
获取内省状态列表¶
带有分页和过滤
方法:
GET路径:
/v1/introspection
- 可选查询字符串字段
?marker=<uuid>&limit=<number>分页?sort=<key[:asc|desc]>[&sort=...]分页,排序键?state=<op>:<state_name>[,<state_name>...]过滤,集合式started_at=<op>:<time>[&started_at=...]过滤,时间间隔finished_at=(<op>:<time>)|null[&finished_at=...]过滤,时间间隔
响应代码
正常的 http 响应代码:
200400用于无效的查询字符串404marker 未找到或状态无效
响应数据的 JSON schema 定义
[
{
'uuid': '<node_uuid>',
'state': '<state_name>,
'finished': true/false,
'started_at': '<time>',
'finished_at': '<time>'|null,
'links': [{
'href': '<url_to_node_uuid_introspection_detail>',
'rel: 'self'
}]
},
...
]
示例用例
GET@/v1/introspection?finished_at=2016-09-21/&limit=50所有在 9 月 29 日 00:00 UTC 之后完成的内省,无论状态如何,限制为 50 个GET@/v1/introspection?finished_at=ge:15:30&state=error&sort=error:asc仅错误内省,从今天 15:30 开始,按错误消息按字母顺序排序GET@/v1/introspection?finished_at=null待处理的内省GET@/v1/introspection?started_at=ge:15:30&state=waiting从今天 15:30 开始等待的内省
客户端 (CLI) 影响¶
此更改应由 python ironic inspector 客户端项目采用。CLI 应包含一个带有可选开关的新子命令,这些开关反映 API 可选查询。
openstack baremetal introspection statuses \
[--states=<op>:<state_name>[,<state_name>...]]
[--started-at=(<op>:<time>)[,<op>:<time>...]]
[--finished-at=(<op>:<time>)|null[,(<op>:<time>)|null...]]
[--marker=<node_uuid>]
[--limit=<number>]
[--sort=<key[:asc|desc]>[,<key[:asc|desc]>...]]
在没有分页参数的情况下,该命令应返回完整的列表。输出应以表格形式格式化,就像 openstack 命令一样。
Ironic python agent 影响¶
无
性能和可扩展性影响¶
将过滤与分页结合使用可能对服务器端资源利用率产生积极影响。
安全影响¶
无
部署者影响¶
由于 分页,引入了一个新的配置选项 CONF.api_max_limit = 1000,以限制 API 端点在单个请求中可以返回的项目数量。这是为了防止服务器资源耗尽。
这个新的端点具有直接影响,无法在 ironic inspector 服务中关闭。
现有的 API 客户端,例如 python ironic inspector 客户端,应继续工作而不会受到任何影响,因为该端点是新的。当然,它们会错过这个功能。
建议部署者同时更新服务器端和客户端,最好按此顺序。
开发者影响¶
建议开发人员采用此端点,而不是必须先从 ironic 服务获取节点列表,然后才能从 inspector 服务获取内省状态。
实现¶
Assignees¶
Milan Kovacik, #milan, <vetrisko>
Dmitry Tantsur, #dtantsur, <divius>
主要 Assignee: <vetrisko>
工作项¶
此功能可以分多个补丁实现,例如,先着陆分页,然后再进行基于状态和基于时间的过滤,可能对 ironic inspector 和 python ironic inspector 客户端项目都有意义。
ironic inspector 项目的 状态列表 API 端点的部分实现目前被此规范着陆阻止。它已经支持基于时间和分页的过滤。
测试¶
使用 ironic inspector 服务器和 python ironic inspector 客户端项目进行功能和单元测试。