Ironic 节点电源控制的 Redfish 代理¶
https://storyboard.openstack.org/#!/story/2009184
我们改善节点多租户支持目标的一个重要方面是为节点租户提供无缝的用户体验。 这包括使租户能够在其租用的节点上使用现有的配置工作流程,并确保这些工具能够按预期工作。 Ironic 策略允许租户通过 Ironic REST API 或 openstack baremetal CLI 访问基本的电源控制;但是,如果这些工具缺乏与 Ironic API 通信的指令,它们能够工作的唯一方法是直接向他们希望配置的节点的 BMC 发送请求。 这将需要向租户提供 BMC 电源凭据,考虑到节点多租户的目标之一是能够在不向用户提供如此低级别的访问权限的情况下实现这种功能,这尤其成问题。 [NMTSTORY] [NODELEAS]
由于这种解决方案不可取,为了能够使用现有的配置工具,我们打算模拟一种基于标准的接口(在本例中为 Redfish),供节点租户使用。 该接口将接收来自配置工具的 Redfish API 调用,在 Ironic 中执行相应的操作,并以 Redfish 模式定义的格式返回响应。 Redfish 客户端将能够以他们期望的方式进行身份验证,并且这些请求将使用与现有 Ironic 基础设施相同的身份验证策略进行处理。 如果一切按计划进行,此功能将解决先前描述的兼容性问题,并且无需向租户授予任何特殊权限即可实现。
问题描述¶
这里的关键问题是兼容性——租户拥有期望通过无法访问的接口进行通信的工具,而这有两个不可取的解决方案。
第一种解决方案是重构租户的工作流程,使其改用 Ironic API。 对于用户而言,这既耗时又耗费资源,特别是考虑到这些租户通常只能在有限的时间内访问裸机节点。
第二种解决方案是向租户提供 BMC 凭据,这不仅违背了节点多租户的原则,而且存在巨大的安全风险。 如果这些凭据的访问范围未受限制,租户可能会损坏或以其他方式破坏裸机节点。 此外,如果提供的凭据在租户应该失去对节点访问权限时未立即撤销,他们将保留对节点电源控制(以及可能更多)的访问权限,直到更改凭据为止。
这些解决方案可能会解决兼容性问题,但反过来,它们会造成重大的效率问题或安全问题。 此功能旨在解决兼容性问题,而不会显著损害安全性和效率。
提议的变更¶
我们将创建 Ironic 主仓库中的一个新的 WSGI 服务,该服务将在 /redfish 处提供 REST API,对于最终用户而言,它将像一个合法的 v1 Redfish 端点,尽管功能集有限。 该接口将提供最基本的功能,足以让 Redfish 配置工具设置 Ironic 节点的电源状态。 在未来,此服务可以扩展以提供其他功能,例如启动设备、启动模式和虚拟媒体;但是,这超出了我们在此规范中旨在实现的目标范围。
实现细节¶
实现此目标所需的三个关键组件是
一种用户可以进行身份验证的方式
一种确定用户身份(角色、项目、权限等)的方式
用于对用户希望配置的节点执行操作的接口。
总的来说,使用此功能的流程如下
获取用于向 Ironic Redfish 中间件进行身份验证的凭据。
如果所使用的 Ironic 系统使用 Keystone 进行身份验证,用户必须创建一个应用凭据集,该凭据集限定在适当的项目和域中。
如果不是,用户将通过 HTTP 基本身份验证进行身份验证,该身份验证将使用 Ironic 的基本身份验证中间件进行处理。 配置后端(存储凭据的位置)将由各个 Ironic 系统操作员决定。
(仅限 Keystone 用户) 使用 Redfish SessionService 接口进行身份验证。
Keystone 用户将通过 Redfish SessionService 接口使用其新创建的应用凭据的 UUID 作为用户名,以及凭据的密钥作为密码进行身份验证。 作为响应,他们将在主体中收到符合 Redfish 模式的 Session 对象,以及授权令牌和新创建的 Session 接口的 URL,这些信息将在标头中提供。
执行必要的配置操作。
所有对 Systems 端点的请求都需要身份验证;使用 SessionService 进行身份验证的用户必须在每个请求标头中提供他们收到的
X-Auth-Token,而使用 HTTP Basic Auth 的用户必须在每个请求标头中提供 base64 编码的凭据(如 [RFC7617] 中所述)。
(仅限 Keystone 用户) 结束在步骤 2 中创建的 Session。
Keystone 用户将向先前返回给他们的 Session 对象的 URL 发送 DELETE 请求,从而在内部撤销创建的 Keystone 授权令牌(注意:不是应用凭据)。 如果用户希望执行进一步的操作,他们需要再次重复步骤 2 中的身份验证过程。
身份验证¶
此功能应提供的访问权限应仅由某些用户访问。 身份验证的问题是“访问请求的人是否真的是他们声称的那个人?” 我们如何回答这个问题取决于所使用的 Ironic 系统中的身份验证策略。
在 Keystone (v3) 的上下文中,“这个人是谁?”这个问题需要一些信息——用户的标识符、他们正在使用的项目的标识符以及用户和项目存在的域的标识符。 但是,Redfish 仅期望用户的标识符(UUID 或用户名)来确定身份,因此身份验证最终将需要 Redfish 用户提供比他们原本期望提供的更多信息,这可能是一个潜在的问题。
我们打算通过使用应用凭据来解决此问题,该凭据指定用户、项目和他们限定的域。 由于每个应用凭据都具有 UUID,我们可以用此标识符代替原本 Keystone 需要的所有信息。 [APPCREDS] 从安全角度来看,这种方法也有益,因为它减少了直接处理原始用户凭据的次数。
用户将把凭据的 UUID 和密钥传递给 SessionService,该服务将将其在内部传递给 Keystone 进行验证。 如果提供的信息有效,将创建一个授权令牌并以模拟 Redfish Session 格式发送回用户。 由于 Redfish Session 需要一个 UUID,我们将新创建的 Keystone 授权令牌的审计 ID 用于满足此要求。 根据 Keystone API 参考,“您可以使用这些审计 ID 来跟踪令牌的使用情况……而无需向非特权用户公开令牌 ID。” [KSTNEAPI] 我们希望确保此代理不会无意中暴露敏感信息,并且在这种情况下使用审计 ID 似乎是一个明智的选择。
用户完成他们打算执行的配置操作后,他们将向 Session URL 发送 DELETE 请求,如 Redfish 规范所述。 在内部,这将撤销 Keystone 授权令牌,基本上“注销用户”。 这是结束用户会话的预期方法,但是重要的是要注意 Keystone 和 Redfish 处理会话过期的方式之间的区别。
Redfish Session 旨在在一段时间不活动后过期,而 Keystone 授权令牌旨在在特定时间过期(例如,创建后一小时或两小时)。 我们不打算模拟 Redfish Session 过期,因为我们认为增加的开销和代码复杂性不值得这种细节带来的微小好处。 授权令牌本质上是短暂的,用户需要认识到这一点并考虑到意外过期的可能性,无论我们是否实现此细节。
使用 HTTP Basic Auth 的用户的身份验证过程将很简单,因为这种策略是基于标准的(参见 [RFC7617])。 用户将在每个对期望用户授权的 Redfish 端点的请求中提供 base64 编码的凭据。 由于 Ironic 支持基本身份验证,因此实现它将只是通过预先存在的基本身份验证中间件传递用户的凭据。 此外,如果使用基本身份验证,则 SessionService 将被禁用且无法使用。
身份¶
由于应用凭据是在创建时限定的,因此使用现有的 Ironic 策略代码和 Keystone 中间件获得构成用户身份的信息应该是一个简单的过程。 我们将使用此信息来确定用户可以通过与现有 Ironic API 相同的方式和方法访问哪些数据、操作等。
重要的是要注意,使用基本身份验证,这种基于策略的访问限制基本上不存在。 如果用户可以登录,他们将可以访问所有可用数据。 但是,由于我们的基本身份验证策略是 Ironic 的基本身份验证,因此对 Ironic 基本身份验证功能的任何扩展反过来也会扩展此功能的范围。
配置工具¶
将在此处实现的节点配置工具在功能上与现有的裸机端点相同,如下所示。 实现此功能的内部逻辑将尽可能地镜像实际的 Ironic API;从理论上讲,唯一的区别应该在于用户请求和用户响应的格式。
模拟的 Redfish URI |
等效的 Ironic URI |
|---|---|
[GET] /redfish/v1/SystemService/Systems |
[GET] /v1/nodes |
[GET] /redfish/v1/SystemService/Systems/{uuid} |
[GET] /v1/nodes/{uuid} |
|
|
此中间件将遵守 Redfish 规范 1.0.0 [RFSHSPEC] 和模式 [RFSHSCHM],以实现与现有工具的最大向后兼容性。 有关这些端点计划功能的更多详细信息将在下面的 REST API Impact 部分中详细说明。
备选方案¶
我们希望实现的这种 BMC 接口模拟已经存在于 sushy-tools [SUSHY] 和 VirtualBMC [VIRTBMC] 中,它们分别模拟 Redfish 和 IPMI。 Tzu-Mainn Chen (tzumainn) 提交了一个以前的规范,该规范提出在 Ironic 中使用 sushy-tools 驱动程序来实现此功能,但对安全性以及此功能存在于 Ironic 本身中的潜在价值的担忧导致了此规范的提出。 [PREVSPEC]
我们目前计划将其作为 Ironic 仓库中的一个单独的 WSGI 服务来实现,但是,Ironic API 和此 Redfish 代理都可以运行在同一个服务下。 由于两者都是独立的 WSGI 应用程序,因此可以使用 WSGI 分派器(例如 Werkzeug 应用程序分派中间件 [WSGIDISP])来实现这一点。
数据模型影响¶
无。
状态机影响¶
无。
REST API 影响¶
不会对 Ironic API 进行任何更改,而是将创建如以下所述的新 WSGI 服务托管新 API。 最终用户将能够像它是一个 v1.0.0 Redfish 端点一样与此 API 交互(参见 [RFSHSPEC] 和 [RFSHSCHM])。
由于这是一个新服务,Ironic 操作员需要考虑到它需要自己的端口,并且(如果使用 Keystone)需要在 Keystone 中添加为新的端点。 但是,如果这被证明是一个重大的不便,则有可能将 Ironic API 和此代理启动在同一个服务中,如上述 Alternatives 中所述。
Redfish API 版本:¶
GET /redfish
返回 Redfish 协议版本 (v1)。 这将始终返回如下所示的相同响应,如 Redfish API 规范所述。([RFSHSPEC] 的第 6.2 节)
正常响应代码:200 OK
示例响应
{ "v1": "/redfish/v1/" }
名称
类型
描述
v1
string
Redfish v1 ServiceRoot 的 URL。
GET /redfish/v1/
Redfish 服务根 URL,将返回一个 Redfish ServiceRoot 对象,其中包含有关 Redfish 系统上可用信息的信息。
正常响应代码:200 OK
示例响应
{ "@odata.type": "#ServiceRoot.v1_0_0.ServiceRoot", "Id": "IronicProxy", "Name": "Ironic Redfish Proxy", "RedfishVersion": "1.0.0", "Links": { "Sessions": { "@odata.id": "/redfish/v1/SessionService/Sessions" } }, "Systems": { "@odata.id": "/redfish/v1/Systems" }, "SessionService": { "@odata.id": "/redfish/v1/SessionService" }, "@odata.id": "/redfish/v1/" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
Id
string
此特定资源的标识符。
名称
string
此特定 ServiceRoot 的名称。
链接
对象
包含包含指向相关资源集合的链接的对象。
Systems
对象
包含指向 Systems 资源集合的链接。
SessionService
对象
包含指向 SessionsService 资源的链接。
Sessions
对象
包含指向 Sessions 资源集合的链接。
RedfishVersion
string
此 Redfish 服务的版本。
Sessions¶
GET /redfish/v1/SessionService
返回一个 Redfish SessionService 对象,其中包含有关 SessionService 和 Session 对象配置方式的信息。
如果底层的 Ironic 系统正在使用 HTTP 基本身份验证,则 SessionService 将报告其自身已禁用,并且所有 Session 相关功能将无法使用。
正常响应代码:200 OK
错误响应代码:404 Not Found,500 Internal Server Error
如果底层 Ironic 系统未使用 Keystone 身份验证,将返回 404 Not Found。
如果内部请求进行身份验证失败,将返回 500 Internal Server Error。
示例响应
{ "@odata.type": "#SessionService.v1_0_0.SessionService", "Id": "KeystoneAuthProxy", "Name": "Redfish Proxy for Keystone Authentication", "Status": { "State": "Enabled", "Health": "OK" }, "ServiceEnabled": true, "SessionTimeout": 86400, "Sessions": { "@odata.id": "/redfish/v1/SessionService/Sessions" }, "@odata.id": "/redfish/v1/SessionService" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
Id
string
此特定资源的标识符。
名称
string
此特定资源的名称。
状态
对象
包含服务状态信息的对象。
State
string
服务的状态,为“Enabled”或“Disabled”之一。
Health
string
服务的健康状况,通常为“OK”。 [1]
ServiceEnabled
bool
指示 SessionService 是否已启用。
SessionTimeout
number
会话因不活动而过期之前的时间量,以秒为单位。 [2]
Sessions
对象
包含指向 Session 资源集合的链接。
GET /redfish/v1/SessionService/Sessions
返回一个 Redfish SessionCollection,其中包含指向用于验证请求的 Session 的链接。要求用户在请求头中提供有效的身份验证信息。
正常响应代码:200 OK
错误响应代码:401 未授权,404 未找到,500 内部服务器错误
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果底层 Ironic 系统未使用 Keystone 身份验证,将返回 404 Not Found。
如果内部请求进行身份验证失败,将返回 500 Internal Server Error。
示例响应
{ "@odata.type": "#SessionCollection.SessionCollection", "Name": "Ironic Proxy Session Collection", "Members@odata.count": 1, "Members": [ { "@odata.id": "/redfish/v1/SessionService/Sessions/ABC" } ], "@odata.id": "/redfish/v1/SessionService/Sessions" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
名称
string
此特定资源的名称。
number
集合中存在的 Session 接口数量。
成员
数组
一个对象数组,包含指向单个 Session 接口的链接。
POST /redfish/v1/SessionService/Sessions
请求 Session 身份验证。用户名和密码应在请求体中传递,成功后将返回创建的 Session 对象。此响应的头部将包含身份验证令牌在
X-Auth-Token头部,以及 Session 对象在Location头部中的链接。正常响应代码:201 已创建
错误响应代码:400 请求错误,401 未授权,404 未找到,500 内部服务器错误
如果消息体中缺少用户名/密码字段,将返回 400 请求错误。
如果提供的凭据无效,将返回 401 未授权。
如果底层 Ironic 系统未使用 Keystone 身份验证,将返回 404 Not Found。
如果内部请求进行身份验证失败,将返回 500 Internal Server Error。
示例请求
{ "UserName": "85775665-c110-4b85-8989-e6162170b3ec", "Password": "its-a-secret-shhhhh" }
名称
类型
描述
用户名
string
用于身份验证的 Keystone 应用程序凭据的 UUID。
密码
string
所述应用程序凭据的密钥。
示例响应
Location: /redfish/v1/SessionService/Sessions/identifier X-Auth-Token: super-duper-secret-aaaaaaaaaaaa { "@odata.id": "/redfish/v1/SessionService/Sessions/identifier", "@odata.type": "#Session.1.0.0.Session", "Id": "identifier", "Name": "user session", "UserName": "85775665-c110-4b85-8989-e6162170b3ec" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
Id
string
此特定资源的标识符。
名称
string
此特定资源的名称。
用户名
string
用于身份验证的应用程序凭据的 UUID。
GET /redfish/v1/SessionService/Sessions/{identifier}
返回 URL 中指定的标识符的 Session。要求用户在请求头中提供有效的身份验证信息,用于他们尝试访问的会话。
正常响应代码:200 OK
错误响应代码:401 未授权,403 禁止,404 未找到,500 内部服务器错误
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果请求头中的身份验证信息有效但缺乏访问正在访问的 Session 的适当授权,将返回 403 禁止。
如果指定的标识符不对应于合法的 Session ID,或者底层的 Ironic 系统未使用 Keystone 身份验证,将返回 404 未找到。
如果内部请求进行身份验证失败,将返回 500 Internal Server Error。
示例响应
{ "@odata.id": "/redfish/v1/SessionService/Sessions/identifier", "@odata.type": "#Session.1.0.0.Session", "Id": "identifier", "Name": "user session", "UserName": "85775665-c110-4b85-8989-e6162170b3ec" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
Id
string
此特定资源的标识符。
名称
string
此特定资源的名称。
用户名
string
用于身份验证的应用程序凭据
DELETE /redfish/v1/SessionService/Sessions/{identifier}
结束 URL 中标识的会话。要求用户在请求头中提供有效的身份验证信息,用于他们尝试结束的会话。
正常响应代码:204 无内容
错误响应代码:401 未授权,403 禁止,404 未找到,500 内部服务器错误
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果请求头中的身份验证信息有效但缺乏访问正在访问的 Session 的适当授权,将返回 403 禁止。
如果指定的标识符不对应于合法的 Session ID,或者底层的 Ironic 系统未使用 Keystone 身份验证,将返回 404 未找到。
如果内部请求进行身份验证失败,将返回 500 Internal Server Error。
节点管理¶
GET /redfish/v1/Systems
等同于
baremetal node list,将返回一个 Redfish ComputerSystem 接口集合,对应于 Ironic 节点。要求用户在请求头中提供有效的身份验证信息,用于他们尝试访问的资源。正常响应代码:200 OK
错误响应代码:401 未授权,403 禁止,500 内部服务器错误
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果请求头中的身份验证信息有效但缺乏列出 Bare Metal 节点的适当权限,将返回 403 禁止。
如果对 Bare Metal 服务的内部请求无法完成,将返回 500 内部服务器错误。
示例响应
{ "@odata.type": "#ComputerSystemCollection.ComputerSystemCollection", "Name": "Ironic Node Collection", "Members@odata.count": 2, "Members": [ { "@odata.id": "/redfish/v1/Systems/ABCDEFG" }, { "@odata.id": "/redfish/v1/Systems/HIJKLMNOP" } ], "@odata.id": "/redfish/v1/Systems" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
名称
string
此特定资源的名称。
number
集合中存在的 System 接口数量。
成员
数组
一个对象数组,包含指向单个 System 接口的链接。
GET /redfish/v1/Systems/{node_ident}
等同于
baremetal node show,但细节较少。将返回一个 Redfish System 资源,包含基本信息、电源信息以及电源控制接口的位置。要求用户在请求头中提供有效的身份验证信息,用于他们尝试访问的资源。正常响应代码:200 OK
错误响应代码:401 未授权,403 禁止,404 未找到,500 内部服务器错误
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果请求头中的身份验证信息有效但缺乏访问 Bare Metal 节点的适当权限,将返回 403 禁止。
如果指定的标识符不对应于合法的节点 UUID,将返回 404 未找到。
如果对 Bare Metal 服务的内部请求无法完成,将返回 500 内部服务器错误。
示例响应
{ "@odata.type": "#ComputerSystem.v1.0.0.ComputerSystem", "Id": "ABCDEFG", "Name": "Baremetal Host ABC", "Description": "It's a computer", "UUID": "ABCDEFG", "PowerState": "On", "Actions": { "#ComputerSystem.Reset": { "target": "/redfish/v1/Systems/ABCDEFG/Actions/ComputerSystem.Reset", "ResetType@Redfish.AllowableValues": [ "On", "ForceOn", "ForceOff", "ForceRestart", "GracefulRestart", "GracefulShutdown" ] } }, "@odata.id": "/redfish/v1/Systems/ABCDEFG" }
名称
类型
描述
@odata.type
string
模拟 Redfish 资源的类型。
@odata.id
string
资源链接。
Id
string
此特定资源的标识符。等于相应的 Ironic 节点 UUID。
名称
string
此特定资源的名称。等于相应的 Ironic 节点的名称(如果已设置),否则等于节点 UUID。
描述
string
如果 Ironic 节点设置了描述,它将在此处返回。如果未设置,则不会返回此字段。
UUID
string
此资源的 UUID。
PowerState
string
所询问的节点/System 的当前状态,可以是“On”(开机)、“Off”(关机)、“Powering On”(正在开机)或“Powering Off”(正在关机)之一。
动作
对象
包含可以对此系统执行的定义的动作。
#ComputerSystem. Reset
对象
包含有关“Reset”动作的信息。
目标
string
Reset 动作接口的 URI。
ResetType@Redfish. AllowableValues
数组
一个字符串数组,包含此动作提供的所有有效选项。
POST /redfish/v1/Systems/{node_ident}/Actions/ComputerSystem.Reset
调用 Reset 动作以更改节点/System 的电源状态。应在请求体中指定要执行的 Reset 动作类型。要求用户在请求头中提供有效的身份验证信息,用于他们尝试访问的资源。
在请求体中接受以下 ResetType 值 [3]
“On”(软开机)
“ForceOn”(硬开机)
“GracefulShutdown”(软关机)
“ForceOff”(硬关机)
“GracefulRestart”(软重启)
“ForceRestart”(硬重启)
正常响应代码:202 已接受
错误响应代码:400 请求错误,401 未授权,403 禁止,404 未找到,409 NodeLocked/ClientError,500 内部服务器错误,503 NoFreeConductorWorkers(有关代码 409 和 503 的更多信息,请参阅
/v1/nodes/{ident}/states/power的 PUT 请求的详细信息 [IRONCAPI])如果消息体中未找到“ResetType”字段,或者该字段具有无效值,将返回 400 请求错误。
如果请求头中的身份验证信息缺失或无效,将返回 401 未授权。
如果请求头中的身份验证信息有效但缺乏对正在访问的 Bare Metal 节点执行指定动作的适当权限,将返回 403 禁止。
如果指定的标识符不对应于合法的节点 UUID,将返回 404 未找到。
409 NodeLocked/ClientError 是此请求代理到 Bare Metal API 调用中指定的错误代码。409 响应的主体将与从 Bare Metal API 接收到的主体相同。
如果对 Bare Metal 服务的内部请求无法完成,将返回 500 内部服务器错误。
503 NoFreeConductorWorkers 是此请求代理到 Bare Metal API 调用中指定的错误代码。503 响应的主体将与从 Bare Metal API 接收到的主体相同。
示例请求
X-Auth-Token: super-duper-secret-aaaaaaaaaaaa { "ResetType": "ForceOff" }
名称
类型
描述
ResetType
string
要执行的 Reset 动作类型(见上文)
客户端 (CLI) 影响¶
无。
“openstack baremetal” CLI¶
虽然此添加将包括新的 REST API 端点,但此功能只是为用户提供另一种访问 Ironic API 中已存在功能的途径,这些功能已经可以通过 openstack baremetal CLI 访问。
“openstacksdk”¶
无。
RPC API 影响¶
无。
驱动程序 API 影响¶
无。
Nova 驱动程序影响¶
无。
Ramdisk 影响¶
无。
安全影响¶
此功能的安全性主要考虑因素是增加了访问 Ironic 硬件的新方式。但是,这不应带来太多的新安全问题,因为身份验证将以相同的方式进行,并使用与现有 Ironic API 相同的中间件。尽管如此,将采取一切必要的措施以确保与现有身份验证中间件的集成安全可靠。
为了进一步降低风险,生成的应用程序凭据可以并且应该限制其范围,仅允许访问此中间件所需的 Ironic API 的部分。我们还将要求所有请求通过 HTTPS 进行,因为会话令牌、应用程序凭据密钥以及(base64 编码的)HTTP 基本身份验证凭据将以明文形式发送。
其他最终用户影响¶
这将为最终用户提供一种替代的访问电源控制的方式,该方式与现有的 Redfish 配置工具兼容。这意味着从理论上讲,大多数用户不会直接发出 API 调用,而是使用现有的 Redfish 兼容软件,例如 Redfishtool。
可扩展性影响¶
无。
性能影响¶
由于这将作为单独的 WSGI 服务实现,因此需要一些额外的开销,但影响应该很小,因为它不需要运行任何定期任务,也不需要执行任何额外的数据库查询。
此外,应注意的是,运行此代理服务对于 Ironic 系统操作员来说是完全可选的;如果不想使用它,可以简单地忽略其存在。
其他部署者影响¶
此功能不应影响那些不想使用它的人,因为它必须单独运行并且可以忽略。为了防止意外启动,操作员应该能够在 Ironic 配置文件中显式禁用它。
那些希望使用此功能的人需要记住,由于它当前作为单独的 WSGI 服务实现,因此至少需要为其运行自己的端口。如果希望将 Redfish 代理服务绑定到与 Ironic API 不同的端口或不同的主机 IP,这会很有用;但是,它需要通过 Keystone 添加一个新的端点(如果使用 Keystone),并且可能需要系统管理员进行额外的网络配置。
开发人员影响¶
此新服务将使用 Flask 实现,而不是 Ironic API 当前使用的 Pecan。因此,为该新功能编写的所有代码都将进行充分的文档记录,以便最大限度地提高对不熟悉 Flask 的任何 Ironic 开发人员的可读性。
TheJulia 提到,未来 Ironic 开发团队可能会考虑将 Ironic API 迁移到使用 Flask,并且此添加到代码库中的内容可能对那些负责进行迁移的人员有所帮助。
最后,Sessions 功能在 sushy-tools 中不存在;由于此规范包括对其实现的计划,因此它可能对那里也是一个有用的补充。这个基本的 Redfish 代理将来可以扩展到为那些觉得这种功能有用的人通过类似 Redfish 的接口提供对 Ironic 系统的更多部分的访问。
实现¶
负责人¶
- 主要负责人
- Sam Zuk (sam_z / szuk) <szuk@redhat.com>
- 其他贡献者
- Tzu-Mainn Chen (tzumainn) <tzumainn@redhat.com>
工作项¶
创建必要的 API 端点
实现 Redfish System -> Ironic Node 代理
实现 Redfish Session -> Keystone 身份验证代理
编写单元测试和功能测试以确保正常功能
编写文档,说明如何使用和配置此功能,供用户、管理员和开发人员使用。
以模拟预期用例的方式在真实硬件上测试此功能。
依赖项¶
无。
测试¶
需要进行功能测试,以确保对这些新代理端点发出的请求在实际的 Ironic 设置上产生正确的结果。此外,应编写严格的测试用例,以确保绝对不会发生对节点 API 的未经授权的访问。
升级和向后兼容性¶
N/A
文档影响¶
需要为新的 API 端点提供文档,以及启用和配置此功能所需的说明(供操作员使用),以及最终用户可能需要的其他信息,例如如何使用身份验证令牌。