展开嵌套资源

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

对于许多 UI 使用场景,如果堆栈包含基于堆栈的资源,列出与给定堆栈关联的所有资源通常会消耗大量资源。因此,建议 resource-list 在请求时返回与给定堆栈关联的所有资源。

问题描述

目前,resource-list 仅返回给定堆栈的顶级资源,不包括任何嵌套堆栈内的资源。这使得一些使用场景变得困难或次优,因为需要在资源引用链接上进行多次 API 调用。

  • 在删除堆栈时,UI 应该能够向用户呈现与给定堆栈关联的所有资源的列表,以避免因堆栈删除而删除某些资源而产生的困惑。

  • API 的用户(通过 CLI、curl 或其他方法)希望能够快速轻松地列出和跟踪与堆栈关联的每个资源的状态,无论资源在堆栈层次结构中的位置如何。

  • OpenStack 仪表板可能会显示来自堆栈的资源的不正确、令人困惑的拓扑结构,因为它不了解嵌套堆栈(例如,服务器组)。

提议的变更

建议的实现将向 resource-list API 方法添加一个可选的查询参数

nested_depth

递归深度,用于限制返回的资源。此参数指示用户希望返回嵌套资源以及父堆栈中的资源。将此参数设置为数字会导致系统限制递归深度。值为 0 没有效果。值为 MAX 会返回所有资源,直到 max_nested_stack_depth。系统将永远不会递归到超过 max_nested_stack_depth,无论参数中传递的值如何。

Heat 服务将看到此参数,并递归遍历所有嵌套堆栈到指定的深度,并展平资源列表数据结构。对于存在于嵌套堆栈中的资源,还将包含包含的嵌套堆栈 ID 和父资源名称。

结果响应数据将如下所示

{"resources":
  [
    {
      "resource_name": "db",
      "links": [...],
      "logical_resource_id": "db",
      "resource_status_reason": "state changed",
      "updated_time": "2014-04-15T18:23:35Z",
      "required_by": ["web_nodes"],
      "resource_status": "CREATE_COMPLETE",
      "physical_resource_id": "4974985c-da78-444b-aeb3-9a80baccdd1a",
      "resource_type": "OS::Trove::Instance"
    },
    {
      "resource_name": "lb",
      "links": [...],
      "logical_resource_id": "lb",
      "resource_status_reason": "state changed",
      "updated_time": "2014-04-15T18:30:52Z",
      "required_by": [],
      "resource_status": "CREATE_COMPLETE",
      "physical_resource_id": "229145",
      "resource_type": "Rackspace::Cloud::LoadBalancer"
    },
    {
      "resource_name": "web_nodes",
      "links": [...],
      "logical_resource_id": "web_nodes",
      "resource_status_reason": "state changed",
      "updated_time": "2014-04-15T18:25:10Z",
      "required_by": ["lb"],
      "resource_status": "CREATE_COMPLETE",
      "physical_resource_id": "c3a46e6f-f999-4f9b-a797-3043031d381a",
      "resource_type": "OS::Heat::ResourceGroup"
    },
    {
      "resource_name": "web_node1",
      "links": [...],
      "logical_resource_id": "web_node1",
      "resource_status_reason": "state changed",
      "updated_time": "2014-04-15T18:25:10Z",
      "required_by": ["lb"],
      "resource_status": "CREATE_COMPLETE",
      "physical_resource_id": "c3a46e6f-f999-4f9b-a797-3043031d3811",
      "resource_type": "Rackspace::Cloud::Server",
      "parent": "web_nodes",
      "nested_stack_id": "1234512345"
    },
    {
      "resource_name": "web_node2",
      "links": [...],
      "logical_resource_id": "web_node2",
      "resource_status_reason": "state changed",
      "updated_time": "2014-04-15T18:25:10Z",
      "required_by": ["lb"],
      "resource_status": "CREATE_COMPLETE",
      "physical_resource_id": "c3a46e6f-f999-4f9b-a797-3043031d3822",
      "resource_type": "Rackspace::Cloud::Server",
      "parent": "web_nodes",
      "nested_stack_id": "1234512345"
    }
  ]
}

这些更改主要位于

  • heat.engine.service

  • heat.db

  • heat.api

  • python-heatclient

备选方案

目前,抽象嵌套堆栈的每个资源在通过 resource-show 查看时都将包含指向嵌套堆栈的链接。这允许用户通过以下方式在客户端实现此功能:

  1. 列出堆栈中的所有资源

  2. 单独检索每个资源

  3. 如果当前资源具有指向嵌套堆栈的链接,则递归该堆栈的资源并将其添加到列表/树中

虽然这提供了更大的灵活性,可以根据用户的特定用例列出嵌套资源,但对于所述用例以及从网络角度来看,效率非常低。本规范无意删除此选项,只是为了提供另一种更有效地满足几个常见用例的替代方案,同时保留现有的链接遍历方法,以供需要更多控制资源层次结构显示用例使用。

实现

负责人

主要负责人

randall-burt

里程碑

完成目标里程碑

Juno-2

工作项

  • 更新 DB API 和实现,以接受资源列表的 nested_depth 参数,并在逻辑中使用该参数来追加来自任何嵌套堆栈的资源。

  • 更新引擎以接受然后将 nested_depth 参数传递给 DB API。

  • 更新 API 以接受并将 nested_depth 参数传递给引擎;请尽量不要对 RPC API 进行版本控制。

  • 更新 python-heatclient 以公开新的标志并正确格式化输出

  • 将参数添加到 Heat V1 WADL

依赖项