支持外部资源。

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/heat/+spec/external-resources

问题描述

我们没有办法指示 Heat 使用现有的(外部)物理资源 ID。

用例 1:

在一段时间内运行堆栈时,用户可能需要对服务器(重建它)进行带外操作。但这会使它与 Heat 的视角不同步。因此,这是一种告诉 Heat “这是新的资源 ID,我现在正在接管它”的机制。在稍后某个阶段(s)他可能希望告诉 Heat 再次接管它 - 通过删除“external_reference”部分。这满足了 TripleO 的需求(并且我们假设许多其他需要对重要的堆栈进行长时间操作的用户),允许 get_attr/get_resource 在他们对外操作资源时继续发挥作用,并让 Heat 保持不变。当用户对它的状态满意时,他们可以将它返回到 Heat 的控制之下。

用例 2:

存在一个现有资源,我们希望使用 get_attr 来检索有用的信息,而不是手动执行此操作并通过参数传递信息。

在所有这些情况下,一旦完成,资源可以标记为外部,任何更新或删除都将被忽略(除非用户首先删除“external”信息)。

提议的变更

为了实现这一点,用户会将以下内容添加到模板中

resources:
  ...
  res_a:
    type: OS::Nova::Server
    external_id: the-server-id
    properties:
      ...

注意:1. 没有“resource_data 或 Metadata”的位置,因为这些由操作使用,一旦变为外部,这些操作将不再可能。将有一些资源类型,由于缺少资源数据/元数据,将无法从外部变为正常资源。这将尽可能地记录,并且 Heat 开发人员应避免使用 resource_data。

2. 一旦资源具有“external_id”属性,属性将被忽略(但允许存在)。如果删除了“external_id”,资源将使用属性进行更新。

使用 external_id 创建资源。

这涵盖了第二个用例。在这里,我们看到存在一个 external_id,逻辑上执行采用和检查(以确保资源实际存在)。

使用 external_id 更新资源。

这涵盖了第一个用例。我们覆盖了 Heat 之前写入的 resource_id 并忽略所有属性。这里也会调用检查来确保资源存在。如果 external_id 与现有的 physical_resource_id 不同,则将删除现有的资源。

删除 external_id。

要将资源转换为“正常”资源,用户必须从资源中删除“external_id”属性并执行堆栈更新。如果资源需要一些缺失的 resource_data 或元数据,而这些数据缺失(并且无法恢复),则这将失败,并且它将保持为外部资源。

删除具有 external_reference 的资源的堆栈。

当存在 external_reference 时,假定删除策略为 RETAIN(不会被删除)。

备选方案

用户可以使用当前的 adopt/abandon 机制,但它有一些略有不同的行为。此外,使用 2 次 API 调用切换物理 resource_id 比较困难。

实现

负责人

主要负责人

asalkeld

里程碑

完成目标里程碑

Liberty-2

工作项

  • 代码

  • 功能测试。

  • 需要在模板指南中添加文档。

  • 记录限制(需要 resource_data 和元数据的资源)。

依赖项