通过 Mistral 支持 TripleO Overcloud 部署

我们需要一个 TripleO 库来支持 overcloud 部署工作流。

问题描述

TripleO 具有一个 overcloud 部署工作流,该工作流使用 Heat 模板并包含以下步骤

  • 用户编辑模板和环境文件。这些文件可以存储在任何地方。

  • Heat 可以验证模板。

  • 模板和环境被发送到 Heat 以进行 overcloud 部署。

此工作流已经由 CLI 支持。

然而,从 GUI 的角度来看,虽然工作流很简单,但并不容易操作。以下是一些出现的问题

  • 此工作流中的一些业务逻辑包含在 CLI 本身中,这使得其他 UI 难以使用。

  • 如果 TripleO overcloud 部署工作流发生变化,CLI 和 GUI 方法很容易出现分歧——这是一种危险的情况。

  • CLI 方法允许开放式的灵活性(CLI 不关心模板来自哪里),这对 GUI 来说是有害的(GUI 用户不关心模板存储在哪里,但一致的方法对于防止 GUI 和 CLI 之间出现分歧是可取的)。

需要创建通用代码,以适应 CLI 的灵活性和 GUI 用户需求的易用性。

提议的变更

为了解决这个问题,我们建议创建一个与 Mistral 集成的部署,包含以下内容

  • 将 overcloud 部署工作流中涉及的业务逻辑封装在 tripleo-common 库中,利用 Mistral actions 和 workflows。

  • 提供一个简化的工作流,以隐藏 GUI 用户不需要的复杂性

  • 更新 CLI 以在适当的情况下使用此代码,以防止与 GUI 产生分歧。

前三点值得进一步解释。首先,让我们概述提议的 GUI 工作流。

  1. 用户将 Heat 部署模板推送到 swift。

  2. 用户定义 Heat 模板 capabilities 给定的模板资源类型的数值,这些数值存储在 environment[1] 中。请注意,此规范将在 mitaka 中完成。下面讨论了一个解决方法。

  3. 现在已经指定了模板资源类型,用户可以配置 Heat 给定的部署参数。编辑后的参数被更新并存储在 environment 中。‘Roles’ 仍然可以从可用的 Heat 参数[2] 中派生。

  4. 可以重复步骤 2 和 3。

  5. 配置完成后,用户触发 overcloud 的部署。模板和环境文件从 Swift 中获取并发送到 Heat。

  6. overcloud 部署完成后,执行任何需要的部署后配置。

CLI 和 GUI 都将使用 Swift 工作流并将模板存储到 Swift 中。这将促进从基于 CLI 的部署切换到 UI 以及反之亦然的可能性。

Mistral Workflows 由 Tasks 组成,Tasks 将一个或多个 Actions 分组在一起以供 Workflow Execution 执行。Action 实现为一个类,具有初始化方法和 run 方法。run 方法为 Python 代码提供单个执行点。Action 或 Workflows 需要的任何状态持久化都将存储在 Mistral Environment 对象中。

在某些情况下,OpenStack 服务可能缺少 TripleO 所需的功能,或者它可能只能通过其关联的 Python 客户端访问。为了短期内缓解此问题,某些 Actions 需要直接使用 Action Execution [3] 执行,Action Execution 直接调用 Action 并立即返回,但它也无法访问与 Workflow Execution 相同的上下文。从理论上讲,每个 action execution 都应该替换为 OpenStack 服务 API 调用。

以下是使用 python-mistralclient 或 Mistral API 从 CLI 或 GUI 执行的预期 Workflows 和 Actions 的摘要。可能需要额外的 actions 或库代码来启用这些操作,这些操作不打算直接使用。

工作流程

  • 节点注册

  • 节点内省

  • 计划创建

  • 计划删除

  • 部署

  • 验证操作

动作

  • 计划列表

  • 获取 Capabilities

  • 更新 Capabilities

  • 获取 Parameters

  • 更新 Parameters

  • Roles 列表

对于 Flavors 和 Image 管理,将分别使用 Nova 和 Glance APIs。

节点的注册和内省将在 Mistral Workflow 中实现。逻辑当前在 tripleoclient 中,将被移植,因为某些节点配置被指定为逻辑的一部分(ramdisk、内核名称等),因此用户不必指定这些配置。标记、列出和删除节点将通过适当的 Ironic/Inspectors APIs 进行。

部署计划由 Swift 容器中的一组 heat 模板组成,以及存储在 Mistral Environment 中的数据。首次创建计划时,将解析 capabilities map 数据并存储在关联的 Mistral Environment 中。模板需要上传到与要创建的 stack 具有相同名称的 Swift 容器中。虽然任何用户都可以使用原始 POST 请求来完成此操作,但 GUI 和 CLI 将提供便利函数来改善用户体验。便利函数将在可以直接使用或包含在 Workflow 中的 Action 中实现。

