列出内省状态

列出内省状态 RFE

用户目前无法从 ironic inspector 服务获取所有内省状态的列表,只能先从 ironic 服务获取节点列表。ironic inspector 缺少一个 API 端点来提供这些信息。本规范的目的是描述这样一个端点。

问题描述

用户应该能够通过一个专用的 API 端点获取 ironic inspector 管理的内省状态列表。内省状态列表项应提供特定节点内省状态的基本状态信息,以及指向完整内省状态端点的链接。状态项列表应进行分页。应该能够根据 started_atfinished_atstate 节点内省状态属性来过滤状态列表。

提议的变更

端点应位于 GET@/v1/introspection 路径,以 JSON 格式提供内省状态列表。端点应考虑这些查询,以影响列表的分页和过滤

状态查询

?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|false

  • started_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 响应代码: 200

  • 400 用于无效的查询字符串

  • 404 marker 未找到或状态无效

响应数据的 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 客户端项目进行功能和单元测试。