计划的删除将在 Workflow 中实现,以确保在删除模板、容器和 Mistral Environment 之前没有关联的 stack。列出计划将通过调用 ‘mistral environment-list’ 来完成。

要获取可用 Heat 环境文件的列表及其描述和约束,该库将有一个 Action,该 Action 返回在计划创建期间添加的 capabilities 的信息,并标识哪些 Heat 环境文件已被选择。 还会有一个 action 接受用户选择的 Heat 环境文件列表,并将信息存储在 Mistral Environment 中。使用 Workflow 执行这些操作将不方便,因为它们只是读取或更新 Mistral Environment,并且不需要额外的逻辑。

Roles 的识别将在调用 Heat 的 Workflow 中实现。

要获取部署参数,将创建 Actions,这些 Actions 将调用 Heat 并提供所需的模板信息以获取参数并将参数值设置为 Environment。

要执行 TripleO 验证,将创建 Workflows 和相关的 Actions 以支持 list、start、stop 和 results 操作。有关 Mistral 如何实现验证的更多信息,请参阅规范 [4]。

替代方案

一种替代方案是强制非 CLI UI 重新实现当前包含在 CLI 中的业务逻辑。这不是一个好的替代方案。另一种可能的替代方案是创建一个 REST API [5] 来抽象 TripleO 部署逻辑,但这需要付出更多的努力来创建和维护,并且已经在邮件列表中进行了广泛讨论。[6][7]

安全影响

其他最终用户影响

–templates 工作流最终将被修改为使用更新的 tripleo-common 库。

与 Mistral 集成是一个简单的过程,这可能会导致使用量增加。

性能影响

其他部署者影响

开发人员影响

现在,开发人员将不再直接在 python-tripleoclient 中编写 workflow 代码,而是创建 Mistral Actions 和 Workflows 来帮助实现需求。

目前,更改 overcloud 部署工作流会导致压力,因为需要单独更新 CLI 和 GUI 代码。将两者合并使这成为一个更容易实现的目标。但是,开发人员需要牢记这种架构,并确保对 –templates 或 –plan 工作流的更改在 tripleo-common 库中维护(在适当的时候),以避免不必要的差异。

实现

负责人

主要负责人

  • rbrady

  • jtomasek

  • dprince

工作项

所需的工作项是

  • 开发 tripleo-common Mistral actions,提供我们部署工作流所需的所有功能。

  • 这涉及将大部分代码从 python-tripleoclient 移到通用、狭窄的 Mistral actions 中,这些 actions 可以通过 Mistral API 消费。

  • 创建新的 Mistral workflows 来帮助处理高级任务,例如部署、内省、节点注册等。

  • tripleo-common 更像是一个内部库,其逻辑旨在由使用 Mistral actions 消费(几乎)完全。项目不应尝试通过将 tripleo-common 作为库来绕过 API,尽可能多地。对于常见的轮询函数等,可能会有一些例外,但通常所有核心工作流逻辑都应由 API 驱动。

  • 更新 CLI 以直接通过 python-mistralclient 消费这些 Mistral actions。

实现这些更改的所有补丁都必须通过 CI,并根据需要添加额外的测试。

依赖项

测试

应更新 TripleO CI 以测试更新的 tripleo-common 库。

我们的意图是让 tripleoclient 消费我们编写的 Mistral actions。由于所有现有的上游 Tripleo CI 在 tripleoclient 上发布,因此这种方法确保我们的所有工作流 actions 始终有效。这应该使我们覆盖 90% 的 Mistral actions 和 workflows,并允许我们以迭代/快速的方式进行实现。 一旦 UI 安装并成为我们上游 CI 的一部分,我们也可以依靠那里的覆盖率来确保我们没有出现中断。

文档影响

Mistral Actions 和 Workflows 某种程度上是自文档化的,并且可以通过在命令行上运行 ‘mistral workflow-list’ 或 ‘mistral action-list’ 轻松地进行内省。但是,更新的库必须文档完善并符合 OpenStack 标准。需要在 tripleo-common 和 tripleo-docs 存储库中提供文档。

参考资料

[1] https://specs.openstack.org/openstack/heat-specs/specs/mitaka/resource-capabilities.html

[2] https://specs.openstack.org/openstack/heat-specs/specs/liberty/nested-validation.html

[3] https://docs.openstack.org/developer/mistral/terminology/executions.html

[4] https://review.openstack.org/#/c/255792/

[5] https://specs.openstack.org/openstack/tripleo-specs/specs/mitaka/tripleo-overcloud-deployment-library.html

[6] http://lists.openstack.org/pipermail/openstack-dev/2016-January/083943.html

[7] http://lists.openstack.org/pipermail/openstack-dev/2016-January/083757.html